hgext/shelve.py
branchstable
changeset 20149 578b888c820e
parent 20103 b3483223f734
child 20407 955547eb2e20
child 20937 c0bf8bea10dd
--- a/hgext/shelve.py	Tue Nov 26 15:38:33 2013 +0100
+++ b/hgext/shelve.py	Tue Nov 26 16:23:05 2013 -0800
@@ -91,7 +91,6 @@
             pendingctx = fp.readline().strip()
             parents = [bin(h) for h in fp.readline().split()]
             stripnodes = [bin(h) for h in fp.readline().split()]
-            unknownfiles = fp.readline()[:-1].split('\0')
         finally:
             fp.close()
 
@@ -101,13 +100,11 @@
         obj.pendingctx = repo[bin(pendingctx)]
         obj.parents = parents
         obj.stripnodes = stripnodes
-        obj.unknownfiles = unknownfiles
 
         return obj
 
     @classmethod
-    def save(cls, repo, name, originalwctx, pendingctx, stripnodes,
-             unknownfiles):
+    def save(cls, repo, name, originalwctx, pendingctx, stripnodes):
         fp = repo.opener(cls._filename, 'wb')
         fp.write('%i\n' % cls._version)
         fp.write('%s\n' % name)
@@ -115,7 +112,6 @@
         fp.write('%s\n' % hex(pendingctx.node()))
         fp.write('%s\n' % ' '.join([hex(p) for p in repo.dirstate.parents()]))
         fp.write('%s\n' % ' '.join([hex(n) for n in stripnodes]))
-        fp.write('%s\n' % '\0'.join(unknownfiles))
         fp.close()
 
     @classmethod
@@ -379,7 +375,7 @@
 
         lock = repo.lock()
 
-        mergefiles(ui, repo, state.wctx, state.pendingctx, state.unknownfiles)
+        mergefiles(ui, repo, state.wctx, state.pendingctx)
 
         repair.strip(ui, repo, state.stripnodes, backup='none', topic='shelve')
         shelvedstate.clear(repo)
@@ -387,9 +383,9 @@
     finally:
         lockmod.release(lock, wlock)
 
-def mergefiles(ui, repo, wctx, shelvectx, unknownfiles):
+def mergefiles(ui, repo, wctx, shelvectx):
     """updates to wctx and merges the changes from shelvectx into the
-    dirstate. drops any files in unknownfiles from the dirstate."""
+    dirstate."""
     oldquiet = ui.quiet
     try:
         ui.quiet = True
@@ -397,17 +393,18 @@
         files = []
         files.extend(shelvectx.files())
         files.extend(shelvectx.parents()[0].files())
+
+        # revert will overwrite unknown files, so move them out of the way
+        m, a, r, d, u = repo.status(unknown=True)[:5]
+        for file in u:
+            if file in files:
+                util.rename(file, file + ".orig")
         cmdutil.revert(ui, repo, shelvectx, repo.dirstate.parents(),
                        *pathtofiles(repo, files),
                        **{'no_backup': True})
     finally:
         ui.quiet = oldquiet
 
-    # Send untracked files back to being untracked
-    dirstate = repo.dirstate
-    for f in unknownfiles:
-        dirstate.drop(f)
-
 def unshelvecleanup(ui, repo, name, opts):
     """remove related files after an unshelve"""
     if not opts['keep']:
@@ -446,7 +443,7 @@
             # rebase was a no-op, so it produced no child commit
             shelvectx = state.pendingctx
 
-        mergefiles(ui, repo, state.wctx, shelvectx, state.unknownfiles)
+        mergefiles(ui, repo, state.wctx, shelvectx)
 
         state.stripnodes.append(shelvectx.node())
         repair.strip(ui, repo, state.stripnodes, backup='none', topic='shelve')
@@ -538,8 +535,8 @@
         # to the original wctx.
 
         # Store pending changes in a commit
-        m, a, r, d, u = repo.status(unknown=True)[:5]
-        if m or a or r or d or u:
+        m, a, r, d = repo.status()[:4]
+        if m or a or r or d:
             def commitfunc(ui, repo, message, match, opts):
                 hasmq = util.safehasattr(repo, 'mq')
                 if hasmq:
@@ -554,7 +551,6 @@
 
             tempopts = {}
             tempopts['message'] = "pending changes temporary commit"
-            tempopts['addremove'] = True
             oldquiet = ui.quiet
             try:
                 ui.quiet = True
@@ -588,7 +584,7 @@
 
                 stripnodes = [repo.changelog.node(rev)
                               for rev in xrange(oldtiprev, len(repo))]
-                shelvedstate.save(repo, basename, wctx, tmpwctx, stripnodes, u)
+                shelvedstate.save(repo, basename, wctx, tmpwctx, stripnodes)
 
                 util.rename(repo.join('rebasestate'),
                             repo.join('unshelverebasestate'))
@@ -603,7 +599,7 @@
                 # rebase was a no-op, so it produced no child commit
                 shelvectx = tmpwctx
 
-        mergefiles(ui, repo, wctx, shelvectx, u)
+        mergefiles(ui, repo, wctx, shelvectx)
         shelvedstate.clear(repo)
 
         # The transaction aborting will strip all the commits for us,