changeset 210:d2badbd7d1ad

hg undo: fixup working dir state -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 hg undo: fixup working dir state manifest hash: 60fd7a5621f7c4e87c7c36097aaf11b22e7ee0b4 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCngETywK+sNU5EO8RAiC/AKChvIgy61YfOLJcTQg5BKkTLLErRgCgnJMr +xb+XsjeNfK+83MzeuE8UOk= =EIlj -----END PGP SIGNATURE-----
author mpm@selenic.com
date Wed, 01 Jun 2005 10:40:19 -0800
parents 63af1db35611
children 426d3c3ae363
files hg mercurial/commands.py mercurial/hg.py
diffstat 3 files changed, 32 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/hg	Wed Jun 01 00:25:42 2005 -0800
+++ b/hg	Wed Jun 01 10:40:19 2005 -0800
@@ -417,9 +417,6 @@
 elif cmd == "recover":
     repo.recover()
 
-elif cmd == "undo":
-    repo.recover("undo")
-
 elif cmd == "verify":
     filelinkrevs = {}
     filenodes = {}
--- a/mercurial/commands.py	Wed Jun 01 00:25:42 2005 -0800
+++ b/mercurial/commands.py	Wed Jun 01 10:40:19 2005 -0800
@@ -90,6 +90,9 @@
         for p,l in zip(zip(*pieces), lines):
             u.write(" ".join(p) + ": " + l[1])
 
+def undo(ui, repo, args):
+    repo.undo()
+
 table = {
     "init": (init, [], 'hg init'),
     "help": (help, [], 'hg init'),
@@ -100,6 +103,7 @@
                       ('n', 'number', None, 'show revision number'),
                       ('c', 'changeset', None, 'show changeset')],
                      'hg annotate [-u] [-c] [-n] [-r id] [files]'),
+    "undo": (undo, [], 'hg undo'),
     }
 
 norepo = "init branch help"
--- a/mercurial/hg.py	Wed Jun 01 00:25:42 2005 -0800
+++ b/mercurial/hg.py	Wed Jun 01 10:40:19 2005 -0800
@@ -329,13 +329,35 @@
         return transaction(self.opener, self.join("journal"),
                            self.join("undo"))
 
-    def recover(self, f = "journal"):
+    def recover(self):
+        self.lock()
+        if os.path.exists(self.join("recover")):
+            self.ui.status("attempting to rollback interrupted transaction\n")
+            return rollback(self.opener, self.join("recover"))
+        else:
+            self.ui.warn("no interrupted transaction available\n")
+
+    def undo(self):
         self.lock()
-        if os.path.exists(self.join(f)):
-            self.ui.status("attempting to rollback %s information\n" % f)
-            return rollback(self.opener, self.join(f))
+        if os.path.exists(self.join("undo")):
+            self.ui.status("attempting to rollback last transaction\n")
+            rollback(self.opener, self.join("undo"))
+            self.manifest = manifest(self.opener)
+            self.changelog = changelog(self.opener)
+
+            self.ui.status("discarding dircache\n")
+            node = self.changelog.tip()
+            mf = self.changelog.read(node)[0]
+            mm = self.manifest.read(mf)
+            f = mm.keys()
+            f.sort()
+
+            self.setcurrent(node)
+            self.dircache.clear()
+            self.dircache.taint(f)
+        
         else:
-            self.ui.warn("no %s information available\n" % f)
+            self.ui.warn("no undo information available\n")
 
     def lock(self, wait = 1):
         try:
@@ -476,7 +498,7 @@
                 if fn in dc:
                     c = dc[fn]
                     del dc[fn]
-                    if not c:
+                    if not c or c[1] < 0:
                         if fcmp(fn):
                             changed.append(fn)
                     elif c[1] != s.st_size: