mercurial/commands.py
changeset 725 c6b912f8b5b2
parent 724 1c0c413cccdd
parent 715 938dd667ca21
child 726 809a870a0e73
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'),