forked from sympy/sympy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupdate_docs.py
More file actions
executable file
·119 lines (88 loc) · 3.38 KB
/
update_docs.py
File metadata and controls
executable file
·119 lines (88 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/env python3
import subprocess
import sys
from os.path import join, splitext, basename
from contextlib import contextmanager
from tempfile import TemporaryDirectory
from zipfile import ZipFile
from shutil import copytree
def main(sympy_doc_git, doc_html_zip, version, push=None):
"""Run this as ./update_docs.py SYMPY_DOC_GIT DOC_HTML_ZIP VERSION [--push]
!!!!!!!!!!!!!!!!!
NOTE: This is intended to be run as part of the release script.
NOTE: This script will automatically push to the sympy_doc repo.
!!!!!!!!!!!!!!!!!
Args
====
SYMPY_DOC_GIT: Path to the sympy_doc repo.
DOC_HTML_ZIP: Path to the zip of the built html docs.
VERSION: Version string (e.g. "1.6")
--push (optional): Push the results (Warning this pushes direct to github)
This script automates the "release docs" step described in the README of the
sympy/sympy_doc repo:
https://github.com/sympy/sympy_doc#release-docs
"""
if push is None:
push = False
elif push == "--push":
push = True
else:
raise ValueError("Invalid arguments")
update_docs(sympy_doc_git, doc_html_zip, version, push)
def update_docs(sympy_doc_git, doc_html_zip, version, push):
# We started with a clean tree so restore it on error
with git_rollback_on_error(sympy_doc_git, branch='gh-pages') as run:
# Delete docs for the last version
run('git', 'rm', '-rf', 'latest')
# Extract new docs in replacement
extract_docs(sympy_doc_git, doc_html_zip)
# Commit new docs
run('git', 'add', 'latest')
run('git', 'commit', '-m', 'Add sympy %s docs' % version)
# Update indexes
run('./generate_indexes.py')
run('git', 'diff')
run('git', 'commit', '-a', '-m', 'Update indexes')
if push:
run('git', 'push')
else:
print('Results are committed but not pushed')
@contextmanager
def git_rollback_on_error(gitroot_path, branch='master'):
def run(*cmdline, **kwargs):
"""Run subprocess with cwd in sympy_doc"""
print()
print('Running: $ ' + ' '.join(cmdline))
print()
return subprocess.run(cmdline, cwd=gitroot_path, check=True, **kwargs)
unclean_msg = "The git repo should be completely clean before running this"
try:
run('git', 'diff', '--exit-code') # Error if tree is unclean
except subprocess.CalledProcessError:
raise ValueError(unclean_msg)
if run('git', 'clean', '-n', stdout=subprocess.PIPE).stdout:
raise ValueError(unclean_msg)
run('git', 'checkout', branch)
run('git', 'pull')
bsha_start = run('git', 'rev-parse', 'HEAD', stdout=subprocess.PIPE).stdout
sha_start = bsha_start.strip().decode('ascii')
try:
yield run
except Exception as e:
run('git', 'reset', '--hard', sha_start)
raise e from None
def extract_docs(sympy_doc_git, doc_html_zip):
subdirname = splitext(basename(doc_html_zip))[0]
with TemporaryDirectory() as tempdir:
print()
print('Extracting docs to ' + tempdir)
print()
ZipFile(doc_html_zip).extractall(tempdir)
print()
print('Copying to sympy_doc/latest')
print()
srcpath = join(tempdir, subdirname)
dstpath = join(sympy_doc_git, 'latest')
copytree(srcpath, dstpath)
if __name__ == "__main__":
main(*sys.argv[1:])