[PATCH 5 of 8 STABLE RFC] largefiles: show status for files added on another branch correctly

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Fri Feb 17 10:07:31 CST 2012


# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1329494573 -32400
# Branch stable
# Node ID 82a87da836d10865af586152c2473bc24dd0cfd4
# Parent  507343506cb1260d5c3429c4b15d581291067a85
largefiles: show status for files added on another branch correctly

current implementation can't show status for largefiles added on
another branch correctly, because:

    1. no STANDIN file/directory corresponded to specified patterns
       exists 'local' side branch (this causes 'performance boost'
       root choise), and

    2. 'tostandin()' only examines 2nd context, so can't update
       'mach._files' correctly (this causes unexpected behavior of
       'dirstate.status()')

this patch fixes this problem by:

    1. choising 'performance boost' route only 'parent - working
       context' comparison, because 'lfdirstate' and STANDIN directory
       may not have enough information in other cases.

    2. examining both 1st/2nd context for files/directories not known
       to each other

========================================
IN FACT, THIS FIX IS NOT COMPLETE.
========================================

tests shown below does not work expectedly:

  $ hg status -A --rev 4 another
  R another/e.txt

  $ hg status -A --rev 4 sub/a.txt another
  R another/e.txt
  C sub/a.txt

diff -r 507343506cb1 -r 82a87da836d1 hgext/largefiles/reposetup.py
--- a/hgext/largefiles/reposetup.py	Sat Feb 18 01:02:52 2012 +0900
+++ b/hgext/largefiles/reposetup.py	Sat Feb 18 01:02:53 2012 +0900
@@ -120,7 +120,7 @@
                 # largefiles, we should just bail here and let super
                 # handle it -- thus gaining a big performance boost.
                 lfdirstate = lfutil.openlfdirstate(ui, self)
-                if working and match.files() and not match.anypats():
+                if parentworking and match.files() and not match.anypats():
                     for f in match.files():
                         if (f in lfdirstate) or hasstandin(f):
                             break
@@ -132,8 +132,9 @@
                 # Create a copy of match that matches standins instead
                 # of largefiles.
                 def tostandin(file):
-                    if inctx(lfutil.standin(file), ctx2):
-                        return lfutil.standin(file)
+                    sf = lfutil.standin(file)
+                    if inctx(sf, ctx1) or inctx(sf, ctx2):
+                        return sf
                     return file
 
                 # Create a function that we can use to override what is
diff -r 507343506cb1 -r 82a87da836d1 tests/test-largefiles.t
--- a/tests/test-largefiles.t	Sat Feb 18 01:02:52 2012 +0900
+++ b/tests/test-largefiles.t	Sat Feb 18 01:02:53 2012 +0900
@@ -1062,4 +1062,33 @@
   $ hg status -A --rev 0 --rev 1 sub/a.txt sub/sub
   C sub/a.txt
 
+  $ hg update -C 0 > /dev/null
+  $ mkdir another
+  $ echo e > another/e.txt
+  $ hg add --large another/e.txt
+  $ hg commit -m '#4'
+  Invoking status precommit hook
+  A another/e.txt
+  created new head
+  $ hg update -C 3 > /dev/null
+
+  $ hg status -A --rev 4 another/e.txt
+  R another/e.txt
+  $ hg status -A --rev 4 --rev . another/e.txt
+  R another/e.txt
+  $ hg status -A --rev . --rev 4 another/e.txt
+  A another/e.txt
+
+  $ hg status -A --rev 4 --rev . another
+  R another/e.txt
+  $ hg status -A --rev . --rev 4 another
+  A another/e.txt
+
+  $ hg status -A --rev 4 --rev . sub/a.txt another
+  R another/e.txt
+  C sub/a.txt
+  $ hg status -A --rev . --rev 4 sub/a.txt another
+  A another/e.txt
+  C sub/a.txt
+
   $ cd ..


More information about the Mercurial-devel mailing list