sapling/eden/hg-server/tests/test-clone.t
Durham Goode 98d9269874 server: copy hg to a new hg-server directory
Summary:
Create a fork of the Mercurial code that we can use to build server
rpms. The hg servers will continue to exist for a few more months while we move
the darkstorm and ediscovery use cases off them. In the mean time, we want to
start making breaking changes to the client, so let's create a stable copy of
the hg code to produce rpms for the hg servers.

The fork is based off c7770c78d, the latest hg release.

This copies the files as is, then adds some minor tweaks to get it to build:
- Disables some lint checks that appear to be bypassed by path
- sed replace eden/scm with eden/hg-server
- Removed a dependency on scm/telemetry from the edenfs-client tests since
  scm/telemetry pulls in the original eden/scm/lib/configparser which conflicts
  with the hg-server conflict parser.

allow-large-files

Reviewed By: quark-zju

Differential Revision: D27632557

fbshipit-source-id: b2f442f4ec000ea08e4d62de068750832198e1f4
2021-04-09 10:09:06 -07:00

793 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
(XXX: zstore migration is done twice)
$ 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 ..