Show More
@@ -0,0 +1,143 | |||
|
1 | #!/usr/bin/env python | |
|
2 | """Script to commit the doc build outputs into the github-pages repo. | |
|
3 | ||
|
4 | Use: | |
|
5 | ||
|
6 | gh-pages.py [tag] | |
|
7 | ||
|
8 | If no tag is given, the current output of 'git describe' is used. If given, | |
|
9 | that is how the resulting directory will be named. | |
|
10 | ||
|
11 | In practice, you should use either actual clean tags from a current build or | |
|
12 | something like 'current' as a stable URL for the most current version of the """ | |
|
13 | ||
|
14 | #----------------------------------------------------------------------------- | |
|
15 | # Imports | |
|
16 | #----------------------------------------------------------------------------- | |
|
17 | import os | |
|
18 | import re | |
|
19 | import shutil | |
|
20 | import sys | |
|
21 | from os import chdir as cd | |
|
22 | from os.path import join as pjoin | |
|
23 | ||
|
24 | from subprocess import Popen, PIPE, CalledProcessError, check_call | |
|
25 | ||
|
26 | #----------------------------------------------------------------------------- | |
|
27 | # Globals | |
|
28 | #----------------------------------------------------------------------------- | |
|
29 | ||
|
30 | pages_dir = 'gh-pages' | |
|
31 | html_dir = 'build/html' | |
|
32 | pages_repo = 'git@github.com:ipython/ipython-doc.git' | |
|
33 | ||
|
34 | #----------------------------------------------------------------------------- | |
|
35 | # Functions | |
|
36 | #----------------------------------------------------------------------------- | |
|
37 | def sh(cmd): | |
|
38 | """Execute command in a subshell, return status code.""" | |
|
39 | return check_call(cmd, shell=True) | |
|
40 | ||
|
41 | ||
|
42 | def sh2(cmd): | |
|
43 | """Execute command in a subshell, return stdout. | |
|
44 | ||
|
45 | Stderr is unbuffered from the subshell.x""" | |
|
46 | p = Popen(cmd, stdout=PIPE, shell=True) | |
|
47 | out = p.communicate()[0] | |
|
48 | retcode = p.returncode | |
|
49 | if retcode: | |
|
50 | raise CalledProcessError(retcode, cmd) | |
|
51 | else: | |
|
52 | return out.rstrip() | |
|
53 | ||
|
54 | ||
|
55 | def sh3(cmd): | |
|
56 | """Execute command in a subshell, return stdout, stderr | |
|
57 | ||
|
58 | If anything appears in stderr, print it out to sys.stderr""" | |
|
59 | p = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True) | |
|
60 | out, err = p.communicate() | |
|
61 | retcode = p.returncode | |
|
62 | if retcode: | |
|
63 | raise CalledProcessError(retcode, cmd) | |
|
64 | else: | |
|
65 | return out.rstrip(), err.rstrip() | |
|
66 | ||
|
67 | ||
|
68 | def init_repo(path): | |
|
69 | """clone the gh-pages repo if we haven't already.""" | |
|
70 | sh("git clone %s %s"%(pages_repo, path)) | |
|
71 | here = os.getcwd() | |
|
72 | cd(path) | |
|
73 | sh('git checkout gh-pages') | |
|
74 | cd(here) | |
|
75 | ||
|
76 | ||
|
77 | def render_htmlindex(fname, tag): | |
|
78 | rel = '<li> Release: <a href="{t}/index.html">{t}</a>'.format(t=tag) | |
|
79 | rep = re.compile('<!-- RELEASE -->') | |
|
80 | out = [] | |
|
81 | with file(fname) as f: | |
|
82 | for line in f: | |
|
83 | out.append(line) | |
|
84 | if rep.search(line): | |
|
85 | out.append(rep.sub(rel, line)) | |
|
86 | return ''.join(out) | |
|
87 | ||
|
88 | ||
|
89 | def new_htmlindex(fname, tag): | |
|
90 | new_page = render_htmlindex(fname, tag) | |
|
91 | os.rename(fname, fname+'~') | |
|
92 | with file(fname, 'w') as f: | |
|
93 | f.write(new_page) | |
|
94 | ||
|
95 | ||
|
96 | #----------------------------------------------------------------------------- | |
|
97 | # Script starts | |
|
98 | #----------------------------------------------------------------------------- | |
|
99 | if __name__ == '__main__': | |
|
100 | # The tag can be given as a positional argument | |
|
101 | try: | |
|
102 | tag = sys.argv[1] | |
|
103 | except IndexError: | |
|
104 | tag = sh2('git describe') | |
|
105 | ||
|
106 | startdir = os.getcwd() | |
|
107 | if not os.path.exists(pages_dir): | |
|
108 | init_repo(pages_dir) | |
|
109 | ||
|
110 | dest = pjoin(pages_dir, tag) | |
|
111 | ||
|
112 | # don't `make html` here, because gh-pages already depends on html in Makefile | |
|
113 | # sh('make html') | |
|
114 | ||
|
115 | # This is pretty unforgiving: we unconditionally nuke the destination | |
|
116 | # directory, and then copy the html tree in there | |
|
117 | shutil.rmtree(dest, ignore_errors=True) | |
|
118 | shutil.copytree(html_dir, dest) | |
|
119 | ||
|
120 | try: | |
|
121 | cd(pages_dir) | |
|
122 | sh('git checkout gh-pages') | |
|
123 | status = sh2('git status | head -1') | |
|
124 | branch = re.match('\# On branch (.*)$', status).group(1) | |
|
125 | if branch != 'gh-pages': | |
|
126 | e = 'On %r, git branch is %r, MUST be "gh-pages"' % (pages_dir, | |
|
127 | branch) | |
|
128 | raise RuntimeError(e) | |
|
129 | ||
|
130 | sh('git add %s' % tag) | |
|
131 | new_htmlindex('index.html', tag) | |
|
132 | sh('git add index.html') | |
|
133 | sh('git commit -m"Created new doc release, named: %s"' % tag) | |
|
134 | ||
|
135 | print 'Most recent 3 commits:' | |
|
136 | sys.stdout.flush() | |
|
137 | sh('git --no-pager log --oneline HEAD~3..') | |
|
138 | finally: | |
|
139 | cd(startdir) | |
|
140 | ||
|
141 | ||
|
142 | print 'Now verify the build in: %r' % dest | |
|
143 | print "If everything looks good, 'git push'" |
@@ -32,7 +32,7 help: | |||
|
32 | 32 | @echo "gitwash-update update git workflow from source repo" |
|
33 | 33 | |
|
34 | 34 | clean: |
|
35 |
-rm -rf build/* dist/* $(SRCDIR)/api/generated |
|
|
35 | -rm -rf build/* dist/* $(SRCDIR)/api/generated | |
|
36 | 36 | |
|
37 | 37 | pdf: latex |
|
38 | 38 | cd build/latex && make all-pdf |
@@ -104,4 +104,7 nightly: dist | |||
|
104 | 104 | rsync -avH --delete dist/ ipython:www/doc/nightly |
|
105 | 105 | |
|
106 | 106 | gh-pages: html |
|
107 | sh update_ghpages.sh | |
|
107 | python gh-pages.py | |
|
108 | ||
|
109 | gh-pages-current: html | |
|
110 | python gh-pages.py current |
@@ -44,7 +44,6 extensions = [ | |||
|
44 | 44 | 'inheritance_diagram', |
|
45 | 45 | 'ipython_console_highlighting', |
|
46 | 46 | 'numpydoc', # to preprocess docstrings |
|
47 | 'sphinxtogithub', | |
|
48 | 47 | ] |
|
49 | 48 | |
|
50 | 49 | # Add any paths that contain templates here, relative to this directory. |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now