diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -752,7 +752,11 @@ class workingctx(changectx): 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 --git a/tests/test-subrepo-deep-nested-change b/tests/test-subrepo-deep-nested-change new file mode 100755 --- /dev/null +++ b/tests/test-subrepo-deep-nested-change @@ -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 --git a/tests/test-subrepo-deep-nested-change.out b/tests/test-subrepo-deep-nested-change.out new file mode 100644 --- /dev/null +++ b/tests/test-subrepo-deep-nested-change.out @@ -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