16
16
17
17
from django .conf import settings
18
18
from django .core .management import BaseCommand , call_command
19
+ from django .db .models import Q
19
20
from django .utils .translation import to_locale
20
21
from sphinx .application import Sphinx
21
22
from sphinx .config import Config
@@ -39,6 +40,11 @@ def add_arguments(self, parser):
39
40
"version is no longer supported."
40
41
),
41
42
)
43
+ parser .add_argument (
44
+ "--interactive" ,
45
+ action = "store_true" ,
46
+ help = "Ask before building each version" ,
47
+ )
42
48
parser .add_argument (
43
49
"--update-index" ,
44
50
action = "store_true" ,
@@ -53,40 +59,58 @@ def add_arguments(self, parser):
53
59
default = False ,
54
60
help = "Also invalidate downstream caches for any changed doc versions." ,
55
61
)
62
+ parser .add_argument (
63
+ "args" ,
64
+ metavar = "versions" ,
65
+ nargs = "*" ,
66
+ help = "Which version to rebuild (all by default)" ,
67
+ )
68
+
69
+ def _get_doc_releases (self , versions , options ):
70
+ """
71
+ Return a DocumentRelease queryset of all the versions that should be
72
+ built, based on the arguments received on the command line.
73
+ """
74
+ default_docs_version = DocumentRelease .objects .get (
75
+ is_default = True
76
+ ).release .version
77
+
78
+ # Somehow, bizarely, there's a bug in Sphinx such that if I try to
79
+ # build 1.0 before other versions, things fail in weird ways. However,
80
+ # building newer versions first works. I suspect Sphinx is hanging onto
81
+ # some global state. Anyway, we can work around it by making sure that
82
+ # "dev" builds before "1.0". This is ugly, but oh well.
83
+ queryset = DocumentRelease .objects .order_by ("-release" )
56
84
57
- def handle (self , ** kwargs ):
85
+ # Skip translated non-stable versions to avoid a crash:
86
+ # https://github.com/django/djangoproject.com/issues/627
87
+ queryset = queryset .filter (Q (lang = "en" ) | Q (release = default_docs_version ))
88
+
89
+ if options ["language" ]:
90
+ queryset = queryset .filter (lang = options ["language" ])
91
+
92
+ if versions :
93
+ queryset = queryset .by_versions (* versions )
94
+
95
+ return queryset
96
+
97
+ def handle (self , * versions , ** kwargs ):
58
98
self .verbosity = kwargs ["verbosity" ]
59
99
self .update_index = kwargs ["update_index" ]
60
100
self .purge_cache = kwargs ["purge_cache" ]
61
101
62
102
self .default_builders = ["json" , "djangohtml" ]
63
- default_docs_version = DocumentRelease .objects .get (
64
- is_default = True
65
- ).release .version
66
103
67
104
# Keep track of which Git sources have been updated, e.g.,
68
105
# {'1.8': True} if the 1.8 docs updated.
69
106
self .release_docs_changed = {}
70
107
# Only update the index if some docs rebuild.
71
108
self .update_index_required = False
72
109
73
- # Somehow, bizarely, there's a bug in Sphinx such that if I try to
74
- # build 1.0 before other versions, things fail in weird ways. However,
75
- # building newer versions first works. I suspect Sphinx is hanging onto
76
- # some global state. Anyway, we can work around it by making sure that
77
- # "dev" builds before "1.0". This is ugly, but oh well.
78
- doc_releases = DocumentRelease .objects .order_by ("-release" )
79
- if kwargs ["language" ]:
80
- doc_releases = doc_releases .filter (lang = kwargs ["language" ])
81
- for release in doc_releases :
82
- # Skip translated non-stable versions to avoid a crash:
83
- # https://github.com/django/djangoproject.com/issues/627
84
- if (
85
- release .lang != "en"
86
- and not release .release .version == default_docs_version
87
- ):
88
- continue
89
- self .build_doc_release (release , force = kwargs ["force" ])
110
+ for release in self ._get_doc_releases (versions , kwargs ):
111
+ self .build_doc_release (
112
+ release , force = kwargs ["force" ], interactive = kwargs ["interactive" ]
113
+ )
90
114
91
115
if self .update_index_required :
92
116
call_command ("update_index" , ** {"verbosity" : self .verbosity })
@@ -106,10 +130,16 @@ def handle(self, **kwargs):
106
130
if self .verbosity >= 1 :
107
131
self .stdout .write ("No docs changes; skipping cache purge." )
108
132
109
- def build_doc_release (self , release , force = False ):
133
+ def build_doc_release (self , release , force = False , interactive = False ):
110
134
# Skip not supported releases.
111
135
if not release .is_supported and not force :
112
136
return
137
+ if interactive :
138
+ prompt = (
139
+ f"About to start building docs for release { release } . Continue? Y/n "
140
+ )
141
+ if input (prompt ).upper () not in {"" , "Y" , "YES" , "OUI" }:
142
+ return
113
143
if self .verbosity >= 1 :
114
144
self .stdout .write (f"Starting update for { release } at { datetime .now ()} ..." )
115
145
0 commit comments