test-subrepo-git.t
1290 lines
| 29.3 KiB
| text/troff
|
Tads3Lexer
/ tests / test-subrepo-git.t
|
r22046 | #require git | ||
|
r12992 | |||
r48603 | # XXX-CHG When running with python2 + chg this test tend to get stuck and end up | |||
# as a time-out error. My effort to reproduce this outside of the CI failed. The | ||||
# test itself seems to pass fine, but never "complete". Debugging it is slow and | ||||
# tedious. This as a bad impact on the development process as most CI run end up | ||||
# wasting abotu 1h until that one fails. | ||||
# | ||||
# Pierre-Yves David, Augie Fackler and Raphaël Gomès all agreed to disable this | ||||
# case in that specific case until we figure this out (or we drop python2 o:-) ) | ||||
#if no-py3 chg | ||||
$ echo 'skipped: this test get stuck on the CI with python2 + chg. investigation needed' | ||||
$ exit 80 | ||||
#endif | ||||
|
r12992 | make git commits repeatable | ||
|
r32413 | $ cat >> $HGRCPATH <<EOF | ||
> [defaults] | ||||
> commit = -d "0 0" | ||||
> EOF | ||||
|
r17022 | $ echo "[core]" >> $HOME/.gitconfig | ||
$ echo "autocrlf = false" >> $HOME/.gitconfig | ||||
|
r12992 | $ GIT_AUTHOR_NAME='test'; export GIT_AUTHOR_NAME | ||
$ GIT_AUTHOR_EMAIL='test@example.org'; export GIT_AUTHOR_EMAIL | ||||
$ GIT_AUTHOR_DATE='1234567891 +0000'; export GIT_AUTHOR_DATE | ||||
$ GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; export GIT_COMMITTER_NAME | ||||
$ GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"; export GIT_COMMITTER_EMAIL | ||||
$ GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"; export GIT_COMMITTER_DATE | ||||
|
r23693 | $ GIT_CONFIG_NOSYSTEM=1; export GIT_CONFIG_NOSYSTEM | ||
|
r12992 | |||
|
r46842 | set default branch to value compatible with new and old git version | ||
$ git config --global init.defaultBranch master | ||||
|
r12992 | root hg repo | ||
$ hg init t | ||||
$ cd t | ||||
$ echo a > a | ||||
$ hg add a | ||||
$ hg commit -m a | ||||
$ cd .. | ||||
new external git repo | ||||
$ mkdir gitroot | ||||
$ cd gitroot | ||||
$ git init -q | ||||
$ echo g > g | ||||
$ git add g | ||||
$ git commit -q -m g | ||||
add subrepo clone | ||||
$ cd ../t | ||||
$ echo 's = [git]../gitroot' > .hgsub | ||||
$ git clone -q ../gitroot s | ||||
$ hg add .hgsub | ||||
|
r34988 | |||
git subrepo is disabled by default | ||||
|
r12992 | $ hg commit -m 'new git subrepo' | ||
|
r34990 | abort: git subrepos not allowed | ||
|
r34988 | (see 'hg help config.subrepos' for details) | ||
[255] | ||||
so enable it | ||||
$ cat >> $HGRCPATH <<EOF | ||||
> [subrepos] | ||||
|
r34990 | > git:allowed = true | ||
|
r34988 | > EOF | ||
$ hg commit -m 'new git subrepo' | ||||
|
r12992 | $ hg debugsub | ||
path s | ||||
source ../gitroot | ||||
revision da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | ||||
|
r12995 | record a new commit from upstream from a different branch | ||
|
r12992 | |||
$ cd ../gitroot | ||||
|
r13091 | $ git checkout -q -b testing | ||
|
r12992 | $ echo gg >> g | ||
$ git commit -q -a -m gg | ||||
$ cd ../t/s | ||||
|
r13091 | $ git pull -q >/dev/null 2>/dev/null | ||
$ git checkout -q -b testing origin/testing >/dev/null | ||||
|
r12992 | |||
$ cd .. | ||||
|
r13182 | $ hg status --subrepos | ||
M s/g | ||||
|
r12992 | $ hg commit -m 'update git subrepo' | ||
$ hg debugsub | ||||
path s | ||||
source ../gitroot | ||||
revision 126f2a14290cd5ce061fdedc430170e8d39e1c5a | ||||
|
r12993 | |||
|
r13092 | make $GITROOT pushable, by replacing it with a clone with nothing checked out | ||
$ cd .. | ||||
$ git clone gitroot gitrootbare --bare -q | ||||
$ rm -rf gitroot | ||||
$ mv gitrootbare gitroot | ||||
|
r12993 | clone root | ||
|
r13092 | $ cd t | ||
|
r20105 | $ hg clone . ../tc 2> /dev/null | ||
|
r12993 | updating to branch default | ||
|
r13525 | cloning subrepo s from $TESTTMP/gitroot | ||
|
r12993 | 3 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ cd ../tc | ||||
$ hg debugsub | ||||
path s | ||||
source ../gitroot | ||||
revision 126f2a14290cd5ce061fdedc430170e8d39e1c5a | ||||
|
r34986 | $ cd .. | ||
clone with subrepo disabled (update should fail) | ||||
|
r34990 | $ hg clone t -U tc2 --config subrepos.allowed=false | ||
$ hg update -R tc2 --config subrepos.allowed=false | ||||
abort: subrepos not enabled | ||||
|
r34986 | (see 'hg help config.subrepos' for details) | ||
[255] | ||||
$ ls tc2 | ||||
a | ||||
|
r34990 | $ hg clone t tc3 --config subrepos.allowed=false | ||
|
r34986 | updating to branch default | ||
|
r34990 | abort: subrepos not enabled | ||
|
r34986 | (see 'hg help config.subrepos' for details) | ||
[255] | ||||
$ ls tc3 | ||||
a | ||||
|
r12993 | |||
update to previous substate | ||||
|
r34986 | $ cd tc | ||
|
r13111 | $ hg update 1 -q | ||
|
r12993 | $ cat s/g | ||
g | ||||
$ hg debugsub | ||||
path s | ||||
source ../gitroot | ||||
revision da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | ||||
|
r12994 | |||
clone root, make local change | ||||
|
r13092 | $ cd ../t | ||
|
r20105 | $ hg clone . ../ta 2> /dev/null | ||
|
r12994 | updating to branch default | ||
|
r13525 | cloning subrepo s from $TESTTMP/gitroot | ||
|
r12994 | 3 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ cd ../ta | ||||
$ echo ggg >> s/g | ||||
|
r13182 | $ hg status --subrepos | ||
M s/g | ||||
|
r23523 | $ hg diff --subrepos | ||
diff --git a/s/g b/s/g | ||||
index 089258f..85341ee 100644 | ||||
--- a/s/g | ||||
+++ b/s/g | ||||
@@ -1,2 +1,3 @@ | ||||
g | ||||
gg | ||||
|
r23938 | +ggg | ||
|
r15321 | $ hg commit --subrepos -m ggg | ||
|
r13181 | committing subrepository s | ||
|
r12994 | $ hg debugsub | ||
path s | ||||
source ../gitroot | ||||
revision 79695940086840c99328513acbe35f90fcd55e57 | ||||
clone root separately, make different local change | ||||
$ cd ../t | ||||
|
r20105 | $ hg clone . ../tb 2> /dev/null | ||
|
r12994 | updating to branch default | ||
|
r13525 | cloning subrepo s from $TESTTMP/gitroot | ||
|
r12994 | 3 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ cd ../tb/s | ||||
|
r23411 | $ hg status --subrepos | ||
|
r12994 | $ echo f > f | ||
|
r23411 | $ hg status --subrepos | ||
? s/f | ||||
|
r23963 | $ hg add . | ||
|
r24174 | adding f | ||
|
r12994 | $ git add f | ||
$ cd .. | ||||
|
r13182 | $ hg status --subrepos | ||
A s/f | ||||
|
r15321 | $ hg commit --subrepos -m f | ||
|
r13181 | committing subrepository s | ||
|
r12994 | $ hg debugsub | ||
path s | ||||
source ../gitroot | ||||
revision aa84837ccfbdfedcdcdeeedc309d73e6eb069edc | ||||
user b push changes | ||||
|
r13091 | $ hg push 2>/dev/null | ||
|
r35394 | pushing to $TESTTMP/t | ||
|
r33365 | pushing branch testing of subrepository "s" | ||
|
r12994 | searching for changes | ||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files | ||||
user a pulls, merges, commits | ||||
$ cd ../ta | ||||
$ hg pull | ||||
|
r35394 | pulling from $TESTTMP/t | ||
|
r12994 | searching for changes | ||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
|
r34662 | new changesets 089416c11d73 | ||
|
r12994 | (run 'hg heads' to see heads, 'hg merge' to merge) | ||
|
r13091 | $ hg merge 2>/dev/null | ||
|
r21401 | subrepository s diverged (local revision: 7969594, remote revision: aa84837) | ||
|
r42791 | you can (m)erge, keep (l)ocal [working copy] or keep (r)emote [merge rev]. | ||
what do you want to do? m | ||||
|
r13569 | pulling subrepo s from $TESTTMP/gitroot | ||
|
r12994 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
(branch merge, don't forget to commit) | ||||
|
r24256 | $ hg st --subrepos s | ||
A s/f | ||||
|
r12994 | $ cat s/f | ||
f | ||||
$ cat s/g | ||||
g | ||||
gg | ||||
ggg | ||||
|
r15321 | $ hg commit --subrepos -m 'merge' | ||
|
r13181 | committing subrepository s | ||
|
r13182 | $ hg status --subrepos --rev 1:5 | ||
M .hgsubstate | ||||
M s/g | ||||
A s/f | ||||
|
r12994 | $ hg debugsub | ||
path s | ||||
source ../gitroot | ||||
revision f47b465e1bce645dbf37232a00574aa1546ca8d3 | ||||
|
r13091 | $ hg push 2>/dev/null | ||
|
r35394 | pushing to $TESTTMP/t | ||
|
r33365 | pushing branch testing of subrepository "s" | ||
|
r12994 | searching for changes | ||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 2 changesets with 2 changes to 1 files | ||||
|
r12996 | |||
|
r13029 | make upstream git changes | ||
$ cd .. | ||||
$ git clone -q gitroot gitclone | ||||
$ cd gitclone | ||||
$ echo ff >> f | ||||
$ git commit -q -a -m ff | ||||
$ echo fff >> f | ||||
$ git commit -q -a -m fff | ||||
|
r13091 | $ git push origin testing 2>/dev/null | ||
|
r13029 | |||
make and push changes to hg without updating the subrepo | ||||
$ cd ../t | ||||
|
r20105 | $ hg clone . ../td 2>&1 | egrep -v '^Cloning into|^done\.' | ||
|
r13029 | updating to branch default | ||
|
r13525 | cloning subrepo s from $TESTTMP/gitroot | ||
|
r33365 | checking out detached HEAD in subrepository "s" | ||
|
r13029 | check out a git branch if you intend to make changes | ||
3 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ cd ../td | ||||
$ echo aa >> a | ||||
$ hg commit -m aa | ||||
$ hg push | ||||
|
r35394 | pushing to $TESTTMP/t | ||
|
r13029 | searching for changes | ||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files | ||||
|
r13087 | sync to upstream git, distribute changes | ||
$ cd ../ta | ||||
$ hg pull -u -q | ||||
$ cd s | ||||
|
r13091 | $ git pull -q >/dev/null 2>/dev/null | ||
|
r13087 | $ cd .. | ||
$ hg commit -m 'git upstream sync' | ||||
$ hg debugsub | ||||
path s | ||||
source ../gitroot | ||||
revision 32a343883b74769118bb1d3b4b1fbf9156f4dddc | ||||
$ hg push -q | ||||
$ cd ../tb | ||||
$ hg pull -q | ||||
|
r13091 | $ hg update 2>/dev/null | ||
|
r13569 | pulling subrepo s from $TESTTMP/gitroot | ||
|
r13087 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg debugsub | ||||
path s | ||||
source ../gitroot | ||||
revision 32a343883b74769118bb1d3b4b1fbf9156f4dddc | ||||
|
r19013 | create a new git branch | ||
$ cd s | ||||
$ git checkout -b b2 | ||||
Switched to a new branch 'b2' | ||||
$ echo a>a | ||||
$ git add a | ||||
$ git commit -qm 'add a' | ||||
$ cd .. | ||||
$ hg commit -m 'add branch in s' | ||||
pulling new git branch should not create tracking branch named 'origin/b2' | ||||
(issue3870) | ||||
$ cd ../td/s | ||||
$ git remote set-url origin $TESTTMP/tb/s | ||||
|
r19049 | $ git branch --no-track oldtesting | ||
|
r19013 | $ cd .. | ||
$ hg pull -q ../tb | ||||
$ hg up | ||||
From $TESTTMP/tb/s | ||||
* [new branch] b2 -> origin/b2 | ||||
|
r35804 | Previous HEAD position was f47b465* merge (glob) | ||
|
r19013 | Switched to a new branch 'b2' | ||
pulling subrepo s from $TESTTMP/tb/s | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
|
r12996 | update to a revision without the subrepo, keeping the local git repository | ||
$ cd ../t | ||||
$ hg up 0 | ||||
0 files updated, 0 files merged, 2 files removed, 0 files unresolved | ||||
|
r13010 | $ ls -a s | ||
|
r12996 | . | ||
.. | ||||
.git | ||||
$ hg up 2 | ||||
2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
|
r13010 | $ ls -a s | ||
|
r12996 | . | ||
.. | ||||
.git | ||||
g | ||||
|
r13027 | |||
archive subrepos | ||||
|
r13091 | $ cd ../tc | ||
$ hg pull -q | ||||
$ hg archive --subrepos -r 5 ../archive 2>/dev/null | ||||
|
r13569 | pulling subrepo s from $TESTTMP/gitroot | ||
|
r13027 | $ cd ../archive | ||
$ cat s/f | ||||
f | ||||
$ cat s/g | ||||
g | ||||
gg | ||||
ggg | ||||
|
r13181 | |||
|
r17108 | $ hg -R ../tc archive --subrepo -r 5 -X ../tc/**f ../archive_x 2>/dev/null | ||
|
r17114 | $ find ../archive_x | sort | grep -v pax_global_header | ||
|
r17108 | ../archive_x | ||
../archive_x/.hg_archival.txt | ||||
../archive_x/.hgsub | ||||
../archive_x/.hgsubstate | ||||
../archive_x/a | ||||
../archive_x/s | ||||
../archive_x/s/g | ||||
|
r24953 | $ hg -R ../tc archive -S ../archive.tgz --prefix '.' 2>/dev/null | ||
|
r24964 | $ tar -tzf ../archive.tgz | sort | grep -v pax_global_header | ||
|
r24953 | .hg_archival.txt | ||
.hgsub | ||||
.hgsubstate | ||||
a | ||||
s/g | ||||
|
r24924 | |||
|
r44467 | $ hg -R ../tc archive -S ../lf_archive.tgz --prefix '.' \ | ||
> --config extensions.largefiles= 2>/dev/null | ||||
$ tar -tzf ../lf_archive.tgz | sort | grep -v pax_global_header | ||||
.hg_archival.txt | ||||
.hgsub | ||||
.hgsubstate | ||||
a | ||||
s/g | ||||
|
r13181 | create nested repo | ||
$ cd .. | ||||
$ hg init outer | ||||
$ cd outer | ||||
$ echo b>b | ||||
$ hg add b | ||||
$ hg commit -m b | ||||
|
r20105 | $ hg clone ../t inner 2> /dev/null | ||
|
r13181 | updating to branch default | ||
|
r13525 | cloning subrepo s from $TESTTMP/gitroot | ||
|
r13181 | 3 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ echo inner = inner > .hgsub | ||||
$ hg add .hgsub | ||||
$ hg commit -m 'nested sub' | ||||
nested commit | ||||
$ echo ffff >> inner/s/f | ||||
|
r13182 | $ hg status --subrepos | ||
M inner/s/f | ||||
|
r15321 | $ hg commit --subrepos -m nested | ||
|
r13181 | committing subrepository inner | ||
|
r35394 | committing subrepository inner/s | ||
|
r13181 | |||
nested archive | ||||
$ hg archive --subrepos ../narchive | ||||
|
r13296 | $ ls ../narchive/inner/s | grep -v pax_global_header | ||
|
r13181 | f | ||
g | ||||
|
r13324 | |||
|
r13460 | relative source expansion | ||
$ cd .. | ||||
$ mkdir d | ||||
|
r20105 | $ hg clone t d/t 2> /dev/null | ||
|
r13460 | updating to branch default | ||
|
r13525 | cloning subrepo s from $TESTTMP/gitroot | ||
|
r13460 | 3 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
|
r13553 | Don't crash if the subrepo is missing | ||
$ hg clone t missing -q | ||||
$ cd missing | ||||
$ rm -rf s | ||||
$ hg status -S | ||||
$ hg sum | grep commit | ||||
commit: 1 subrepos | ||||
$ hg push -q | ||||
|
r33365 | abort: subrepo s is missing (in subrepository "s") | ||
|
r13553 | [255] | ||
|
r15321 | $ hg commit --subrepos -qm missing | ||
|
r33365 | abort: subrepo s is missing (in subrepository "s") | ||
|
r13553 | [255] | ||
|
r24902 | |||
#if symlink | ||||
Don't crash if subrepo is a broken symlink | ||||
$ ln -s broken s | ||||
$ hg status -S | ||||
|
r34985 | abort: subrepo 's' traverses symbolic link | ||
[255] | ||||
|
r24902 | $ hg push -q | ||
|
r34985 | abort: subrepo 's' traverses symbolic link | ||
|
r24902 | [255] | ||
$ hg commit --subrepos -qm missing | ||||
|
r34985 | abort: subrepo 's' traverses symbolic link | ||
|
r24902 | [255] | ||
$ rm s | ||||
#endif | ||||
|
r20105 | $ hg update -C 2> /dev/null | ||
|
r13560 | cloning subrepo s from $TESTTMP/gitroot | ||
|
r13553 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg sum | grep commit | ||||
commit: (clean) | ||||
|
r14469 | Don't crash if the .hgsubstate entry is missing | ||
$ hg update 1 -q | ||||
$ hg rm .hgsubstate | ||||
$ hg commit .hgsubstate -m 'no substate' | ||||
|
r16073 | nothing changed | ||
[1] | ||||
|
r14469 | $ hg tag -l nosubstate | ||
$ hg manifest | ||||
.hgsub | ||||
|
r16073 | .hgsubstate | ||
|
r14469 | a | ||
$ hg status -S | ||||
|
r16073 | R .hgsubstate | ||
|
r14469 | $ hg sum | grep commit | ||
|
r16073 | commit: 1 removed, 1 subrepos (new branch head) | ||
|
r14469 | |||
$ hg commit -m 'restore substate' | ||||
|
r16073 | nothing changed | ||
[1] | ||||
|
r14469 | $ hg manifest | ||
.hgsub | ||||
.hgsubstate | ||||
a | ||||
$ hg sum | grep commit | ||||
|
r16073 | commit: 1 removed, 1 subrepos (new branch head) | ||
|
r14469 | |||
$ hg update -qC nosubstate | ||||
$ ls s | ||||
|
r16073 | g | ||
|
r14469 | |||
|
r15531 | issue3109: false positives in git diff-index | ||
$ hg update -q | ||||
$ touch -t 200001010000 s/g | ||||
$ hg status --subrepos | ||||
$ touch -t 200001010000 s/g | ||||
$ hg sum | grep commit | ||||
commit: (clean) | ||||
|
r13324 | Check hg update --clean | ||
|
r13331 | $ cd $TESTTMP/ta | ||
|
r13324 | $ echo > s/g | ||
$ cd s | ||||
$ echo c1 > f1 | ||||
$ echo c1 > f2 | ||||
$ git add f1 | ||||
$ cd .. | ||||
|
r13331 | $ hg status -S | ||
M s/g | ||||
A s/f1 | ||||
|
r23411 | ? s/f2 | ||
|
r13331 | $ ls s | ||
f | ||||
f1 | ||||
f2 | ||||
g | ||||
$ hg update --clean | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ hg status -S | ||||
|
r23411 | ? s/f1 | ||
? s/f2 | ||||
|
r13331 | $ ls s | ||
f | ||||
f1 | ||||
f2 | ||||
g | ||||
|
r13417 | |||
Sticky subrepositories, no changes | ||||
$ cd $TESTTMP/ta | ||||
$ hg id -n | ||||
7 | ||||
$ cd s | ||||
$ git rev-parse HEAD | ||||
32a343883b74769118bb1d3b4b1fbf9156f4dddc | ||||
$ cd .. | ||||
$ hg update 1 > /dev/null 2>&1 | ||||
$ hg id -n | ||||
1 | ||||
$ cd s | ||||
$ git rev-parse HEAD | ||||
da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | ||||
$ cd .. | ||||
|
r21024 | Sticky subrepositories, file changes | ||
|
r13417 | $ touch s/f1 | ||
$ cd s | ||||
$ git add f1 | ||||
$ cd .. | ||||
$ hg id -n | ||||
|
r17255 | 1+ | ||
|
r13417 | $ cd s | ||
$ git rev-parse HEAD | ||||
da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | ||||
$ cd .. | ||||
$ hg update 4 | ||||
|
r21401 | subrepository s diverged (local revision: da5f5b1, remote revision: aa84837) | ||
|
r42791 | you can (m)erge, keep (l)ocal [working copy] or keep (r)emote [destination]. | ||
what do you want to do? m | ||||
|
r13417 | subrepository sources for s differ | ||
|
r42791 | you can use (l)ocal source (da5f5b1) or (r)emote source (aa84837). | ||
what do you want to do? l | ||||
|
r13417 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg id -n | ||||
4+ | ||||
$ cd s | ||||
$ git rev-parse HEAD | ||||
da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | ||||
$ cd .. | ||||
|
r17345 | $ hg update --clean tip > /dev/null 2>&1 | ||
|
r13417 | |||
Sticky subrepository, revision updates | ||||
$ hg id -n | ||||
7 | ||||
$ cd s | ||||
$ git rev-parse HEAD | ||||
32a343883b74769118bb1d3b4b1fbf9156f4dddc | ||||
$ cd .. | ||||
$ cd s | ||||
$ git checkout aa84837ccfbdfedcdcdeeedc309d73e6eb069edc | ||||
|
r35804 | Previous HEAD position was 32a3438* fff (glob) | ||
HEAD is now at aa84837* f (glob) | ||||
|
r13417 | $ cd .. | ||
$ hg update 1 | ||||
|
r21401 | subrepository s diverged (local revision: 32a3438, remote revision: da5f5b1) | ||
|
r42791 | you can (m)erge, keep (l)ocal [working copy] or keep (r)emote [destination]. | ||
what do you want to do? m | ||||
|
r13417 | subrepository sources for s differ (in checked out version) | ||
|
r42791 | you can use (l)ocal source (32a3438) or (r)emote source (da5f5b1). | ||
what do you want to do? l | ||||
|
r13417 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg id -n | ||||
1+ | ||||
$ cd s | ||||
$ git rev-parse HEAD | ||||
aa84837ccfbdfedcdcdeeedc309d73e6eb069edc | ||||
$ cd .. | ||||
Sticky subrepository, file changes and revision updates | ||||
$ touch s/f1 | ||||
$ cd s | ||||
$ git add f1 | ||||
$ git rev-parse HEAD | ||||
aa84837ccfbdfedcdcdeeedc309d73e6eb069edc | ||||
$ cd .. | ||||
$ hg id -n | ||||
1+ | ||||
$ hg update 7 | ||||
|
r21401 | subrepository s diverged (local revision: 32a3438, remote revision: 32a3438) | ||
|
r42791 | you can (m)erge, keep (l)ocal [working copy] or keep (r)emote [destination]. | ||
what do you want to do? m | ||||
|
r13417 | subrepository sources for s differ | ||
|
r42791 | you can use (l)ocal source (32a3438) or (r)emote source (32a3438). | ||
what do you want to do? l | ||||
|
r13417 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg id -n | ||||
|
r17255 | 7+ | ||
|
r13417 | $ cd s | ||
$ git rev-parse HEAD | ||||
aa84837ccfbdfedcdcdeeedc309d73e6eb069edc | ||||
$ cd .. | ||||
Sticky repository, update --clean | ||||
|
r16264 | $ hg update --clean tip 2>/dev/null | ||
|
r13417 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg id -n | ||||
7 | ||||
$ cd s | ||||
$ git rev-parse HEAD | ||||
32a343883b74769118bb1d3b4b1fbf9156f4dddc | ||||
$ cd .. | ||||
Test subrepo already at intended revision: | ||||
$ cd s | ||||
$ git checkout 32a343883b74769118bb1d3b4b1fbf9156f4dddc | ||||
|
r35804 | HEAD is now at 32a3438* fff (glob) | ||
|
r13417 | $ cd .. | ||
$ hg update 1 | ||||
|
r35804 | Previous HEAD position was 32a3438* fff (glob) | ||
HEAD is now at da5f5b1* g (glob) | ||||
|
r13417 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg id -n | ||||
1 | ||||
$ cd s | ||||
$ git rev-parse HEAD | ||||
da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | ||||
$ cd .. | ||||
|
r16527 | Test forgetting files, not implemented in git subrepo, used to | ||
traceback | ||||
|
r17022 | #if no-windows | ||
|
r16527 | $ hg forget 'notafile*' | ||
|
r35230 | notafile*: $ENOENT$ | ||
|
r16527 | [1] | ||
|
r17022 | #else | ||
|
r35230 | error: The filename, directory name, or volume label syntax is incorrect | ||
|
r17022 | $ hg forget 'notafile' | ||
notafile: * (glob) | ||||
[1] | ||||
#endif | ||||
|
r16913 | |||
$ cd .. | ||||
|
r21564 | |||
Test sanitizing ".hg/hgrc" in subrepo | ||||
$ cd t | ||||
$ hg tip -q | ||||
7:af6d2edbb0d3 | ||||
$ hg update -q -C af6d2edbb0d3 | ||||
$ cd s | ||||
$ git checkout -q -b sanitize-test | ||||
$ mkdir .hg | ||||
$ echo '.hg/hgrc in git repo' > .hg/hgrc | ||||
$ mkdir -p sub/.hg | ||||
$ echo 'sub/.hg/hgrc in git repo' > sub/.hg/hgrc | ||||
$ git add .hg sub | ||||
$ git commit -qm 'add .hg/hgrc to be sanitized at hg update' | ||||
$ git push -q origin sanitize-test | ||||
$ cd .. | ||||
$ grep ' s$' .hgsubstate | ||||
32a343883b74769118bb1d3b4b1fbf9156f4dddc s | ||||
$ hg commit -qm 'commit with git revision including .hg/hgrc' | ||||
$ hg parents -q | ||||
8:3473d20bddcf | ||||
$ grep ' s$' .hgsubstate | ||||
c4069473b459cf27fd4d7c2f50c4346b4e936599 s | ||||
$ cd .. | ||||
|
r21566 | $ hg -R tc pull -q | ||
$ hg -R tc update -q -C 3473d20bddcf 2>&1 | sort | ||||
|
r35394 | warning: removing potentially hostile 'hgrc' in '$TESTTMP/tc/s/.hg' | ||
warning: removing potentially hostile 'hgrc' in '$TESTTMP/tc/s/sub/.hg' | ||||
|
r21564 | $ cd tc | ||
$ hg parents -q | ||||
8:3473d20bddcf | ||||
$ grep ' s$' .hgsubstate | ||||
c4069473b459cf27fd4d7c2f50c4346b4e936599 s | ||||
|
r21748 | $ test -f s/.hg/hgrc | ||
|
r21564 | [1] | ||
|
r21748 | $ test -f s/sub/.hg/hgrc | ||
|
r21564 | [1] | ||
$ cd .. | ||||
|
r21565 | |||
additional test for "git merge --ff" route: | ||||
$ cd t | ||||
$ hg tip -q | ||||
8:3473d20bddcf | ||||
$ hg update -q -C af6d2edbb0d3 | ||||
$ cd s | ||||
$ git checkout -q testing | ||||
$ mkdir .hg | ||||
$ echo '.hg/hgrc in git repo' > .hg/hgrc | ||||
$ mkdir -p sub/.hg | ||||
$ echo 'sub/.hg/hgrc in git repo' > sub/.hg/hgrc | ||||
$ git add .hg sub | ||||
$ git commit -qm 'add .hg/hgrc to be sanitized at hg update (git merge --ff)' | ||||
$ git push -q origin testing | ||||
$ cd .. | ||||
$ grep ' s$' .hgsubstate | ||||
32a343883b74769118bb1d3b4b1fbf9156f4dddc s | ||||
$ hg commit -qm 'commit with git revision including .hg/hgrc' | ||||
$ hg parents -q | ||||
9:ed23f7fe024e | ||||
$ grep ' s$' .hgsubstate | ||||
f262643c1077219fbd3858d54e78ef050ef84fbf s | ||||
$ cd .. | ||||
$ cd tc | ||||
$ hg update -q -C af6d2edbb0d3 | ||||
|
r21748 | $ test -f s/.hg/hgrc | ||
|
r21565 | [1] | ||
|
r21748 | $ test -f s/sub/.hg/hgrc | ||
|
r21565 | [1] | ||
|
r21566 | $ cd .. | ||
$ hg -R tc pull -q | ||||
$ hg -R tc update -q -C ed23f7fe024e 2>&1 | sort | ||||
|
r35394 | warning: removing potentially hostile 'hgrc' in '$TESTTMP/tc/s/.hg' | ||
warning: removing potentially hostile 'hgrc' in '$TESTTMP/tc/s/sub/.hg' | ||||
|
r21566 | $ cd tc | ||
|
r21565 | $ hg parents -q | ||
9:ed23f7fe024e | ||||
$ grep ' s$' .hgsubstate | ||||
f262643c1077219fbd3858d54e78ef050ef84fbf s | ||||
|
r21748 | $ test -f s/.hg/hgrc | ||
|
r21565 | [1] | ||
|
r21748 | $ test -f s/sub/.hg/hgrc | ||
|
r21565 | [1] | ||
|
r21567 | |||
Test that sanitizing is omitted in meta data area: | ||||
$ mkdir s/.git/.hg | ||||
$ echo '.hg/hgrc in git metadata area' > s/.git/.hg/hgrc | ||||
$ hg update -q -C af6d2edbb0d3 | ||||
|
r33365 | checking out detached HEAD in subrepository "s" | ||
|
r21567 | check out a git branch if you intend to make changes | ||
|
r23523 | check differences made by most recent change | ||
$ cd s | ||||
$ cat > foobar << EOF | ||||
> woopwoop | ||||
> | ||||
> foo | ||||
> bar | ||||
> EOF | ||||
$ git add foobar | ||||
|
r21565 | $ cd .. | ||
|
r23523 | |||
$ hg diff --subrepos | ||||
diff --git a/s/foobar b/s/foobar | ||||
new file mode 100644 | ||||
index 0000000..8a5a5e2 | ||||
--- /dev/null | ||||
+++ b/s/foobar | ||||
@@ -0,0 +1,4 @@ | ||||
+woopwoop | ||||
+ | ||||
+foo | ||||
|
r23938 | +bar | ||
|
r23523 | |||
$ hg commit --subrepos -m "Added foobar" | ||||
committing subrepository s | ||||
created new head | ||||
$ hg diff -c . --subrepos --nodates | ||||
diff -r af6d2edbb0d3 -r 255ee8cf690e .hgsubstate | ||||
--- a/.hgsubstate | ||||
+++ b/.hgsubstate | ||||
@@ -1,1 +1,1 @@ | ||||
-32a343883b74769118bb1d3b4b1fbf9156f4dddc s | ||||
+fd4dbf828a5b2fcd36b2bcf21ea773820970d129 s | ||||
diff --git a/s/foobar b/s/foobar | ||||
new file mode 100644 | ||||
index 0000000..8a5a5e2 | ||||
--- /dev/null | ||||
+++ b/s/foobar | ||||
@@ -0,0 +1,4 @@ | ||||
+woopwoop | ||||
+ | ||||
+foo | ||||
|
r23938 | +bar | ||
|
r23523 | |||
check output when only diffing the subrepository | ||||
$ hg diff -c . --subrepos s | ||||
diff --git a/s/foobar b/s/foobar | ||||
new file mode 100644 | ||||
index 0000000..8a5a5e2 | ||||
--- /dev/null | ||||
+++ b/s/foobar | ||||
@@ -0,0 +1,4 @@ | ||||
+woopwoop | ||||
+ | ||||
+foo | ||||
|
r23938 | +bar | ||
|
r23523 | |||
check output when diffing something else | ||||
$ hg diff -c . --subrepos .hgsubstate --nodates | ||||
diff -r af6d2edbb0d3 -r 255ee8cf690e .hgsubstate | ||||
--- a/.hgsubstate | ||||
+++ b/.hgsubstate | ||||
@@ -1,1 +1,1 @@ | ||||
-32a343883b74769118bb1d3b4b1fbf9156f4dddc s | ||||
+fd4dbf828a5b2fcd36b2bcf21ea773820970d129 s | ||||
add new changes, including whitespace | ||||
$ cd s | ||||
$ cat > foobar << EOF | ||||
> woop woop | ||||
> | ||||
> foo | ||||
> bar | ||||
> EOF | ||||
$ echo foo > barfoo | ||||
$ git add barfoo | ||||
$ cd .. | ||||
$ hg diff --subrepos --ignore-all-space | ||||
diff --git a/s/barfoo b/s/barfoo | ||||
new file mode 100644 | ||||
index 0000000..257cc56 | ||||
--- /dev/null | ||||
+++ b/s/barfoo | ||||
|
r28035 | @@ -0,0 +1* @@ (glob) | ||
|
r23938 | +foo | ||
|
r23523 | $ hg diff --subrepos s/foobar | ||
diff --git a/s/foobar b/s/foobar | ||||
index 8a5a5e2..bd5812a 100644 | ||||
--- a/s/foobar | ||||
+++ b/s/foobar | ||||
@@ -1,4 +1,4 @@ | ||||
-woopwoop | ||||
+woop woop | ||||
foo | ||||
|
r23938 | bar | ||
|
r23523 | |||
|
r23542 | execute a diffstat | ||
the output contains a regex, because git 1.7.10 and 1.7.11 | ||||
change the amount of whitespace | ||||
|
r23523 | $ hg diff --subrepos --stat | ||
|
r35155 | \s*barfoo \|\s+1 \+ (re) | ||
\s*foobar \|\s+2 \+- (re) | ||||
|
r23938 | 2 files changed, 2 insertions\(\+\), 1 deletions?\(-\) (re) | ||
|
r23523 | |||
|
r24778 | adding an include should ignore the other elements | ||
|
r23523 | $ hg diff --subrepos -I s/foobar | ||
|
r24778 | diff --git a/s/foobar b/s/foobar | ||
index 8a5a5e2..bd5812a 100644 | ||||
--- a/s/foobar | ||||
+++ b/s/foobar | ||||
@@ -1,4 +1,4 @@ | ||||
-woopwoop | ||||
+woop woop | ||||
foo | ||||
bar | ||||
adding an exclude should ignore this element | ||||
|
r23523 | $ hg diff --subrepos -X s/foobar | ||
|
r24778 | diff --git a/s/barfoo b/s/barfoo | ||
new file mode 100644 | ||||
index 0000000..257cc56 | ||||
--- /dev/null | ||||
+++ b/s/barfoo | ||||
|
r28035 | @@ -0,0 +1* @@ (glob) | ||
|
r24778 | +foo | ||
moving a file should show a removal and an add | ||||
$ hg revert --all | ||||
reverting subrepo ../gitroot | ||||
$ cd s | ||||
$ git mv foobar woop | ||||
$ cd .. | ||||
$ hg diff --subrepos | ||||
diff --git a/s/foobar b/s/foobar | ||||
deleted file mode 100644 | ||||
index 8a5a5e2..0000000 | ||||
--- a/s/foobar | ||||
+++ /dev/null | ||||
@@ -1,4 +0,0 @@ | ||||
-woopwoop | ||||
- | ||||
-foo | ||||
-bar | ||||
diff --git a/s/woop b/s/woop | ||||
new file mode 100644 | ||||
index 0000000..8a5a5e2 | ||||
--- /dev/null | ||||
+++ b/s/woop | ||||
@@ -0,0 +1,4 @@ | ||||
+woopwoop | ||||
+ | ||||
+foo | ||||
+bar | ||||
$ rm s/woop | ||||
|
r23523 | |||
|
r23550 | revert the subrepository | ||
$ hg revert --all | ||||
|
r23937 | reverting subrepo ../gitroot | ||
|
r23550 | |||
$ hg status --subrepos | ||||
|
r23678 | ? s/barfoo | ||
? s/foobar.orig | ||||
|
r23550 | |||
|
r23678 | $ mv s/foobar.orig s/foobar | ||
|
r23550 | $ hg revert --no-backup s | ||
|
r23937 | reverting subrepo ../gitroot | ||
|
r23550 | |||
$ hg status --subrepos | ||||
? s/barfoo | ||||
|
r26940 | revert moves orig files to the right place | ||
$ echo 'bloop' > s/foobar | ||||
$ hg revert --all --verbose --config 'ui.origbackuppath=.hg/origbackups' | ||||
reverting subrepo ../gitroot | ||||
|
r41752 | creating directory: $TESTTMP/tc/.hg/origbackups/s | ||
saving current version of foobar as .hg/origbackups/s/foobar | ||||
$ ls .hg/origbackups/s | ||||
|
r34145 | foobar | ||
|
r26940 | $ rm -rf .hg/origbackups | ||
|
r23991 | show file at specific revision | ||
$ cat > s/foobar << EOF | ||||
> woop woop | ||||
> fooo bar | ||||
> EOF | ||||
$ hg commit --subrepos -m "updated foobar" | ||||
committing subrepository s | ||||
$ cat > s/foobar << EOF | ||||
> current foobar | ||||
> (should not be visible using hg cat) | ||||
> EOF | ||||
$ hg cat -r . s/foobar | ||||
woop woop | ||||
fooo bar (no-eol) | ||||
$ hg cat -r "parents(.)" s/foobar > catparents | ||||
$ mkdir -p tmp/s | ||||
$ hg cat -r "parents(.)" --output tmp/%% s/foobar | ||||
$ diff tmp/% catparents | ||||
$ hg cat -r "parents(.)" --output tmp/%s s/foobar | ||||
$ diff tmp/foobar catparents | ||||
$ hg cat -r "parents(.)" --output tmp/%d/otherfoobar s/foobar | ||||
$ diff tmp/s/otherfoobar catparents | ||||
$ hg cat -r "parents(.)" --output tmp/%p s/foobar | ||||
$ diff tmp/s/foobar catparents | ||||
$ hg cat -r "parents(.)" --output tmp/%H s/foobar | ||||
$ diff tmp/255ee8cf690ec86e99b1e80147ea93ece117cd9d catparents | ||||
$ hg cat -r "parents(.)" --output tmp/%R s/foobar | ||||
$ diff tmp/10 catparents | ||||
$ hg cat -r "parents(.)" --output tmp/%h s/foobar | ||||
$ diff tmp/255ee8cf690e catparents | ||||
$ rm tmp/10 | ||||
$ hg cat -r "parents(.)" --output tmp/%r s/foobar | ||||
$ diff tmp/10 catparents | ||||
$ mkdir tmp/tc | ||||
$ hg cat -r "parents(.)" --output tmp/%b/foobar s/foobar | ||||
$ diff tmp/tc/foobar catparents | ||||
|
r24174 | cleanup | ||
$ rm -r tmp | ||||
$ rm catparents | ||||
add git files, using either files or patterns | ||||
$ echo "hsss! hsssssssh!" > s/snake.python | ||||
$ echo "ccc" > s/c.c | ||||
$ echo "cpp" > s/cpp.cpp | ||||
$ hg add s/snake.python s/c.c s/cpp.cpp | ||||
$ hg st --subrepos s | ||||
M s/foobar | ||||
A s/c.c | ||||
A s/cpp.cpp | ||||
A s/snake.python | ||||
? s/barfoo | ||||
$ hg revert s | ||||
reverting subrepo ../gitroot | ||||
$ hg add --subrepos "glob:**.python" | ||||
|
r35394 | adding s/snake.python | ||
|
r24174 | $ hg st --subrepos s | ||
A s/snake.python | ||||
? s/barfoo | ||||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
$ hg revert s | ||||
reverting subrepo ../gitroot | ||||
$ hg add --subrepos s | ||||
|
r35394 | adding s/barfoo | ||
adding s/c.c | ||||
adding s/cpp.cpp | ||||
adding s/foobar.orig | ||||
adding s/snake.python | ||||
|
r24174 | $ hg st --subrepos s | ||
A s/barfoo | ||||
A s/c.c | ||||
A s/cpp.cpp | ||||
A s/foobar.orig | ||||
A s/snake.python | ||||
$ hg revert s | ||||
reverting subrepo ../gitroot | ||||
make sure everything is reverted correctly | ||||
$ hg st --subrepos s | ||||
? s/barfoo | ||||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
? s/snake.python | ||||
$ hg add --subrepos --exclude "path:s/c.c" | ||||
|
r35394 | adding s/barfoo | ||
adding s/cpp.cpp | ||||
adding s/foobar.orig | ||||
adding s/snake.python | ||||
|
r24174 | $ hg st --subrepos s | ||
A s/barfoo | ||||
A s/cpp.cpp | ||||
A s/foobar.orig | ||||
A s/snake.python | ||||
? s/c.c | ||||
$ hg revert --all -q | ||||
.hgignore should not have influence in subrepos | ||||
$ cat > .hgignore << EOF | ||||
> syntax: glob | ||||
> *.python | ||||
> EOF | ||||
$ hg add .hgignore | ||||
|
r24182 | $ hg add --subrepos "glob:**.python" s/barfoo | ||
|
r35394 | adding s/snake.python | ||
|
r24174 | $ hg st --subrepos s | ||
|
r24182 | A s/barfoo | ||
|
r24174 | A s/snake.python | ||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
$ hg revert --all -q | ||||
.gitignore should have influence, | ||||
except for explicitly added files (no patterns) | ||||
$ cat > s/.gitignore << EOF | ||||
> *.python | ||||
> EOF | ||||
$ hg add s/.gitignore | ||||
$ hg st --subrepos s | ||||
A s/.gitignore | ||||
? s/barfoo | ||||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
|
r24256 | $ hg st --subrepos s --all | ||
A s/.gitignore | ||||
? s/barfoo | ||||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
I s/snake.python | ||||
C s/f | ||||
C s/foobar | ||||
C s/g | ||||
|
r24174 | $ hg add --subrepos "glob:**.python" | ||
$ hg st --subrepos s | ||||
A s/.gitignore | ||||
? s/barfoo | ||||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
$ hg add --subrepos s/snake.python | ||||
$ hg st --subrepos s | ||||
A s/.gitignore | ||||
A s/snake.python | ||||
? s/barfoo | ||||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
correctly do a dry run | ||||
$ hg add --subrepos s --dry-run | ||||
|
r35394 | adding s/barfoo | ||
adding s/c.c | ||||
adding s/cpp.cpp | ||||
adding s/foobar.orig | ||||
|
r24174 | $ hg st --subrepos s | ||
A s/.gitignore | ||||
A s/snake.python | ||||
? s/barfoo | ||||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
|
r24183 | error given when adding an already tracked file | ||
|
r24174 | $ hg add s/.gitignore | ||
|
r24183 | s/.gitignore already tracked! | ||
[1] | ||||
|
r24256 | $ hg add s/g | ||
s/g already tracked! | ||||
[1] | ||||
|
r24183 | |||
removed files can be re-added | ||||
|
r24256 | removing files using 'rm' or 'git rm' has the same effect, | ||
since we ignore the staging area | ||||
|
r24183 | $ hg ci --subrepos -m 'snake' | ||
committing subrepository s | ||||
$ cd s | ||||
|
r24256 | $ rm snake.python | ||
(remove leftover .hg so Mercurial doesn't look for a root here) | ||||
|
r24581 | $ rm -rf .hg | ||
|
r24256 | $ hg status --subrepos --all . | ||
R snake.python | ||||
? barfoo | ||||
? c.c | ||||
? cpp.cpp | ||||
? foobar.orig | ||||
C .gitignore | ||||
C f | ||||
C foobar | ||||
C g | ||||
|
r24183 | $ git rm snake.python | ||
rm 'snake.python' | ||||
|
r24256 | $ hg status --subrepos --all . | ||
R snake.python | ||||
? barfoo | ||||
? c.c | ||||
? cpp.cpp | ||||
? foobar.orig | ||||
C .gitignore | ||||
C f | ||||
C foobar | ||||
C g | ||||
|
r24183 | $ touch snake.python | ||
$ cd .. | ||||
$ hg add s/snake.python | ||||
$ hg status -S | ||||
M s/snake.python | ||||
? .hgignore | ||||
? s/barfoo | ||||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
|
r24943 | $ hg revert --all -q | ||
make sure we show changed files, rather than changed subtrees | ||||
$ mkdir s/foo | ||||
$ touch s/foo/bwuh | ||||
$ hg add s/foo/bwuh | ||||
$ hg commit -S -m "add bwuh" | ||||
committing subrepository s | ||||
$ hg status -S --change . | ||||
M .hgsubstate | ||||
A s/foo/bwuh | ||||
? s/barfoo | ||||
? s/c.c | ||||
? s/cpp.cpp | ||||
? s/foobar.orig | ||||
? s/snake.python.orig | ||||
|
r24174 | |||
|
r32902 | #if git19 | ||
|
r28658 | test for Git CVE-2016-3068 | ||
$ hg init malicious-subrepository | ||||
$ cd malicious-subrepository | ||||
|
r29295 | $ echo "s = [git]ext::sh -c echo% pwned:% \$PWNED_MSG% >pwned.txt" > .hgsub | ||
|
r28658 | $ git init s | ||
Initialized empty Git repository in $TESTTMP/tc/malicious-subrepository/s/.git/ | ||||
$ cd s | ||||
$ git commit --allow-empty -m 'empty' | ||||
[master (root-commit) 153f934] empty | ||||
|
r23523 | $ cd .. | ||
|
r28658 | $ hg add .hgsub | ||
$ hg commit -m "add subrepo" | ||||
$ cd .. | ||||
|
r29256 | $ rm -f pwned.txt | ||
|
r29135 | $ unset GIT_ALLOW_PROTOCOL | ||
|
r29328 | $ PWNED_MSG="your git is too old or mercurial has regressed" hg clone \ | ||
|
r29257 | > malicious-subrepository malicious-subrepository-protected | ||
|
r35394 | Cloning into '$TESTTMP/tc/malicious-subrepository-protected/s'... | ||
|
r28658 | fatal: transport 'ext' not allowed | ||
updating to branch default | ||||
|
r29295 | cloning subrepo s from ext::sh -c echo% pwned:% $PWNED_MSG% >pwned.txt | ||
|
r33365 | abort: git clone error 128 in s (in subrepository "s") | ||
|
r28658 | [255] | ||
|
r29295 | $ f -Dq pwned.txt | ||
pwned.txt: file not found | ||||
|
r28658 | |||
whitelisting of ext should be respected (that's the git submodule behaviour) | ||||
|
r29256 | $ rm -f pwned.txt | ||
|
r29257 | $ env GIT_ALLOW_PROTOCOL=ext PWNED_MSG="you asked for it" hg clone \ | ||
> malicious-subrepository malicious-subrepository-clone-allowed | ||||
|
r35394 | Cloning into '$TESTTMP/tc/malicious-subrepository-clone-allowed/s'... | ||
|
r28658 | fatal: Could not read from remote repository. | ||
Please make sure you have the correct access rights | ||||
and the repository exists. | ||||
updating to branch default | ||||
|
r29295 | cloning subrepo s from ext::sh -c echo% pwned:% $PWNED_MSG% >pwned.txt | ||
|
r33365 | abort: git clone error 128 in s (in subrepository "s") | ||
|
r28658 | [255] | ||
|
r29295 | $ f -Dq pwned.txt | ||
pwned: you asked for it | ||||
|
r32902 | |||
#endif | ||||
|
r33731 | |||
test for ssh exploit with git subrepos 2017-07-25 | ||||
$ hg init malicious-proxycommand | ||||
$ cd malicious-proxycommand | ||||
$ echo 's = [git]ssh://-oProxyCommand=rm${IFS}non-existent/path' > .hgsub | ||||
$ git init s | ||||
Initialized empty Git repository in $TESTTMP/tc/malicious-proxycommand/s/.git/ | ||||
$ cd s | ||||
$ git commit --allow-empty -m 'empty' | ||||
[master (root-commit) 153f934] empty | ||||
$ cd .. | ||||
$ hg add .hgsub | ||||
$ hg ci -m 'add subrepo' | ||||
$ cd .. | ||||
$ hg clone malicious-proxycommand malicious-proxycommand-clone | ||||
updating to branch default | ||||
abort: potentially unsafe url: 'ssh://-oProxyCommand=rm${IFS}non-existent/path' (in subrepository "s") | ||||
[255] | ||||
also check that a percent encoded '-' (%2D) doesn't work | ||||
$ cd malicious-proxycommand | ||||
$ echo 's = [git]ssh://%2DoProxyCommand=rm${IFS}non-existent/path' > .hgsub | ||||
$ hg ci -m 'change url to percent encoded' | ||||
$ cd .. | ||||
$ rm -r malicious-proxycommand-clone | ||||
$ hg clone malicious-proxycommand malicious-proxycommand-clone | ||||
updating to branch default | ||||
abort: potentially unsafe url: 'ssh://-oProxyCommand=rm${IFS}non-existent/path' (in subrepository "s") | ||||
[255] | ||||