2010-11-19 01:05:10 +03:00
|
|
|
$ hg init repo
|
|
|
|
$ cd repo
|
|
|
|
$ hg init subrepo
|
|
|
|
$ echo a > subrepo/a
|
|
|
|
$ hg -R subrepo ci -Am adda
|
|
|
|
adding a
|
|
|
|
$ echo 'subrepo = subrepo' > .hgsub
|
|
|
|
$ hg ci -Am addsubrepo
|
|
|
|
adding .hgsub
|
|
|
|
$ echo b > subrepo/b
|
|
|
|
$ hg -R subrepo ci -Am addb
|
|
|
|
adding b
|
|
|
|
$ hg ci -m updatedsub
|
|
|
|
|
2012-05-04 16:19:52 +04:00
|
|
|
ignore blanklines in .hgsubstate
|
|
|
|
|
|
|
|
>>> file('.hgsubstate', 'wb').write('\n\n \t \n \n')
|
|
|
|
$ hg st --subrepos
|
|
|
|
M .hgsubstate
|
|
|
|
$ hg revert -qC .hgsubstate
|
|
|
|
|
2012-05-04 16:19:55 +04:00
|
|
|
abort more gracefully on .hgsubstate parsing error
|
|
|
|
|
|
|
|
$ cp .hgsubstate .hgsubstate.old
|
|
|
|
>>> file('.hgsubstate', 'wb').write('\ninvalid')
|
2015-07-09 18:59:51 +03:00
|
|
|
$ hg st --subrepos --cwd $TESTTMP -R $TESTTMP/repo
|
2015-07-21 05:48:42 +03:00
|
|
|
abort: invalid subrepository revision specifier in 'repo/.hgsubstate' line 2
|
2012-05-04 16:19:55 +04:00
|
|
|
[255]
|
|
|
|
$ mv .hgsubstate.old .hgsubstate
|
|
|
|
|
2010-11-19 01:05:10 +03:00
|
|
|
delete .hgsub and revert it
|
|
|
|
|
|
|
|
$ rm .hgsub
|
|
|
|
$ hg revert .hgsub
|
2015-04-05 22:08:55 +03:00
|
|
|
warning: subrepo spec file '.hgsub' not found
|
|
|
|
warning: subrepo spec file '.hgsub' not found
|
2010-11-19 01:05:10 +03:00
|
|
|
|
|
|
|
delete .hgsubstate and revert it
|
|
|
|
|
|
|
|
$ rm .hgsubstate
|
|
|
|
$ hg revert .hgsubstate
|
|
|
|
|
|
|
|
delete .hgsub and update
|
|
|
|
|
|
|
|
$ rm .hgsub
|
2015-07-09 18:59:51 +03:00
|
|
|
$ hg up 0 --cwd $TESTTMP -R $TESTTMP/repo
|
2015-07-21 05:48:42 +03:00
|
|
|
warning: subrepo spec file 'repo/.hgsub' not found
|
|
|
|
warning: subrepo spec file 'repo/.hgsub' not found
|
2010-11-19 01:05:10 +03:00
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg st
|
2015-04-05 22:08:55 +03:00
|
|
|
warning: subrepo spec file '.hgsub' not found
|
2010-11-19 01:05:10 +03:00
|
|
|
! .hgsub
|
|
|
|
$ ls subrepo
|
|
|
|
a
|
|
|
|
|
|
|
|
delete .hgsubstate and update
|
|
|
|
|
|
|
|
$ hg up -C
|
2015-04-05 22:08:55 +03:00
|
|
|
warning: subrepo spec file '.hgsub' not found
|
|
|
|
warning: subrepo spec file '.hgsub' not found
|
2010-11-19 01:05:10 +03:00
|
|
|
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ rm .hgsubstate
|
2012-08-08 20:10:16 +04:00
|
|
|
$ hg up 0
|
2016-08-12 15:56:40 +03:00
|
|
|
other [destination] changed .hgsubstate which local [working copy] deleted
|
2010-11-19 01:05:10 +03:00
|
|
|
use (c)hanged version or leave (d)eleted? c
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg st
|
|
|
|
$ ls subrepo
|
|
|
|
a
|
2012-06-11 03:40:51 +04:00
|
|
|
|
2013-11-24 05:17:17 +04:00
|
|
|
Enable obsolete
|
|
|
|
|
|
|
|
$ cat >> $HGRCPATH << EOF
|
|
|
|
> [ui]
|
|
|
|
> logtemplate= {rev}:{node|short} {desc|firstline}
|
|
|
|
> [phases]
|
|
|
|
> publish=False
|
2014-10-15 00:34:25 +04:00
|
|
|
> [experimental]
|
|
|
|
> evolution=createmarkers
|
2013-11-24 05:17:17 +04:00
|
|
|
> EOF
|
|
|
|
|
|
|
|
check that we can update parent repo with missing (amended) subrepo revision
|
|
|
|
|
|
|
|
$ hg up --repository subrepo -r tip
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg ci -m "updated subrepo to tip"
|
|
|
|
created new head
|
|
|
|
$ cd subrepo
|
|
|
|
$ hg update -r tip
|
|
|
|
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ echo foo > a
|
|
|
|
$ hg commit --amend -m "addb (amended)"
|
|
|
|
$ cd ..
|
|
|
|
$ hg update --clean .
|
|
|
|
revision 102a90ea7b4a in subrepo subrepo is hidden
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
|
subrepo: propagate the --hidden option to hg subrepositories
With many commands accepting a '-S' or an explicit path to trigger recursing
into subrepos, it seems that --hidden needs to be propagated too.
Unfortunately, many of the subrepo layer methods discard the options map, so
passing the option along explicitly isn't currently an option. It also isn't
clear if other filtered views need to be propagated, so changing all of those
commands may be insufficient anyway.
The specific jam I got into was amending an ancestor of qbase in a subrepo, and
then evolving. The patch ended up being hidden, and outgoing said it would only
push one unrelated commit. But push aborted with an 'unknown revision' that I
traced back to the patch. (Odd it didn't say 'filtered revision'.) A push with
--hidden worked from the subrepo, but that wasn't possible from the parent repo
before this.
Since the underlying problem doesn't actually require a subrepo, there's
probably more to investigate here in the discovery area. Yes, evolve + mq is
not exactly sane, but I don't know what is seeing the hidden revision.
In lieu of creating a test for the above situation (evolving mq should probably
be blocked), the test here is a marginally useful case where --hidden is needed
in a subrepo: cat'ing a file in a hidden revision. Without this change, cat
aborts with:
$ hg --hidden cat subrepo/a
skipping missing subrepository: subrepo
[1]
2015-02-03 23:01:43 +03:00
|
|
|
check that --hidden is propagated to the subrepo
|
|
|
|
|
|
|
|
$ hg -R subrepo up tip
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg ci -m 'commit with amended subrepo'
|
|
|
|
$ echo bar > subrepo/a
|
|
|
|
$ hg -R subrepo ci --amend -m "amend a (again)"
|
|
|
|
$ hg --hidden cat subrepo/a
|
|
|
|
foo
|
|
|
|
|
2015-06-16 23:15:15 +03:00
|
|
|
verify will warn if locked-in subrepo revisions are hidden or missing
|
|
|
|
|
|
|
|
$ hg ci -m "amended subrepo (again)"
|
2017-05-20 17:19:59 +03:00
|
|
|
$ hg --config extensions.strip= --hidden strip -R subrepo -qr 'tip' --config devel.strip-obsmarkers=no
|
2015-06-16 23:15:15 +03:00
|
|
|
$ hg verify
|
|
|
|
checking changesets
|
|
|
|
checking manifests
|
|
|
|
crosschecking files in changesets and manifests
|
|
|
|
checking files
|
|
|
|
2 files, 5 changesets, 5 total revisions
|
|
|
|
checking subrepo links
|
|
|
|
subrepo 'subrepo' is hidden in revision a66de08943b6
|
|
|
|
subrepo 'subrepo' is hidden in revision 674d05939c1e
|
|
|
|
subrepo 'subrepo' not found in revision a7d05d9055a4
|
|
|
|
|
verify: don't init subrepo when missing one is referenced (issue5128) (API)
Initializing a subrepo when one doesn't exist is the right thing to do when the
parent is being updated, but in few other cases. Unfortunately, there isn't
enough context in the subrepo module to distinguish this case. This same issue
can be caused with other subrepo aware commands, so there is a general issue
here beyond the scope of this fix.
A simpler attempt I tried was to add an '_updating' boolean to localrepo, and
set/clear it around the call to mergemod.update() in hg.updaterepo(). That
mostly worked, but doesn't handle the case where archive will clone the subrepo
if it is missing. (I vaguely recall that there may be other commands that will
clone if needed like this, but certainly not all do. It seems both handy, and a
bit surprising for what should be a read only operation. It might be nice if
all commands did this consistently, but we probably need Angel's subrepo caching
first, to not make a mess of the working directory.)
I originally handled 'Exception' in order to pick up the Aborts raised in
subrepo.state(), but this turns out to be unnecessary because that is called
once and cached by ctx.sub() when iterating the subrepos.
It was suggested in the bug discussion to skip looking at the subrepo links
unless -S is specified. I don't really like that idea because missing a subrepo
or (less likely, but worse) a corrupt .hgsubstate is a problem of the parent
repo when checking out a revision. The -S option seems like a better fit for
functionality that would recurse into each subrepo and do a full verification.
Ultimately, the default value for 'allowcreate' should probably be flipped, but
since the default behavior was to allow creation, this is less risky for now.
2016-04-28 05:45:52 +03:00
|
|
|
verifying shouldn't init a new subrepo if the reference doesn't exist
|
|
|
|
|
|
|
|
$ mv subrepo b
|
|
|
|
$ hg verify
|
|
|
|
checking changesets
|
|
|
|
checking manifests
|
|
|
|
crosschecking files in changesets and manifests
|
|
|
|
checking files
|
|
|
|
2 files, 5 changesets, 5 total revisions
|
|
|
|
checking subrepo links
|
|
|
|
0: repository $TESTTMP/repo/subrepo not found (glob)
|
|
|
|
1: repository $TESTTMP/repo/subrepo not found (glob)
|
|
|
|
3: repository $TESTTMP/repo/subrepo not found (glob)
|
|
|
|
4: repository $TESTTMP/repo/subrepo not found (glob)
|
|
|
|
$ ls
|
|
|
|
b
|
|
|
|
$ mv b subrepo
|
|
|
|
|
2012-06-11 03:40:51 +04:00
|
|
|
$ cd ..
|