[PATCH 2 of 5] subrepo: dirtiness checks should iterate over subrepos

Edouard Gomez ed.gomez at free.fr
Sat Mar 13 17:38:08 CST 2010


# HG changeset patch
# User Edouard Gomez <ed.gomez at free.fr>
# Date 1268522890 -3600
# Node ID d44b51a2934277fc5eaf194ee1e1e82ca7704f7f
# Parent  dbb98843753b9e5fe9dfbe0a9dc5e5ccccade282
subrepo: dirtiness checks should iterate over subrepos

diff -r dbb98843753b -r d44b51a29342 mercurial/context.py
--- a/mercurial/context.py	Sun Mar 14 00:28:10 2010 +0100
+++ b/mercurial/context.py	Sun Mar 14 00:28:10 2010 +0100
@@ -697,7 +697,11 @@
 
     def dirty(self, missing=False):
         "check whether a working directory is modified"
-
+        # check subrepos first
+        for s in self.substate:
+            if self.sub(s).dirty():
+                return True
+        # check current working dir
         return (self.p2() or self.branch() != self.p1().branch() or
                 self.modified() or self.added() or self.removed() or
                 (missing and self.deleted()))
diff -r dbb98843753b -r d44b51a29342 tests/test-subrepo-deep-nested-change
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-subrepo-deep-nested-change	Sun Mar 14 00:28:10 2010 +0100
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+echo % Preparing the subrepository 'sub2'
+hg init sub2
+echo sub2 > sub2/sub2
+hg add -R sub2
+hg commit -R sub2 -m "sub2 import"
+
+echo % Preparing the 'sub1' repo which depends on the subrepo 'sub2'
+hg init sub1
+echo sub1 > sub1/sub1
+echo "sub2 = ../sub2" > sub1/.hgsub
+hg clone sub2 sub1/sub2 | sed 's/ .*sub/ ...sub/g'
+hg add -R sub1
+hg commit -R sub1 -m "sub1 import"
+
+echo % Preparing the 'main' repo which depends on the subrepo 'sub1'
+hg init main
+echo main > main/main
+echo "sub1 = ../sub1" > main/.hgsub
+hg clone sub1 main/sub1  | sed 's/ .*sub/ ...sub/g'
+hg add -R main
+hg commit -R main -m "main import"
+
+echo % Cleaning both repositories, just as a clone -U
+hg up -C -R sub2 null
+hg up -C -R sub1 null
+hg up -C -R main null
+rm -rf main/sub1
+rm -rf sub1/sub2
+
+echo % Clone main
+hg clone main cloned | sed 's/ .*sub/ ...sub/g' 
+
+echo % Checking cloned repo ids
+printf "cloned " ; hg id -R cloned
+printf "cloned/sub1 " ; hg id -R cloned/sub1
+printf "cloned/sub1/sub2 " ; hg id -R cloned/sub1/sub2
+
+echo % debugsub output for main and sub1
+hg debugsub -R cloned
+hg debugsub -R cloned/sub1
+
+echo % Modifying deeply nested 'sub2'
+echo modified > cloned/sub1/sub2/sub2
+hg commit -m "deep nested modif should trigger a commit" -R cloned
+
+echo % Checking modified node ids
+printf "cloned " ; hg id -R cloned
+printf "cloned/sub1 " ; hg id -R cloned/sub1
+printf "cloned/sub1/sub2 " ; hg id -R cloned/sub1/sub2
+
+echo % debugsub output for main and sub1
+hg debugsub -R cloned
+hg debugsub -R cloned/sub1
+
+exit 0
diff -r dbb98843753b -r d44b51a29342 tests/test-subrepo-deep-nested-change.out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-subrepo-deep-nested-change.out	Sun Mar 14 00:28:10 2010 +0100
@@ -0,0 +1,64 @@
+% Preparing the subrepository sub2
+adding sub2/sub2
+% Preparing the sub1 repo which depends on the subrepo sub2
+updating to branch default
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+adding sub1/.hgsub
+adding sub1/sub1
+committing subrepository sub2
+% Preparing the main repo which depends on the subrepo sub1
+updating to branch default
+pulling ...sub2
+requesting all changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files
+3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+adding main/.hgsub
+adding main/main
+committing subrepository sub1
+% Cleaning both repositories, just as a clone -U
+0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+% Clone main
+updating to branch default
+pulling ...sub1
+requesting all changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 3 changes to 3 files
+pulling ...sub2
+requesting all changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files
+3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+% Checking cloned repo ids
+cloned 7f491f53a367 tip
+cloned/sub1 fc3b4ce2696f tip
+cloned/sub1/sub2 c57a0840e3ba tip
+% debugsub output for main and sub1
+path sub1
+ source   ../sub1
+ revision fc3b4ce2696f7741438c79207583768f2ce6b0dd
+path sub2
+ source   ../sub2
+ revision c57a0840e3badd667ef3c3ef65471609acb2ba3c
+% Modifying deeply nested sub2
+committing subrepository sub1
+committing subrepository sub2
+% Checking modified node ids
+cloned ffe6649062fe tip
+cloned/sub1 2ecb03bf44a9 tip
+cloned/sub1/sub2 53dd3430bcaf tip
+% debugsub output for main and sub1
+path sub1
+ source   ../sub1
+ revision 2ecb03bf44a94e749e8669481dd9069526ce7cb9
+path sub2
+ source   ../sub2
+ revision 53dd3430bcaf5ab4a7c48262bcad6d441f510487


More information about the Mercurial-devel mailing list