mercurial/commands.py
changeset 1030 28e2f13ca7c4
parent 1028 25e7ea0f2cff
parent 1016 836667830fee
child 1031 503aaf19a040
equal deleted inserted replaced
1029:b5f0ccad8917 1030:28e2f13ca7c4
   138     if hasattr(pat, 'read') and 'r' in mode:
   138     if hasattr(pat, 'read') and 'r' in mode:
   139         return pat
   139         return pat
   140     return open(make_filename(repo, r, pat, node, total, seqno, revwidth),
   140     return open(make_filename(repo, r, pat, node, total, seqno, revwidth),
   141                 mode)
   141                 mode)
   142 
   142 
   143 def dodiff(fp, ui, repo, files=None, node1=None, node2=None, match=util.always, changes=None):
   143 def dodiff(fp, ui, repo, node1, node2, files=None, match=util.always,
       
   144            changes=None, text=False):
   144     def date(c):
   145     def date(c):
   145         return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
   146         return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
   146 
   147 
   147     if not changes:
   148     if not changes:
   148         (c, a, d, u) = repo.changes(node1, node2, files, match = match)
   149         (c, a, d, u) = repo.changes(node1, node2, files, match = match)
   180     for f in c:
   181     for f in c:
   181         to = None
   182         to = None
   182         if f in mmap:
   183         if f in mmap:
   183             to = repo.file(f).read(mmap[f])
   184             to = repo.file(f).read(mmap[f])
   184         tn = read(f)
   185         tn = read(f)
   185         fp.write(mdiff.unidiff(to, date1, tn, date2, f, r))
   186         fp.write(mdiff.unidiff(to, date1, tn, date2, f, r, text=text))
   186     for f in a:
   187     for f in a:
   187         to = None
   188         to = None
   188         tn = read(f)
   189         tn = read(f)
   189         fp.write(mdiff.unidiff(to, date1, tn, date2, f, r))
   190         fp.write(mdiff.unidiff(to, date1, tn, date2, f, r, text=text))
   190     for f in d:
   191     for f in d:
   191         to = repo.file(f).read(mmap[f])
   192         to = repo.file(f).read(mmap[f])
   192         tn = None
   193         tn = None
   193         fp.write(mdiff.unidiff(to, date1, tn, date2, f, r))
   194         fp.write(mdiff.unidiff(to, date1, tn, date2, f, r, text=text))
   194 
   195 
   195 def show_changeset(ui, repo, rev=0, changenode=None, filelog=None, brinfo=None):
   196 def show_changeset(ui, repo, rev=0, changenode=None, filelog=None, brinfo=None):
   196     """show a single changeset or file revision"""
   197     """show a single changeset or file revision"""
   197     changelog = repo.changelog
   198     changelog = repo.changelog
   198     if filelog:
   199     if filelog:
   430         node = repo.changelog.lookup(opts['rev'])
   431         node = repo.changelog.lookup(opts['rev'])
   431     else:
   432     else:
   432         node = repo.dirstate.parents()[0]
   433         node = repo.dirstate.parents()[0]
   433     change = repo.changelog.read(node)
   434     change = repo.changelog.read(node)
   434     mmap = repo.manifest.read(change[0])
   435     mmap = repo.manifest.read(change[0])
       
   436 
   435     for src, abs, rel, exact in walk(repo, pats, opts):
   437     for src, abs, rel, exact in walk(repo, pats, opts):
   436         if abs not in mmap:
   438         if abs not in mmap:
   437             ui.warn("warning: %s is not in the repository!\n" % rel)
   439             ui.warn("warning: %s is not in the repository!\n" % rel)
   438             continue
   440             continue
   439 
   441 
   440         lines = repo.file(abs).annotate(mmap[abs])
   442         f = repo.file(abs)
       
   443         if not opts['text'] and util.binary(f.read(mmap[abs])):
       
   444             ui.write("%s: binary file\n" % rel)
       
   445             continue
       
   446 
       
   447         lines = f.annotate(mmap[abs])
   441         pieces = []
   448         pieces = []
   442 
   449 
   443         for o, f in opmap:
   450         for o, f in opmap:
   444             if opts[o]:
   451             if opts[o]:
   445                 l = [f(n) for n, dummy in lines]
   452                 l = [f(n) for n, dummy in lines]
   648     for src, abs, rel, exact in items:
   655     for src, abs, rel, exact in items:
   649         print fmt % (src, abs, rel, exactly[exact])
   656         print fmt % (src, abs, rel, exactly[exact])
   650 
   657 
   651 def diff(ui, repo, *pats, **opts):
   658 def diff(ui, repo, *pats, **opts):
   652     """diff working directory (or selected files)"""
   659     """diff working directory (or selected files)"""
   653     revs = []
   660     node1, node2 = None, None
   654     if opts['rev']:
   661     revs = [repo.lookup(x) for x in opts['rev']]
   655         revs = map(lambda x: repo.lookup(x), opts['rev'])
   662 
   656 
   663     if len(revs) > 0:
       
   664         node1 = revs[0]
       
   665     if len(revs) > 1:
       
   666         node2 = revs[1]
   657     if len(revs) > 2:
   667     if len(revs) > 2:
   658         raise util.Abort("too many revisions to diff")
   668         raise util.Abort("too many revisions to diff")
   659 
   669 
   660     files = []
   670     files = []
   661     match = util.always
   671     match = util.always
   662     if pats:
   672     if pats:
   663         roots, match, results = makewalk(repo, pats, opts)
   673         roots, match, results = makewalk(repo, pats, opts)
   664         for src, abs, rel, exact in results:
   674         for src, abs, rel, exact in results:
   665             files.append(abs)
   675             files.append(abs)
   666     dodiff(sys.stdout, ui, repo, files, *revs, **{'match': match})
   676 
       
   677     dodiff(sys.stdout, ui, repo, node1, node2, files, match=match,
       
   678            text=opts['text'])
   667 
   679 
   668 def doexport(ui, repo, changeset, seqno, total, revwidth, opts):
   680 def doexport(ui, repo, changeset, seqno, total, revwidth, opts):
   669     node = repo.lookup(changeset)
   681     node = repo.lookup(changeset)
   670     prev, other = repo.changelog.parents(node)
   682     prev, other = repo.changelog.parents(node)
   671     change = repo.changelog.read(node)
   683     change = repo.changelog.read(node)
   683     if other != hg.nullid:
   695     if other != hg.nullid:
   684         fp.write("# Parent  %s\n" % hg.hex(other))
   696         fp.write("# Parent  %s\n" % hg.hex(other))
   685     fp.write(change[4].rstrip())
   697     fp.write(change[4].rstrip())
   686     fp.write("\n\n")
   698     fp.write("\n\n")
   687 
   699 
   688     dodiff(fp, ui, repo, None, prev, node)
   700     dodiff(fp, ui, repo, prev, node, text=opts['text'])
   689     if fp != sys.stdout: fp.close()
   701     if fp != sys.stdout: fp.close()
   690 
   702 
   691 def export(ui, repo, *changesets, **opts):
   703 def export(ui, repo, *changesets, **opts):
   692     """dump the header and diffs for one or more changesets"""
   704     """dump the header and diffs for one or more changesets"""
   693     if not changesets:
   705     if not changesets:
   866             if filelog:
   878             if filelog:
   867                 filenode = filelog.node(i)
   879                 filenode = filelog.node(i)
   868                 i = filelog.linkrev(filenode)
   880                 i = filelog.linkrev(filenode)
   869             changenode = repo.changelog.node(i)
   881             changenode = repo.changelog.node(i)
   870             prev, other = repo.changelog.parents(changenode)
   882             prev, other = repo.changelog.parents(changenode)
   871             dodiff(sys.stdout, ui, repo, files, prev, changenode)
   883             dodiff(sys.stdout, ui, repo, prev, changenode, files)
   872             ui.write("\n\n")
   884             ui.write("\n\n")
   873 
   885 
   874 def manifest(ui, repo, rev=None):
   886 def manifest(ui, repo, rev=None):
   875     """output the latest or given revision of the project manifest"""
   887     """output the latest or given revision of the project manifest"""
   876     if rev:
   888     if rev:
  1284           ('X', 'exclude', [], 'exclude path from search')],
  1296           ('X', 'exclude', [], 'exclude path from search')],
  1285          "hg addremove [OPTION]... [FILE]..."),
  1297          "hg addremove [OPTION]... [FILE]..."),
  1286     "^annotate":
  1298     "^annotate":
  1287         (annotate,
  1299         (annotate,
  1288          [('r', 'rev', '', 'revision'),
  1300          [('r', 'rev', '', 'revision'),
       
  1301           ('a', 'text', None, 'treat all files as text'),
  1289           ('u', 'user', None, 'show user'),
  1302           ('u', 'user', None, 'show user'),
  1290           ('n', 'number', None, 'show revision number'),
  1303           ('n', 'number', None, 'show revision number'),
  1291           ('c', 'changeset', None, 'show changeset'),
  1304           ('c', 'changeset', None, 'show changeset'),
  1292           ('I', 'include', [], 'include path in search'),
  1305           ('I', 'include', [], 'include path in search'),
  1293           ('X', 'exclude', [], 'exclude path from search')],
  1306           ('X', 'exclude', [], 'exclude path from search')],
  1325           ('X', 'exclude', [], 'exclude path from search')],
  1338           ('X', 'exclude', [], 'exclude path from search')],
  1326          'debugwalk [OPTION]... [FILE]...'),
  1339          'debugwalk [OPTION]... [FILE]...'),
  1327     "^diff":
  1340     "^diff":
  1328         (diff,
  1341         (diff,
  1329          [('r', 'rev', [], 'revision'),
  1342          [('r', 'rev', [], 'revision'),
       
  1343           ('a', 'text', None, 'treat all files as text'),
  1330           ('I', 'include', [], 'include path in search'),
  1344           ('I', 'include', [], 'include path in search'),
  1331           ('X', 'exclude', [], 'exclude path from search')],
  1345           ('X', 'exclude', [], 'exclude path from search')],
  1332          'hg diff [-I] [-X] [-r REV1 [-r REV2]] [FILE]...'),
  1346          'hg diff [-I] [-X] [-r REV1 [-r REV2]] [FILE]...'),
  1333     "^export":
  1347     "^export":
  1334         (export,
  1348         (export,
  1335          [('o', 'output', "", 'output to file')],
  1349          [('o', 'output', "", 'output to file'),
       
  1350           ('a', 'text', None, 'treat all files as text')],
  1336          "hg export [-o OUTFILE] REV..."),
  1351          "hg export [-o OUTFILE] REV..."),
  1337     "forget":
  1352     "forget":
  1338         (forget,
  1353         (forget,
  1339          [('I', 'include', [], 'include path in search'),
  1354          [('I', 'include', [], 'include path in search'),
  1340           ('X', 'exclude', [], 'exclude path from search')],
  1355           ('X', 'exclude', [], 'exclude path from search')],