64 |
64 |
65 We walk a window of revisions in the desired order. Within the |
65 We walk a window of revisions in the desired order. Within the |
66 window, we first walk forwards to gather data, then in the desired |
66 window, we first walk forwards to gather data, then in the desired |
67 order (usually backwards) to display it. |
67 order (usually backwards) to display it. |
68 |
68 |
69 This function returns an (iterator, getchange) pair. The |
69 This function returns an (iterator, getchange, matchfn) tuple. The |
70 getchange function returns the changelog entry for a numeric |
70 getchange function returns the changelog entry for a numeric |
71 revision. The iterator yields 3-tuples. They will be of one of |
71 revision. The iterator yields 3-tuples. They will be of one of |
72 the following forms: |
72 the following forms: |
73 |
73 |
74 "window", incrementing, lastrev: stepping through a window, |
74 "window", incrementing, lastrev: stepping through a window, |
80 possible display |
80 possible display |
81 |
81 |
82 "iter", rev, None: in-order traversal of the revs earlier iterated |
82 "iter", rev, None: in-order traversal of the revs earlier iterated |
83 over with "add" - use to display data''' |
83 over with "add" - use to display data''' |
84 |
84 |
|
85 files, matchfn, anypats, cwd = matchpats(repo, pats, opts) |
|
86 |
85 if repo.changelog.count() == 0: |
87 if repo.changelog.count() == 0: |
86 return [], False |
88 return [], False, matchfn |
87 |
89 |
88 files, matchfn, anypats, cwd = matchpats(repo, pats, opts) |
|
89 revs = map(int, revrange(ui, repo, opts['rev'] or ['tip:0'])) |
90 revs = map(int, revrange(ui, repo, opts['rev'] or ['tip:0'])) |
90 wanted = {} |
91 wanted = {} |
91 slowpath = anypats |
92 slowpath = anypats |
92 window = 300 |
93 window = 300 |
93 fncache = {} |
94 fncache = {} |
151 for rev in srevs: |
152 for rev in srevs: |
152 fns = fncache.get(rev) or filter(matchfn, getchange(rev)[3]) |
153 fns = fncache.get(rev) or filter(matchfn, getchange(rev)[3]) |
153 yield 'add', rev, fns |
154 yield 'add', rev, fns |
154 for rev in nrevs: |
155 for rev in nrevs: |
155 yield 'iter', rev, None |
156 yield 'iter', rev, None |
156 return iterate(), getchange |
157 return iterate(), getchange, matchfn |
157 |
158 |
158 revrangesep = ':' |
159 revrangesep = ':' |
159 |
160 |
160 def revrange(ui, repo, revs, revlog=None): |
161 def revrange(ui, repo, revs, revlog=None): |
161 """Yield revision as strings from a list of revision specifications.""" |
162 """Yield revision as strings from a list of revision specifications.""" |
1115 dodiff(sys.stdout, ui, repo, node1, node2, fns, match=matchfn, |
1116 dodiff(sys.stdout, ui, repo, node1, node2, fns, match=matchfn, |
1116 text=opts['text']) |
1117 text=opts['text']) |
1117 |
1118 |
1118 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): |
1119 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): |
1119 node = repo.lookup(changeset) |
1120 node = repo.lookup(changeset) |
1120 prev, other = repo.changelog.parents(node) |
1121 parents = [p for p in repo.changelog.parents(node) if p != nullid] |
|
1122 prev = (parents and parents[0]) or nullid |
1121 change = repo.changelog.read(node) |
1123 change = repo.changelog.read(node) |
1122 |
1124 |
|
1125 if opts['switch_parent']: |
|
1126 parents.reverse() |
1123 fp = make_file(repo, repo.changelog, opts['output'], |
1127 fp = make_file(repo, repo.changelog, opts['output'], |
1124 node=node, total=total, seqno=seqno, |
1128 node=node, total=total, seqno=seqno, |
1125 revwidth=revwidth) |
1129 revwidth=revwidth) |
1126 if fp != sys.stdout: |
1130 if fp != sys.stdout: |
1127 ui.note("%s\n" % fp.name) |
1131 ui.note("%s\n" % fp.name) |
1128 |
1132 |
1129 fp.write("# HG changeset patch\n") |
1133 fp.write("# HG changeset patch\n") |
1130 fp.write("# User %s\n" % change[1]) |
1134 fp.write("# User %s\n" % change[1]) |
1131 fp.write("# Node ID %s\n" % hex(node)) |
1135 fp.write("# Node ID %s\n" % hex(node)) |
1132 fp.write("# Parent %s\n" % hex(prev)) |
1136 fp.write("# Parent %s\n" % hex(prev)) |
1133 if other != nullid: |
1137 if len(parents) > 1: |
1134 fp.write("# Parent %s\n" % hex(other)) |
1138 fp.write("# Parent %s\n" % hex(parents[1])) |
1135 fp.write(change[4].rstrip()) |
1139 fp.write(change[4].rstrip()) |
1136 fp.write("\n\n") |
1140 fp.write("\n\n") |
1137 |
1141 |
1138 dodiff(fp, ui, repo, prev, node, text=opts['text']) |
1142 dodiff(fp, ui, repo, prev, node, text=opts['text']) |
1139 if fp != sys.stdout: |
1143 if fp != sys.stdout: |
1160 %r zero-padded changeset revision number |
1164 %r zero-padded changeset revision number |
1161 |
1165 |
1162 Without the -a option, export will avoid generating diffs of files |
1166 Without the -a option, export will avoid generating diffs of files |
1163 it detects as binary. With -a, export will generate a diff anyway, |
1167 it detects as binary. With -a, export will generate a diff anyway, |
1164 probably with undesirable results. |
1168 probably with undesirable results. |
|
1169 |
|
1170 With the --switch-parent option, the diff will be against the second |
|
1171 parent. It can be useful to review a merge. |
1165 """ |
1172 """ |
1166 if not changesets: |
1173 if not changesets: |
1167 raise util.Abort(_("export requires at least one changeset")) |
1174 raise util.Abort(_("export requires at least one changeset")) |
1168 seqno = 0 |
1175 seqno = 0 |
1169 revs = list(revrange(ui, repo, changesets)) |
1176 revs = list(revrange(ui, repo, changesets)) |
1279 counts[change] += 1 |
1286 counts[change] += 1 |
1280 return counts['+'], counts['-'] |
1287 return counts['+'], counts['-'] |
1281 |
1288 |
1282 fstate = {} |
1289 fstate = {} |
1283 skip = {} |
1290 skip = {} |
1284 changeiter, getchange = walkchangerevs(ui, repo, pats, opts) |
1291 changeiter, getchange, matchfn = walkchangerevs(ui, repo, pats, opts) |
1285 count = 0 |
1292 count = 0 |
1286 incrementing = False |
1293 incrementing = False |
1287 for st, rev, fns in changeiter: |
1294 for st, rev, fns in changeiter: |
1288 if st == 'window': |
1295 if st == 'window': |
1289 incrementing = rev |
1296 incrementing = rev |
1542 def debug(self, *args): |
1549 def debug(self, *args): |
1543 if self.debugflag: |
1550 if self.debugflag: |
1544 self.write(*args) |
1551 self.write(*args) |
1545 def __getattr__(self, key): |
1552 def __getattr__(self, key): |
1546 return getattr(self.ui, key) |
1553 return getattr(self.ui, key) |
1547 changeiter, getchange = walkchangerevs(ui, repo, pats, opts) |
1554 changeiter, getchange, matchfn = walkchangerevs(ui, repo, pats, opts) |
1548 for st, rev, fns in changeiter: |
1555 for st, rev, fns in changeiter: |
1549 if st == 'window': |
1556 if st == 'window': |
1550 du = dui(ui) |
1557 du = dui(ui) |
1551 elif st == 'add': |
1558 elif st == 'add': |
1552 du.bump(rev) |
1559 du.bump(rev) |
1558 if opts['only_merges'] and len(parents) != 2: |
1565 if opts['only_merges'] and len(parents) != 2: |
1559 continue |
1566 continue |
1560 |
1567 |
1561 br = None |
1568 br = None |
1562 if opts['keyword']: |
1569 if opts['keyword']: |
1563 changes = repo.changelog.read(repo.changelog.node(rev)) |
1570 changes = getchange(rev) |
1564 miss = 0 |
1571 miss = 0 |
1565 for k in [kw.lower() for kw in opts['keyword']]: |
1572 for k in [kw.lower() for kw in opts['keyword']]: |
1566 if not (k in changes[1].lower() or |
1573 if not (k in changes[1].lower() or |
1567 k in changes[4].lower() or |
1574 k in changes[4].lower() or |
1568 k in " ".join(changes[3][:20]).lower()): |
1575 k in " ".join(changes[3][:20]).lower()): |
1575 br = repo.branchlookup([repo.changelog.node(rev)]) |
1582 br = repo.branchlookup([repo.changelog.node(rev)]) |
1576 |
1583 |
1577 show_changeset(du, repo, rev, brinfo=br) |
1584 show_changeset(du, repo, rev, brinfo=br) |
1578 if opts['patch']: |
1585 if opts['patch']: |
1579 prev = (parents and parents[0]) or nullid |
1586 prev = (parents and parents[0]) or nullid |
1580 dodiff(du, du, repo, prev, changenode, fns) |
1587 dodiff(du, du, repo, prev, changenode, match=matchfn) |
1581 du.write("\n\n") |
1588 du.write("\n\n") |
1582 elif st == 'iter': |
1589 elif st == 'iter': |
1583 for args in du.hunk[rev]: |
1590 for args in du.hunk[rev]: |
1584 ui.write(*args) |
1591 ui.write(*args) |
1585 |
1592 |
2120 a change is visible for pull by other users, undoing it locally is |
2127 a change is visible for pull by other users, undoing it locally is |
2121 ineffective. |
2128 ineffective. |
2122 """ |
2129 """ |
2123 repo.undo() |
2130 repo.undo() |
2124 |
2131 |
2125 def update(ui, repo, node=None, merge=False, clean=False, branch=None): |
2132 def update(ui, repo, node=None, merge=False, clean=False, force=None, |
|
2133 branch=None): |
2126 """update or merge working directory |
2134 """update or merge working directory |
2127 |
2135 |
2128 Update the working directory to the specified revision. |
2136 Update the working directory to the specified revision. |
2129 |
2137 |
2130 If there are no outstanding changes in the working directory and |
2138 If there are no outstanding changes in the working directory and |
2157 else: |
2165 else: |
2158 ui.warn(_("branch %s not found\n") % (branch)) |
2166 ui.warn(_("branch %s not found\n") % (branch)) |
2159 return 1 |
2167 return 1 |
2160 else: |
2168 else: |
2161 node = node and repo.lookup(node) or repo.changelog.tip() |
2169 node = node and repo.lookup(node) or repo.changelog.tip() |
2162 return repo.update(node, allow=merge, force=clean) |
2170 return repo.update(node, allow=merge, force=clean, forcemerge=force) |
2163 |
2171 |
2164 def verify(ui, repo): |
2172 def verify(ui, repo): |
2165 """verify the integrity of the repository |
2173 """verify the integrity of the repository |
2166 |
2174 |
2167 Verify the integrity of the current repository. |
2175 Verify the integrity of the current repository. |
2254 ('X', 'exclude', [], _('exclude names matching the given patterns'))], |
2262 ('X', 'exclude', [], _('exclude names matching the given patterns'))], |
2255 _('hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...')), |
2263 _('hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...')), |
2256 "^export": |
2264 "^export": |
2257 (export, |
2265 (export, |
2258 [('o', 'output', "", _('print output to file with formatted name')), |
2266 [('o', 'output', "", _('print output to file with formatted name')), |
2259 ('a', 'text', None, _('treat all files as text'))], |
2267 ('a', 'text', None, _('treat all files as text')), |
|
2268 ('', 'switch-parent', None, _('diff against the second parent'))], |
2260 "hg export [-a] [-o OUTFILE] REV..."), |
2269 "hg export [-a] [-o OUTFILE] REV..."), |
2261 "forget": |
2270 "forget": |
2262 (forget, |
2271 (forget, |
2263 [('I', 'include', [], _('include names matching the given patterns')), |
2272 [('I', 'include', [], _('include names matching the given patterns')), |
2264 ('X', 'exclude', [], _('exclude names matching the given patterns'))], |
2273 ('X', 'exclude', [], _('exclude names matching the given patterns'))], |
2402 "undo": (undo, [], _('hg undo')), |
2411 "undo": (undo, [], _('hg undo')), |
2403 "^update|up|checkout|co": |
2412 "^update|up|checkout|co": |
2404 (update, |
2413 (update, |
2405 [('b', 'branch', "", _('checkout the head of a specific branch')), |
2414 [('b', 'branch', "", _('checkout the head of a specific branch')), |
2406 ('m', 'merge', None, _('allow merging of branches')), |
2415 ('m', 'merge', None, _('allow merging of branches')), |
2407 ('C', 'clean', None, _('overwrite locally modified files'))], |
2416 ('C', 'clean', None, _('overwrite locally modified files')), |
2408 _('hg update [-b TAG] [-m] [-C] [REV]')), |
2417 ('f', 'force', None, _('force a merge with outstanding changes'))], |
|
2418 _('hg update [-b TAG] [-m] [-C] [-f] [REV]')), |
2409 "verify": (verify, [], _('hg verify')), |
2419 "verify": (verify, [], _('hg verify')), |
2410 "version": (show_version, [], _('hg version')), |
2420 "version": (show_version, [], _('hg version')), |
2411 } |
2421 } |
2412 |
2422 |
2413 globalopts = [ |
2423 globalopts = [ |