annotate onsub.py @ 0:e49f3bbfec4d

Initial version.
author Martin Geisler <mg@aragost.com>
date Mon, 06 Sep 2010 12:09:47 +0200
parents
children a2184bbf38e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
1
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
2 import os
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
3 from mercurial.i18n import _
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
4 from mercurial import extensions, subrepo, util
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
5
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
6 """execute a command in each subrepository"""
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
7
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
8 def onsub(ui, repo, *args, **opts):
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
9 """execute a command in each subrepository
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
10
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
11 The command is executed with the current working directory set to
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
12 the root of each subrepository. By default, execution stops if the
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
13 command returns a non-zero exit code. Use --ignore-errors to
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
14 override this.
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
15
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
16 Use --verbose/-v to print the name of each subrepo before the
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
17 command is executed, use --print0/-0 to terminate this line with a
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
18 NUL character instead of a newline. This can for instance be
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
19 useful in combination with :hg:`status --print0`.
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
20
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
21 The command has access to the following environment variables:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
22
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
23 ``HG_REPO``:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
24 Absolute path to the top-level repository in which the onsub
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
25 command was executed.
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
26
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
27 ``HG_SUBPATH``:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
28 Relative path to the current subrepository from the top-level
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
29 repository.
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
30
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
31 ``HG_SUBURL``:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
32 URL for the current subrepository as specified in the
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
33 containing repository's ``.hgsub`` file.
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
34
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
35 ``HG_SUBSTATE``:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
36 State of the current subrepository as specified in the
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
37 containing repository's ``.hgsubstate`` file.
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
38 """
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
39 cmd = ' '.join(args)
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
40 foreach(ui, repo, cmd, not opts.get('breadth_first'), opts.get('print0'))
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
41
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
42 def foreach(ui, repo, cmd, depthfirst, print0):
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
43 """execute cmd in repo.root and in each subrepository"""
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
44 ctx = repo['.']
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
45 work = [ctx.sub(subpath) for subpath in sorted(ctx.substate)]
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
46 if depthfirst:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
47 work.reverse()
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
48
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
49 while work:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
50 if depthfirst:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
51 sub = work.pop()
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
52 else:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
53 sub = work.pop(0)
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
54
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
55 relpath = subrepo.relpath(sub)
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
56 if print0:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
57 ui.write(relpath, "\0")
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
58 else:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
59 ui.note(_("executing '%s' in %s\n") % (cmd, relpath))
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
60 util.system(cmd, environ=dict(HG_SUBPATH=relpath,
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
61 HG_SUBURL=sub._path,
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
62 HG_SUBSTATE=sub._state[1],
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
63 HG_REPO=repo.root),
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
64 cwd=os.path.join(repo.root, relpath), onerr=util.Abort,
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
65 errprefix=_('terminated onsub in %s') % relpath)
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
66
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
67 if isinstance(sub, subrepo.hgsubrepo):
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
68 rev = sub._state[1]
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
69 ctx = sub._repo[rev]
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
70 w = [ctx.sub(subpath) for subpath in sorted(ctx.substate)]
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
71 if depthfirst:
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
72 w.reverse()
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
73 work.extend(w)
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
74
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
75 cmdtable = {
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
76 "onsub":
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
77 (onsub,
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
78 [('b', 'breadth-first', None,
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
79 _('use breadth-first traversal')),
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
80 ('0', 'print0', None,
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
81 _('end subrepository names with NUL, for use with xargs'))],
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
82 _('[-b] [-0] CMD'))
e49f3bbfec4d Initial version.
Martin Geisler <mg@aragost.com>
parents:
diff changeset
83 }