mercurial/commands.py
changeset 1472 3c909a747d7f
parent 1470 fb9b84c91222
child 1475 d791c335fb7b
equal deleted inserted replaced
1471:f56f38a1a85f 1472:3c909a747d7f
  1788         if ui.verbose or not exact: ui.status(_('removing %s\n') % rel)
  1788         if ui.verbose or not exact: ui.status(_('removing %s\n') % rel)
  1789         names.append(abs)
  1789         names.append(abs)
  1790     repo.remove(names, unlink=True)
  1790     repo.remove(names, unlink=True)
  1791     return errs
  1791     return errs
  1792 
  1792 
  1793 def revert(ui, repo, *names, **opts):
  1793 def revert(ui, repo, *pats, **opts):
  1794     """revert modified files or dirs back to their unmodified states
  1794     """revert modified files or dirs back to their unmodified states
  1795 
  1795 
  1796     Revert any uncommitted modifications made to the named files or
  1796     Revert any uncommitted modifications made to the named files or
  1797     directories.  This restores the contents of the affected files to
  1797     directories.  This restores the contents of the affected files to
  1798     an unmodified state.
  1798     an unmodified state.
  1799 
  1799 
  1800     If a file has been deleted, it is recreated.  If the executable
  1800     If a file has been deleted, it is recreated.  If the executable
  1801     mode of a file was changed, it is reset.
  1801     mode of a file was changed, it is reset.
  1802 
  1802 
  1803     If a directory is given, all files in that directory and its
  1803     If names are given, all files matching the names are reverted.
  1804     subdirectories are reverted.
  1804 
  1805 
  1805     If no names are given, all files in the current directory and
  1806     If no arguments are given, all files in the current directory and
       
  1807     its subdirectories are reverted.
  1806     its subdirectories are reverted.
  1808     """
  1807     """
  1809     node = opts['rev'] and repo.lookup(opts['rev']) or \
  1808     node = opts['rev'] and repo.lookup(opts['rev']) or \
  1810            repo.dirstate.parents()[0]
  1809            repo.dirstate.parents()[0]
  1811     root = os.path.realpath(repo.root)
  1810 
  1812 
  1811     files, choose, anypats = matchpats(repo, repo.getcwd(), pats, opts)
  1813     def trimpath(p):
  1812     (c, a, d, u) = repo.changes(match=choose)
  1814         p = os.path.realpath(p)
  1813     repo.forget(a)
  1815         if p.startswith(root):
  1814     repo.undelete(d)
  1816             rest = p[len(root):]
  1815 
  1817             if not rest:
  1816     return repo.update(node, False, True, choose, False)
  1818                 return rest
       
  1819             if p.startswith(os.sep):
       
  1820                 return rest[1:]
       
  1821             return p
       
  1822 
       
  1823     relnames = map(trimpath, names or [os.getcwd()])
       
  1824     chosen = {}
       
  1825 
       
  1826     def choose(name):
       
  1827         def body(name):
       
  1828             for r in relnames:
       
  1829                 if not name.startswith(r):
       
  1830                     continue
       
  1831                 rest = name[len(r):]
       
  1832                 if not rest:
       
  1833                     return r, True
       
  1834                 depth = rest.count(os.sep)
       
  1835                 if not r:
       
  1836                     if depth == 0 or not opts['nonrecursive']:
       
  1837                         return r, True
       
  1838                 elif rest[0] == os.sep:
       
  1839                     if depth == 1 or not opts['nonrecursive']:
       
  1840                         return r, True
       
  1841             return None, False
       
  1842         relname, ret = body(name)
       
  1843         if ret:
       
  1844             chosen[relname] = 1
       
  1845         return ret
       
  1846 
       
  1847     (c, a, d, u) = repo.changes()
       
  1848     repo.forget(filter(choose, a))
       
  1849     repo.undelete(filter(choose, d))
       
  1850 
       
  1851     r = repo.update(node, False, True, choose, False)
       
  1852     for n in relnames:
       
  1853         if n not in chosen:
       
  1854             ui.warn(_('error: no matches for %s\n') % n)
       
  1855             r = 1
       
  1856     sys.stdout.flush()
       
  1857     return r
       
  1858 
  1817 
  1859 def root(ui, repo):
  1818 def root(ui, repo):
  1860     """print the root (top) of the current working dir
  1819     """print the root (top) of the current working dir
  1861 
  1820 
  1862     Print the root directory of the current repository.
  1821     Print the root directory of the current repository.
  2346                    ('A', 'after', None, _('record a rename that has already occurred')),
  2305                    ('A', 'after', None, _('record a rename that has already occurred')),
  2347                    ('f', 'force', None, _('forcibly copy over an existing managed file'))],
  2306                    ('f', 'force', None, _('forcibly copy over an existing managed file'))],
  2348                   _('hg rename [OPTION]... [SOURCE]... DEST')),
  2307                   _('hg rename [OPTION]... [SOURCE]... DEST')),
  2349     "^revert":
  2308     "^revert":
  2350         (revert,
  2309         (revert,
  2351          [("n", "nonrecursive", None, _("do not recurse into subdirectories")),
  2310          [('I', 'include', [], _('include names matching the given patterns')),
       
  2311           ('X', 'exclude', [], _('exclude names matching the given patterns')),
  2352           ("r", "rev", "", _("revision to revert to"))],
  2312           ("r", "rev", "", _("revision to revert to"))],
  2353          _("hg revert [-n] [-r REV] [NAME]...")),
  2313          _("hg revert [-n] [-r REV] [NAME]...")),
  2354     "root": (root, [], _("hg root")),
  2314     "root": (root, [], _("hg root")),
  2355     "^serve":
  2315     "^serve":
  2356         (serve,
  2316         (serve,