diff hgext/largefiles/lfcommands.py @ 15793:3ef07ecdb0d5

largefiles: correctly handle dirstate status when rebasing When rebasing, we need to trust that the standins are always correct. The rebase operation updates the standins according to the changeset it is rebasing. We need to make the largefiles in the working copy match. If we don't make them match, then they get accidentally reverted, either during the rebase or during the next commit after the rebase. This worked previously only becuase we were relying on the behavior that largefiles with a changed standin, but unchanged contents, never showed up in the list of modified largefiles. Unfortunately, pre-commit hooks can get an incorrect status this way, and it also results in extra execution of code. The solution is to simply trust the standins when we are about to commit a rebased changeset, and politely ask updatelfiles() to pull the new contents down. In this case, updatelfiles() will also mark any files it has pulled down as dirty in the lfdirstate so that pre-commit hooks will get correct status output.
author Na'Tosha Bard <natosha@unity3d.com>
date Sat, 07 Jan 2012 18:43:34 +0100
parents 9036c7d106bf
children 62098aeb1e15
line wrap: on
line diff
--- a/hgext/largefiles/lfcommands.py	Sat Jan 07 12:42:54 2012 +0100
+++ b/hgext/largefiles/lfcommands.py	Sat Jan 07 18:43:34 2012 +0100
@@ -455,7 +455,13 @@
             ret = -1
     state = repo.dirstate[lfutil.standin(lfile)]
     if state == 'n':
-        lfdirstate.normal(lfile)
+        # When rebasing, we need to synchronize the standin and the largefile,
+        # because otherwise the largefile will get reverted.  But for commit's
+        # sake, we have to mark the file as unclean.
+        if getattr(repo, "_isrebasing", False):
+           lfdirstate.normallookup(lfile)
+        else:
+            lfdirstate.normal(lfile)
     elif state == 'r':
         lfdirstate.remove(lfile)
     elif state == 'a':