Show More
@@ -2290,6 +2290,15 b' def add(ui, repo, match, prefix, explici' | |||
|
2290 | 2290 | bad.extend(f for f in rejected if f in match.files()) |
|
2291 | 2291 | return bad |
|
2292 | 2292 | |
|
2293 | def addwebdirpath(repo, serverpath, webconf): | |
|
2294 | webconf[serverpath] = repo.root | |
|
2295 | repo.ui.debug('adding %s = %s\n' % (serverpath, repo.root)) | |
|
2296 | ||
|
2297 | for r in repo.revs('filelog("path:.hgsub")'): | |
|
2298 | ctx = repo[r] | |
|
2299 | for subpath in ctx.substate: | |
|
2300 | ctx.sub(subpath).addwebdirpath(serverpath, webconf) | |
|
2301 | ||
|
2293 | 2302 | def forget(ui, repo, match, prefix, explicitonly): |
|
2294 | 2303 | join = lambda f: os.path.join(prefix, f) |
|
2295 | 2304 | bad = [] |
@@ -4619,7 +4619,8 b' def root(ui, repo):' | |||
|
4619 | 4619 | ('t', 'templates', '', _('web templates to use'), _('TEMPLATE')), |
|
4620 | 4620 | ('', 'style', '', _('template style to use'), _('STYLE')), |
|
4621 | 4621 | ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')), |
|
4622 |
('', 'certificate', '', _('SSL certificate file'), _('FILE'))] |
|
|
4622 | ('', 'certificate', '', _('SSL certificate file'), _('FILE'))] | |
|
4623 | + subrepoopts, | |
|
4623 | 4624 | _('[OPTION]...'), |
|
4624 | 4625 | optionalrepo=True) |
|
4625 | 4626 | def serve(ui, repo, **opts): |
@@ -136,6 +136,10 b' Interaction with Mercurial Commands' | |||
|
136 | 136 | subrepository changes are available when referenced by top-level |
|
137 | 137 | repositories. Push is a no-op for Subversion subrepositories. |
|
138 | 138 | |
|
139 | :serve: serve does not recurse into subrepositories unless | |
|
140 | -S/--subrepos is specified. Git and Subversion subrepositories | |
|
141 | are currently silently ignored. | |
|
142 | ||
|
139 | 143 | :status: status does not recurse into subrepositories unless |
|
140 | 144 | -S/--subrepos is specified. Subrepository changes are displayed as |
|
141 | 145 | regular Mercurial changes on the subrepository |
@@ -15,6 +15,7 b' from .i18n import _' | |||
|
15 | 15 | |
|
16 | 16 | from . import ( |
|
17 | 17 | chgserver, |
|
18 | cmdutil, | |
|
18 | 19 | commandserver, |
|
19 | 20 | error, |
|
20 | 21 | hgweb, |
@@ -130,11 +131,22 b' def _createhgwebservice(ui, repo, opts):' | |||
|
130 | 131 | baseui = ui |
|
131 | 132 | webconf = opts.get('web_conf') or opts.get('webdir_conf') |
|
132 | 133 | if webconf: |
|
134 | if opts.get('subrepos'): | |
|
135 | raise error.Abort(_('--web-conf cannot be used with --subrepos')) | |
|
136 | ||
|
133 | 137 | # load server settings (e.g. web.port) to "copied" ui, which allows |
|
134 | 138 | # hgwebdir to reload webconf cleanly |
|
135 | 139 | servui = ui.copy() |
|
136 | 140 | servui.readconfig(webconf, sections=['web']) |
|
137 | 141 | alluis.add(servui) |
|
142 | elif opts.get('subrepos'): | |
|
143 | servui = ui | |
|
144 | ||
|
145 | # If repo is None, hgweb.createapp() already raises a proper abort | |
|
146 | # message as long as webconf is None. | |
|
147 | if repo: | |
|
148 | webconf = dict() | |
|
149 | cmdutil.addwebdirpath(repo, "", webconf) | |
|
138 | 150 | else: |
|
139 | 151 | servui = ui |
|
140 | 152 |
@@ -444,6 +444,15 b' class abstractsubrepo(object):' | |||
|
444 | 444 | self._ctx = ctx |
|
445 | 445 | self._path = path |
|
446 | 446 | |
|
447 | def addwebdirpath(self, serverpath, webconf): | |
|
448 | """Add the hgwebdir entries for this subrepo, and any of its subrepos. | |
|
449 | ||
|
450 | ``serverpath`` is the path component of the URL for this repo. | |
|
451 | ||
|
452 | ``webconf`` is the dictionary of hgwebdir entries. | |
|
453 | """ | |
|
454 | pass | |
|
455 | ||
|
447 | 456 | def storeclean(self, path): |
|
448 | 457 | """ |
|
449 | 458 | returns true if the repository has not changed since it was last |
@@ -651,6 +660,10 b' class hgsubrepo(abstractsubrepo):' | |||
|
651 | 660 | self.ui.setconfig('ui', '_usedassubrepo', 'True', 'subrepo') |
|
652 | 661 | self._initrepo(r, state[0], create) |
|
653 | 662 | |
|
663 | @annotatesubrepoerror | |
|
664 | def addwebdirpath(self, serverpath, webconf): | |
|
665 | cmdutil.addwebdirpath(self._repo, subrelpath(self), webconf) | |
|
666 | ||
|
654 | 667 | def storeclean(self, path): |
|
655 | 668 | with self._repo.lock(): |
|
656 | 669 | return self._storeclean(path) |
@@ -184,6 +184,7 b' Show the options for the "serve" command' | |||
|
184 | 184 | --repository |
|
185 | 185 | --stdio |
|
186 | 186 | --style |
|
187 | --subrepos | |
|
187 | 188 | --templates |
|
188 | 189 | --time |
|
189 | 190 | --traceback |
@@ -194,6 +195,7 b' Show the options for the "serve" command' | |||
|
194 | 195 | -A |
|
195 | 196 | -E |
|
196 | 197 | -R |
|
198 | -S | |
|
197 | 199 | -a |
|
198 | 200 | -d |
|
199 | 201 | -h |
@@ -225,7 +227,7 b' Show all commands + options' | |||
|
225 | 227 | pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure |
|
226 | 228 | push: force, rev, bookmark, branch, new-branch, ssh, remotecmd, insecure |
|
227 | 229 | remove: after, force, subrepos, include, exclude |
|
228 | serve: accesslog, daemon, daemon-postexec, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, cmdserver, templates, style, ipv6, certificate | |
|
230 | serve: accesslog, daemon, daemon-postexec, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, cmdserver, templates, style, ipv6, certificate, subrepos | |
|
229 | 231 | status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, copies, print0, rev, change, include, exclude, subrepos, template |
|
230 | 232 | summary: remote |
|
231 | 233 | update: clean, check, merge, date, rev, tool |
@@ -73,6 +73,43 b" Preparing the 'main' repo which depends " | |||
|
73 | 73 | adding main/main (glob) |
|
74 | 74 | $ hg commit -R main -m "main import" |
|
75 | 75 | |
|
76 | #if serve | |
|
77 | ||
|
78 | Unfortunately, subrepos not at their nominal location cannot be cloned. But | |
|
79 | they are still served from their location within the local repository. The only | |
|
80 | reason why 'main' can be cloned via the filesystem is because 'sub1' and 'sub2' | |
|
81 | are also available as siblings of 'main'. | |
|
82 | ||
|
83 | $ hg serve -R main --debug -S -p $HGPORT -d --pid-file=hg1.pid -E error.log -A access.log | |
|
84 | adding = $TESTTMP/main (glob) | |
|
85 | adding sub1 = $TESTTMP/main/sub1 (glob) | |
|
86 | adding sub1/sub2 = $TESTTMP/main/sub1/sub2 (glob) | |
|
87 | listening at http://*:$HGPORT/ (bound to *:$HGPORT) (glob) (?) | |
|
88 | adding = $TESTTMP/main (glob) (?) | |
|
89 | adding sub1 = $TESTTMP/main/sub1 (glob) (?) | |
|
90 | adding sub1/sub2 = $TESTTMP/main/sub1/sub2 (glob) (?) | |
|
91 | $ cat hg1.pid >> $DAEMON_PIDS | |
|
92 | ||
|
93 | $ hg clone http://localhost:$HGPORT httpclone --config progress.disable=True | |
|
94 | requesting all changes | |
|
95 | adding changesets | |
|
96 | adding manifests | |
|
97 | adding file changes | |
|
98 | added 1 changesets with 3 changes to 3 files | |
|
99 | updating to branch default | |
|
100 | abort: HTTP Error 404: Not Found | |
|
101 | [255] | |
|
102 | ||
|
103 | $ cat access.log | |
|
104 | * "GET /?cmd=capabilities HTTP/1.1" 200 - (glob) | |
|
105 | * "GET /?cmd=batch HTTP/1.1" 200 - * (glob) | |
|
106 | * "GET /?cmd=getbundle HTTP/1.1" 200 - * (glob) | |
|
107 | * "GET /../sub1?cmd=capabilities HTTP/1.1" 404 - (glob) | |
|
108 | ||
|
109 | $ killdaemons.py | |
|
110 | $ rm hg1.pid error.log access.log | |
|
111 | #endif | |
|
112 | ||
|
76 | 113 | Cleaning both repositories, just as a clone -U |
|
77 | 114 | |
|
78 | 115 | $ hg up -C -R sub2 null |
@@ -251,6 +251,60 b' Status between revisions:' | |||
|
251 | 251 | z1 |
|
252 | 252 | +z2 |
|
253 | 253 | |
|
254 | #if serve | |
|
255 | $ cd .. | |
|
256 | $ hg serve -R repo --debug -S -p $HGPORT -d --pid-file=hg1.pid -E error.log -A access.log | |
|
257 | adding = $TESTTMP/repo (glob) | |
|
258 | adding foo = $TESTTMP/repo/foo (glob) | |
|
259 | adding foo/bar = $TESTTMP/repo/foo/bar (glob) | |
|
260 | listening at http://*:$HGPORT/ (bound to *:$HGPORT) (glob) (?) | |
|
261 | adding = $TESTTMP/repo (glob) (?) | |
|
262 | adding foo = $TESTTMP/repo/foo (glob) (?) | |
|
263 | adding foo/bar = $TESTTMP/repo/foo/bar (glob) (?) | |
|
264 | $ cat hg1.pid >> $DAEMON_PIDS | |
|
265 | ||
|
266 | $ hg clone http://localhost:$HGPORT clone --config progress.disable=True | |
|
267 | requesting all changes | |
|
268 | adding changesets | |
|
269 | adding manifests | |
|
270 | adding file changes | |
|
271 | added 3 changesets with 5 changes to 3 files | |
|
272 | updating to branch default | |
|
273 | cloning subrepo foo from http://localhost:$HGPORT/foo | |
|
274 | requesting all changes | |
|
275 | adding changesets | |
|
276 | adding manifests | |
|
277 | adding file changes | |
|
278 | added 4 changesets with 7 changes to 3 files | |
|
279 | cloning subrepo foo/bar from http://localhost:$HGPORT/foo/bar (glob) | |
|
280 | requesting all changes | |
|
281 | adding changesets | |
|
282 | adding manifests | |
|
283 | adding file changes | |
|
284 | added 3 changesets with 3 changes to 1 files | |
|
285 | 3 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
|
286 | ||
|
287 | $ cat clone/foo/bar/z.txt | |
|
288 | z1 | |
|
289 | z2 | |
|
290 | z3 | |
|
291 | ||
|
292 | $ cat access.log | |
|
293 | * "GET /?cmd=capabilities HTTP/1.1" 200 - (glob) | |
|
294 | * "GET /?cmd=batch HTTP/1.1" 200 - * (glob) | |
|
295 | * "GET /?cmd=getbundle HTTP/1.1" 200 - * (glob) | |
|
296 | * "GET /foo?cmd=capabilities HTTP/1.1" 200 - (glob) | |
|
297 | * "GET /foo?cmd=batch HTTP/1.1" 200 - * (glob) | |
|
298 | * "GET /foo?cmd=getbundle HTTP/1.1" 200 - * (glob) | |
|
299 | * "GET /foo/bar?cmd=capabilities HTTP/1.1" 200 - (glob) | |
|
300 | * "GET /foo/bar?cmd=batch HTTP/1.1" 200 - * (glob) | |
|
301 | * "GET /foo/bar?cmd=getbundle HTTP/1.1" 200 - * (glob) | |
|
302 | ||
|
303 | $ killdaemons.py | |
|
304 | $ rm hg1.pid error.log access.log | |
|
305 | $ cd repo | |
|
306 | #endif | |
|
307 | ||
|
254 | 308 | Enable progress extension for archive tests: |
|
255 | 309 | |
|
256 | 310 | $ cp $HGRCPATH $HGRCPATH.no-progress |
General Comments 0
You need to be logged in to leave comments.
Login now