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, |