sapling/eden/scm/tests/test-hgext-stablerev.t
Marc Fisher 9bdd73be2c Add stables template keyword to hg.
Summary:
Adding support for the stables template keyword in stablerev extension.

This keyword calls out to a script specified in the config stablerev.stables_cmd to get a list of stable aliases for a given revision.

Reviewed By: quark-zju

Differential Revision: D28204529

fbshipit-source-id: 3c5b21846ce6f686afddd00d3326a54b85be87dd
2021-05-06 23:52:32 -07:00

165 lines
3.8 KiB
Perl

#chg-compatible
$ newrepo
$ enable stablerev
$ hg debugdrawdag <<'EOS'
> D
> |
> C
> |
> B
> |
> A
> EOS
$ setconfig alias.log="log -T '[{node|short}]: {desc}\n'"
# Basics
If the script doesn't return anything, an abort is raised:
$ printf "#!/bin/bash\n" > stable.sh
$ chmod +x stable.sh
$ setconfig stablerev.script=./stable.sh
$ hg log -r "getstablerev()"
abort: stable rev returned by script (./stable.sh) was empty
[255]
Make the script return something:
$ printf "#!/bin/bash\n\necho 'B'" > stable.sh
$ hg log -r "getstablerev()"
[112478962961]: B
Change the script, change the result:
$ printf "#!/bin/bash\n\necho 'C'" > stable.sh
$ hg log -r "getstablerev()"
[26805aba1e60]: C
The script is always run relative to repo root:
$ mkdir subdir
$ cd subdir
$ hg log -r "getstablerev()"
[26805aba1e60]: C
$ cd ..
JSON is also supported:
$ printf "#!/bin/bash\n\necho '{\"node\": \"D\"}'" > stable.sh
$ hg log -r "getstablerev()"
[f585351a92f8]: D
Invalid JSON aborts:
$ printf "#!/bin/bash\n\necho '{node\": \"D\"}'" > stable.sh
$ hg log -r "getstablerev()"
abort: stable rev returned by script (./stable.sh) was invalid
[255]
An alias can be used for simplicity:
$ printf "#!/bin/bash\n\necho 'A'" > stable.sh
$ setconfig revsetalias.stable="getstablerev()"
$ hg log -r stable
[426bada5c675]: A
Check that stables template keyword works:
$ cat <<'EOF' > stables.sh
> #!/bin/bash
> cat << FOE
> {
> "$1": ["stable1", "stable2"]
> }
> FOE
> EOF
$ chmod +x stables.sh
$ setconfig "stablerev.stablesscript=./stables.sh {nodeid}"
$ hg log -r "D" --template "{stables}\n"
stable1 stable2
# Auto-pull
Make another repo with "E" (9bc730a19041):
$ cd ..
$ newrepo
$ drawdag <<'EOS'
> E
> |
> D
> |
> C
> |
> B
> |
> A
> EOS
$ cd ../repo1
What if the stable commit isn't present locally?
$ printf "#!/bin/bash\n\necho '9bc730a19041'" > stable.sh
$ hg log -r stable
abort: stable commit (9bc730a19041) not in the repo
(try hg pull first)
[255]
The revset can be configured to automatically pull in this case:
$ setconfig paths.default=../repo2
$ setconfig stablerev.pullonmissing=True
$ hg log -r stable
stable commit (9bc730a19041) not in repo; pulling to get it...
pulling from $TESTTMP/repo2
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
[9bc730a19041]: E
But it might not exist even after pulling:
$ printf "#!/bin/bash\n\necho 'abcdef123'" > stable.sh
$ hg log -r stable
stable commit (abcdef123) not in repo; pulling to get it...
pulling from $TESTTMP/repo2
searching for changes
no changes found
abort: stable commit (abcdef123) not in the repo
(try hg pull first)
[255]
# Targets
Targets are disabled by default:
$ hg log -r "getstablerev(foo)"
abort: targets are not supported in this repo
[255]
But they can be made optional or required:
$ setconfig stablerev.targetarg=optional
$ hg log -r "getstablerev(foo)"
stable commit (abcdef123) not in repo; pulling to get it...
pulling from $TESTTMP/repo2
searching for changes
no changes found
abort: stable commit (abcdef123) not in the repo
(try hg pull first)
[255]
$ setconfig stablerev.targetarg=required
$ hg log -r "getstablerev()"
abort: must pass a target
[255]
Try making the script return different locations, based on the target:
$ cat <<'EOF' > stable.sh
> #!/bin/bash
> if [ "$TARGET" = "foo" ]; then
> echo 'D'
> else
> echo 'C'
> fi
> EOF
$ hg log -r "getstablerev(foo)"
[f585351a92f8]: D
$ hg log -r "getstablerev(bar)"
[26805aba1e60]: C
Lastly, targets can be used in conjunction with aliases:
$ setconfig revsetalias.stable="getstablerev(foo)"
$ hg log -r stable
[f585351a92f8]: D