sapling/eden/scm/tests/test-clone.t
Jun Wu dcb7775096 changelog: remove Python zstore support
Summary:
The zstore for commit messages are now handled by Rust entirely. There is no
need to keep the Python zstore around, except for migration and doctor
use-cases.

Reviewed By: andll

Differential Revision: D27897893

fbshipit-source-id: 21b10596af28c45425f6f102fd13f0421d1e8373
2021-04-21 19:30:15 -07:00

792 lines
18 KiB
Perl

#chg-compatible
$ disable treemanifest
$ configure dummyssh
Prepare repo a:
$ hg init a
$ cd a
$ echo a > a
$ hg add a
$ hg commit -m test
$ echo first line > b
$ hg add b
Create a non-inlined filelog:
$ hg debugsh -c 'open("data1", "wb").write("".join("%s\n" % x for x in range(10000)).encode("utf-8"))'
$ for j in 0 1 2 3 4 5 6 7 8 9; do
> cat data1 >> b
> hg commit -m test
> done
List files in store/data (should show a 'b.d'):
$ for i in .hg/store/data/*; do
> echo $i
> done
.hg/store/data/a.i
.hg/store/data/b.i
Default operation:
$ hg clone . ../b
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd ../b
$ cat a
a
$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
2 files, 11 changesets, 11 total revisions
Invalid dest '' must abort:
$ hg clone . ''
abort: empty destination path is not valid
[255]
No update, with debug option:
#if hardlink
$ hg --debug clone -U . ../c --config progress.debug=true
progress: linking: 1
progress: linking: 2
progress: linking: 3
progress: linking: 4
progress: linking: 5
progress: linking: 6
progress: linking: 7
progress: linking: 8
progress: linking: 9
progress: linking: 10
progress: linking: 11
progress: linking: 12
progress: linking: 13
progress: linking: 14
progress: linking: 15
progress: linking: 16
progress: linking: 17
progress: linking: 18
progress: linking: 19
progress: linking: 20
progress: linking: 21
progress: linking (end)
copied 21 files
#else
$ hg --debug clone -U . ../c --config progress.debug=true
linking: 1
copying: 2
copying: 3
copying: 4
copying: 5
copying: 6
copying: 7
copying: 8
copied 8 files
#endif
$ cd ../c
$ cat a 2>/dev/null || echo "a not present"
a not present
$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
2 files, 11 changesets, 11 total revisions
Default destination:
$ mkdir ../d
$ cd ../d
$ hg clone ../a
destination directory: a
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd a
$ hg cat a
a
$ cd ../..
Check that we drop the 'file:' from the path before writing the .hgrc:
$ hg clone file:a e
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ grep 'file:' e/.hg/hgrc
[1]
Check that path aliases are expanded:
$ hg clone -q -U --config 'paths.foobar=a#0' foobar f
$ hg -R f showconfig paths.default
$TESTTMP/a#0
Use --pull:
$ hg clone --pull a g
requesting all changes
adding changesets
adding manifests
adding file changes
added 11 changesets with 11 changes to 2 files
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg -R g verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
2 files, 11 changesets, 11 total revisions
Invalid dest '' with --pull must abort (issue2528):
$ hg clone --pull a ''
abort: empty destination path is not valid
[255]
Clone to '.':
$ mkdir h
$ cd h
$ hg clone ../a .
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd ..
*** Tests for option -u ***
Adding some more history to repo a:
$ cd a
$ echo the quick brown fox >a
$ hg ci -m "hacked default"
$ hg up '.^'
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg bookmark stable
$ echo some text >a
$ hg ci -m "starting branch stable"
$ echo some more text >a
$ hg ci -m "another change for branch stable"
$ hg up '.^'
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(leaving bookmark stable)
$ hg parents
commit: 7bc8ee83a26f
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: starting branch stable
Repo a has two heads:
$ hg heads
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
commit: 3aa88e8a4d5f
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: hacked default
$ cd ..
Testing --noupdate with --updaterev (must abort):
$ hg clone --noupdate --updaterev 1 a ua
abort: cannot specify both --noupdate and --updaterev
[255]
Testing clone -u:
$ hg clone -u . a ua
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Repo ua has both heads:
$ hg -R ua heads
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
commit: 3aa88e8a4d5f
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: hacked default
Same revision checked out in repo a and ua:
$ hg -R a parents --template "{node|short}\n"
7bc8ee83a26f
$ hg -R ua parents --template "{node|short}\n"
7bc8ee83a26f
$ rm -r ua
Testing clone --pull -u:
$ hg clone --pull -u . a ua
requesting all changes
adding changesets
adding manifests
adding file changes
added 14 changesets with 14 changes to 2 files
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Repo ua has both heads:
$ hg -R ua heads
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
commit: 3aa88e8a4d5f
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: hacked default
Same revision checked out in repo a and ua:
$ hg -R a parents --template "{node|short}\n"
7bc8ee83a26f
$ hg -R ua parents --template "{node|short}\n"
7bc8ee83a26f
$ rm -r ua
Testing clone -u <branch>:
$ hg clone -u stable a ua
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Repo ua has both heads:
$ hg -R ua heads
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
commit: 3aa88e8a4d5f
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: hacked default
Branch 'stable' is checked out:
$ hg -R ua parents
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
$ rm -r ua
Testing default checkout:
$ hg clone a ua
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Repo ua has both heads:
$ hg -R ua heads
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
commit: 3aa88e8a4d5f
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: hacked default
$ rm -r ua
Testing #<bookmark> (no longer works):
$ hg clone -u . a#stable ua
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Repo ua has branch 'stable' and 'default' (was changed in fd511e9eeea6):
$ hg -R ua heads
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
commit: 3aa88e8a4d5f
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: hacked default
Same revision checked out in repo a and ua:
$ hg -R a parents --template "{node|short}\n"
7bc8ee83a26f
$ hg -R ua parents --template "{node|short}\n"
7bc8ee83a26f
$ rm -r ua
Testing -u -r <branch>:
$ hg clone -u . -r stable a ua
adding changesets
adding manifests
adding file changes
added 13 changesets with 13 changes to 2 files
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Repo ua has branch 'stable' and 'default' (was changed in fd511e9eeea6):
$ hg -R ua heads
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
Same revision checked out in repo a and ua:
$ hg -R a parents --template "{node|short}\n"
7bc8ee83a26f
$ hg -R ua parents --template "{node|short}\n"
7bc8ee83a26f
$ rm -r ua
Testing -r <branch>:
$ hg clone -r stable a ua
adding changesets
adding manifests
adding file changes
added 13 changesets with 13 changes to 2 files
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Repo ua has branch 'stable' and 'default' (was changed in fd511e9eeea6):
$ hg -R ua heads
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
Branch 'stable' is checked out:
$ hg -R ua parents
commit: 4f44d5743f52
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another change for branch stable
$ rm -r ua
Test clone with special '@' bookmark:
$ cd a
$ hg bookmark -r a7949464abda @ # branch point of stable from default
$ hg clone . ../i
updating to bookmark @
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg id -i ../i
a7949464abda
$ rm -r ../i
$ hg bookmark -f -r stable @
$ hg bookmarks
@ 4f44d5743f52
stable 4f44d5743f52
$ hg clone . ../i
updating to bookmark @
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg id -i ../i
4f44d5743f52
$ cd "$TESTTMP"
Testing failures:
$ mkdir fail
$ cd fail
No local source
$ hg clone a b
abort: repository a not found!
[255]
No remote source
#if windows
$ hg clone http://$LOCALIP:3121/a b
abort: error: * (glob)
[255]
#else
$ hg clone http://$LOCALIP:3121/a b
abort: error: *refused* (glob)
[255]
#endif
$ rm -rf b # work around bug with http clone
#if unix-permissions no-root
Inaccessible source
$ mkdir a
$ chmod 000 a
$ hg clone a b
abort: repository a not found!
[255]
Inaccessible destination
$ hg init b
$ cd b
$ hg clone . ../a
abort: Permission denied: ../a
(current process runs with uid 42) (?)
(../a: mode 0o52, uid 42, gid 42) (?)
(..: mode 0o52, uid 42, gid 42) (?)
[255]
$ cd ..
$ chmod 700 a
$ rm -r a b
#endif
#if fifo
Source of wrong type
$ mkfifo a
$ hg clone a b
abort: repository a not found!
[255]
$ rm a
#endif
Default destination, same directory
$ hg init q
$ hg clone q
destination directory: q
abort: destination 'q' is not empty
[255]
destination directory not empty
$ mkdir a
$ echo stuff > a/a
$ hg clone q a
abort: destination 'a' is not empty
[255]
#if unix-permissions no-root
leave existing directory in place after clone failure
$ hg init c
$ cd c
$ echo c > c
$ hg commit -A -m test
adding c
$ chmod -rx .hg/store/data
$ cd ..
$ mkdir d
$ hg clone c d 2> err
[255]
$ test -d d
$ test -d d/.hg
[1]
re-enable perm to allow deletion
$ chmod +rx c/.hg/store/data
#endif
$ cd ..
Test clone from the repository in (emulated) revlog format 0 (issue4203):
$ mkdir issue4203
$ mkdir -p src/.hg
$ echo foo > src/foo
$ hg -R src add src/foo
abort: legacy dirstate implementations are no longer supported!
[255]
$ hg -R src commit -m '#0'
abort: legacy dirstate implementations are no longer supported!
[255]
$ hg -R src log -q
abort: legacy dirstate implementations are no longer supported!
[255]
$ hg clone -U -q src dst
abort: legacy dirstate implementations are no longer supported!
[255]
$ hg -R dst log -q
abort: repository dst not found!
[255]
Create repositories to test auto sharing functionality
$ cat >> $HGRCPATH << EOF
> [extensions]
> share=
> EOF
$ hg init empty
$ hg init source1a
$ cd source1a
$ echo initial1 > foo
$ hg -q commit -A -m initial
$ echo second > foo
$ hg commit -m second
$ cd ..
$ hg init filteredrev0
$ cd filteredrev0
$ cat >> .hg/hgrc << EOF
> [experimental]
> evolution.createmarkers=True
> EOF
$ echo initial1 > foo
$ hg -q commit -A -m initial0
$ hg -q up -r null
$ echo initial2 > foo
$ hg -q commit -A -m initial1
$ hg debugobsolete c05d5c47a5cf81401869999f3d05f7d699d2b29a e082c1832e09a7d1e78b7fd49a592d372de854c8
$ cd ..
$ hg -q clone --pull source1a source1b
$ cd source1a
$ hg bookmark bookA
$ echo 1a > foo
$ hg commit -m 1a
$ cd ../source1b
$ hg -q up -r 'desc(initial)'
$ echo head1 > foo
$ hg commit -m head1
$ hg bookmark head1
$ hg -q up -r 'desc(initial)'
$ echo head2 > foo
$ hg commit -m head2
$ hg bookmark head2
$ hg -q up -r 'desc(initial)'
$ hg bookmark branch1
$ echo branch1 > foo
$ hg commit -m branch1
$ hg -q up -r 'desc(initial)'
$ hg bookmark branch2
$ echo branch2 > foo
$ hg commit -m branch2
$ cd ..
$ hg init source2
$ cd source2
$ echo initial2 > foo
$ hg -q commit -A -m initial2
$ echo second > foo
$ hg commit -m second
$ cd ..
SEC: check for unsafe ssh url
$ cat >> $HGRCPATH << EOF
> [ui]
> ssh = sh -c "read l; read l; read l"
> EOF
$ hg clone 'ssh://-oProxyCommand=touch${IFS}owned/path'
destination directory: path
abort: potentially unsafe url: 'ssh://-oProxyCommand=touch${IFS}owned/path'
[255]
$ hg clone 'ssh://%2DoProxyCommand=touch${IFS}owned/path'
destination directory: path
abort: potentially unsafe url: 'ssh://-oProxyCommand=touch${IFS}owned/path'
[255]
$ hg clone 'ssh://fakehost|touch%20owned/path'
destination directory: path
abort: no suitable response from remote hg!
[255]
$ hg clone 'ssh://fakehost%7Ctouch%20owned/path'
destination directory: path
abort: no suitable response from remote hg!
[255]
$ hg clone 'ssh://-oProxyCommand=touch owned%20foo@example.com/nonexistent/path'
destination directory: path
abort: potentially unsafe url: 'ssh://-oProxyCommand=touch owned foo@example.com/nonexistent/path'
[255]
#if windows
$ hg clone "ssh://%26touch%20owned%20/path" --debug
destination directory: path
running sh -c "read l; read l; read l" "&touch owned " "hg -R path serve --stdio"
sending hello command
sending between command
abort: no suitable response from remote hg!
[255]
$ hg clone "ssh://example.com:%26touch%20owned%20/path" --debug
destination directory: path
running sh -c "read l; read l; read l" -p "&touch owned " example.com "hg -R path serve --stdio"
sending hello command
sending between command
abort: no suitable response from remote hg!
[255]
#else
$ hg clone "ssh://%3btouch%20owned%20/path" --debug
destination directory: path
running sh -c "read l; read l; read l" ';touch owned ' 'hg -R path serve --stdio'
sending hello command
sending between command
abort: no suitable response from remote hg!
[255]
$ hg clone "ssh://example.com:%3btouch%20owned%20/path" --debug
destination directory: path
running sh -c "read l; read l; read l" -p ';touch owned ' example.com 'hg -R path serve --stdio'
sending hello command
sending between command
abort: no suitable response from remote hg!
[255]
#endif
$ hg clone "ssh://v-alid.example.com/path" --debug
destination directory: path
running sh -c "read l; read l; read l" v-alid\.example\.com ['"]hg -R path serve --stdio['"] (re)
sending hello command
sending between command
abort: no suitable response from remote hg!
[255]
We should not have created a file named owned - if it exists, the
attack succeeded.
$ if test -f owned; then echo 'you got owned'; fi
Cloning without fsmonitor enabled does not print a warning for small repos
$ hg clone a fsmonitor-default
updating to bookmark @
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Lower the warning threshold to simulate a large repo
$ cat >> $HGRCPATH << EOF
> [fsmonitor]
> warn_update_file_count = 2
> EOF
We should see a warning about no fsmonitor on supported platforms
#if linuxormacos no-fsmonitor
$ hg clone a nofsmonitor
updating to bookmark @
(warning: large working directory being used without fsmonitor enabled; enable fsmonitor to improve performance; see "hg help -e fsmonitor")
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
#else
$ hg clone a nofsmonitor
updating to bookmark @
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
#endif
We should not see warning about fsmonitor when it is enabled
#if fsmonitor
$ hg clone a fsmonitor-enabled
updating to bookmark @
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
#endif
We can disable the fsmonitor warning
$ hg --config fsmonitor.warn_when_unused=false clone a fsmonitor-disable-warning
updating to bookmark @
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Loaded fsmonitor but disabled in config should still print warning
#if linuxormacos fsmonitor
$ hg --config fsmonitor.mode=off clone a fsmonitor-mode-off
updating to bookmark @
(warning: large working directory being used without fsmonitor enabled; enable fsmonitor to improve performance; see "hg help -e fsmonitor") (fsmonitor !)
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
#endif
Warning not printed if working directory isn't empty
$ hg -q clone a fsmonitor-update
(warning: large working directory being used without fsmonitor enabled; enable fsmonitor to improve performance; see "hg help -e fsmonitor") (?)
$ cd fsmonitor-update
$ hg up acb14030fe0a
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
(leaving bookmark @)
$ hg up cf0fe1914066
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
`hg update` from null revision also prints
$ hg up null
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
#if linuxormacos no-fsmonitor
$ hg up cf0fe1914066
(warning: large working directory being used without fsmonitor enabled; enable fsmonitor to improve performance; see "hg help -e fsmonitor")
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
#else
$ hg up cf0fe1914066
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
#endif
$ cd ..