sapling/eden/scm/tests/test-fb-hgext-crdump.t
Jun Wu e5fc952da5 discovery: drop unsound "all remote known" fast path (BC)
Summary:
This used to be correct when both local and remote list all heads.  With
selectivepull, we only ask remote about certain heads, if those heads are
known, that does not mean the common heads are just those, since the server
might have other branches refer to related commits.

Dropping the path allows us to figure out "missing" commits more accurately.
This can be seen from the change in `test-fb-hgext-treemanifest-treeonly.t`.

This change also allows us to reproduce a pushrebase problem in the next diff.

This is a breaking change in case the push does not create new commits while
creating a remote bookmark. Previously the exit code might be 1. Now it's 0,
which seems more desirable since it's not "nothing changed".

Reviewed By: DurhamG

Differential Revision: D31877853

fbshipit-source-id: d03c1d0ffec98b46fbc59ff12ab2015f3c10385c
2021-10-26 19:53:42 -07:00

516 lines
15 KiB
Raku

#chg-compatible
$ configure mutation-norecord dummyssh
$ enable amend crdump remotenames
$ showgraph() {
> hg log --graph --hidden -T "{desc|firstline}" | sed \$d
> }
Create repo
$ mkdir server
$ hg init server
$ hg clone -q ssh://user@dummy/server repo
$ cd repo
$ echo A > a
$ printf "A\0\n" > bin1
$ hg addremove
adding a
adding bin1
$ hg commit -m a
$ hg push -q -r . --to releasebranch --create
$ hg debugmakepublic .
$ printf "A\nB\nC\nD\nE\nF\n" > a
$ printf "a\0b\n" > bin1
$ printf "b\0\n" > bin2
$ hg addremove
adding bin2
$ revision="Differential Revision: https://phabricator.facebook.com/D123"
$ hg commit -m "b
> $revision"
$ showgraph
@ b
o a
Test obsolete markers
$ printf "a\0b\0c\n" > bin1
$ hg amend -m "b'
> $revision"
$ showgraph
@ b'
x b
o a
$ hg debugcrdump -U 1 -r . --obsolete --traceback
{
"commits": [
{
"binary_files": [
{
"file_name": "bin1",
"new_file": "69403266b0b9ca9c9403df5097a07d01b74f3e23",
"old_file": "23c26c825bddcb198e701c6f7043a4e35dcb8b97"
},
{
"file_name": "bin2",
"new_file": "31f7b4d23cf93fd41972d0a879086e900cbf06c9",
"old_file": null
}
],
"bookmarks": [],
"branch": "releasebranch",
"commit_cloud": false,
"date": [
0,
0
],
"desc": "b'\nDifferential Revision: https://phabricator.facebook.com/D123",
"files": [
"a",
"bin1",
"bin2"
],
"manifest_node": "26a5003fbb1c1f8a249c3d8276787d33d2d2bb13",
"node": "9e6c8a14e241d3140575d17288d4a91bd8c9a3c8",
"p1": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"patch_file": "9e6c8a14e241d3140575d17288d4a91bd8c9a3c8.patch",
"public_base": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"user": "test"
}
],
"output_directory": "*" (glob)
}
$ echo G >> a
$ echo C > c
$ rm bin2
$ echo x > bin1
$ hg addremove
removing bin2
adding c
$ hg commit -m c
$ hg bookmark bookmark1 -i
Add a master bookmark and verify it becomes the remote branch
- The [1] exit code is because no commits are pushed
$ hg push -q -r releasebranch --to master --create
Test basic dump of two commits
$ hg debugcrdump -U 1 -r ".^^::." --traceback| tee ../json_output
{
"commits": [
{
"binary_files": [
{
"file_name": "bin1",
"new_file": "23c26c825bddcb198e701c6f7043a4e35dcb8b97",
"old_file": null
}
],
"bookmarks": [],
"branch": "master",
"commit_cloud": false,
"date": [
0,
0
],
"desc": "a",
"files": [
"a",
"bin1"
],
"manifest_node": "08008b9e8e41209ef9312333a21a7aff8cce126b",
"node": "65d913976cc18347138f7b9f5186010d39b39b0f",
"p1": {
"node": "0000000000000000000000000000000000000000"
},
"patch_file": "65d913976cc18347138f7b9f5186010d39b39b0f.patch",
"public_base": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"user": "test"
},
{
"binary_files": [
{
"file_name": "bin1",
"new_file": "69403266b0b9ca9c9403df5097a07d01b74f3e23",
"old_file": "23c26c825bddcb198e701c6f7043a4e35dcb8b97"
},
{
"file_name": "bin2",
"new_file": "31f7b4d23cf93fd41972d0a879086e900cbf06c9",
"old_file": null
}
],
"bookmarks": [],
"branch": "master",
"commit_cloud": false,
"date": [
0,
0
],
"desc": "b'\nDifferential Revision: https://phabricator.facebook.com/D123",
"files": [
"a",
"bin1",
"bin2"
],
"manifest_node": "26a5003fbb1c1f8a249c3d8276787d33d2d2bb13",
"node": "9e6c8a14e241d3140575d17288d4a91bd8c9a3c8",
"p1": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"patch_file": "9e6c8a14e241d3140575d17288d4a91bd8c9a3c8.patch",
"public_base": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"user": "test"
},
{
"binary_files": [
{
"file_name": "bin1",
"new_file": "08f31c375398e39fe9c485a2a06a79dfc296580e",
"old_file": "69403266b0b9ca9c9403df5097a07d01b74f3e23"
},
{
"file_name": "bin2",
"new_file": null,
"old_file": "31f7b4d23cf93fd41972d0a879086e900cbf06c9"
}
],
"bookmarks": [
"bookmark1"
],
"branch": "master",
"commit_cloud": false,
"date": [
0,
0
],
"desc": "c",
"files": [
"a",
"bin1",
"bin2",
"c"
],
"manifest_node": "218d3347f4e18d50a39fdafa305daaeff0e120bc",
"node": "e3a67aeeade9ad9e292f1762f8f075a8322042b7",
"p1": {
"differential_revision": "123",
"node": "9e6c8a14e241d3140575d17288d4a91bd8c9a3c8"
},
"patch_file": "e3a67aeeade9ad9e292f1762f8f075a8322042b7.patch",
"public_base": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"user": "test"
}
],
"output_directory": "*" (glob)
}
>>> import codecs
>>> import json
>>> from os import path
>>> with open("../json_output") as f:
... data = json.loads(f.read())
... outdir = data['output_directory']
... for commit in data['commits']:
... print("#### commit %s" % commit['node'])
... print(open(path.join(outdir, commit['patch_file'])).read())
... for binfile in commit['binary_files']:
... print("######## file %s" % binfile['file_name'])
... if binfile['old_file'] is not None:
... print("######## old")
... print(codecs.encode(open(path.join(outdir, binfile['old_file']), "rb").read(), 'hex').decode("utf-8"))
... if binfile['new_file'] is not None:
... print("######## new")
... print(codecs.encode(open(path.join(outdir, binfile['new_file']), "rb").read(), 'hex').decode("utf-8"))
... import shutil
... shutil.rmtree(outdir)
#### commit 65d913976cc18347138f7b9f5186010d39b39b0f
diff --git a/a b/a
new file mode 100644
--- /dev/null
+++ b/a
@@ -0,0 +1,1 @@
+A
diff --git a/bin1 b/bin1
new file mode 100644
Binary file bin1 has changed
######## file bin1
######## new
41000a
#### commit 9e6c8a14e241d3140575d17288d4a91bd8c9a3c8
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,6 @@
A
+B
+C
+D
+E
+F
diff --git a/bin1 b/bin1
Binary file bin1 has changed
diff --git a/bin2 b/bin2
new file mode 100644
Binary file bin2 has changed
######## file bin1
######## old
41000a
######## new
61006200630a
######## file bin2
######## new
62000a
#### commit e3a67aeeade9ad9e292f1762f8f075a8322042b7
diff --git a/a b/a
--- a/a
+++ b/a
@@ -6,1 +6,2 @@
F
+G
diff --git a/bin1 b/bin1
Binary file bin1 has changed
diff --git a/bin2 b/bin2
deleted file mode 100644
Binary file bin2 has changed
diff --git a/c b/c
new file mode 100644
--- /dev/null
+++ b/c
@@ -0,0 +1,1 @@
+C
######## file bin1
######## old
61006200630a
######## new
780a
######## file bin2
######## old
62000a
#if jq
Test crdump not dumping binaries
$ hg debugcrdump -U 1 -r ".^^::." | jq '.commits[].binary_files?'
[
{
"file_name": "bin1",
"new_file": "23c26c825bddcb198e701c6f7043a4e35dcb8b97",
"old_file": null
}
]
[
{
"file_name": "bin1",
"new_file": "69403266b0b9ca9c9403df5097a07d01b74f3e23",
"old_file": "23c26c825bddcb198e701c6f7043a4e35dcb8b97"
},
{
"file_name": "bin2",
"new_file": "31f7b4d23cf93fd41972d0a879086e900cbf06c9",
"old_file": null
}
]
[
{
"file_name": "bin1",
"new_file": "08f31c375398e39fe9c485a2a06a79dfc296580e",
"old_file": "69403266b0b9ca9c9403df5097a07d01b74f3e23"
},
{
"file_name": "bin2",
"new_file": null,
"old_file": "31f7b4d23cf93fd41972d0a879086e900cbf06c9"
}
]
$ hg debugcrdump -U 1 -r ".^^::." --nobinary | jq '.commits[].binary_files?'
null
null
null
#endif
Test non-ASCII characters
$ echo x > X
$ HGENCODING=utf-8 hg commit -Aqm "Méssage în únicode"
$ HGENCODING=utf-8 hg book -r . "unusúal-bøøkmàrk"
$ hg debugcrdump -r .
{
"commits": [
{
"binary_files": [],
"bookmarks": [
"unus\u00faal-b\u00f8\u00f8km\u00e0rk"
],
"branch": "master",
"commit_cloud": false,
"date": [
0,
0
],
"desc": "M\u00e9ssage \u00een \u00fanicode",
"files": [
"X"
],
"manifest_node": "7083bb0a52b5998e73c5a9b05ee66e4991cf53a2",
"node": "4d5bdcf868416c46f75e4a118b69d8022325bcda",
"p1": {
"differential_revision": "",
"node": "e3a67aeeade9ad9e292f1762f8f075a8322042b7"
},
"patch_file": "4d5bdcf868416c46f75e4a118b69d8022325bcda.patch",
"public_base": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"user": "test"
}
],
"output_directory": "*" (glob)
}
$ hg debugcrdump -r . --encoding=utf-8
{
"commits": [
{
"binary_files": [],
"bookmarks": [
"unus\u00faal-b\u00f8\u00f8km\u00e0rk"
],
"branch": "master",
"commit_cloud": false,
"date": [
0,
0
],
"desc": "M\u00e9ssage \u00een \u00fanicode",
"files": [
"X"
],
"manifest_node": "7083bb0a52b5998e73c5a9b05ee66e4991cf53a2",
"node": "4d5bdcf868416c46f75e4a118b69d8022325bcda",
"p1": {
"differential_revision": "",
"node": "e3a67aeeade9ad9e292f1762f8f075a8322042b7"
},
"patch_file": "4d5bdcf868416c46f75e4a118b69d8022325bcda.patch",
"public_base": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"user": "test"
}
],
"output_directory": "*" (glob)
}
$ hg debugcrdump -r . --encoding=iso-8859-1
{
"commits": [
{
"binary_files": [],
"bookmarks": [
"unus\u00faal-b\u00f8\u00f8km\u00e0rk"
],
"branch": "master",
"commit_cloud": false,
"date": [
0,
0
],
"desc": "M\u00e9ssage \u00een \u00fanicode",
"files": [
"X"
],
"manifest_node": "7083bb0a52b5998e73c5a9b05ee66e4991cf53a2",
"node": "4d5bdcf868416c46f75e4a118b69d8022325bcda",
"p1": {
"differential_revision": "",
"node": "e3a67aeeade9ad9e292f1762f8f075a8322042b7"
},
"patch_file": "4d5bdcf868416c46f75e4a118b69d8022325bcda.patch",
"public_base": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"user": "test"
}
],
"output_directory": "*" (glob)
}
$ hg debugcrdump -r . --encoding=ascii
{
"commits": [
{
"binary_files": [],
"bookmarks": [
"unus\u00faal-b\u00f8\u00f8km\u00e0rk"
],
"branch": "master",
"commit_cloud": false,
"date": [
0,
0
],
"desc": "M\u00e9ssage \u00een \u00fanicode",
"files": [
"X"
],
"manifest_node": "7083bb0a52b5998e73c5a9b05ee66e4991cf53a2",
"node": "4d5bdcf868416c46f75e4a118b69d8022325bcda",
"p1": {
"differential_revision": "",
"node": "e3a67aeeade9ad9e292f1762f8f075a8322042b7"
},
"patch_file": "4d5bdcf868416c46f75e4a118b69d8022325bcda.patch",
"public_base": {
"node": "65d913976cc18347138f7b9f5186010d39b39b0f"
},
"user": "test"
}
],
"output_directory": "*" (glob)
}
#if jq
Test use globalrev instead of svnrev
$ echo >> Y
$ hg commit -Aqm "commit with no globalrev"
$ hg debugmakepublic '.'
$ echo >> Z
$ hg commit -Aqm "local commit"
$ hg debugcrdump -r '.' | jq -e '.commits[].public_base.svnrev' > /dev/null
[1]
$ hg -q update '.^'
$ echo >> Y
$ hg commit --config "extensions.commitextras=" \
> -Aqm "commit with globalrev" --extra global_rev="100098765"
$ hg debugmakepublic '.'
$ echo >> Z
$ hg commit -Aqm "local commit"
$ hg debugcrdump -r '.' | jq -e '.commits[].public_base.svnrev' > /dev/null
[1]
$ hg debugcrdump --config "extensions.globalrevs=" -r '.' \
> | jq '.commits[].public_base.svnrev'
"100098765"
#endif