mercurial/commands.py
changeset 1092 0a02315976ff
parent 1090 1bca39b85615
child 1093 1f1661c58283
equal deleted inserted replaced
1091:d62130f99a73 1092:0a02315976ff
     4 #
     4 #
     5 # This software may be used and distributed according to the terms
     5 # This software may be used and distributed according to the terms
     6 # of the GNU General Public License, incorporated herein by reference.
     6 # of the GNU General Public License, incorporated herein by reference.
     7 
     7 
     8 from demandload import demandload
     8 from demandload import demandload
       
     9 from node import *
     9 demandload(globals(), "os re sys signal shutil imp")
    10 demandload(globals(), "os re sys signal shutil imp")
    10 demandload(globals(), "fancyopts ui hg util lock")
    11 demandload(globals(), "fancyopts ui hg util lock")
    11 demandload(globals(), "fnmatch hgweb mdiff random signal time traceback")
    12 demandload(globals(), "fnmatch hgweb mdiff random signal time traceback")
    12 demandload(globals(), "errno socket version struct atexit sets")
    13 demandload(globals(), "errno socket version struct atexit sets")
    13 
    14 
   161             yield str(fix(spec, None))
   162             yield str(fix(spec, None))
   162 
   163 
   163 def make_filename(repo, r, pat, node=None,
   164 def make_filename(repo, r, pat, node=None,
   164                   total=None, seqno=None, revwidth=None):
   165                   total=None, seqno=None, revwidth=None):
   165     node_expander = {
   166     node_expander = {
   166         'H': lambda: hg.hex(node),
   167         'H': lambda: hex(node),
   167         'R': lambda: str(r.rev(node)),
   168         'R': lambda: str(r.rev(node)),
   168         'h': lambda: hg.short(node),
   169         'h': lambda: short(node),
   169         }
   170         }
   170     expander = {
   171     expander = {
   171         '%': lambda: '%',
   172         '%': lambda: '%',
   172         'b': lambda: os.path.basename(repo.root),
   173         'b': lambda: os.path.basename(repo.root),
   173         }
   174         }
   240             return repo.wfile(f).read()
   241             return repo.wfile(f).read()
   241 
   242 
   242     if ui.quiet:
   243     if ui.quiet:
   243         r = None
   244         r = None
   244     else:
   245     else:
   245         hexfunc = ui.verbose and hg.hex or hg.short
   246         hexfunc = ui.verbose and hex or short
   246         r = [hexfunc(node) for node in [node1, node2] if node]
   247         r = [hexfunc(node) for node in [node1, node2] if node]
   247 
   248 
   248     change = repo.changelog.read(node1)
   249     change = repo.changelog.read(node1)
   249     mmap = repo.manifest.read(change[0])
   250     mmap = repo.manifest.read(change[0])
   250     date1 = date(change)
   251     date1 = date(change)
   271         changenode = log.node(rev)
   272         changenode = log.node(rev)
   272     elif not rev:
   273     elif not rev:
   273         rev = log.rev(changenode)
   274         rev = log.rev(changenode)
   274 
   275 
   275     if ui.quiet:
   276     if ui.quiet:
   276         ui.write("%d:%s\n" % (rev, hg.short(changenode)))
   277         ui.write("%d:%s\n" % (rev, short(changenode)))
   277         return
   278         return
   278 
   279 
   279     changes = log.read(changenode)
   280     changes = log.read(changenode)
   280 
   281 
   281     t, tz = changes[2].split(' ')
   282     t, tz = changes[2].split(' ')
   284         tz = int(tz)
   285         tz = int(tz)
   285     except ValueError:
   286     except ValueError:
   286         tz = 0
   287         tz = 0
   287     date = time.asctime(time.localtime(float(t))) + " %+05d" % (int(tz)/-36)
   288     date = time.asctime(time.localtime(float(t))) + " %+05d" % (int(tz)/-36)
   288 
   289 
   289     parents = [(log.rev(p), ui.verbose and hg.hex(p) or hg.short(p))
   290     parents = [(log.rev(p), ui.verbose and hex(p) or short(p))
   290                for p in log.parents(changenode)
   291                for p in log.parents(changenode)
   291                if ui.debugflag or p != hg.nullid]
   292                if ui.debugflag or p != nullid]
   292     if not ui.debugflag and len(parents) == 1 and parents[0][0] == rev-1:
   293     if not ui.debugflag and len(parents) == 1 and parents[0][0] == rev-1:
   293         parents = []
   294         parents = []
   294 
   295 
   295     if ui.verbose:
   296     if ui.verbose:
   296         ui.write("changeset:   %d:%s\n" % (rev, hg.hex(changenode)))
   297         ui.write("changeset:   %d:%s\n" % (rev, hex(changenode)))
   297     else:
   298     else:
   298         ui.write("changeset:   %d:%s\n" % (rev, hg.short(changenode)))
   299         ui.write("changeset:   %d:%s\n" % (rev, short(changenode)))
   299 
   300 
   300     for tag in repo.nodetags(changenode):
   301     for tag in repo.nodetags(changenode):
   301         ui.status("tag:         %s\n" % tag)
   302         ui.status("tag:         %s\n" % tag)
   302     for parent in parents:
   303     for parent in parents:
   303         ui.write("parent:      %d:%s\n" % parent)
   304         ui.write("parent:      %d:%s\n" % parent)
   305     if brinfo and changenode in brinfo:
   306     if brinfo and changenode in brinfo:
   306         br = brinfo[changenode]
   307         br = brinfo[changenode]
   307         ui.write("branch:      %s\n" % " ".join(br))
   308         ui.write("branch:      %s\n" % " ".join(br))
   308 
   309 
   309     ui.debug("manifest:    %d:%s\n" % (repo.manifest.rev(changes[0]),
   310     ui.debug("manifest:    %d:%s\n" % (repo.manifest.rev(changes[0]),
   310                                       hg.hex(changes[0])))
   311                                       hex(changes[0])))
   311     ui.status("user:        %s\n" % changes[1])
   312     ui.status("user:        %s\n" % changes[1])
   312     ui.status("date:        %s\n" % date)
   313     ui.status("date:        %s\n" % date)
   313 
   314 
   314     if ui.debugflag:
   315     if ui.debugflag:
   315         files = repo.changes(log.parents(changenode)[0], changenode)
   316         files = repo.changes(log.parents(changenode)[0], changenode)
   462     repo.remove(remove)
   463     repo.remove(remove)
   463 
   464 
   464 def annotate(ui, repo, *pats, **opts):
   465 def annotate(ui, repo, *pats, **opts):
   465     """show changeset information per file line"""
   466     """show changeset information per file line"""
   466     def getnode(rev):
   467     def getnode(rev):
   467         return hg.short(repo.changelog.node(rev))
   468         return short(repo.changelog.node(rev))
   468 
   469 
   469     def getname(rev):
   470     def getname(rev):
   470         try:
   471         try:
   471             return bcache[rev]
   472             return bcache[rev]
   472         except KeyError:
   473         except KeyError:
   700              " nodeid       p1           p2\n")
   701              " nodeid       p1           p2\n")
   701     for i in range(r.count()):
   702     for i in range(r.count()):
   702         e = r.index[i]
   703         e = r.index[i]
   703         ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
   704         ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
   704                 i, e[0], e[1], e[2], e[3],
   705                 i, e[0], e[1], e[2], e[3],
   705             hg.short(e[6]), hg.short(e[4]), hg.short(e[5])))
   706             short(e[6]), short(e[4]), short(e[5])))
   706 
   707 
   707 def debugindexdot(ui, file_):
   708 def debugindexdot(ui, file_):
   708     """dump an index DAG as a .dot file"""
   709     """dump an index DAG as a .dot file"""
   709     r = hg.revlog(file, file_, "")
   710     r = hg.revlog(file, file_, "")
   710     ui.write("digraph G {\n")
   711     ui.write("digraph G {\n")
   711     for i in range(r.count()):
   712     for i in range(r.count()):
   712         e = r.index[i]
   713         e = r.index[i]
   713         ui.write("\t%d -> %d\n" % (r.rev(e[4]), i))
   714         ui.write("\t%d -> %d\n" % (r.rev(e[4]), i))
   714         if e[5] != hg.nullid:
   715         if e[5] != nullid:
   715             ui.write("\t%d -> %d\n" % (r.rev(e[5]), i))
   716             ui.write("\t%d -> %d\n" % (r.rev(e[5]), i))
   716     ui.write("}\n")
   717     ui.write("}\n")
   717 
   718 
   718 def debugwalk(ui, repo, *pats, **opts):
   719 def debugwalk(ui, repo, *pats, **opts):
   719     """show how files match on given patterns"""
   720     """show how files match on given patterns"""
   759     if fp != sys.stdout:
   760     if fp != sys.stdout:
   760         ui.note("%s\n" % fp.name)
   761         ui.note("%s\n" % fp.name)
   761 
   762 
   762     fp.write("# HG changeset patch\n")
   763     fp.write("# HG changeset patch\n")
   763     fp.write("# User %s\n" % change[1])
   764     fp.write("# User %s\n" % change[1])
   764     fp.write("# Node ID %s\n" % hg.hex(node))
   765     fp.write("# Node ID %s\n" % hex(node))
   765     fp.write("# Parent  %s\n" % hg.hex(prev))
   766     fp.write("# Parent  %s\n" % hex(prev))
   766     if other != hg.nullid:
   767     if other != nullid:
   767         fp.write("# Parent  %s\n" % hg.hex(other))
   768         fp.write("# Parent  %s\n" % hex(other))
   768     fp.write(change[4].rstrip())
   769     fp.write(change[4].rstrip())
   769     fp.write("\n\n")
   770     fp.write("\n\n")
   770 
   771 
   771     dodiff(fp, ui, repo, prev, node, text=opts['text'])
   772     dodiff(fp, ui, repo, prev, node, text=opts['text'])
   772     if fp != sys.stdout:
   773     if fp != sys.stdout:
   900     for n in repo.changelog.heads():
   901     for n in repo.changelog.heads():
   901         show_changeset(ui, repo, changenode=n, brinfo=br)
   902         show_changeset(ui, repo, changenode=n, brinfo=br)
   902 
   903 
   903 def identify(ui, repo):
   904 def identify(ui, repo):
   904     """print information about the working copy"""
   905     """print information about the working copy"""
   905     parents = [p for p in repo.dirstate.parents() if p != hg.nullid]
   906     parents = [p for p in repo.dirstate.parents() if p != nullid]
   906     if not parents:
   907     if not parents:
   907         ui.write("unknown\n")
   908         ui.write("unknown\n")
   908         return
   909         return
   909 
   910 
   910     hexfunc = ui.verbose and hg.hex or hg.short
   911     hexfunc = ui.verbose and hex or short
   911     (c, a, d, u) = repo.changes()
   912     (c, a, d, u) = repo.changes()
   912     output = ["%s%s" % ('+'.join([hexfunc(parent) for parent in parents]),
   913     output = ["%s%s" % ('+'.join([hexfunc(parent) for parent in parents]),
   913                         (c or a or d) and "+" or "")]
   914                         (c or a or d) and "+" or "")]
   914 
   915 
   915     if not ui.quiet:
   916     if not ui.quiet:
  1075     mf = repo.manifest.readflags(n)
  1076     mf = repo.manifest.readflags(n)
  1076     files = m.keys()
  1077     files = m.keys()
  1077     files.sort()
  1078     files.sort()
  1078 
  1079 
  1079     for f in files:
  1080     for f in files:
  1080         ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f))
  1081         ui.write("%40s %3s %s\n" % (hex(m[f]), mf[f] and "755" or "644", f))
  1081 
  1082 
  1082 def outgoing(ui, repo, dest="default-push"):
  1083 def outgoing(ui, repo, dest="default-push"):
  1083     """show changesets not found in destination"""
  1084     """show changesets not found in destination"""
  1084     dest = ui.expandpath(dest)
  1085     dest = ui.expandpath(dest)
  1085     other = hg.repository(ui, dest)
  1086     other = hg.repository(ui, dest)
  1095         p = repo.changelog.parents(repo.lookup(rev))
  1096         p = repo.changelog.parents(repo.lookup(rev))
  1096     else:
  1097     else:
  1097         p = repo.dirstate.parents()
  1098         p = repo.dirstate.parents()
  1098 
  1099 
  1099     for n in p:
  1100     for n in p:
  1100         if n != hg.nullid:
  1101         if n != nullid:
  1101             show_changeset(ui, repo, changenode=n)
  1102             show_changeset(ui, repo, changenode=n)
  1102 
  1103 
  1103 def paths(ui, search=None):
  1104 def paths(ui, search=None):
  1104     """show definition of symbolic path names"""
  1105     """show definition of symbolic path names"""
  1105     try:
  1106     try:
  1258             cmd = fin.readline()[:-1]
  1259             cmd = fin.readline()[:-1]
  1259             if cmd == '':
  1260             if cmd == '':
  1260                 return
  1261                 return
  1261             if cmd == "heads":
  1262             if cmd == "heads":
  1262                 h = repo.heads()
  1263                 h = repo.heads()
  1263                 respond(" ".join(map(hg.hex, h)) + "\n")
  1264                 respond(" ".join(map(hex, h)) + "\n")
  1264             if cmd == "lock":
  1265             if cmd == "lock":
  1265                 lock = repo.lock()
  1266                 lock = repo.lock()
  1266                 respond("")
  1267                 respond("")
  1267             if cmd == "unlock":
  1268             if cmd == "unlock":
  1268                 if lock:
  1269                 if lock:
  1269                     lock.release()
  1270                     lock.release()
  1270                 lock = None
  1271                 lock = None
  1271                 respond("")
  1272                 respond("")
  1272             elif cmd == "branches":
  1273             elif cmd == "branches":
  1273                 arg, nodes = getarg()
  1274                 arg, nodes = getarg()
  1274                 nodes = map(hg.bin, nodes.split(" "))
  1275                 nodes = map(bin, nodes.split(" "))
  1275                 r = []
  1276                 r = []
  1276                 for b in repo.branches(nodes):
  1277                 for b in repo.branches(nodes):
  1277                     r.append(" ".join(map(hg.hex, b)) + "\n")
  1278                     r.append(" ".join(map(hex, b)) + "\n")
  1278                 respond("".join(r))
  1279                 respond("".join(r))
  1279             elif cmd == "between":
  1280             elif cmd == "between":
  1280                 arg, pairs = getarg()
  1281                 arg, pairs = getarg()
  1281                 pairs = [map(hg.bin, p.split("-")) for p in pairs.split(" ")]
  1282                 pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
  1282                 r = []
  1283                 r = []
  1283                 for b in repo.between(pairs):
  1284                 for b in repo.between(pairs):
  1284                     r.append(" ".join(map(hg.hex, b)) + "\n")
  1285                     r.append(" ".join(map(hex, b)) + "\n")
  1285                 respond("".join(r))
  1286                 respond("".join(r))
  1286             elif cmd == "changegroup":
  1287             elif cmd == "changegroup":
  1287                 nodes = []
  1288                 nodes = []
  1288                 arg, roots = getarg()
  1289                 arg, roots = getarg()
  1289                 nodes = map(hg.bin, roots.split(" "))
  1290                 nodes = map(bin, roots.split(" "))
  1290 
  1291 
  1291                 cg = repo.changegroup(nodes)
  1292                 cg = repo.changegroup(nodes)
  1292                 while 1:
  1293                 while 1:
  1293                     d = cg.read(4096)
  1294                     d = cg.read(4096)
  1294                     if not d:
  1295                     if not d:
  1366                 " please use -m or --message instead.\n")
  1367                 " please use -m or --message instead.\n")
  1367     if name == "tip":
  1368     if name == "tip":
  1368         ui.warn("abort: 'tip' is a reserved name!\n")
  1369         ui.warn("abort: 'tip' is a reserved name!\n")
  1369         return -1
  1370         return -1
  1370     if rev:
  1371     if rev:
  1371         r = hg.hex(repo.lookup(rev))
  1372         r = hex(repo.lookup(rev))
  1372     else:
  1373     else:
  1373         r = hg.hex(repo.changelog.tip())
  1374         r = hex(repo.changelog.tip())
  1374 
  1375 
  1375     if name.find(revrangesep) >= 0:
  1376     if name.find(revrangesep) >= 0:
  1376         ui.warn("abort: '%s' cannot be used in a tag name\n" % revrangesep)
  1377         ui.warn("abort: '%s' cannot be used in a tag name\n" % revrangesep)
  1377         return -1
  1378         return -1
  1378 
  1379 
  1400 
  1401 
  1401     l = repo.tagslist()
  1402     l = repo.tagslist()
  1402     l.reverse()
  1403     l.reverse()
  1403     for t, n in l:
  1404     for t, n in l:
  1404         try:
  1405         try:
  1405             r = "%5d:%s" % (repo.changelog.rev(n), hg.hex(n))
  1406             r = "%5d:%s" % (repo.changelog.rev(n), hex(n))
  1406         except KeyError:
  1407         except KeyError:
  1407             r = "    ?:?"
  1408             r = "    ?:?"
  1408         ui.write("%-30s %s\n" % (t, r))
  1409         ui.write("%-30s %s\n" % (t, r))
  1409 
  1410 
  1410 def tip(ui, repo):
  1411 def tip(ui, repo):
  1451             for x in found:
  1452             for x in found:
  1452                 show_changeset(ui, repo, changenode=x, brinfo=br)
  1453                 show_changeset(ui, repo, changenode=x, brinfo=br)
  1453             return 1
  1454             return 1
  1454         if len(found) == 1:
  1455         if len(found) == 1:
  1455             node = found[0]
  1456             node = found[0]
  1456             ui.warn("Using head %s for branch %s\n" % (hg.short(node), branch))
  1457             ui.warn("Using head %s for branch %s\n" % (short(node), branch))
  1457         else:
  1458         else:
  1458             ui.warn("branch %s not found\n" % (branch))
  1459             ui.warn("branch %s not found\n" % (branch))
  1459             return 1
  1460             return 1
  1460     else:
  1461     else:
  1461         node = node and repo.lookup(node) or repo.changelog.tip()
  1462         node = node and repo.lookup(node) or repo.changelog.tip()