Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/commands.py @ 871:c2e77581bc84
Merge with mpm.
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Tue, 09 Aug 2005 17:24:38 -0800 |
parents | a82eae840447 1df0983eb589 |
children | d4cb383e7de7 781266a78fe1 953ccddd57bd bc9ca4d51d23 |
comparison
equal
deleted
inserted
replaced
870:a82eae840447 | 871:c2e77581bc84 |
---|---|
271 ui.status("summary: %s\n" % description.splitlines()[0]) | 271 ui.status("summary: %s\n" % description.splitlines()[0]) |
272 ui.status("\n") | 272 ui.status("\n") |
273 | 273 |
274 def show_version(ui): | 274 def show_version(ui): |
275 """output version and copyright information""" | 275 """output version and copyright information""" |
276 ui.write("Mercurial version %s\n" % version.get_version()) | 276 ui.write("Mercurial Distributed SCM (version %s)\n" |
277 % version.get_version()) | |
277 ui.status( | 278 ui.status( |
278 "\nCopyright (C) 2005 Matt Mackall <mpm@selenic.com>\n" | 279 "\nCopyright (C) 2005 Matt Mackall <mpm@selenic.com>\n" |
279 "This is free software; see the source for copying conditions. " | 280 "This is free software; see the source for copying conditions. " |
280 "There is NO\nwarranty; " | 281 "There is NO\nwarranty; " |
281 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" | 282 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" |
282 ) | 283 ) |
283 | 284 |
284 def help_(ui, cmd=None): | 285 def help_(ui, cmd=None): |
285 """show help for a given command or all commands""" | 286 """show help for a given command or all commands""" |
286 if cmd: | 287 if cmd and cmd != 'shortlist': |
287 try: | 288 key, i = find(cmd) |
288 i = find(cmd) | 289 # synopsis |
289 ui.write("%s\n\n" % i[2]) | 290 ui.write("%s\n\n" % i[2]) |
290 | 291 |
291 if i[1]: | 292 # description |
292 for s, l, d, c in i[1]: | 293 doc = i[0].__doc__ |
293 opt = ' ' | 294 if ui.quiet: |
294 if s: | 295 doc = doc.splitlines(0)[0] |
295 opt = opt + '-' + s + ' ' | 296 ui.write("%s\n" % doc.rstrip()) |
296 if l: | 297 |
297 opt = opt + '--' + l + ' ' | 298 # aliases |
298 if d: | 299 if not ui.quiet: |
299 opt = opt + '(' + str(d) + ')' | 300 aliases = ', '.join(key.split('|')[1:]) |
300 ui.write(opt, "\n") | 301 if aliases: |
301 if c: | 302 ui.write("\naliases: %s\n" % aliases) |
302 ui.write(' %s\n' % c) | 303 |
303 ui.write("\n") | 304 # options |
304 | 305 if not ui.quiet and i[1]: |
305 ui.write(i[0].__doc__, "\n") | 306 ui.write("\noptions:\n\n") |
306 except UnknownCommand: | 307 for s, l, d, c in i[1]: |
307 ui.warn("hg: unknown command %s\n" % cmd) | 308 opt = ' ' |
308 sys.exit(0) | 309 if s: |
310 opt = opt + '-' + s + ' ' | |
311 if l: | |
312 opt = opt + '--' + l + ' ' | |
313 if d: | |
314 opt = opt + '(' + str(d) + ')' | |
315 ui.write(opt, "\n") | |
316 if c: | |
317 ui.write(' %s\n' % c) | |
318 | |
309 else: | 319 else: |
320 # program name | |
310 if ui.verbose: | 321 if ui.verbose: |
311 show_version(ui) | 322 show_version(ui) |
312 ui.write('\n') | |
313 if ui.verbose: | |
314 ui.write('hg commands:\n\n') | |
315 else: | 323 else: |
316 ui.write('basic hg commands (use "hg help -v" for more):\n\n') | 324 ui.status("Mercurial Distributed SCM\n") |
325 ui.status('\n') | |
326 | |
327 # list of commands | |
328 if cmd == "shortlist": | |
329 ui.status('basic commands (use "hg help" ' | |
330 'for the full list or option "-v" for details):\n\n') | |
331 elif ui.verbose: | |
332 ui.status('list of commands:\n\n') | |
333 else: | |
334 ui.status('list of commands (use "hg help -v" ' | |
335 'to show aliases and global options):\n\n') | |
317 | 336 |
318 h = {} | 337 h = {} |
338 cmds = {} | |
319 for c, e in table.items(): | 339 for c, e in table.items(): |
320 f = c.split("|")[0] | 340 f = c.split("|")[0] |
321 if not ui.verbose and not f.startswith("^"): | 341 if cmd == "shortlist" and not f.startswith("^"): |
322 continue | 342 continue |
343 f = f.lstrip("^") | |
323 if not ui.debugflag and f.startswith("debug"): | 344 if not ui.debugflag and f.startswith("debug"): |
324 continue | 345 continue |
325 f = f.lstrip("^") | |
326 d = "" | 346 d = "" |
327 if e[0].__doc__: | 347 if e[0].__doc__: |
328 d = e[0].__doc__.splitlines(0)[0].rstrip() | 348 d = e[0].__doc__.splitlines(0)[0].rstrip() |
329 h[f] = d | 349 h[f] = d |
350 cmds[f]=c.lstrip("^") | |
330 | 351 |
331 fns = h.keys() | 352 fns = h.keys() |
332 fns.sort() | 353 fns.sort() |
333 m = max(map(len, fns)) | 354 m = max(map(len, fns)) |
334 for f in fns: | 355 for f in fns: |
335 ui.write(' %-*s %s\n' % (m, f, h[f])) | 356 if ui.verbose: |
357 commands = cmds[f].replace("|",", ") | |
358 ui.write(" %s:\n %s\n"%(commands,h[f])) | |
359 else: | |
360 ui.write(' %-*s %s\n' % (m, f, h[f])) | |
361 | |
362 # global options | |
363 if ui.verbose: | |
364 ui.write("\nglobal options:\n\n") | |
365 for s, l, d, c in globalopts: | |
366 opt = ' ' | |
367 if s: | |
368 opt = opt + '-' + s + ' ' | |
369 if l: | |
370 opt = opt + '--' + l + ' ' | |
371 if d: | |
372 opt = opt + '(' + str(d) + ')' | |
373 ui.write(opt, "\n") | |
374 if c: | |
375 ui.write(' %s\n' % c) | |
336 | 376 |
337 # Commands start here, listed alphabetically | 377 # Commands start here, listed alphabetically |
338 | 378 |
339 def add(ui, repo, *pats, **opts): | 379 def add(ui, repo, *pats, **opts): |
340 '''add the specified files on the next commit''' | 380 '''add the specified files on the next commit''' |
696 elif not line.startswith("# ") and line: | 736 elif not line.startswith("# ") and line: |
697 message.append(line) | 737 message.append(line) |
698 hgpatch = False | 738 hgpatch = False |
699 elif line == '# HG changeset patch': | 739 elif line == '# HG changeset patch': |
700 hgpatch = True | 740 hgpatch = True |
741 message = [] # We may have collected garbage | |
701 else: | 742 else: |
702 message.append(line) | 743 message.append(line) |
703 | 744 |
704 # make sure message isn't empty | 745 # make sure message isn't empty |
705 if not message: | 746 if not message: |
1029 '''show changed files in the working directory | 1070 '''show changed files in the working directory |
1030 | 1071 |
1031 M = modified | 1072 M = modified |
1032 A = added | 1073 A = added |
1033 R = removed | 1074 R = removed |
1034 ? = not tracked''' | 1075 ? = not tracked |
1076 ''' | |
1035 | 1077 |
1036 cwd = repo.getcwd() | 1078 cwd = repo.getcwd() |
1037 files, matchfn = matchpats(repo, cwd, pats, opts) | 1079 files, matchfn = matchpats(repo, cwd, pats, opts) |
1038 (c, a, d, u) = [[pathto(cwd, x) for x in n] | 1080 (c, a, d, u) = [[pathto(cwd, x) for x in n] |
1039 for n in repo.changes(files=files, match=matchfn)] | 1081 for n in repo.changes(files=files, match=matchfn)] |
1040 | 1082 |
1041 for f in c: | 1083 changetypes = [('modified', 'M', c), |
1042 ui.write("M ", f, "\n") | 1084 ('added', 'A', a), |
1043 for f in a: | 1085 ('removed', 'R', d), |
1044 ui.write("A ", f, "\n") | 1086 ('unknown', '?', u)] |
1045 for f in d: | 1087 |
1046 ui.write("R ", f, "\n") | 1088 for opt, char, changes in ([ct for ct in changetypes if opts[ct[0]]] |
1047 for f in u: | 1089 or changetypes): |
1048 ui.write("? ", f, "\n") | 1090 for f in changes: |
1091 ui.write("%s %s\n" % (char, f)) | |
1049 | 1092 |
1050 def tag(ui, repo, name, rev=None, **opts): | 1093 def tag(ui, repo, name, rev=None, **opts): |
1051 """add a tag for the current tip or a given revision""" | 1094 """add a tag for the current tip or a given revision""" |
1052 if opts['text']: | 1095 if opts['text']: |
1053 ui.warn("Warning: -t and --text is deprecated," | 1096 ui.warn("Warning: -t and --text is deprecated," |
1136 return repo.verify() | 1179 return repo.verify() |
1137 | 1180 |
1138 # Command options and aliases are listed here, alphabetically | 1181 # Command options and aliases are listed here, alphabetically |
1139 | 1182 |
1140 table = { | 1183 table = { |
1141 "^add": (add, | 1184 "^add": |
1142 [('I', 'include', [], 'include path in search'), | 1185 (add, |
1143 ('X', 'exclude', [], 'exclude path from search')], | 1186 [('I', 'include', [], 'include path in search'), |
1144 "hg add [FILE]..."), | 1187 ('X', 'exclude', [], 'exclude path from search')], |
1145 "addremove": (addremove, | 1188 "hg add [FILE]..."), |
1146 [('I', 'include', [], 'include path in search'), | 1189 "addremove": |
1147 ('X', 'exclude', [], 'exclude path from search')], | 1190 (addremove, |
1148 "hg addremove [OPTION]... [FILE]..."), | 1191 [('I', 'include', [], 'include path in search'), |
1192 ('X', 'exclude', [], 'exclude path from search')], | |
1193 "hg addremove [OPTION]... [FILE]..."), | |
1149 "^annotate": | 1194 "^annotate": |
1150 (annotate, | 1195 (annotate, |
1151 [('r', 'rev', '', 'revision'), | 1196 [('r', 'rev', '', 'revision'), |
1152 ('u', 'user', None, 'show user'), | 1197 ('u', 'user', None, 'show user'), |
1153 ('n', 'number', None, 'show revision number'), | 1198 ('n', 'number', None, 'show revision number'), |
1177 "copy": (copy, [], 'hg copy SOURCE DEST'), | 1222 "copy": (copy, [], 'hg copy SOURCE DEST'), |
1178 "debugcheckstate": (debugcheckstate, [], 'debugcheckstate'), | 1223 "debugcheckstate": (debugcheckstate, [], 'debugcheckstate'), |
1179 "debugstate": (debugstate, [], 'debugstate'), | 1224 "debugstate": (debugstate, [], 'debugstate'), |
1180 "debugindex": (debugindex, [], 'debugindex FILE'), | 1225 "debugindex": (debugindex, [], 'debugindex FILE'), |
1181 "debugindexdot": (debugindexdot, [], 'debugindexdot FILE'), | 1226 "debugindexdot": (debugindexdot, [], 'debugindexdot FILE'), |
1182 "debugwalk": (debugwalk, | 1227 "debugwalk": |
1183 [('I', 'include', [], 'include path in search'), | 1228 (debugwalk, |
1184 ('X', 'exclude', [], 'exclude path from search')], | 1229 [('I', 'include', [], 'include path in search'), |
1185 'debugwalk [OPTIONS]... [FILE]...'), | 1230 ('X', 'exclude', [], 'exclude path from search')], |
1231 'debugwalk [OPTIONS]... [FILE]...'), | |
1186 "^diff": | 1232 "^diff": |
1187 (diff, | 1233 (diff, |
1188 [('r', 'rev', [], 'revision'), | 1234 [('r', 'rev', [], 'revision'), |
1189 ('I', 'include', [], 'include path in search'), | 1235 ('I', 'include', [], 'include path in search'), |
1190 ('X', 'exclude', [], 'exclude path from search')], | 1236 ('X', 'exclude', [], 'exclude path from search')], |
1191 'hg diff [-r REV1 [-r REV2]] [FILE]...'), | 1237 'hg diff [-r REV1 [-r REV2]] [FILE]...'), |
1192 "^export": | 1238 "^export": |
1193 (export, | 1239 (export, |
1194 [('o', 'output', "", 'output to file')], | 1240 [('o', 'output', "", 'output to file')], |
1195 "hg export [-o OUTFILE] REV..."), | 1241 "hg export [-o OUTFILE] REV..."), |
1196 "forget": (forget, | 1242 "forget": |
1197 [('I', 'include', [], 'include path in search'), | 1243 (forget, |
1198 ('X', 'exclude', [], 'exclude path from search')], | 1244 [('I', 'include', [], 'include path in search'), |
1199 "hg forget FILE..."), | 1245 ('X', 'exclude', [], 'exclude path from search')], |
1246 "hg forget FILE..."), | |
1200 "heads": (heads, [], 'hg heads'), | 1247 "heads": (heads, [], 'hg heads'), |
1201 "help": (help_, [], 'hg help [COMMAND]'), | 1248 "help": (help_, [], 'hg help [COMMAND]'), |
1202 "identify|id": (identify, [], 'hg identify'), | 1249 "identify|id": (identify, [], 'hg identify'), |
1203 "import|patch": | 1250 "import|patch": |
1204 (import_, | 1251 (import_, |
1257 ('n', 'name', os.getcwd(), 'repository name'), | 1304 ('n', 'name', os.getcwd(), 'repository name'), |
1258 ('', 'stdio', None, 'for remote clients'), | 1305 ('', 'stdio', None, 'for remote clients'), |
1259 ('t', 'templates', "", 'template map'), | 1306 ('t', 'templates', "", 'template map'), |
1260 ('6', 'ipv6', None, 'use IPv6 in addition to IPv4')], | 1307 ('6', 'ipv6', None, 'use IPv6 in addition to IPv4')], |
1261 "hg serve [OPTION]..."), | 1308 "hg serve [OPTION]..."), |
1262 "^status": (status, | 1309 "^status": |
1263 [('I', 'include', [], 'include path in search'), | 1310 (status, |
1264 ('X', 'exclude', [], 'exclude path from search')], | 1311 [('m', 'modified', None, 'show only modified files'), |
1265 'hg status [FILE]...'), | 1312 ('a', 'added', None, 'show only added files'), |
1313 ('r', 'removed', None, 'show only removed files'), | |
1314 ('u', 'unknown', None, 'show only unknown (not tracked) files'), | |
1315 ('I', 'include', [], 'include path in search'), | |
1316 ('X', 'exclude', [], 'exclude path from search')], | |
1317 "hg status [FILE]..."), | |
1266 "tag": | 1318 "tag": |
1267 (tag, | 1319 (tag, |
1268 [('l', 'local', None, 'make the tag local'), | 1320 [('l', 'local', None, 'make the tag local'), |
1269 ('m', 'message', "", 'commit message'), | 1321 ('m', 'message', "", 'commit message'), |
1270 ('t', 'text', "", 'commit message (deprecated: use -m)'), | 1322 ('t', 'text', "", 'commit message (deprecated: use -m)'), |
1281 'hg update [-m] [-C] [REV]'), | 1333 'hg update [-m] [-C] [REV]'), |
1282 "verify": (verify, [], 'hg verify'), | 1334 "verify": (verify, [], 'hg verify'), |
1283 "version": (show_version, [], 'hg version'), | 1335 "version": (show_version, [], 'hg version'), |
1284 } | 1336 } |
1285 | 1337 |
1286 globalopts = [('v', 'verbose', None, 'verbose'), | 1338 globalopts = [('v', 'verbose', None, 'verbose mode'), |
1287 ('', 'debug', None, 'debug'), | 1339 ('', 'debug', None, 'debug mode'), |
1288 ('q', 'quiet', None, 'quiet'), | 1340 ('q', 'quiet', None, 'quiet mode'), |
1289 ('', 'profile', None, 'profile'), | 1341 ('', 'profile', None, 'profile'), |
1290 ('R', 'repository', "", 'repository root directory'), | 1342 ('R', 'repository', "", 'repository root directory'), |
1291 ('', 'traceback', None, 'print traceback on exception'), | 1343 ('', 'traceback', None, 'print traceback on exception'), |
1292 ('y', 'noninteractive', None, 'run non-interactively'), | 1344 ('y', 'noninteractive', None, 'run non-interactively'), |
1293 ('', 'version', None, 'output version information and exit'), | 1345 ('', 'version', None, 'output version information and exit'), |
1297 norepo = "clone init version help debugindex debugindexdot" | 1349 norepo = "clone init version help debugindex debugindexdot" |
1298 | 1350 |
1299 def find(cmd): | 1351 def find(cmd): |
1300 for e in table.keys(): | 1352 for e in table.keys(): |
1301 if re.match("(%s)$" % e, cmd): | 1353 if re.match("(%s)$" % e, cmd): |
1302 return table[e] | 1354 return e, table[e] |
1303 | 1355 |
1304 raise UnknownCommand(cmd) | 1356 raise UnknownCommand(cmd) |
1305 | 1357 |
1306 class SignalInterrupt(Exception): | 1358 class SignalInterrupt(Exception): |
1307 """Exception raised on SIGTERM and SIGHUP.""" | 1359 """Exception raised on SIGTERM and SIGHUP.""" |
1325 raise ParseError(None, inst) | 1377 raise ParseError(None, inst) |
1326 | 1378 |
1327 if options["version"]: | 1379 if options["version"]: |
1328 return ("version", show_version, [], options, cmdoptions) | 1380 return ("version", show_version, [], options, cmdoptions) |
1329 elif not args: | 1381 elif not args: |
1330 return ("help", help_, [], options, cmdoptions) | 1382 return ("help", help_, ["shortlist"], options, cmdoptions) |
1331 else: | 1383 else: |
1332 cmd, args = args[0], args[1:] | 1384 cmd, args = args[0], args[1:] |
1333 | 1385 |
1334 i = find(cmd) | 1386 i = find(cmd)[1] |
1335 | 1387 |
1336 # combine global options into local | 1388 # combine global options into local |
1337 c = list(i[1]) | 1389 c = list(i[1]) |
1338 for o in globalopts: | 1390 for o in globalopts: |
1339 c.append((o[0], o[1], options[o[1]], o[3])) | 1391 c.append((o[0], o[1], options[o[1]], o[3])) |
1365 if inst.args[0]: | 1417 if inst.args[0]: |
1366 u.warn("hg %s: %s\n" % (inst.args[0], inst.args[1])) | 1418 u.warn("hg %s: %s\n" % (inst.args[0], inst.args[1])) |
1367 help_(u, inst.args[0]) | 1419 help_(u, inst.args[0]) |
1368 else: | 1420 else: |
1369 u.warn("hg: %s\n" % inst.args[1]) | 1421 u.warn("hg: %s\n" % inst.args[1]) |
1370 help_(u) | 1422 help_(u, 'shortlist') |
1371 sys.exit(-1) | 1423 sys.exit(-1) |
1372 except UnknownCommand, inst: | 1424 except UnknownCommand, inst: |
1373 u = ui.ui() | 1425 u = ui.ui() |
1374 u.warn("hg: unknown command '%s'\n" % inst.args[0]) | 1426 u.warn("hg: unknown command '%s'\n" % inst.args[0]) |
1375 help_(u) | 1427 help_(u, 'shortlist') |
1376 sys.exit(1) | 1428 sys.exit(1) |
1377 | 1429 |
1378 if options["time"]: | 1430 if options["time"]: |
1379 def get_times(): | 1431 def get_times(): |
1380 t = os.times() | 1432 t = os.times() |
1453 if len(tb) > 2: # no | 1505 if len(tb) > 2: # no |
1454 raise | 1506 raise |
1455 u.debug(inst, "\n") | 1507 u.debug(inst, "\n") |
1456 u.warn("%s: invalid arguments\n" % cmd) | 1508 u.warn("%s: invalid arguments\n" % cmd) |
1457 help_(u, cmd) | 1509 help_(u, cmd) |
1510 except UnknownCommand, inst: | |
1511 u.warn("hg: unknown command '%s'\n" % inst.args[0]) | |
1512 help_(u, 'shortlist') | |
1458 | 1513 |
1459 sys.exit(-1) | 1514 sys.exit(-1) |