mercurial/commands.py
changeset 1625 e1bcf7fa983f
parent 1622 5e9168401a68
child 1626 f2b1df3dbcbb
equal deleted inserted replaced
1624:d9e576e55d81 1625:e1bcf7fa983f
    38     if not pats and cwd:
    38     if not pats and cwd:
    39         opts['include'] = [os.path.join(cwd, i) for i in opts['include']]
    39         opts['include'] = [os.path.join(cwd, i) for i in opts['include']]
    40         opts['exclude'] = [os.path.join(cwd, x) for x in opts['exclude']]
    40         opts['exclude'] = [os.path.join(cwd, x) for x in opts['exclude']]
    41         cwd = ''
    41         cwd = ''
    42     return util.cmdmatcher(repo.root, cwd, pats or ['.'], opts.get('include'),
    42     return util.cmdmatcher(repo.root, cwd, pats or ['.'], opts.get('include'),
    43                         opts.get('exclude'), head) + (cwd,)
    43                            opts.get('exclude'), head)
    44 
    44 
    45 def makewalk(repo, pats, opts, node=None, head=''):
    45 def makewalk(repo, pats, opts, node=None, head=''):
    46     files, matchfn, anypats, cwd = matchpats(repo, pats, opts, head)
    46     files, matchfn, anypats = matchpats(repo, pats, opts, head)
    47     exact = dict(zip(files, files))
    47     exact = dict(zip(files, files))
    48     def walk():
    48     def walk():
    49         for src, fn in repo.walk(node=node, files=files, match=matchfn):
    49         for src, fn in repo.walk(node=node, files=files, match=matchfn):
    50             yield src, fn, util.pathto(cwd, fn), fn in exact
    50             yield src, fn, util.pathto(repo.getcwd(), fn), fn in exact
    51     return files, matchfn, walk()
    51     return files, matchfn, walk()
    52 
    52 
    53 def walk(repo, pats, opts, node=None, head=''):
    53 def walk(repo, pats, opts, node=None, head=''):
    54     files, matchfn, results = makewalk(repo, pats, opts, node, head)
    54     files, matchfn, results = makewalk(repo, pats, opts, node, head)
    55     for r in results:
    55     for r in results:
    80     possible display
    80     possible display
    81 
    81 
    82     "iter", rev, None: in-order traversal of the revs earlier iterated
    82     "iter", rev, None: in-order traversal of the revs earlier iterated
    83     over with "add" - use to display data'''
    83     over with "add" - use to display data'''
    84 
    84 
    85     files, matchfn, anypats, cwd = matchpats(repo, pats, opts)
    85     files, matchfn, anypats = matchpats(repo, pats, opts)
    86 
    86 
    87     if repo.changelog.count() == 0:
    87     if repo.changelog.count() == 0:
    88         return [], False, matchfn
    88         return [], False, matchfn
    89 
    89 
    90     revs = map(int, revrange(ui, repo, opts['rev'] or ['tip:0']))
    90     revs = map(int, revrange(ui, repo, opts['rev'] or ['tip:0']))
   513     add, remove = [], []
   513     add, remove = [], []
   514     for src, abs, rel, exact in walk(repo, pats, opts):
   514     for src, abs, rel, exact in walk(repo, pats, opts):
   515         if src == 'f' and repo.dirstate.state(abs) == '?':
   515         if src == 'f' and repo.dirstate.state(abs) == '?':
   516             add.append(abs)
   516             add.append(abs)
   517             if ui.verbose or not exact:
   517             if ui.verbose or not exact:
   518                 ui.status(_('adding %s\n') % rel)
   518                 ui.status(_('adding %s\n') % ((pats and rel) or abs))
   519         if repo.dirstate.state(abs) != 'r' and not os.path.exists(rel):
   519         if repo.dirstate.state(abs) != 'r' and not os.path.exists(rel):
   520             remove.append(abs)
   520             remove.append(abs)
   521             if ui.verbose or not exact:
   521             if ui.verbose or not exact:
   522                 ui.status(_('removing %s\n') % rel)
   522                 ui.status(_('removing %s\n') % ((pats and rel) or abs))
   523     repo.add(add)
   523     repo.add(add)
   524     repo.remove(remove)
   524     repo.remove(remove)
   525 
   525 
   526 def annotate(ui, repo, *pats, **opts):
   526 def annotate(ui, repo, *pats, **opts):
   527     """show changeset information per file line
   527     """show changeset information per file line
   566     change = repo.changelog.read(node)
   566     change = repo.changelog.read(node)
   567     mmap = repo.manifest.read(change[0])
   567     mmap = repo.manifest.read(change[0])
   568 
   568 
   569     for src, abs, rel, exact in walk(repo, pats, opts):
   569     for src, abs, rel, exact in walk(repo, pats, opts):
   570         if abs not in mmap:
   570         if abs not in mmap:
   571             ui.warn(_("warning: %s is not in the repository!\n") % rel)
   571             ui.warn(_("warning: %s is not in the repository!\n") %
       
   572                     ((pats and rel) or abs))
   572             continue
   573             continue
   573 
   574 
   574         f = repo.file(abs)
   575         f = repo.file(abs)
   575         if not opts['text'] and util.binary(f.read(mmap[abs])):
   576         if not opts['text'] and util.binary(f.read(mmap[abs])):
   576             ui.write(_("%s: binary file\n") % rel)
   577             ui.write(_("%s: binary file\n") % ((pats and rel) or abs))
   577             continue
   578             continue
   578 
   579 
   579         lines = f.annotate(mmap[abs])
   580         lines = f.annotate(mmap[abs])
   580         pieces = []
   581         pieces = []
   581 
   582 
   781             raise util.Abort(_("can't read commit message '%s': %s") %
   782             raise util.Abort(_("can't read commit message '%s': %s") %
   782                              (logfile, inst.strerror))
   783                              (logfile, inst.strerror))
   783 
   784 
   784     if opts['addremove']:
   785     if opts['addremove']:
   785         addremove(ui, repo, *pats, **opts)
   786         addremove(ui, repo, *pats, **opts)
   786     fns, match, anypats, cwd = matchpats(repo, pats, opts)
   787     fns, match, anypats = matchpats(repo, pats, opts)
   787     if pats:
   788     if pats:
   788         modified, added, removed, deleted, unknown = (
   789         modified, added, removed, deleted, unknown = (
   789             repo.changes(files=fns, match=match))
   790             repo.changes(files=fns, match=match))
   790         files = modified + added + removed
   791         files = modified + added + removed
   791     else:
   792     else:
  1120     if len(revs) > 1:
  1121     if len(revs) > 1:
  1121         node2 = revs[1]
  1122         node2 = revs[1]
  1122     if len(revs) > 2:
  1123     if len(revs) > 2:
  1123         raise util.Abort(_("too many revisions to diff"))
  1124         raise util.Abort(_("too many revisions to diff"))
  1124 
  1125 
  1125     fns, matchfn, anypats, cwd = matchpats(repo, pats, opts)
  1126     fns, matchfn, anypats = matchpats(repo, pats, opts)
  1126 
  1127 
  1127     dodiff(sys.stdout, ui, repo, node1, node2, fns, match=matchfn,
  1128     dodiff(sys.stdout, ui, repo, node1, node2, fns, match=matchfn,
  1128            text=opts['text'])
  1129            text=opts['text'])
  1129 
  1130 
  1130 def doexport(ui, repo, changeset, seqno, total, revwidth, opts):
  1131 def doexport(ui, repo, changeset, seqno, total, revwidth, opts):
  1201     forget = []
  1202     forget = []
  1202     for src, abs, rel, exact in walk(repo, pats, opts):
  1203     for src, abs, rel, exact in walk(repo, pats, opts):
  1203         if repo.dirstate.state(abs) == 'a':
  1204         if repo.dirstate.state(abs) == 'a':
  1204             forget.append(abs)
  1205             forget.append(abs)
  1205             if ui.verbose or not exact:
  1206             if ui.verbose or not exact:
  1206                 ui.status(_('forgetting %s\n') % rel)
  1207                 ui.status(_('forgetting %s\n') % ((pats and rel) or abs))
  1207     repo.forget(forget)
  1208     repo.forget(forget)
  1208 
  1209 
  1209 def grep(ui, repo, pattern, *pats, **opts):
  1210 def grep(ui, repo, pattern, *pats, **opts):
  1210     """search for a pattern in specified files and revisions
  1211     """search for a pattern in specified files and revisions
  1211 
  1212 
  1542         if not node and repo.dirstate.state(abs) == '?':
  1543         if not node and repo.dirstate.state(abs) == '?':
  1543             continue
  1544             continue
  1544         if opts['fullpath']:
  1545         if opts['fullpath']:
  1545             ui.write(os.path.join(repo.root, abs), end)
  1546             ui.write(os.path.join(repo.root, abs), end)
  1546         else:
  1547         else:
  1547             ui.write(rel, end)
  1548             ui.write(((pats and rel) or abs), end)
  1548 
  1549 
  1549 def log(ui, repo, *pats, **opts):
  1550 def log(ui, repo, *pats, **opts):
  1550     """show revision history of entire repository or files
  1551     """show revision history of entire repository or files
  1551 
  1552 
  1552     Print the revision history of the specified files or the entire project.
  1553     Print the revision history of the specified files or the entire project.
  1896     If no arguments are given, all files in the repository are reverted.
  1897     If no arguments are given, all files in the repository are reverted.
  1897     """
  1898     """
  1898     node = opts['rev'] and repo.lookup(opts['rev']) or \
  1899     node = opts['rev'] and repo.lookup(opts['rev']) or \
  1899            repo.dirstate.parents()[0]
  1900            repo.dirstate.parents()[0]
  1900 
  1901 
  1901     files, choose, anypats, cwd = matchpats(repo, pats, opts)
  1902     files, choose, anypats = matchpats(repo, pats, opts)
  1902     modified, added, removed, deleted, unknown = repo.changes(match=choose)
  1903     modified, added, removed, deleted, unknown = repo.changes(match=choose)
  1903     repo.forget(added)
  1904     repo.forget(added)
  1904     repo.undelete(removed + deleted)
  1905     repo.undelete(removed + deleted)
  1905 
  1906 
  1906     return repo.update(node, False, True, choose, False)
  1907     return repo.update(node, False, True, choose, False)
  2030     R = removed
  2031     R = removed
  2031     ! = deleted, but still tracked
  2032     ! = deleted, but still tracked
  2032     ? = not tracked
  2033     ? = not tracked
  2033     """
  2034     """
  2034 
  2035 
  2035     files, matchfn, anypats, cwd = matchpats(repo, pats, opts)
  2036     files, matchfn, anypats = matchpats(repo, pats, opts)
       
  2037     cwd = (pats and repo.getcwd()) or ''
  2036     modified, added, removed, deleted, unknown = [
  2038     modified, added, removed, deleted, unknown = [
  2037         [util.pathto(cwd, x) for x in n]
  2039         [util.pathto(cwd, x) for x in n]
  2038         for n in repo.changes(files=files, match=matchfn)]
  2040         for n in repo.changes(files=files, match=matchfn)]
  2039 
  2041 
  2040     changetypes = [(_('modified'), 'M', modified),
  2042     changetypes = [(_('modified'), 'M', modified),