[PATCH 14 of 19 STABLE] largefiles: show status for files added on another branch correctly

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Mon Feb 27 04:46:39 CST 2012


# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1330335216 -32400
# Branch stable
# Node ID b728948758a3dd40ab955b314dbcc3a3f12f924c
# Parent  80ad9da167d20345ccf59b8ff968c44f206d1e09
largefiles: show status for files added on another branch correctly

original 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 also causes unexpected
       'performance boost' root choice), and

    2. 'filefn()' for matcher creation only examines 2nd context, so
       files()' of created matcher is not updated expectedly (this
       causes unexpected behavior of 'dirstate.status()')

this patch fixes this problem by examining both 1st/2nd context for
files/directories not known to each other.

in this patch, 1st context is examined only not in 'parentworking'
case for performance efficiency, because 2nd context (= working
context) should have enough information about removed files in
'parentworking' case.

diff -r 80ad9da167d2 -r b728948758a3 hgext/largefiles/reposetup.py
--- a/hgext/largefiles/reposetup.py	Mon Feb 27 18:33:36 2012 +0900
+++ b/hgext/largefiles/reposetup.py	Mon Feb 27 18:33:36 2012 +0900
@@ -128,12 +128,13 @@
                 # largefiles, we should just bail here and let super
                 # handle it -- thus gaining a big performance boost.
                 if match.files() and not match.anypats():
-                    wctx = repo[None]
                     for f in match.files():
                         if lfutil.isstandin(f):
                             continue
                         sf = lfutil.standin(f)
-                        if inctx(sf, wctx) or inctxdirs(sf, wctx):
+                        if (inctx(sf, ctx2) or inctxdirs(sf, ctx2) or
+                            (not parentworking and
+                             (inctx(sf, ctx1) or inctxdirs(sf, ctx1)))):
                             break
                     else:
                         return super(lfiles_repo, self).status(node1, node2,
@@ -156,7 +157,9 @@
                     for f in files:
                         if not lfutil.isstandin(f):
                             sf = lfutil.standin(f)
-                            if inctx(sf, ctx2) or inctxdirs(sf, ctx2):
+                            if (inctx(sf, ctx2) or inctxdirs(sf, ctx2) or
+                                (not parentworking and
+                                 (inctx(sf, ctx1) or inctxdirs(sf, ctx1)))):
                                 yield sf
                                 continue
                         # not 'known largefile', or 'STANDIN direct' pattern
diff -r 80ad9da167d2 -r b728948758a3 tests/test-largefiles.t
--- a/tests/test-largefiles.t	Mon Feb 27 18:33:36 2012 +0900
+++ b/tests/test-largefiles.t	Mon Feb 27 18:33:36 2012 +0900
@@ -1080,6 +1080,37 @@
   $ hg status -A --rev 0 --rev 1 sub/a.large sub/sub
   C sub/a.large
 
+add files on another branch:
+
+  $ hg update -C 0 > /dev/null
+  $ mkdir another1
+  $ echo e > another1/e.large
+  $ hg add --large another1/e.large
+  $ hg commit -m '#4'
+  Invoking status precommit hook
+  A another1/e.large
+  created new head
+  $ hg update -C 3 > /dev/null
+  $ test ! -d another
+
+test for file added on another branch by file pattern:
+
+  $ hg status -A --rev 4 another1/e.large
+  R another1/e.large
+  $ hg status -A --rev 4 --rev . another1/e.large
+  R another1/e.large
+  $ hg status -A --rev . --rev 4 another1/e.large
+  A another1/e.large
+
+test for file added on another branch by directory pattern:
+
+  $ hg status -A --rev 4 another1
+  R another1/e.large
+  $ hg status -A --rev 4 --rev . another1
+  R another1/e.large
+  $ hg status -A --rev . --rev 4 another1
+  A another1/e.large
+
   $ cd ..
 
 tests for pattern matching for removed files in working context:


More information about the Mercurial-devel mailing list