[PATCH 2 of 2 STABLE] largefiles: notice dirty large files in a subrepo

Matt Harbison matt_harbison at yahoo.com
Mon Apr 23 00:18:38 CDT 2012


# HG changeset patch
# User Matt Harbison <matt_harbison at yahoo.com>
# Date 1335115162 14400
# Branch stable
# Node ID c054bfbf01a2d33e9e88d093f72866fef64be29b
# Parent  cdf25679473c6f3cfc4fb560012dc583fd0e3935
largefiles: notice dirty large files in a subrepo

Summary and commit use dirty() to check the status of a subrepository,
so this overrides dirty() in the subrepo in the same manner as
status() to check the large files instead of their standins.

Previously, if only a large file was changed in a subrepo, summary in
the top level repo would not report the subrepo was dirty and commit
-S would report nothing changed.  If any type of file was changed in
the top repo and only a large file in the subrepo, commit -S would not
commit the changes to the subrepo.

diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
--- a/hgext/largefiles/overrides.py
+++ b/hgext/largefiles/overrides.py
@@ -216,6 +216,13 @@
     finally:
         repo.lfstatus = False
 
+def overridedirty(orig, repo, ignoreupdate=False):
+    try:
+        repo._repo.lfstatus = True
+        return orig(repo, ignoreupdate)
+    finally:
+        repo._repo.lfstatus = False
+
 def overridelog(orig, ui, repo, *pats, **opts):
     try:
         repo.lfstatus = True
diff --git a/hgext/largefiles/uisetup.py b/hgext/largefiles/uisetup.py
--- a/hgext/largefiles/uisetup.py
+++ b/hgext/largefiles/uisetup.py
@@ -81,6 +81,10 @@
     entry = extensions.wrapfunction(cmdutil, 'copy',
                                     overrides.overridecopy)
 
+    # Summary calls dirty on the subrepos
+    entry = extensions.wrapfunction(hgsubrepo, 'dirty',
+                                    overrides.overridedirty)
+
     # Backout calls revert so we need to override both the command and the
     # function
     entry = extensions.wrapcommand(commands.table, 'revert',
diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
--- a/tests/test-largefiles.t
+++ b/tests/test-largefiles.t
@@ -1060,19 +1060,40 @@
   ? .hgsubstate
   $ echo "rev 1" > subrepo/large.txt
   $ hg -R subrepo add --large subrepo/large.txt
+  $ hg sum
+  parent: 1:8ee150ea2e9c tip
+   add subrepo
+  branch: default
+  commit: 1 subrepos
+  update: (current)
   $ hg st
   $ hg st -S
   A subrepo/large.txt
-# This is a workaround for not noticing the subrepo is dirty
-  $ hg -R subrepo ci -m "commit large file"
+  $ hg ci -S -m "commit top repo"
+  committing subrepository subrepo
   Invoking status precommit hook
   A large.txt
-  $ hg ci -S -m "commit top repo"
   Invoking status precommit hook
   M .hgsubstate
+# No differences
   $ hg st -S
+  $ hg sum
+  parent: 2:ce4cd0c527a6 tip
+   commit top repo
+  branch: default
+  commit: (clean)
+  update: (current)
   $ echo "rev 2" > subrepo/large.txt
   $ hg st -S
   M subrepo/large.txt
- 
+  $ hg sum
+  parent: 2:ce4cd0c527a6 tip
+   commit top repo
+  branch: default
+  commit: 1 subrepos
+  update: (current)
+  $ hg ci -m "this commit should fail without -S"
+  abort: uncommitted changes in subrepo subrepo
+  (use --subrepos for recursive commit)
+  [255]
   $ cd ..


More information about the Mercurial-devel mailing list