Show More
@@ -5,7 +5,7 b'' | |||
|
5 | 5 | # |
|
6 | 6 | # This software may be used and distributed according to the terms |
|
7 | 7 | # of the GNU General Public License, incorporated herein by reference. |
|
8 | '''allow graphing the number of lines (or count of revisions) grouped by template''' | |
|
8 | '''command to show certain statistics about revision history''' | |
|
9 | 9 | |
|
10 | 10 | from mercurial.i18n import _ |
|
11 | 11 | from mercurial import patch, cmdutil, util, templater |
@@ -180,5 +180,5 b' cmdtable = {' | |||
|
180 | 180 | ('s', 'sort', False, _('sort by key (default: sort by count)')), |
|
181 | 181 | ('', 'aliases', '', _('file with email aliases')), |
|
182 | 182 | ('', 'progress', None, _('show progress'))], |
|
183 |
_("hg |
|
|
183 | _("hg churn [-d DATE] [-r REV] [--aliases FILE] [--progress] [FILE]")), | |
|
184 | 184 | } |
@@ -1,4 +1,4 b'' | |||
|
1 | """a mercurial extension for syntax highlighting in hgweb | |
|
1 | """syntax highlighting in hgweb, based on Pygments | |
|
2 | 2 | |
|
3 | 3 | It depends on the pygments syntax highlighting library: |
|
4 | 4 | http://pygments.org/ |
@@ -4,66 +4,65 b'' | |||
|
4 | 4 | # |
|
5 | 5 | # This software may be used and distributed according to the terms |
|
6 | 6 | # of the GNU General Public License, incorporated herein by reference. |
|
7 | # | |
|
8 |
|
|
|
9 | # committed to a repo they subscribe to. | |
|
10 | # | |
|
11 |
|
|
|
12 | # configuring. | |
|
13 | # | |
|
14 | # to use, configure notify extension and enable in hgrc like this: | |
|
15 | # | |
|
16 | # [extensions] | |
|
17 | # hgext.notify = | |
|
18 | # | |
|
19 | # [hooks] | |
|
20 | # # one email for each incoming changeset | |
|
21 | # incoming.notify = python:hgext.notify.hook | |
|
22 | # # batch emails when many changesets incoming at one time | |
|
23 | # changegroup.notify = python:hgext.notify.hook | |
|
24 | # | |
|
25 | # [notify] | |
|
26 | # # config items go in here | |
|
27 | # | |
|
28 | # config items: | |
|
29 | # | |
|
30 | # REQUIRED: | |
|
31 | # config = /path/to/file # file containing subscriptions | |
|
32 | # | |
|
33 | # OPTIONAL: | |
|
34 |
|
|
|
35 | # strip = 3 # number of slashes to strip for url paths | |
|
36 | # domain = example.com # domain to use if committer missing domain | |
|
37 |
|
|
|
38 |
|
|
|
39 |
|
|
|
40 | # changegroup = ... # template when run as changegroup hook | |
|
41 | # maxdiff = 300 # max lines of diffs to include (0=none, -1=all) | |
|
42 | # maxsubject = 67 # truncate subject line longer than this | |
|
43 | # diffstat = True # add a diffstat before the diff content | |
|
44 | # sources = serve # notify if source of incoming changes in this list | |
|
45 | # # (serve == ssh or http, push, pull, bundle) | |
|
46 | # [email] | |
|
47 | # from = user@host.com # email address to send as if none given | |
|
48 | # [web] | |
|
49 | # baseurl = http://hgserver/... # root of hg web site for browsing commits | |
|
50 | # | |
|
51 | # notify config file has same format as regular hgrc. it has two | |
|
52 | # sections so you can express subscriptions in whatever way is handier | |
|
53 | # for you. | |
|
54 | # | |
|
55 | # [usersubs] | |
|
56 | # # key is subscriber email, value is ","-separated list of glob patterns | |
|
57 | # user@host = pattern | |
|
58 | # | |
|
59 | # [reposubs] | |
|
60 | # # key is glob pattern, value is ","-separated list of subscriber emails | |
|
61 | # pattern = user@host | |
|
62 | # | |
|
63 | # glob patterns are matched against path to repo root. | |
|
64 | # | |
|
65 | # if you like, you can put notify config file in repo that users can | |
|
66 | # push changes to, they can manage their own subscriptions. | |
|
7 | ||
|
8 | '''hook extension to email notifications on commits/pushes | |
|
9 | ||
|
10 | Subscriptions can be managed through hgrc. Default mode is to print | |
|
11 | messages to stdout, for testing and configuring. | |
|
12 | ||
|
13 | To use, configure notify extension and enable in hgrc like this: | |
|
14 | ||
|
15 | [extensions] | |
|
16 | hgext.notify = | |
|
17 | ||
|
18 | [hooks] | |
|
19 | # one email for each incoming changeset | |
|
20 | incoming.notify = python:hgext.notify.hook | |
|
21 | # batch emails when many changesets incoming at one time | |
|
22 | changegroup.notify = python:hgext.notify.hook | |
|
23 | ||
|
24 | [notify] | |
|
25 | # config items go in here | |
|
26 | ||
|
27 | config items: | |
|
28 | ||
|
29 | REQUIRED: | |
|
30 | config = /path/to/file # file containing subscriptions | |
|
31 | ||
|
32 | OPTIONAL: | |
|
33 | test = True # print messages to stdout for testing | |
|
34 | strip = 3 # number of slashes to strip for url paths | |
|
35 | domain = example.com # domain to use if committer missing domain | |
|
36 | style = ... # style file to use when formatting email | |
|
37 | template = ... # template to use when formatting email | |
|
38 | incoming = ... # template to use when run as incoming hook | |
|
39 | changegroup = ... # template when run as changegroup hook | |
|
40 | maxdiff = 300 # max lines of diffs to include (0=none, -1=all) | |
|
41 | maxsubject = 67 # truncate subject line longer than this | |
|
42 | diffstat = True # add a diffstat before the diff content | |
|
43 | sources = serve # notify if source of incoming changes in this list | |
|
44 | # (serve == ssh or http, push, pull, bundle) | |
|
45 | [email] | |
|
46 | from = user@host.com # email address to send as if none given | |
|
47 | [web] | |
|
48 | baseurl = http://hgserver/... # root of hg web site for browsing commits | |
|
49 | ||
|
50 | notify config file has same format as regular hgrc. it has two | |
|
51 | sections so you can express subscriptions in whatever way is handier | |
|
52 | for you. | |
|
53 | ||
|
54 | [usersubs] | |
|
55 | # key is subscriber email, value is ","-separated list of glob patterns | |
|
56 | user@host = pattern | |
|
57 | ||
|
58 | [reposubs] | |
|
59 | # key is glob pattern, value is ","-separated list of subscriber emails | |
|
60 | pattern = user@host | |
|
61 | ||
|
62 | glob patterns are matched against path to repo root. | |
|
63 | ||
|
64 | if you like, you can put notify config file in repo that users can | |
|
65 | push changes to, they can manage their own subscriptions.''' | |
|
67 | 66 | |
|
68 | 67 | from mercurial.i18n import _ |
|
69 | 68 | from mercurial.node import bin, short |
@@ -5,7 +5,7 b'' | |||
|
5 | 5 | # This software may be used and distributed according to the terms |
|
6 | 6 | # of the GNU General Public License, incorporated herein by reference. |
|
7 | 7 | |
|
8 | ''' Rebasing feature | |
|
8 | '''move sets of revisions to a different ancestor | |
|
9 | 9 | |
|
10 | 10 | This extension lets you rebase changesets in an existing Mercurial repository. |
|
11 | 11 | |
@@ -105,6 +105,8 b' def rebase(ui, repo, **opts):' | |||
|
105 | 105 | |
|
106 | 106 | clearstatus(repo) |
|
107 | 107 | ui.status(_("rebase completed\n")) |
|
108 | if os.path.exists(repo.sjoin('undo')): | |
|
109 | util.unlink(repo.sjoin('undo')) | |
|
108 | 110 | if skipped: |
|
109 | 111 | ui.note(_("%d revisions have been skipped\n") % len(skipped)) |
|
110 | 112 | finally: |
@@ -94,12 +94,12 b' def annotate(ui, repo, *pats, **opts):' | |||
|
94 | 94 | ('follow', lambda x: x[0].path()), |
|
95 | 95 | ] |
|
96 | 96 | |
|
97 |
if (not opts |
|
|
98 |
and not opts |
|
|
97 | if (not opts.get('user') and not opts.get('changeset') and not opts.get('date') | |
|
98 | and not opts.get('follow')): | |
|
99 | 99 | opts['number'] = 1 |
|
100 | 100 | |
|
101 | 101 | linenumber = opts.get('line_number') is not None |
|
102 |
if (linenumber and (not opts |
|
|
102 | if (linenumber and (not opts.get('changeset')) and (not opts.get('number'))): | |
|
103 | 103 | raise util.Abort(_('at least one of -n/-c is required for -l')) |
|
104 | 104 | |
|
105 | 105 | funcmap = [func for op, func in opmap if opts.get(op)] |
@@ -107,12 +107,12 b' def annotate(ui, repo, *pats, **opts):' | |||
|
107 | 107 | lastfunc = funcmap[-1] |
|
108 | 108 | funcmap[-1] = lambda x: "%s:%s" % (lastfunc(x), x[1]) |
|
109 | 109 | |
|
110 |
ctx = repo[opts |
|
|
110 | ctx = repo[opts.get('rev')] | |
|
111 | 111 | |
|
112 | 112 | m = cmdutil.match(repo, pats, opts) |
|
113 | 113 | for abs in ctx.walk(m): |
|
114 | 114 | fctx = ctx[abs] |
|
115 |
if not opts |
|
|
115 | if not opts.get('text') and util.binary(fctx.data()): | |
|
116 | 116 | ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs)) |
|
117 | 117 | continue |
|
118 | 118 | |
@@ -154,7 +154,7 b' def archive(ui, repo, dest, **opts):' | |||
|
154 | 154 | The default is the basename of the archive, with suffixes removed. |
|
155 | 155 | ''' |
|
156 | 156 | |
|
157 |
ctx = repo[opts |
|
|
157 | ctx = repo[opts.get('rev')] | |
|
158 | 158 | if not ctx: |
|
159 | 159 | raise util.Abort(_('repository has no revisions')) |
|
160 | 160 | node = ctx.node() |
@@ -163,14 +163,14 b' def archive(ui, repo, dest, **opts):' | |||
|
163 | 163 | raise util.Abort(_('repository root cannot be destination')) |
|
164 | 164 | matchfn = cmdutil.match(repo, [], opts) |
|
165 | 165 | kind = opts.get('type') or 'files' |
|
166 |
prefix = opts |
|
|
166 | prefix = opts.get('prefix') | |
|
167 | 167 | if dest == '-': |
|
168 | 168 | if kind == 'files': |
|
169 | 169 | raise util.Abort(_('cannot archive plain files to stdout')) |
|
170 | 170 | dest = sys.stdout |
|
171 | 171 | if not prefix: prefix = os.path.basename(repo.root) + '-%h' |
|
172 | 172 | prefix = cmdutil.make_filename(repo, prefix, node) |
|
173 |
archival.archive(repo, dest, node, kind, not opts |
|
|
173 | archival.archive(repo, dest, node, kind, not opts.get('no_decode'), | |
|
174 | 174 | matchfn, prefix) |
|
175 | 175 | |
|
176 | 176 | def backout(ui, repo, node=None, rev=None, **opts): |
@@ -216,7 +216,7 b' def backout(ui, repo, node=None, rev=Non' | |||
|
216 | 216 | if p1 == nullid: |
|
217 | 217 | raise util.Abort(_('cannot back out a change with no parents')) |
|
218 | 218 | if p2 != nullid: |
|
219 |
if not opts |
|
|
219 | if not opts.get('parent'): | |
|
220 | 220 | raise util.Abort(_('cannot back out a merge changeset without ' |
|
221 | 221 | '--parent')) |
|
222 | 222 | p = repo.lookup(opts['parent']) |
@@ -225,7 +225,7 b' def backout(ui, repo, node=None, rev=Non' | |||
|
225 | 225 | (short(p), short(node))) |
|
226 | 226 | parent = p |
|
227 | 227 | else: |
|
228 |
if opts |
|
|
228 | if opts.get('parent'): | |
|
229 | 229 | raise util.Abort(_('cannot use --parent on non-merge changeset')) |
|
230 | 230 | parent = p1 |
|
231 | 231 | |
@@ -251,7 +251,7 b' def backout(ui, repo, node=None, rev=Non' | |||
|
251 | 251 | (nice(repo.changelog.tip()), nice(node))) |
|
252 | 252 | if op1 != node: |
|
253 | 253 | hg.clean(repo, op1, show_stats=False) |
|
254 |
if opts |
|
|
254 | if opts.get('merge'): | |
|
255 | 255 | ui.status(_('merging with changeset %s\n') % nice(repo.changelog.tip())) |
|
256 | 256 | hg.merge(repo, hex(repo.changelog.tip())) |
|
257 | 257 | else: |
@@ -478,7 +478,7 b' def bundle(ui, repo, fname, dest=None, *' | |||
|
478 | 478 | dest, revs, checkout = hg.parseurl( |
|
479 | 479 | ui.expandpath(dest or 'default-push', dest or 'default'), revs) |
|
480 | 480 | other = hg.repository(ui, dest) |
|
481 |
o = repo.findoutgoing(other, force=opts |
|
|
481 | o = repo.findoutgoing(other, force=opts.get('force')) | |
|
482 | 482 | |
|
483 | 483 | if revs: |
|
484 | 484 | cg = repo.changegroupsubset(o, revs, 'bundle') |
@@ -508,11 +508,11 b' def cat(ui, repo, file1, *pats, **opts):' | |||
|
508 | 508 | %d dirname of file being printed, or '.' if in repo root |
|
509 | 509 | %p root-relative path name of file being printed |
|
510 | 510 | """ |
|
511 |
ctx = repo[opts |
|
|
511 | ctx = repo[opts.get('rev')] | |
|
512 | 512 | err = 1 |
|
513 | 513 | m = cmdutil.match(repo, (file1,) + pats, opts) |
|
514 | 514 | for abs in ctx.walk(m): |
|
515 |
fp = cmdutil.make_file(repo, opts |
|
|
515 | fp = cmdutil.make_file(repo, opts.get('output'), ctx.node(), pathname=abs) | |
|
516 | 516 | data = ctx[abs].data() |
|
517 | 517 | if opts.get('decode'): |
|
518 | 518 | data = repo.wwritedata(abs, data) |
@@ -566,10 +566,10 b' def clone(ui, source, dest=None, **opts)' | |||
|
566 | 566 | """ |
|
567 | 567 | cmdutil.setremoteconfig(ui, opts) |
|
568 | 568 | hg.clone(ui, source, dest, |
|
569 |
pull=opts |
|
|
570 |
stream=opts |
|
|
571 |
rev=opts |
|
|
572 |
update=not opts |
|
|
569 | pull=opts.get('pull'), | |
|
570 | stream=opts.get('uncompressed'), | |
|
571 | rev=opts.get('rev'), | |
|
572 | update=not opts.get('noupdate')) | |
|
573 | 573 | |
|
574 | 574 | def commit(ui, repo, *pats, **opts): |
|
575 | 575 | """commit the specified files or all outstanding changes |
@@ -588,7 +588,7 b' def commit(ui, repo, *pats, **opts):' | |||
|
588 | 588 | See 'hg help dates' for a list of formats valid for -d/--date. |
|
589 | 589 | """ |
|
590 | 590 | def commitfunc(ui, repo, message, match, opts): |
|
591 |
return repo.commit(match.files(), message, opts |
|
|
591 | return repo.commit(match.files(), message, opts.get('user'), opts.get('date'), | |
|
592 | 592 | match, force_editor=opts.get('force_editor')) |
|
593 | 593 | |
|
594 | 594 | node = cmdutil.commit(ui, repo, commitfunc, pats, opts) |
@@ -651,7 +651,7 b' def debugancestor(ui, repo, *args):' | |||
|
651 | 651 | def debugcomplete(ui, cmd='', **opts): |
|
652 | 652 | """returns the completion list associated with the given command""" |
|
653 | 653 | |
|
654 |
if opts |
|
|
654 | if opts.get('options'): | |
|
655 | 655 | options = [] |
|
656 | 656 | otables = [globalopts] |
|
657 | 657 | if cmd: |
@@ -981,7 +981,7 b' def diff(ui, repo, *pats, **opts):' | |||
|
981 | 981 | it detects as binary. With -a, diff will generate a diff anyway, |
|
982 | 982 | probably with undesirable results. |
|
983 | 983 | """ |
|
984 |
node1, node2 = cmdutil.revpair(repo, opts |
|
|
984 | node1, node2 = cmdutil.revpair(repo, opts.get('rev')) | |
|
985 | 985 | |
|
986 | 986 | m = cmdutil.match(repo, pats, opts) |
|
987 | 987 | patch.diff(repo, node1, node2, match=m, opts=patch.diffopts(ui, opts)) |
@@ -1023,8 +1023,8 b' def export(ui, repo, *changesets, **opts' | |||
|
1023 | 1023 | ui.note(_('exporting patches:\n')) |
|
1024 | 1024 | else: |
|
1025 | 1025 | ui.note(_('exporting patch:\n')) |
|
1026 |
patch.export(repo, revs, template=opts |
|
|
1027 |
switch_parent=opts |
|
|
1026 | patch.export(repo, revs, template=opts.get('output'), | |
|
1027 | switch_parent=opts.get('switch_parent'), | |
|
1028 | 1028 | opts=patch.diffopts(ui, opts)) |
|
1029 | 1029 | |
|
1030 | 1030 | def grep(ui, repo, pattern, *pats, **opts): |
@@ -1044,7 +1044,7 b' def grep(ui, repo, pattern, *pats, **opt' | |||
|
1044 | 1044 | use the --all flag. |
|
1045 | 1045 | """ |
|
1046 | 1046 | reflags = 0 |
|
1047 |
if opts |
|
|
1047 | if opts.get('ignore_case'): | |
|
1048 | 1048 | reflags |= re.I |
|
1049 | 1049 | try: |
|
1050 | 1050 | regexp = re.compile(pattern, reflags) |
@@ -1052,7 +1052,7 b' def grep(ui, repo, pattern, *pats, **opt' | |||
|
1052 | 1052 | ui.warn(_("grep: invalid match pattern: %s\n") % inst) |
|
1053 | 1053 | return None |
|
1054 | 1054 | sep, eol = ':', '\n' |
|
1055 |
if opts |
|
|
1055 | if opts.get('print0'): | |
|
1056 | 1056 | sep = eol = '\0' |
|
1057 | 1057 | |
|
1058 | 1058 | fcache = {} |
@@ -1118,21 +1118,21 b' def grep(ui, repo, pattern, *pats, **opt' | |||
|
1118 | 1118 | found = False |
|
1119 | 1119 | filerevmatches = {} |
|
1120 | 1120 | r = prev.get(fn, -1) |
|
1121 |
if opts |
|
|
1121 | if opts.get('all'): | |
|
1122 | 1122 | iter = difflinestates(states, prevstates) |
|
1123 | 1123 | else: |
|
1124 | 1124 | iter = [('', l) for l in prevstates] |
|
1125 | 1125 | for change, l in iter: |
|
1126 | 1126 | cols = [fn, str(r)] |
|
1127 |
if opts |
|
|
1127 | if opts.get('line_number'): | |
|
1128 | 1128 | cols.append(str(l.linenum)) |
|
1129 |
if opts |
|
|
1129 | if opts.get('all'): | |
|
1130 | 1130 | cols.append(change) |
|
1131 |
if opts |
|
|
1131 | if opts.get('user'): | |
|
1132 | 1132 | cols.append(ui.shortuser(get(r)[1])) |
|
1133 | 1133 | if opts.get('date'): |
|
1134 | 1134 | cols.append(datefunc(get(r)[2])) |
|
1135 |
if opts |
|
|
1135 | if opts.get('files_with_matches'): | |
|
1136 | 1136 | c = (fn, r) |
|
1137 | 1137 | if c in filerevmatches: |
|
1138 | 1138 | continue |
@@ -1177,7 +1177,7 b' def grep(ui, repo, pattern, *pats, **opt' | |||
|
1177 | 1177 | if fn in prev or fstate[fn]: |
|
1178 | 1178 | r = display(fn, rev, m, fstate[fn]) |
|
1179 | 1179 | found = found or r |
|
1180 |
if r and not opts |
|
|
1180 | if r and not opts.get('all'): | |
|
1181 | 1181 | skip[fn] = True |
|
1182 | 1182 | if copy: |
|
1183 | 1183 | skip[copy] = True |
@@ -1210,7 +1210,7 b' def heads(ui, repo, *branchrevs, **opts)' | |||
|
1210 | 1210 | no child changesets with that tag. They are usually where |
|
1211 | 1211 | development on the given branch takes place. |
|
1212 | 1212 | """ |
|
1213 |
if opts |
|
|
1213 | if opts.get('rev'): | |
|
1214 | 1214 | start = repo.lookup(opts['rev']) |
|
1215 | 1215 | else: |
|
1216 | 1216 | start = None |
@@ -1230,10 +1230,10 b' def heads(ui, repo, *branchrevs, **opts)' | |||
|
1230 | 1230 | if branch != branchrev: |
|
1231 | 1231 | ui.warn(_("no changes on branch %s containing %s are " |
|
1232 | 1232 | "reachable from %s\n") |
|
1233 |
% (branch, branchrev, opts |
|
|
1233 | % (branch, branchrev, opts.get('rev'))) | |
|
1234 | 1234 | else: |
|
1235 | 1235 | ui.warn(_("no changes on branch %s are reachable from %s\n") |
|
1236 |
% (branch, opts |
|
|
1236 | % (branch, opts.get('rev'))) | |
|
1237 | 1237 | heads.extend(bheads) |
|
1238 | 1238 | if not heads: |
|
1239 | 1239 | return 1 |
@@ -1310,6 +1310,8 b' def help_(ui, name=None, with_version=Fa' | |||
|
1310 | 1310 | f = c.split("|", 1)[0] |
|
1311 | 1311 | if select and not select(f): |
|
1312 | 1312 | continue |
|
1313 | if select is None and e[0].__module__ != __name__: | |
|
1314 | continue | |
|
1313 | 1315 | if name == "shortlist" and not f.startswith("^"): |
|
1314 | 1316 | continue |
|
1315 | 1317 | f = f.lstrip("^") |
@@ -1335,6 +1337,19 b' def help_(ui, name=None, with_version=Fa' | |||
|
1335 | 1337 | else: |
|
1336 | 1338 | ui.write(' %-*s %s\n' % (m, f, h[f])) |
|
1337 | 1339 | |
|
1340 | exts = list(extensions.extensions()) | |
|
1341 | if exts: | |
|
1342 | ui.write(_('\nenabled extensions:\n\n')) | |
|
1343 | maxlength = 0 | |
|
1344 | exthelps = [] | |
|
1345 | for ename, ext in exts: | |
|
1346 | doc = (ext.__doc__ or _('(no help text available)')) | |
|
1347 | ename = ename.split('.')[-1] | |
|
1348 | maxlength = max(len(ename), maxlength) | |
|
1349 | exthelps.append((ename, doc.splitlines(0)[0].strip())) | |
|
1350 | for ename, text in exthelps: | |
|
1351 | ui.write(_(' %s %s\n') % (ename.ljust(maxlength), text)) | |
|
1352 | ||
|
1338 | 1353 | if not ui.quiet: |
|
1339 | 1354 | addglobalopts(True) |
|
1340 | 1355 | |
@@ -1538,7 +1553,7 b' def import_(ui, repo, patch1, *patches, ' | |||
|
1538 | 1553 | if date: |
|
1539 | 1554 | opts['date'] = util.parsedate(date) |
|
1540 | 1555 | |
|
1541 |
if opts.get('exact') or not opts |
|
|
1556 | if opts.get('exact') or not opts.get('force'): | |
|
1542 | 1557 | cmdutil.bail_if_changed(repo) |
|
1543 | 1558 | |
|
1544 | 1559 | d = opts["base"] |
@@ -1633,7 +1648,7 b' def incoming(ui, repo, source="default",' | |||
|
1633 | 1648 | See pull for valid source format details. |
|
1634 | 1649 | """ |
|
1635 | 1650 | limit = cmdutil.loglimit(opts) |
|
1636 |
source, revs, checkout = hg.parseurl(ui.expandpath(source), opts |
|
|
1651 | source, revs, checkout = hg.parseurl(ui.expandpath(source), opts.get('rev')) | |
|
1637 | 1652 | cmdutil.setremoteconfig(ui, opts) |
|
1638 | 1653 | |
|
1639 | 1654 | other = hg.repository(ui, source) |
@@ -1668,7 +1683,7 b' def incoming(ui, repo, source="default",' | |||
|
1668 | 1683 | other = bundlerepo.bundlerepository(ui, repo.root, fname) |
|
1669 | 1684 | |
|
1670 | 1685 | o = other.changelog.nodesbetween(incoming, revs)[0] |
|
1671 |
if opts |
|
|
1686 | if opts.get('newest_first'): | |
|
1672 | 1687 | o.reverse() |
|
1673 | 1688 | displayer = cmdutil.show_changeset(ui, other, opts) |
|
1674 | 1689 | count = 0 |
@@ -1676,7 +1691,7 b' def incoming(ui, repo, source="default",' | |||
|
1676 | 1691 | if count >= limit: |
|
1677 | 1692 | break |
|
1678 | 1693 | parents = [p for p in other.changelog.parents(n) if p != nullid] |
|
1679 |
if opts |
|
|
1694 | if opts.get('no_merges') and len(parents) == 2: | |
|
1680 | 1695 | continue |
|
1681 | 1696 | count += 1 |
|
1682 | 1697 | displayer.show(changenode=n) |
@@ -1719,7 +1734,7 b' def locate(ui, repo, *pats, **opts):' | |||
|
1719 | 1734 | This will avoid the problem of "xargs" treating single filenames |
|
1720 | 1735 | that contain white space as multiple filenames. |
|
1721 | 1736 | """ |
|
1722 |
end = opts |
|
|
1737 | end = opts.get('print0') and '\0' or '\n' | |
|
1723 | 1738 | rev = opts.get('rev') or None |
|
1724 | 1739 | |
|
1725 | 1740 | ret = 1 |
@@ -1728,7 +1743,7 b' def locate(ui, repo, *pats, **opts):' | |||
|
1728 | 1743 | for abs in repo[rev].walk(m): |
|
1729 | 1744 | if not rev and abs not in repo.dirstate: |
|
1730 | 1745 | continue |
|
1731 |
if opts |
|
|
1746 | if opts.get('fullpath'): | |
|
1732 | 1747 | ui.write(os.path.join(repo.root, abs), end) |
|
1733 | 1748 | else: |
|
1734 | 1749 | ui.write(((pats and m.rel(abs)) or abs), end) |
@@ -1772,8 +1787,8 b' def log(ui, repo, *pats, **opts):' | |||
|
1772 | 1787 | limit = cmdutil.loglimit(opts) |
|
1773 | 1788 | count = 0 |
|
1774 | 1789 | |
|
1775 |
if opts |
|
|
1776 |
endrev = max(cmdutil.revrange(repo, opts |
|
|
1790 | if opts.get('copies') and opts.get('rev'): | |
|
1791 | endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1 | |
|
1777 | 1792 | else: |
|
1778 | 1793 | endrev = len(repo) |
|
1779 | 1794 | rcache = {} |
@@ -1812,7 +1827,7 b' def log(ui, repo, *pats, **opts):' | |||
|
1812 | 1827 | if opts["date"]: |
|
1813 | 1828 | df = util.matchdate(opts["date"]) |
|
1814 | 1829 | |
|
1815 |
only_branches = opts |
|
|
1830 | only_branches = opts.get('only_branch') | |
|
1816 | 1831 | |
|
1817 | 1832 | displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn) |
|
1818 | 1833 | for st, rev, fns in changeiter: |
@@ -1820,9 +1835,9 b' def log(ui, repo, *pats, **opts):' | |||
|
1820 | 1835 | changenode = repo.changelog.node(rev) |
|
1821 | 1836 | parents = [p for p in repo.changelog.parentrevs(rev) |
|
1822 | 1837 | if p != nullrev] |
|
1823 |
if opts |
|
|
1838 | if opts.get('no_merges') and len(parents) == 2: | |
|
1824 | 1839 | continue |
|
1825 |
if opts |
|
|
1840 | if opts.get('only_merges') and len(parents) != 2: | |
|
1826 | 1841 | continue |
|
1827 | 1842 | |
|
1828 | 1843 | if only_branches: |
@@ -1835,7 +1850,7 b' def log(ui, repo, *pats, **opts):' | |||
|
1835 | 1850 | if not df(changes[2][0]): |
|
1836 | 1851 | continue |
|
1837 | 1852 | |
|
1838 |
if opts |
|
|
1853 | if opts.get('keyword'): | |
|
1839 | 1854 | changes = get(rev) |
|
1840 | 1855 | miss = 0 |
|
1841 | 1856 | for k in [kw.lower() for kw in opts['keyword']]: |
@@ -1943,19 +1958,19 b' def outgoing(ui, repo, dest=None, **opts' | |||
|
1943 | 1958 | """ |
|
1944 | 1959 | limit = cmdutil.loglimit(opts) |
|
1945 | 1960 | dest, revs, checkout = hg.parseurl( |
|
1946 |
ui.expandpath(dest or 'default-push', dest or 'default'), opts |
|
|
1961 | ui.expandpath(dest or 'default-push', dest or 'default'), opts.get('rev')) | |
|
1947 | 1962 | cmdutil.setremoteconfig(ui, opts) |
|
1948 | 1963 | if revs: |
|
1949 | 1964 | revs = [repo.lookup(rev) for rev in revs] |
|
1950 | 1965 | |
|
1951 | 1966 | other = hg.repository(ui, dest) |
|
1952 | 1967 | ui.status(_('comparing with %s\n') % util.hidepassword(dest)) |
|
1953 |
o = repo.findoutgoing(other, force=opts |
|
|
1968 | o = repo.findoutgoing(other, force=opts.get('force')) | |
|
1954 | 1969 | if not o: |
|
1955 | 1970 | ui.status(_("no changes found\n")) |
|
1956 | 1971 | return 1 |
|
1957 | 1972 | o = repo.changelog.nodesbetween(o, revs)[0] |
|
1958 |
if opts |
|
|
1973 | if opts.get('newest_first'): | |
|
1959 | 1974 | o.reverse() |
|
1960 | 1975 | displayer = cmdutil.show_changeset(ui, repo, opts) |
|
1961 | 1976 | count = 0 |
@@ -1963,7 +1978,7 b' def outgoing(ui, repo, dest=None, **opts' | |||
|
1963 | 1978 | if count >= limit: |
|
1964 | 1979 | break |
|
1965 | 1980 | parents = [p for p in repo.changelog.parents(n) if p != nullid] |
|
1966 |
if opts |
|
|
1981 | if opts.get('no_merges') and len(parents) == 2: | |
|
1967 | 1982 | continue |
|
1968 | 1983 | count += 1 |
|
1969 | 1984 | displayer.show(changenode=n) |
@@ -2082,7 +2097,7 b' def pull(ui, repo, source="default", **o' | |||
|
2082 | 2097 | Alternatively specify "ssh -C" as your ssh command in your hgrc or |
|
2083 | 2098 | with the --ssh command line option. |
|
2084 | 2099 | """ |
|
2085 |
source, revs, checkout = hg.parseurl(ui.expandpath(source), opts |
|
|
2100 | source, revs, checkout = hg.parseurl(ui.expandpath(source), opts.get('rev')) | |
|
2086 | 2101 | cmdutil.setremoteconfig(ui, opts) |
|
2087 | 2102 | |
|
2088 | 2103 | other = hg.repository(ui, source) |
@@ -2095,8 +2110,8 b' def pull(ui, repo, source="default", **o' | |||
|
2095 | 2110 | "so a rev cannot be specified.") |
|
2096 | 2111 | raise util.Abort(error) |
|
2097 | 2112 | |
|
2098 |
modheads = repo.pull(other, heads=revs, force=opts |
|
|
2099 |
return postincoming(ui, repo, modheads, opts |
|
|
2113 | modheads = repo.pull(other, heads=revs, force=opts.get('force')) | |
|
2114 | return postincoming(ui, repo, modheads, opts.get('update'), checkout) | |
|
2100 | 2115 | |
|
2101 | 2116 | def push(ui, repo, dest=None, **opts): |
|
2102 | 2117 | """push changes to the specified destination |
@@ -2130,14 +2145,14 b' def push(ui, repo, dest=None, **opts):' | |||
|
2130 | 2145 | feature is explicitly enabled on the remote Mercurial server. |
|
2131 | 2146 | """ |
|
2132 | 2147 | dest, revs, checkout = hg.parseurl( |
|
2133 |
ui.expandpath(dest or 'default-push', dest or 'default'), opts |
|
|
2148 | ui.expandpath(dest or 'default-push', dest or 'default'), opts.get('rev')) | |
|
2134 | 2149 | cmdutil.setremoteconfig(ui, opts) |
|
2135 | 2150 | |
|
2136 | 2151 | other = hg.repository(ui, dest) |
|
2137 | 2152 | ui.status(_('pushing to %s\n') % util.hidepassword(dest)) |
|
2138 | 2153 | if revs: |
|
2139 | 2154 | revs = [repo.lookup(rev) for rev in revs] |
|
2140 |
r = repo.push(other, opts |
|
|
2155 | r = repo.push(other, opts.get('force'), revs=revs) | |
|
2141 | 2156 | return r == 0 |
|
2142 | 2157 | |
|
2143 | 2158 | def rawcommit(ui, repo, *pats, **opts): |
@@ -2158,7 +2173,7 b' def rawcommit(ui, repo, *pats, **opts):' | |||
|
2158 | 2173 | message = cmdutil.logmessage(opts) |
|
2159 | 2174 | |
|
2160 | 2175 | files = cmdutil.match(repo, pats, opts).files() |
|
2161 |
if opts |
|
|
2176 | if opts.get('files'): | |
|
2162 | 2177 | files += open(opts['files']).read().splitlines() |
|
2163 | 2178 | |
|
2164 | 2179 | parents = [repo.lookup(p) for p in opts['parent']] |
@@ -2327,15 +2342,15 b' def revert(ui, repo, *pats, **opts):' | |||
|
2327 | 2342 | raise util.Abort(_("you can't specify a revision and a date")) |
|
2328 | 2343 | opts["rev"] = cmdutil.finddate(ui, repo, opts["date"]) |
|
2329 | 2344 | |
|
2330 |
if not pats and not opts |
|
|
2345 | if not pats and not opts.get('all'): | |
|
2331 | 2346 | raise util.Abort(_('no files or directories specified; ' |
|
2332 | 2347 | 'use --all to revert the whole repo')) |
|
2333 | 2348 | |
|
2334 | 2349 | parent, p2 = repo.dirstate.parents() |
|
2335 |
if not opts |
|
|
2350 | if not opts.get('rev') and p2 != nullid: | |
|
2336 | 2351 | raise util.Abort(_('uncommitted merge - please provide a ' |
|
2337 | 2352 | 'specific revision')) |
|
2338 |
ctx = repo[opts |
|
|
2353 | ctx = repo[opts.get('rev')] | |
|
2339 | 2354 | node = ctx.node() |
|
2340 | 2355 | mf = ctx.manifest() |
|
2341 | 2356 | if node == parent: |
@@ -2417,7 +2432,7 b' def revert(ui, repo, *pats, **opts):' | |||
|
2417 | 2432 | target = repo.wjoin(abs) |
|
2418 | 2433 | def handle(xlist, dobackup): |
|
2419 | 2434 | xlist[0].append(abs) |
|
2420 |
if dobackup and not opts |
|
|
2435 | if dobackup and not opts.get('no_backup') and util.lexists(target): | |
|
2421 | 2436 | bakname = "%s.orig" % rel |
|
2422 | 2437 | ui.note(_('saving current version of %s as %s\n') % |
|
2423 | 2438 | (rel, bakname)) |
@@ -2638,11 +2653,11 b' def status(ui, repo, *pats, **opts):' | |||
|
2638 | 2653 | |
|
2639 | 2654 | node1, node2 = cmdutil.revpair(repo, opts.get('rev')) |
|
2640 | 2655 | cwd = (pats and repo.getcwd()) or '' |
|
2641 |
end = opts |
|
|
2656 | end = opts.get('print0') and '\0' or '\n' | |
|
2642 | 2657 | copy = {} |
|
2643 | 2658 | states = 'modified added removed deleted unknown ignored clean'.split() |
|
2644 | 2659 | show = [k for k in states if opts[k]] |
|
2645 |
if opts |
|
|
2660 | if opts.get('all'): | |
|
2646 | 2661 | show += ui.quiet and (states[:4] + ['clean']) or states |
|
2647 | 2662 | if not show: |
|
2648 | 2663 | show = ui.quiet and states[:4] or states[:5] |
@@ -2651,7 +2666,7 b' def status(ui, repo, *pats, **opts):' | |||
|
2651 | 2666 | 'ignored' in show, 'clean' in show, 'unknown' in show) |
|
2652 | 2667 | changestates = zip(states, 'MAR!?IC', stat) |
|
2653 | 2668 | |
|
2654 |
if (opts |
|
|
2669 | if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'): | |
|
2655 | 2670 | ctxn = repo[nullid] |
|
2656 | 2671 | ctx1 = repo[node1] |
|
2657 | 2672 | ctx2 = repo[node2] |
@@ -2668,7 +2683,7 b' def status(ui, repo, *pats, **opts):' | |||
|
2668 | 2683 | for state, char, files in changestates: |
|
2669 | 2684 | if state in show: |
|
2670 | 2685 | format = "%s %%s%s" % (char, end) |
|
2671 |
if opts |
|
|
2686 | if opts.get('no_status'): | |
|
2672 | 2687 | format = "%%s%s" % end |
|
2673 | 2688 | |
|
2674 | 2689 | for f in files: |
@@ -2704,13 +2719,13 b' def tag(ui, repo, name1, *names, **opts)' | |||
|
2704 | 2719 | for n in names: |
|
2705 | 2720 | if n in ['tip', '.', 'null']: |
|
2706 | 2721 | raise util.Abort(_('the name \'%s\' is reserved') % n) |
|
2707 |
if opts |
|
|
2722 | if opts.get('rev') and opts.get('remove'): | |
|
2708 | 2723 | raise util.Abort(_("--rev and --remove are incompatible")) |
|
2709 |
if opts |
|
|
2724 | if opts.get('rev'): | |
|
2710 | 2725 | rev_ = opts['rev'] |
|
2711 |
message = opts |
|
|
2712 |
if opts |
|
|
2713 |
expectedtype = opts |
|
|
2726 | message = opts.get('message') | |
|
2727 | if opts.get('remove'): | |
|
2728 | expectedtype = opts.get('local') and 'local' or 'global' | |
|
2714 | 2729 | for n in names: |
|
2715 | 2730 | if not repo.tagtype(n): |
|
2716 | 2731 | raise util.Abort(_('tag \'%s\' does not exist') % n) |
@@ -2720,7 +2735,7 b' def tag(ui, repo, name1, *names, **opts)' | |||
|
2720 | 2735 | rev_ = nullid |
|
2721 | 2736 | if not message: |
|
2722 | 2737 | message = _('Removed tag %s') % ', '.join(names) |
|
2723 |
elif not opts |
|
|
2738 | elif not opts.get('force'): | |
|
2724 | 2739 | for n in names: |
|
2725 | 2740 | if n in repo.tags(): |
|
2726 | 2741 | raise util.Abort(_('tag \'%s\' already exists ' |
@@ -2738,7 +2753,7 b' def tag(ui, repo, name1, *names, **opts)' | |||
|
2738 | 2753 | if date: |
|
2739 | 2754 | date = util.parsedate(date) |
|
2740 | 2755 | |
|
2741 |
repo.tag(names, r, message, opts |
|
|
2756 | repo.tag(names, r, message, opts.get('local'), opts.get('user'), date) | |
|
2742 | 2757 | |
|
2743 | 2758 | def tags(ui, repo): |
|
2744 | 2759 | """list repository tags |
@@ -2808,7 +2823,7 b' def unbundle(ui, repo, fname1, *fnames, ' | |||
|
2808 | 2823 | finally: |
|
2809 | 2824 | del lock |
|
2810 | 2825 | |
|
2811 |
return postincoming(ui, repo, modheads, opts |
|
|
2826 | return postincoming(ui, repo, modheads, opts.get('update'), None) | |
|
2812 | 2827 | |
|
2813 | 2828 | def update(ui, repo, node=None, rev=None, clean=False, date=None): |
|
2814 | 2829 | """update working directory |
@@ -205,7 +205,7 b' class dirstate(object):' | |||
|
205 | 205 | if not st: |
|
206 | 206 | return |
|
207 | 207 | |
|
208 |
p = parsers.parse_dirstate(self._map, self._copymap, st) |
|
|
208 | p = parsers.parse_dirstate(self._map, self._copymap, st) | |
|
209 | 209 | if not self._dirtypl: |
|
210 | 210 | self._pl = p |
|
211 | 211 |
@@ -137,6 +137,7 b' quit:' | |||
|
137 | 137 | /* msvc 6.0 has problems */ |
|
138 | 138 | # define inline __inline |
|
139 | 139 | typedef unsigned long uint32_t; |
|
140 | typedef unsigned __int64 uint64_t; | |
|
140 | 141 | # else |
|
141 | 142 | # include <stdint.h> |
|
142 | 143 | # endif |
@@ -51,18 +51,22 b' def sha1(s):' | |||
|
51 | 51 | |
|
52 | 52 | try: |
|
53 | 53 | import subprocess |
|
54 | closefds = os.name == 'posix' | |
|
54 | 55 | def popen2(cmd, mode='t', bufsize=-1): |
|
55 |
p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, |
|
|
56 | p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, | |
|
57 | close_fds=closefds, | |
|
56 | 58 | stdin=subprocess.PIPE, stdout=subprocess.PIPE) |
|
57 | 59 | return p.stdin, p.stdout |
|
58 | 60 | def popen3(cmd, mode='t', bufsize=-1): |
|
59 |
p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, |
|
|
61 | p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, | |
|
62 | close_fds=closefds, | |
|
60 | 63 | stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
|
61 | 64 | stderr=subprocess.PIPE) |
|
62 | 65 | return p.stdin, p.stdout, p.stderr |
|
63 | 66 | def Popen3(cmd, capturestderr=False, bufsize=-1): |
|
64 | 67 | stderr = capturestderr and subprocess.PIPE or None |
|
65 |
p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, |
|
|
68 | p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, | |
|
69 | close_fds=closefds, | |
|
66 | 70 | stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
|
67 | 71 | stderr=stderr) |
|
68 | 72 | p.fromchild = p.stdout |
@@ -40,7 +40,7 b'' | |||
|
40 | 40 | | {changenav%navgraphentry} |
|
41 | 41 | </div> |
|
42 | 42 | |
|
43 |
< |
|
|
43 | <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript> | |
|
44 | 44 | |
|
45 | 45 | <div id="wrapper"> |
|
46 | 46 | <ul id="nodebgs"></ul> |
@@ -52,8 +52,6 b'' | |||
|
52 | 52 | <script type="text/javascript"> |
|
53 | 53 | <!-- hide script content |
|
54 | 54 | |
|
55 | document.getElementById('noscript').style.display = 'none'; | |
|
56 | ||
|
57 | 55 | var data = {jsdata|json}; |
|
58 | 56 | var graph = new Graph(); |
|
59 | 57 | graph.scale({bg_height}); |
@@ -32,7 +32,7 b' graph |' | |||
|
32 | 32 | |
|
33 | 33 | <div class="title"> </div> |
|
34 | 34 | |
|
35 |
< |
|
|
35 | <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript> | |
|
36 | 36 | |
|
37 | 37 | <div id="wrapper"> |
|
38 | 38 | <ul id="nodebgs"></ul> |
@@ -44,8 +44,6 b' graph |' | |||
|
44 | 44 | <script> |
|
45 | 45 | <!-- hide script content |
|
46 | 46 | |
|
47 | document.getElementById('noscript').style.display = 'none'; | |
|
48 | ||
|
49 | 47 | var data = {jsdata|json}; |
|
50 | 48 | var graph = new Graph(); |
|
51 | 49 | graph.scale({bg_height}); |
@@ -26,7 +26,7 b' navigate: <small class="navigate">#chang' | |||
|
26 | 26 | </p> |
|
27 | 27 | </form> |
|
28 | 28 | |
|
29 |
< |
|
|
29 | <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript> | |
|
30 | 30 | |
|
31 | 31 | <div id="wrapper"> |
|
32 | 32 | <ul id="nodebgs"></ul> |
@@ -38,8 +38,6 b' navigate: <small class="navigate">#chang' | |||
|
38 | 38 | <script type="text/javascript"> |
|
39 | 39 | <!-- hide script content |
|
40 | 40 | |
|
41 | document.getElementById('noscript').style.display = 'none'; | |
|
42 | ||
|
43 | 41 | var data = {jsdata|json}; |
|
44 | 42 | var graph = new Graph(); |
|
45 | 43 | graph.scale({bg_height}); |
@@ -33,6 +33,10 b' list of commands:' | |||
|
33 | 33 | debugfoobar: |
|
34 | 34 | yet another debug command |
|
35 | 35 | |
|
36 | enabled extensions: | |
|
37 | ||
|
38 | debugextension only debugcommands | |
|
39 | ||
|
36 | 40 | special help topics: |
|
37 | 41 | dates Date Formats |
|
38 | 42 | patterns File Name Patterns |
|
1 | NO CONTENT: modified file, binary diff hidden |
@@ -51,6 +51,12 b' list of commands:' | |||
|
51 | 51 | kwfiles print files currently configured for keyword expansion |
|
52 | 52 | kwshrink revert expanded keywords in working directory |
|
53 | 53 | |
|
54 | enabled extensions: | |
|
55 | ||
|
56 | keyword keyword expansion in local repositories | |
|
57 | mq patch management and development | |
|
58 | notify hook extension to email notifications on commits/pushes | |
|
59 | ||
|
54 | 60 | use "hg -v help keyword" to show aliases and global options |
|
55 | 61 | % hg kwdemo |
|
56 | 62 | [extensions] |
@@ -51,6 +51,10 b' list of commands:' | |||
|
51 | 51 | qunapplied print the patches not yet applied |
|
52 | 52 | strip strip a revision and all its descendants from the repository |
|
53 | 53 | |
|
54 | enabled extensions: | |
|
55 | ||
|
56 | mq patch management and development | |
|
57 | ||
|
54 | 58 | use "hg -v help mq" to show aliases and global options |
|
55 | 59 | adding a |
|
56 | 60 | updating working directory |
@@ -1,4 +1,61 b'' | |||
|
1 | notify extension - No help text available | |
|
1 | notify extension - hook extension to email notifications on commits/pushes | |
|
2 | ||
|
3 | Subscriptions can be managed through hgrc. Default mode is to print | |
|
4 | messages to stdout, for testing and configuring. | |
|
5 | ||
|
6 | To use, configure notify extension and enable in hgrc like this: | |
|
7 | ||
|
8 | [extensions] | |
|
9 | hgext.notify = | |
|
10 | ||
|
11 | [hooks] | |
|
12 | # one email for each incoming changeset | |
|
13 | incoming.notify = python:hgext.notify.hook | |
|
14 | # batch emails when many changesets incoming at one time | |
|
15 | changegroup.notify = python:hgext.notify.hook | |
|
16 | ||
|
17 | [notify] | |
|
18 | # config items go in here | |
|
19 | ||
|
20 | config items: | |
|
21 | ||
|
22 | REQUIRED: | |
|
23 | config = /path/to/file # file containing subscriptions | |
|
24 | ||
|
25 | OPTIONAL: | |
|
26 | test = True # print messages to stdout for testing | |
|
27 | strip = 3 # number of slashes to strip for url paths | |
|
28 | domain = example.com # domain to use if committer missing domain | |
|
29 | style = ... # style file to use when formatting email | |
|
30 | template = ... # template to use when formatting email | |
|
31 | incoming = ... # template to use when run as incoming hook | |
|
32 | changegroup = ... # template when run as changegroup hook | |
|
33 | maxdiff = 300 # max lines of diffs to include (0=none, -1=all) | |
|
34 | maxsubject = 67 # truncate subject line longer than this | |
|
35 | diffstat = True # add a diffstat before the diff content | |
|
36 | sources = serve # notify if source of incoming changes in this list | |
|
37 | # (serve == ssh or http, push, pull, bundle) | |
|
38 | [email] | |
|
39 | from = user@host.com # email address to send as if none given | |
|
40 | [web] | |
|
41 | baseurl = http://hgserver/... # root of hg web site for browsing commits | |
|
42 | ||
|
43 | notify config file has same format as regular hgrc. it has two | |
|
44 | sections so you can express subscriptions in whatever way is handier | |
|
45 | for you. | |
|
46 | ||
|
47 | [usersubs] | |
|
48 | # key is subscriber email, value is ","-separated list of glob patterns | |
|
49 | user@host = pattern | |
|
50 | ||
|
51 | [reposubs] | |
|
52 | # key is glob pattern, value is ","-separated list of subscriber emails | |
|
53 | pattern = user@host | |
|
54 | ||
|
55 | glob patterns are matched against path to repo root. | |
|
56 | ||
|
57 | if you like, you can put notify config file in repo that users can | |
|
58 | push changes to, they can manage their own subscriptions. | |
|
2 | 59 | |
|
3 | 60 | no commands defined |
|
4 | 61 | % commit |
@@ -21,6 +21,10 b' basic commands:' | |||
|
21 | 21 | status show changed files in the working directory |
|
22 | 22 | update update working directory |
|
23 | 23 | |
|
24 | enabled extensions: | |
|
25 | ||
|
26 | record interactive change selection during commit or qrefresh | |
|
27 | ||
|
24 | 28 | use "hg help" for the full list of commands or "hg -v" for details |
|
25 | 29 | % help (mq present) |
|
26 | 30 | hg qrecord [OPTION]... PATCH [FILE]... |
@@ -64,6 +64,9 b' echo "% Rebase with no arguments (from 3' | |||
|
64 | 64 | hg update -C 5 |
|
65 | 65 | hg rebase 2>&1 | sed 's/\(saving bundle to \).*/\1/' |
|
66 | 66 | |
|
67 | echo "% Try to rollback after a rebase (fail)" | |
|
68 | hg rollback | |
|
69 | ||
|
67 | 70 | createrepo > /dev/null 2>&1 |
|
68 | 71 | echo |
|
69 | 72 | echo "% Rebase with base == '.' => same as no arguments (from 3 onto 7)" |
@@ -126,6 +126,8 b' adding manifests' | |||
|
126 | 126 | adding file changes |
|
127 | 127 | added 5 changesets with 5 changes to 5 files |
|
128 | 128 | rebase completed |
|
129 | % Try to rollback after a rebase (fail) | |
|
130 | no rollback information available | |
|
129 | 131 | |
|
130 | 132 | % Rebase with base == '.' => same as no arguments (from 3 onto 7) |
|
131 | 133 | 3 files updated, 0 files merged, 3 files removed, 0 files unresolved |
General Comments 0
You need to be logged in to leave comments.
Login now