comparison mercurial/commands.py @ 725:c6b912f8b5b2

Merge with Matt's tip.
author Bryan O'Sullivan <bos@serpentine.com>
date Tue, 19 Jul 2005 07:00:03 -0800
parents 1c0c413cccdd 938dd667ca21
children 809a870a0e73
comparison
equal deleted inserted replaced
724:1c0c413cccdd 725:c6b912f8b5b2
350 else: 350 else:
351 (c, a, d, u) = repo.changes() 351 (c, a, d, u) = repo.changes()
352 repo.add(u) 352 repo.add(u)
353 repo.remove(d) 353 repo.remove(d)
354 354
355 def annotate(u, repo, file1, *files, **ops): 355 def annotate(ui, repo, file1, *files, **opts):
356 """show changeset information per file line""" 356 """show changeset information per file line"""
357 def getnode(rev): 357 def getnode(rev):
358 return hg.short(repo.changelog.node(rev)) 358 return hg.short(repo.changelog.node(rev))
359 359
360 def getname(rev): 360 def getname(rev):
372 bcache[rev] = name 372 bcache[rev] = name
373 return name 373 return name
374 374
375 bcache = {} 375 bcache = {}
376 opmap = [['user', getname], ['number', str], ['changeset', getnode]] 376 opmap = [['user', getname], ['number', str], ['changeset', getnode]]
377 if not ops['user'] and not ops['changeset']: 377 if not opts['user'] and not opts['changeset']:
378 ops['number'] = 1 378 opts['number'] = 1
379 379
380 node = repo.dirstate.parents()[0] 380 if opts['rev']:
381 if ops['revision']: 381 node = repo.changelog.lookup(opts['rev'])
382 node = repo.changelog.lookup(ops['revision']) 382 else:
383 node = repo.dirstate.parents()[0]
383 change = repo.changelog.read(node) 384 change = repo.changelog.read(node)
384 mmap = repo.manifest.read(change[0]) 385 mmap = repo.manifest.read(change[0])
385 for f in relpath(repo, (file1,) + files): 386 for f in relpath(repo, (file1,) + files):
386 lines = repo.file(f).annotate(mmap[f]) 387 lines = repo.file(f).annotate(mmap[f])
387 pieces = [] 388 pieces = []
388 389
389 for o, f in opmap: 390 for o, f in opmap:
390 if ops[o]: 391 if opts[o]:
391 l = [f(n) for n, dummy in lines] 392 l = [f(n) for n, dummy in lines]
392 m = max(map(len, l)) 393 m = max(map(len, l))
393 pieces.append(["%*s" % (m, x) for x in l]) 394 pieces.append(["%*s" % (m, x) for x in l])
394 395
395 for p, l in zip(zip(*pieces), lines): 396 for p, l in zip(zip(*pieces), lines):
396 u.write(" ".join(p) + ": " + l[1]) 397 ui.write("%s: %s" % (" ".join(p), l[1]))
397 398
398 def cat(ui, repo, file1, rev=None, **opts): 399 def cat(ui, repo, file1, rev=None, **opts):
399 """output the latest or given revision of a file""" 400 """output the latest or given revision of a file"""
400 r = repo.file(relpath(repo, [file1])[0]) 401 r = repo.file(relpath(repo, [file1])[0])
401 if rev: 402 if rev:
574 if opts['output'] and opts['output'] != '-': 575 if opts['output'] and opts['output'] != '-':
575 try: 576 try:
576 outname = make_filename(repo, repo.changelog, opts['output'], 577 outname = make_filename(repo, repo.changelog, opts['output'],
577 node=node, total=total, seqno=seqno, 578 node=node, total=total, seqno=seqno,
578 revwidth=revwidth) 579 revwidth=revwidth)
580 ui.note("Exporting patch to '%s'.\n" % outname)
579 fp = open(outname, 'wb') 581 fp = open(outname, 'wb')
580 except KeyError, inst: 582 except KeyError, inst:
581 ui.warn("error: invalid format spec '%%%s' in output file name\n" % 583 ui.warn("error: invalid format spec '%%%s' in output file name\n" %
582 inst.args[0]) 584 inst.args[0])
583 sys.exit(1) 585 sys.exit(1)
772 files.sort() 774 files.sort()
773 775
774 for f in files: 776 for f in files:
775 ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f)) 777 ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f))
776 778
777 def parents(ui, repo, node=None): 779 def parents(ui, repo, rev=None):
778 '''show the parents of the current working dir''' 780 """show the parents of the working dir or revision"""
779 if node: 781 if rev:
780 p = repo.changelog.parents(repo.lookup(hg.bin(node))) 782 p = repo.changelog.parents(repo.lookup(rev))
781 else: 783 else:
782 p = repo.dirstate.parents() 784 p = repo.dirstate.parents()
783 785
784 for n in p: 786 for n in p:
785 if n != hg.nullid: 787 if n != hg.nullid:
1030 if ".hgtags" in x: 1032 if ".hgtags" in x:
1031 ui.warn("abort: working copy of .hgtags is changed!\n") 1033 ui.warn("abort: working copy of .hgtags is changed!\n")
1032 ui.status("(please commit .hgtags manually)\n") 1034 ui.status("(please commit .hgtags manually)\n")
1033 return -1 1035 return -1
1034 1036
1035 add = not os.path.exists(repo.wjoin(".hgtags"))
1036 repo.wfile(".hgtags", "ab").write("%s %s\n" % (r, name)) 1037 repo.wfile(".hgtags", "ab").write("%s %s\n" % (r, name))
1037 if add: 1038 if repo.dirstate.state(".hgtags") == '?':
1038 repo.add([".hgtags"]) 1039 repo.add([".hgtags"])
1039 1040
1040 if not opts['text']: 1041 if not opts['text']:
1041 opts['text'] = "Added tag %s for changeset %s" % (name, r) 1042 opts['text'] = "Added tag %s for changeset %s" % (name, r)
1042 1043
1098 1099
1099 table = { 1100 table = {
1100 "^add": (add, 1101 "^add": (add,
1101 [('I', 'include', [], 'include path in search'), 1102 [('I', 'include', [], 'include path in search'),
1102 ('X', 'exclude', [], 'exclude path from search')], 1103 ('X', 'exclude', [], 'exclude path from search')],
1103 "hg add [options] [files]"), 1104 "hg add [OPTIONS] [FILES]"),
1104 "addremove": (addremove, [], "hg addremove [files]"), 1105 "addremove": (addremove, [], "hg addremove [FILES]"),
1105 "^annotate": 1106 "^annotate":
1106 (annotate, 1107 (annotate,
1107 [('r', 'revision', '', 'revision'), 1108 [('r', 'rev', '', 'revision'),
1108 ('u', 'user', None, 'show user'), 1109 ('u', 'user', None, 'show user'),
1109 ('n', 'number', None, 'show revision number'), 1110 ('n', 'number', None, 'show revision number'),
1110 ('c', 'changeset', None, 'show changeset')], 1111 ('c', 'changeset', None, 'show changeset')],
1111 'hg annotate [-u] [-c] [-n] [-r id] [files]'), 1112 'hg annotate [-r REV] [-u] [-n] [-c] FILE...'),
1112 "cat": 1113 "cat":
1113 (cat, 1114 (cat,
1114 [('o', 'output', "", 'output to file')], 1115 [('o', 'output', "", 'output to file')],
1115 'hg cat [-o outfile] <file> [rev]'), 1116 'hg cat [-o OUTFILE] FILE [REV]'),
1116 "^clone": 1117 "^clone":
1117 (clone, 1118 (clone,
1118 [('U', 'noupdate', None, 'skip update after cloning')], 1119 [('U', 'noupdate', None, 'skip update after cloning')],
1119 'hg clone [options] <source> [dest]'), 1120 'hg clone [-U] SOURCE [DEST]'),
1120 "^commit|ci": 1121 "^commit|ci":
1121 (commit, 1122 (commit,
1122 [('t', 'text', "", 'commit text'), 1123 [('A', 'addremove', None, 'run add/remove during commit'),
1123 ('A', 'addremove', None, 'run add/remove during commit'), 1124 ('t', 'text', "", 'commit text'),
1124 ('l', 'logfile', "", 'commit text file'), 1125 ('l', 'logfile', "", 'commit text file'),
1125 ('d', 'date', "", 'date code'), 1126 ('d', 'date', "", 'date code'),
1126 ('u', 'user', "", 'user')], 1127 ('u', 'user', "", 'user')],
1127 'hg commit [files]'), 1128 'hg commit [OPTION]... [FILE]...'),
1128 "copy": (copy, [], 'hg copy <source> <dest>'), 1129 "copy": (copy, [], 'hg copy SOURCE DEST'),
1129 "debugcheckstate": (debugcheckstate, [], 'debugcheckstate'), 1130 "debugcheckstate": (debugcheckstate, [], 'debugcheckstate'),
1130 "debugstate": (debugstate, [], 'debugstate'), 1131 "debugstate": (debugstate, [], 'debugstate'),
1131 "debugindex": (debugindex, [], 'debugindex <file>'), 1132 "debugindex": (debugindex, [], 'debugindex FILE'),
1132 "debugindexdot": (debugindexdot, [], 'debugindexdot <file>'), 1133 "debugindexdot": (debugindexdot, [], 'debugindexdot FILE'),
1133 "^diff": 1134 "^diff":
1134 (diff, 1135 (diff,
1135 [('r', 'rev', [], 'revision')], 1136 [('r', 'rev', [], 'revision')],
1136 'hg diff [-r A] [-r B] [files]'), 1137 'hg diff [-r REV1 [-r REV2]] [FILE]...'),
1137 "^export": 1138 "^export":
1138 (export, 1139 (export,
1139 [('o', 'output', "", 'output to file')], 1140 [('o', 'output', "", 'output to file')],
1140 "hg export [-o file] <changeset> ..."), 1141 "hg export [-o OUTFILE] REV..."),
1141 "forget": (forget, [], "hg forget [files]"), 1142 "forget": (forget, [], "hg forget FILE..."),
1142 "heads": (heads, [], 'hg heads'), 1143 "heads": (heads, [], 'hg heads'),
1143 "help": (help_, [], 'hg help [command]'), 1144 "help": (help_, [], 'hg help [COMMAND]'),
1144 "identify|id": (identify, [], 'hg identify'), 1145 "identify|id": (identify, [], 'hg identify'),
1145 "import|patch": 1146 "import|patch":
1146 (import_, 1147 (import_,
1147 [('p', 'strip', 1, 'path strip'), 1148 [('p', 'strip', 1, 'path strip'),
1148 ('b', 'base', "", 'base path')], 1149 ('b', 'base', "", 'base path')],
1149 "hg import [options] <patches>"), 1150 "hg import [-p NUM] [-b BASE] PATCH..."),
1150 "^init": (init, [], 'hg init'), 1151 "^init": (init, [], 'hg init'),
1151 "locate": 1152 "locate":
1152 (locate, 1153 (locate,
1153 [('0', 'print0', None, 'end records with NUL'), 1154 [('0', 'print0', None, 'end records with NUL'),
1154 ('f', 'fullpath', None, 'print complete paths'), 1155 ('f', 'fullpath', None, 'print complete paths'),
1155 ('I', 'include', [], 'include path in search'), 1156 ('I', 'include', [], 'include path in search'),
1156 ('r', 'rev', '', 'revision'), 1157 ('r', 'rev', '', 'revision'),
1157 ('X', 'exclude', [], 'exclude path from search')], 1158 ('X', 'exclude', [], 'exclude path from search')],
1158 'hg locate [options] [files]'), 1159 'hg locate [OPTION]... [PATTERN]...'),
1159 "^log|history": 1160 "^log|history":
1160 (log, 1161 (log,
1161 [('r', 'rev', [], 'revision'), 1162 [('r', 'rev', [], 'revision'),
1162 ('p', 'patch', None, 'show patch')], 1163 ('p', 'patch', None, 'show patch')],
1163 'hg log [-r A] [-r B] [-p] [file]'), 1164 'hg log [-r REV1 [-r REV2]] [-p] [FILE]'),
1164 "manifest": (manifest, [], 'hg manifest [rev]'), 1165 "manifest": (manifest, [], 'hg manifest [REV]'),
1165 "parents": (parents, [], 'hg parents [node]'), 1166 "parents": (parents, [], 'hg parents [REV]'),
1166 "^pull": 1167 "^pull":
1167 (pull, 1168 (pull,
1168 [('u', 'update', None, 'update working directory')], 1169 [('u', 'update', None, 'update working directory')],
1169 'hg pull [options] [source]'), 1170 'hg pull [-u] [SOURCE]'),
1170 "^push": (push, [], 'hg push <destination>'), 1171 "^push": (push, [], 'hg push [DEST]'),
1171 "rawcommit": 1172 "rawcommit":
1172 (rawcommit, 1173 (rawcommit,
1173 [('p', 'parent', [], 'parent'), 1174 [('p', 'parent', [], 'parent'),
1174 ('d', 'date', "", 'date code'), 1175 ('d', 'date', "", 'date code'),
1175 ('u', 'user', "", 'user'), 1176 ('u', 'user', "", 'user'),
1176 ('F', 'files', "", 'file list'), 1177 ('F', 'files', "", 'file list'),
1177 ('t', 'text', "", 'commit text'), 1178 ('t', 'text', "", 'commit text'),
1178 ('l', 'logfile', "", 'commit text file')], 1179 ('l', 'logfile', "", 'commit text file')],
1179 'hg rawcommit [options] [files]'), 1180 'hg rawcommit [OPTION]... [FILE]...'),
1180 "recover": (recover, [], "hg recover"), 1181 "recover": (recover, [], "hg recover"),
1181 "^remove|rm": (remove, [], "hg remove [files]"), 1182 "^remove|rm": (remove, [], "hg remove FILE..."),
1182 "^revert": 1183 "^revert":
1183 (revert, 1184 (revert,
1184 [("n", "nonrecursive", None, "don't recurse into subdirs"), 1185 [("n", "nonrecursive", None, "don't recurse into subdirs"),
1185 ("r", "rev", "", "revision")], 1186 ("r", "rev", "", "revision")],
1186 "hg revert [files|dirs]"), 1187 "hg revert [-n] [-r REV] NAME..."),
1187 "root": (root, [], "hg root"), 1188 "root": (root, [], "hg root"),
1188 "^serve": 1189 "^serve":
1189 (serve, 1190 (serve,
1190 [('A', 'accesslog', '', 'access log file'), 1191 [('A', 'accesslog', '', 'access log file'),
1191 ('E', 'errorlog', '', 'error log file'), 1192 ('E', 'errorlog', '', 'error log file'),
1192 ('p', 'port', 8000, 'listen port'), 1193 ('p', 'port', 8000, 'listen port'),
1193 ('a', 'address', '', 'interface address'), 1194 ('a', 'address', '', 'interface address'),
1194 ('n', 'name', os.getcwd(), 'repository name'), 1195 ('n', 'name', os.getcwd(), 'repository name'),
1195 ('', 'stdio', None, 'for remote clients'), 1196 ('', 'stdio', None, 'for remote clients'),
1196 ('t', 'templates', "", 'template map')], 1197 ('t', 'templates', "", 'template map')],
1197 "hg serve [options]"), 1198 "hg serve [OPTION]..."),
1198 "^status": (status, [], 'hg status'), 1199 "^status": (status, [], 'hg status'),
1199 "tag": 1200 "tag":
1200 (tag, 1201 (tag,
1201 [('l', 'local', None, 'make the tag local'), 1202 [('l', 'local', None, 'make the tag local'),
1202 ('t', 'text', "", 'commit text'), 1203 ('t', 'text', "", 'commit text'),
1203 ('d', 'date', "", 'date code'), 1204 ('d', 'date', "", 'date code'),
1204 ('u', 'user', "", 'user')], 1205 ('u', 'user', "", 'user')],
1205 'hg tag [options] <name> [rev]'), 1206 'hg tag [OPTION]... NAME [REV]'),
1206 "tags": (tags, [], 'hg tags'), 1207 "tags": (tags, [], 'hg tags'),
1207 "tip": (tip, [], 'hg tip'), 1208 "tip": (tip, [], 'hg tip'),
1208 "undo": (undo, [], 'hg undo'), 1209 "undo": (undo, [], 'hg undo'),
1209 "^update|up|checkout|co": 1210 "^update|up|checkout|co":
1210 (update, 1211 (update,
1211 [('m', 'merge', None, 'allow merging of conflicts'), 1212 [('m', 'merge', None, 'allow merging of conflicts'),
1212 ('C', 'clean', None, 'overwrite locally modified files')], 1213 ('C', 'clean', None, 'overwrite locally modified files')],
1213 'hg update [options] [node]'), 1214 'hg update [-m] [-C] [REV]'),
1214 "verify": (verify, [], 'hg verify'), 1215 "verify": (verify, [], 'hg verify'),
1215 "version": (show_version, [], 'hg version'), 1216 "version": (show_version, [], 'hg version'),
1216 } 1217 }
1217 1218
1218 globalopts = [('v', 'verbose', None, 'verbose'), 1219 globalopts = [('v', 'verbose', None, 'verbose'),