mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 00:14:35 +03:00
586f53ce9d
This change appends the subrepo path to subrepo errors. That is, when there is an error performing an operation a subrepo, rather than displaying a message such as: pushing subrepo MYSUBREPO to PATH searching for changes abort: push creates new remote head HEADHASH! hint: did you forget to merge? use push -f to force mercurial will show: pushing subrepo MYSUBREPO to PATH searching for changes abort: push creates new remote head HEADHASH! (in subrepo MYSUBREPO) hint: did you forget to merge? use push -f to force The rationale for this change is that the current error messages make it hard for TortoiseHg (and similar tools) to tell the user which subrepo caused the push failure. The "(in subrepo MYSUBREPO)" message has been added to those subrepo methods were it made sense (by using a decorator). We avoid appending "(in subrepo XXX)" multiple times when subrepos are nexted by throwing a "SubrepoAbort" exception after the extra message is appended. The decorator will then "ignore" (i.e. just re-raise) the exception and never add the message again. A small drawback of this method is that part of the exception trace is lost when the exception is catched and re-raised by the annotatesubrepoerror decorator. Also, because the state() function already printed the subrepo path when it threw an error, that error has been changed to avoid duplicating the subrepo path in the error message. Note that I have also updated several subrepo related tests to reflect these changes.
501 lines
14 KiB
Perl
501 lines
14 KiB
Perl
Create test repository:
|
|
|
|
$ hg init repo
|
|
$ cd repo
|
|
$ echo x1 > x.txt
|
|
|
|
$ hg init foo
|
|
$ cd foo
|
|
$ echo y1 > y.txt
|
|
|
|
$ hg init bar
|
|
$ cd bar
|
|
$ echo z1 > z.txt
|
|
|
|
$ cd ..
|
|
$ echo 'bar = bar' > .hgsub
|
|
|
|
$ cd ..
|
|
$ echo 'foo = foo' > .hgsub
|
|
|
|
Add files --- .hgsub files must go first to trigger subrepos:
|
|
|
|
$ hg add -S .hgsub
|
|
$ hg add -S foo/.hgsub
|
|
$ hg add -S foo/bar
|
|
adding foo/bar/z.txt (glob)
|
|
$ hg add -S
|
|
adding x.txt
|
|
adding foo/y.txt (glob)
|
|
|
|
Test recursive status without committing anything:
|
|
|
|
$ hg status -S
|
|
A .hgsub
|
|
A foo/.hgsub
|
|
A foo/bar/z.txt
|
|
A foo/y.txt
|
|
A x.txt
|
|
|
|
Test recursive diff without committing anything:
|
|
|
|
$ hg diff --nodates -S foo
|
|
diff -r 000000000000 foo/.hgsub
|
|
--- /dev/null
|
|
+++ b/foo/.hgsub
|
|
@@ -0,0 +1,1 @@
|
|
+bar = bar
|
|
diff -r 000000000000 foo/y.txt
|
|
--- /dev/null
|
|
+++ b/foo/y.txt
|
|
@@ -0,0 +1,1 @@
|
|
+y1
|
|
diff -r 000000000000 foo/bar/z.txt
|
|
--- /dev/null
|
|
+++ b/foo/bar/z.txt
|
|
@@ -0,0 +1,1 @@
|
|
+z1
|
|
|
|
Commits:
|
|
|
|
$ hg commit -m fails
|
|
abort: uncommitted changes in subrepo foo
|
|
(use --subrepos for recursive commit)
|
|
[255]
|
|
|
|
The --subrepos flag overwrite the config setting:
|
|
|
|
$ hg commit -m 0-0-0 --config ui.commitsubrepos=No --subrepos
|
|
committing subrepository foo
|
|
committing subrepository foo/bar (glob)
|
|
|
|
$ cd foo
|
|
$ echo y2 >> y.txt
|
|
$ hg commit -m 0-1-0
|
|
|
|
$ cd bar
|
|
$ echo z2 >> z.txt
|
|
$ hg commit -m 0-1-1
|
|
|
|
$ cd ..
|
|
$ hg commit -m 0-2-1
|
|
|
|
$ cd ..
|
|
$ hg commit -m 1-2-1
|
|
|
|
Change working directory:
|
|
|
|
$ echo y3 >> foo/y.txt
|
|
$ echo z3 >> foo/bar/z.txt
|
|
$ hg status -S
|
|
M foo/bar/z.txt
|
|
M foo/y.txt
|
|
$ hg diff --nodates -S
|
|
diff -r d254738c5f5e foo/y.txt
|
|
--- a/foo/y.txt
|
|
+++ b/foo/y.txt
|
|
@@ -1,2 +1,3 @@
|
|
y1
|
|
y2
|
|
+y3
|
|
diff -r 9647f22de499 foo/bar/z.txt
|
|
--- a/foo/bar/z.txt
|
|
+++ b/foo/bar/z.txt
|
|
@@ -1,2 +1,3 @@
|
|
z1
|
|
z2
|
|
+z3
|
|
|
|
Status call crossing repository boundaries:
|
|
|
|
$ hg status -S foo/bar/z.txt
|
|
M foo/bar/z.txt
|
|
$ hg status -S -I 'foo/?.txt'
|
|
M foo/y.txt
|
|
$ hg status -S -I '**/?.txt'
|
|
M foo/bar/z.txt
|
|
M foo/y.txt
|
|
$ hg diff --nodates -S -I '**/?.txt'
|
|
diff -r d254738c5f5e foo/y.txt
|
|
--- a/foo/y.txt
|
|
+++ b/foo/y.txt
|
|
@@ -1,2 +1,3 @@
|
|
y1
|
|
y2
|
|
+y3
|
|
diff -r 9647f22de499 foo/bar/z.txt
|
|
--- a/foo/bar/z.txt
|
|
+++ b/foo/bar/z.txt
|
|
@@ -1,2 +1,3 @@
|
|
z1
|
|
z2
|
|
+z3
|
|
|
|
Status from within a subdirectory:
|
|
|
|
$ mkdir dir
|
|
$ cd dir
|
|
$ echo a1 > a.txt
|
|
$ hg status -S
|
|
M foo/bar/z.txt
|
|
M foo/y.txt
|
|
? dir/a.txt
|
|
$ hg diff --nodates -S
|
|
diff -r d254738c5f5e foo/y.txt
|
|
--- a/foo/y.txt
|
|
+++ b/foo/y.txt
|
|
@@ -1,2 +1,3 @@
|
|
y1
|
|
y2
|
|
+y3
|
|
diff -r 9647f22de499 foo/bar/z.txt
|
|
--- a/foo/bar/z.txt
|
|
+++ b/foo/bar/z.txt
|
|
@@ -1,2 +1,3 @@
|
|
z1
|
|
z2
|
|
+z3
|
|
|
|
Status with relative path:
|
|
|
|
$ hg status -S ..
|
|
M ../foo/bar/z.txt
|
|
M ../foo/y.txt
|
|
? a.txt
|
|
$ hg diff --nodates -S ..
|
|
diff -r d254738c5f5e foo/y.txt
|
|
--- a/foo/y.txt
|
|
+++ b/foo/y.txt
|
|
@@ -1,2 +1,3 @@
|
|
y1
|
|
y2
|
|
+y3
|
|
diff -r 9647f22de499 foo/bar/z.txt
|
|
--- a/foo/bar/z.txt
|
|
+++ b/foo/bar/z.txt
|
|
@@ -1,2 +1,3 @@
|
|
z1
|
|
z2
|
|
+z3
|
|
$ cd ..
|
|
|
|
Cleanup and final commit:
|
|
|
|
$ rm -r dir
|
|
$ hg commit --subrepos -m 2-3-2
|
|
committing subrepository foo
|
|
committing subrepository foo/bar (glob)
|
|
|
|
Test explicit path commands within subrepos: add/forget
|
|
$ echo z1 > foo/bar/z2.txt
|
|
$ hg status -S
|
|
? foo/bar/z2.txt
|
|
$ hg add foo/bar/z2.txt
|
|
$ hg status -S
|
|
A foo/bar/z2.txt
|
|
$ hg forget foo/bar/z2.txt
|
|
$ hg status -S
|
|
? foo/bar/z2.txt
|
|
$ hg forget foo/bar/z2.txt
|
|
not removing foo/bar/z2.txt: file is already untracked (glob)
|
|
[1]
|
|
$ hg status -S
|
|
? foo/bar/z2.txt
|
|
$ rm foo/bar/z2.txt
|
|
|
|
Log with the relationships between repo and its subrepo:
|
|
|
|
$ hg log --template '{rev}:{node|short} {desc}\n'
|
|
2:1326fa26d0c0 2-3-2
|
|
1:4b3c9ff4f66b 1-2-1
|
|
0:23376cbba0d8 0-0-0
|
|
|
|
$ hg -R foo log --template '{rev}:{node|short} {desc}\n'
|
|
3:65903cebad86 2-3-2
|
|
2:d254738c5f5e 0-2-1
|
|
1:8629ce7dcc39 0-1-0
|
|
0:af048e97ade2 0-0-0
|
|
|
|
$ hg -R foo/bar log --template '{rev}:{node|short} {desc}\n'
|
|
2:31ecbdafd357 2-3-2
|
|
1:9647f22de499 0-1-1
|
|
0:4904098473f9 0-0-0
|
|
|
|
Status between revisions:
|
|
|
|
$ hg status -S
|
|
$ hg status -S --rev 0:1
|
|
M .hgsubstate
|
|
M foo/.hgsubstate
|
|
M foo/bar/z.txt
|
|
M foo/y.txt
|
|
$ hg diff --nodates -S -I '**/?.txt' --rev 0:1
|
|
diff -r af048e97ade2 -r d254738c5f5e foo/y.txt
|
|
--- a/foo/y.txt
|
|
+++ b/foo/y.txt
|
|
@@ -1,1 +1,2 @@
|
|
y1
|
|
+y2
|
|
diff -r 4904098473f9 -r 9647f22de499 foo/bar/z.txt
|
|
--- a/foo/bar/z.txt
|
|
+++ b/foo/bar/z.txt
|
|
@@ -1,1 +1,2 @@
|
|
z1
|
|
+z2
|
|
|
|
Enable progress extension for archive tests:
|
|
|
|
$ cp $HGRCPATH $HGRCPATH.no-progress
|
|
$ cat >> $HGRCPATH <<EOF
|
|
> [extensions]
|
|
> progress =
|
|
> [progress]
|
|
> assume-tty = 1
|
|
> delay = 0
|
|
> format = topic bar number
|
|
> refresh = 0
|
|
> width = 60
|
|
> EOF
|
|
|
|
Test archiving to a directory tree (the doubled lines in the output
|
|
only show up in the test output, not in real usage):
|
|
|
|
$ hg archive --subrepos ../archive
|
|
\r (no-eol) (esc)
|
|
archiving [ ] 0/3\r (no-eol) (esc)
|
|
archiving [ ] 0/3\r (no-eol) (esc)
|
|
archiving [=============> ] 1/3\r (no-eol) (esc)
|
|
archiving [=============> ] 1/3\r (no-eol) (esc)
|
|
archiving [===========================> ] 2/3\r (no-eol) (esc)
|
|
archiving [===========================> ] 2/3\r (no-eol) (esc)
|
|
archiving [==========================================>] 3/3\r (no-eol) (esc)
|
|
archiving [==========================================>] 3/3\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
archiving (foo) [ ] 0/3\r (no-eol) (esc)
|
|
archiving (foo) [ ] 0/3\r (no-eol) (esc)
|
|
archiving (foo) [===========> ] 1/3\r (no-eol) (esc)
|
|
archiving (foo) [===========> ] 1/3\r (no-eol) (esc)
|
|
archiving (foo) [=======================> ] 2/3\r (no-eol) (esc)
|
|
archiving (foo) [=======================> ] 2/3\r (no-eol) (esc)
|
|
archiving (foo) [====================================>] 3/3\r (no-eol) (esc)
|
|
archiving (foo) [====================================>] 3/3\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
archiving (foo/bar) [ ] 0/1\r (no-eol) (glob) (esc)
|
|
archiving (foo/bar) [ ] 0/1\r (no-eol) (glob) (esc)
|
|
archiving (foo/bar) [================================>] 1/1\r (no-eol) (glob) (esc)
|
|
archiving (foo/bar) [================================>] 1/1\r (no-eol) (glob) (esc)
|
|
\r (no-eol) (esc)
|
|
$ find ../archive | sort
|
|
../archive
|
|
../archive/.hg_archival.txt
|
|
../archive/.hgsub
|
|
../archive/.hgsubstate
|
|
../archive/foo
|
|
../archive/foo/.hgsub
|
|
../archive/foo/.hgsubstate
|
|
../archive/foo/bar
|
|
../archive/foo/bar/z.txt
|
|
../archive/foo/y.txt
|
|
../archive/x.txt
|
|
|
|
Test archiving to zip file (unzip output is unstable):
|
|
|
|
$ hg archive --subrepos ../archive.zip
|
|
\r (no-eol) (esc)
|
|
archiving [ ] 0/3\r (no-eol) (esc)
|
|
archiving [ ] 0/3\r (no-eol) (esc)
|
|
archiving [=============> ] 1/3\r (no-eol) (esc)
|
|
archiving [=============> ] 1/3\r (no-eol) (esc)
|
|
archiving [===========================> ] 2/3\r (no-eol) (esc)
|
|
archiving [===========================> ] 2/3\r (no-eol) (esc)
|
|
archiving [==========================================>] 3/3\r (no-eol) (esc)
|
|
archiving [==========================================>] 3/3\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
archiving (foo) [ ] 0/3\r (no-eol) (esc)
|
|
archiving (foo) [ ] 0/3\r (no-eol) (esc)
|
|
archiving (foo) [===========> ] 1/3\r (no-eol) (esc)
|
|
archiving (foo) [===========> ] 1/3\r (no-eol) (esc)
|
|
archiving (foo) [=======================> ] 2/3\r (no-eol) (esc)
|
|
archiving (foo) [=======================> ] 2/3\r (no-eol) (esc)
|
|
archiving (foo) [====================================>] 3/3\r (no-eol) (esc)
|
|
archiving (foo) [====================================>] 3/3\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
archiving (foo/bar) [ ] 0/1\r (no-eol) (glob) (esc)
|
|
archiving (foo/bar) [ ] 0/1\r (no-eol) (glob) (esc)
|
|
archiving (foo/bar) [================================>] 1/1\r (no-eol) (glob) (esc)
|
|
archiving (foo/bar) [================================>] 1/1\r (no-eol) (glob) (esc)
|
|
\r (no-eol) (esc)
|
|
|
|
Test archiving a revision that references a subrepo that is not yet
|
|
cloned:
|
|
|
|
$ hg clone -U . ../empty
|
|
$ cd ../empty
|
|
$ hg archive --subrepos -r tip ../archive.tar.gz
|
|
\r (no-eol) (esc)
|
|
archiving [ ] 0/3\r (no-eol) (esc)
|
|
archiving [ ] 0/3\r (no-eol) (esc)
|
|
archiving [=============> ] 1/3\r (no-eol) (esc)
|
|
archiving [=============> ] 1/3\r (no-eol) (esc)
|
|
archiving [===========================> ] 2/3\r (no-eol) (esc)
|
|
archiving [===========================> ] 2/3\r (no-eol) (esc)
|
|
archiving [==========================================>] 3/3\r (no-eol) (esc)
|
|
archiving [==========================================>] 3/3\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
archiving (foo) [ ] 0/3\r (no-eol) (esc)
|
|
archiving (foo) [ ] 0/3\r (no-eol) (esc)
|
|
archiving (foo) [===========> ] 1/3\r (no-eol) (esc)
|
|
archiving (foo) [===========> ] 1/3\r (no-eol) (esc)
|
|
archiving (foo) [=======================> ] 2/3\r (no-eol) (esc)
|
|
archiving (foo) [=======================> ] 2/3\r (no-eol) (esc)
|
|
archiving (foo) [====================================>] 3/3\r (no-eol) (esc)
|
|
archiving (foo) [====================================>] 3/3\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
\r (no-eol) (esc)
|
|
archiving (foo/bar) [ ] 0/1\r (no-eol) (glob) (esc)
|
|
archiving (foo/bar) [ ] 0/1\r (no-eol) (glob) (esc)
|
|
archiving (foo/bar) [================================>] 1/1\r (no-eol) (glob) (esc)
|
|
archiving (foo/bar) [================================>] 1/1\r (no-eol) (glob) (esc)
|
|
\r (no-eol) (esc)
|
|
cloning subrepo foo from $TESTTMP/repo/foo
|
|
cloning subrepo foo/bar from $TESTTMP/repo/foo/bar (glob)
|
|
|
|
The newly cloned subrepos contain no working copy:
|
|
|
|
$ hg -R foo summary
|
|
parent: -1:000000000000 (no revision checked out)
|
|
branch: default
|
|
commit: (clean)
|
|
update: 4 new changesets (update)
|
|
|
|
Disable progress extension and cleanup:
|
|
|
|
$ mv $HGRCPATH.no-progress $HGRCPATH
|
|
|
|
Test archiving when there is a directory in the way for a subrepo
|
|
created by archive:
|
|
|
|
$ hg clone -U . ../almost-empty
|
|
$ cd ../almost-empty
|
|
$ mkdir foo
|
|
$ echo f > foo/f
|
|
$ hg archive --subrepos -r tip archive
|
|
cloning subrepo foo from $TESTTMP/empty/foo
|
|
abort: destination '$TESTTMP/almost-empty/foo' is not empty (in subrepo foo) (glob)
|
|
[255]
|
|
|
|
Clone and test outgoing:
|
|
|
|
$ cd ..
|
|
$ hg clone repo repo2
|
|
updating to branch default
|
|
cloning subrepo foo from $TESTTMP/repo/foo
|
|
cloning subrepo foo/bar from $TESTTMP/repo/foo/bar (glob)
|
|
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
$ cd repo2
|
|
$ hg outgoing -S
|
|
comparing with $TESTTMP/repo (glob)
|
|
searching for changes
|
|
no changes found
|
|
comparing with $TESTTMP/repo/foo
|
|
searching for changes
|
|
no changes found
|
|
comparing with $TESTTMP/repo/foo/bar
|
|
searching for changes
|
|
no changes found
|
|
[1]
|
|
|
|
Make nested change:
|
|
|
|
$ echo y4 >> foo/y.txt
|
|
$ hg diff --nodates -S
|
|
diff -r 65903cebad86 foo/y.txt
|
|
--- a/foo/y.txt
|
|
+++ b/foo/y.txt
|
|
@@ -1,3 +1,4 @@
|
|
y1
|
|
y2
|
|
y3
|
|
+y4
|
|
$ hg commit --subrepos -m 3-4-2
|
|
committing subrepository foo
|
|
$ hg outgoing -S
|
|
comparing with $TESTTMP/repo (glob)
|
|
searching for changes
|
|
changeset: 3:2655b8ecc4ee
|
|
tag: tip
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: 3-4-2
|
|
|
|
comparing with $TESTTMP/repo/foo
|
|
searching for changes
|
|
changeset: 4:e96193d6cb36
|
|
tag: tip
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: 3-4-2
|
|
|
|
comparing with $TESTTMP/repo/foo/bar
|
|
searching for changes
|
|
no changes found
|
|
|
|
|
|
Switch to original repo and setup default path:
|
|
|
|
$ cd ../repo
|
|
$ echo '[paths]' >> .hg/hgrc
|
|
$ echo 'default = ../repo2' >> .hg/hgrc
|
|
|
|
Test incoming:
|
|
|
|
$ hg incoming -S
|
|
comparing with $TESTTMP/repo2 (glob)
|
|
searching for changes
|
|
changeset: 3:2655b8ecc4ee
|
|
tag: tip
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: 3-4-2
|
|
|
|
comparing with $TESTTMP/repo2/foo
|
|
searching for changes
|
|
changeset: 4:e96193d6cb36
|
|
tag: tip
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: 3-4-2
|
|
|
|
comparing with $TESTTMP/repo2/foo/bar
|
|
searching for changes
|
|
no changes found
|
|
|
|
$ hg incoming -S --bundle incoming.hg
|
|
abort: cannot combine --bundle and --subrepos
|
|
[255]
|
|
|
|
Test missing subrepo:
|
|
|
|
$ rm -r foo
|
|
$ hg status -S
|
|
warning: error "unknown revision '65903cebad86f1a84bd4f1134f62fa7dcb7a1c98'" in subrepository "foo"
|
|
|
|
Issue2619: IndexError: list index out of range on hg add with subrepos
|
|
The subrepo must sorts after the explicit filename.
|
|
|
|
$ cd ..
|
|
$ hg init test
|
|
$ cd test
|
|
$ hg init x
|
|
$ echo "x = x" >> .hgsub
|
|
$ hg add .hgsub
|
|
$ touch a x/a
|
|
$ hg add a x/a
|
|
|
|
$ cd ..
|