Skip to content

Commit 2533c84

Browse files
ahornbyfacebook-github-bot
authored andcommitted
run .t tests for getdeps sapling cli build (#963)
Summary: Connect up the sapling *.t tests so that github CI has visible cli test status. To get them to run: * some needed fbpython on path. I included a shim for that in the test makefile target. * test-rust-hooks: Command not found message, added a glob * test-identity.t: add a glob for the sapling version * test-eolfilename.t: output order was unstable, added sorts to make stable * helpers-testrepo.sh: fix assumption that system hg would be able to read test repo, check if its Sapling first. * added a manifest for the hexdump utility some of the tests required * excluded a few remaining tests (see comments in Makefile for reason) * fixed getdeps support for generating actions steps for test only dependencies NB the tests run as "hg". The expectations would need to be updated if we were to run as "sl" Pull Request resolved: #963 X-link: facebookincubator/zstrong#1004 Test Plan: enter ubuntu 22.04 toolbox: `toolbox enter ubuntu-toolbox-22.04 ` make sure system packages are installed `./build/fbcode_builder/getdeps.py install-system-deps --recursive sapling` build sapling (and any depedencieds it requires) `./build/fbcode_builder/getdeps.py build --allow-system-packages --src-dir=. sapling` run the tests. 64 concurrent jobs worked well on my 64GB machine and took 2m10s. ``` ./build/fbcode_builder/getdeps.py test --allow-system-packages --src-dir=. sapling --num-jobs=64 ---------------------------------------------------------------------- Skipped 2 tests (missing feature: Mononoke server available): test-fb-ext-remotefilelog-log.t test-fb-ext-remotefilelog-worker.t Skipped 3 tests (missing feature: running tests with fsmonitor): test-fsmonitor-filemerge.t test-fsmonitor-nonutf8-path.t test-rust-hgevents.t Skipped 46 tests (skipped): test-atexit-epipe.t test-casefolding.t test-check-clang-format.t test-check-code.t test-check-fix-code.t test-check-help.t test-checkserverbookmark.t test-chg.t test-debugbacktrace.t test-debugshell-namespace.t test-eden-clone.t test-eden-commands.t test-eden-du.t test-eden-glob.t test-eden-sparse.t test-eden-watchman-edenapi-glob.t test-eden-watchman-noedenapi-glob.t test-fb-ext-fbconduit.t test-fb-ext-scm-prompt-compat.t test-fb-ext-scm-prompt-git.t test-fb-ext-tweakdefaults-grep.t test-fsmonitor-casefolding.t test-fsmonitor-fallback.t test-fsmonitor-metadata.t test-fsmonitor-refreshclock.t test-fsmonitor-status.t test-fsmonitor-warn-fresh.t test-histedit-reorder.t test-matcher-expand-globs.t test-mutation-infinitepush.t test-non-working-symlink.t test-progress-rust-renderer.t test-progressfile.t test-purge-fsmonitor.t test-remotenames-journal.t test-runlog.t test-rust-status-in-transaction.t test-sparse-track-ignored.t test-status-case-insensitive.t test-status-fresh-instance.t test-status-root-ignored-py.t test-status-watchman.t test-symlink-migration.t test-tracing-under-chg.t test-treestate-fresh-instance.t test-treestate-trackignore.t # Ran 729 tests, 51 skipped, 0 failed. passed on try 0 ``` generate github actions CI (using 16 concurrent jobs to speed them up a little) ``` ./build/fbcode_builder/getdeps.py --allow-system-packages generate-github-actions --free-up-disk --os-type=linux --src-dir=. --output-dir=.github/workflows --job-name "Sapling CLI Getdeps " --job-file-prefix=sapling-cli-getdeps_ sapling --project-install-prefix sapling:/ --num-jobs=16 ``` debugged actions locally with: ``` act -r -j build -W .github/workflows/sapling-cli-getdeps_linux.yml ``` Reviewed By: quark-zju Differential Revision: D63958737 Pulled By: ahornby fbshipit-source-id: 75c0d39258c320100d8d02b31390994bc2f3a3ce
1 parent d690be8 commit 2533c84

File tree

12 files changed

+194
-37
lines changed

12 files changed

+194
-37
lines changed

.github/workflows/sapling-cli-getdeps_linux.yml

+10-1
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,14 @@ jobs:
3030
run: sudo python3 build/fbcode_builder/getdeps.py --allow-system-packages install-system-deps --recursive sapling
3131
- name: Install packaging system deps
3232
run: sudo python3 build/fbcode_builder/getdeps.py --allow-system-packages install-system-deps --recursive patchelf
33+
- name: Install locale-gen
34+
run: sudo apt-get install locales
35+
- name: Ensure en_US.UTF-8 locale present
36+
run: sudo locale-gen en_US.UTF-8
3337
- name: Install Rust Stable
3438
uses: dtolnay/rust-toolchain@stable
39+
- name: Fetch hexdump
40+
run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests hexdump
3541
- name: Fetch bz2
3642
run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests bz2
3743
- name: Fetch ninja
@@ -102,6 +108,8 @@ jobs:
102108
run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fb303
103109
- name: Fetch rust-shed
104110
run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests rust-shed
111+
- name: Build hexdump
112+
run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests hexdump
105113
- name: Build bz2
106114
run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests bz2
107115
- name: Build ninja
@@ -181,6 +189,7 @@ jobs:
181189
name: sapling
182190
path: _artifacts
183191
- name: Test sapling
184-
run: python3 build/fbcode_builder/getdeps.py --allow-system-packages test --src-dir=. sapling --project-install-prefix sapling:/
192+
run: python3 build/fbcode_builder/getdeps.py --allow-system-packages test --num-jobs 16 --src-dir=. sapling --project-install-prefix sapling:/
185193
- name: Show disk space at end
194+
if: always()
186195
run: df -h

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ target/
1414

1515
# Getdeps
1616
/eden/mononoke/tests/integration/getdeps_build.log
17+
/build/Testing/Temporary/LastTest.log

build/fbcode_builder/getdeps.py

+22-9
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,12 @@ def write_job_for_platform(self, platform, args): # noqa: C901
963963
self.process_project_dir_arguments(args, loader)
964964
manifest = loader.load_manifest(args.project)
965965
manifest_ctx = loader.ctx_gen.get_context(manifest.name)
966+
run_tests = (
967+
args.enable_tests
968+
and manifest.get("github.actions", "run_tests", ctx=manifest_ctx) != "off"
969+
)
970+
if run_tests:
971+
manifest_ctx.set("test", "on")
966972
run_on = self.get_run_on(args)
967973

968974
# Some projects don't do anything "useful" as a leaf project, only
@@ -1075,10 +1081,7 @@ def write_job_for_platform(self, platform, args): # noqa: C901
10751081
free_up_disk = ""
10761082

10771083
allow_sys_arg = ""
1078-
if (
1079-
build_opts.allow_system_packages
1080-
and build_opts.host_type.get_package_manager()
1081-
):
1084+
if run_tests:
10821085
sudo_arg = "sudo "
10831086
allow_sys_arg = " --allow-system-packages"
10841087
if build_opts.host_type.get_package_manager() == "deb":
@@ -1097,6 +1100,19 @@ def write_job_for_platform(self, platform, args): # noqa: C901
10971100
out.write(
10981101
f" run: {sudo_arg}python3 build/fbcode_builder/getdeps.py --allow-system-packages install-system-deps --recursive patchelf\n"
10991102
)
1103+
required_locales = manifest.get(
1104+
"github.actions", "required_locales", ctx=manifest_ctx
1105+
)
1106+
if (
1107+
build_opts.host_type.get_package_manager() == "deb"
1108+
and required_locales
1109+
):
1110+
# ubuntu doesn't include this by default
1111+
out.write(" - name: Install locale-gen\n")
1112+
out.write(f" run: {sudo_arg}apt-get install locales\n")
1113+
for loc in required_locales.split():
1114+
out.write(f" - name: Ensure {loc} locale present\n")
1115+
out.write(f" run: {sudo_arg}locale-gen {loc}\n")
11001116

11011117
projects = loader.manifests_in_dependency_order()
11021118

@@ -1188,11 +1204,7 @@ def write_job_for_platform(self, platform, args): # noqa: C901
11881204
out.write(" name: %s\n" % manifest.name)
11891205
out.write(" path: _artifacts\n")
11901206

1191-
if (
1192-
args.enable_tests
1193-
and manifest.get("github.actions", "run_tests", ctx=manifest_ctx)
1194-
!= "off"
1195-
):
1207+
if run_tests:
11961208
num_jobs_arg = ""
11971209
if args.num_jobs:
11981210
num_jobs_arg = f"--num-jobs {args.num_jobs} "
@@ -1203,6 +1215,7 @@ def write_job_for_platform(self, platform, args): # noqa: C901
12031215
)
12041216
if build_opts.free_up_disk and not build_opts.is_windows():
12051217
out.write(" - name: Show disk space at end\n")
1218+
out.write(" if: always()\n")
12061219
out.write(" run: df -h\n")
12071220

12081221
def setup_project_cmd_parser(self, parser):

build/fbcode_builder/getdeps/manifest.py

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
"optional_section": True,
8888
"fields": {
8989
"run_tests": OPTIONAL,
90+
"required_locales": OPTIONAL,
9091
},
9192
},
9293
"crate.pathmap": {"optional_section": True},
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[manifest]
2+
name = hexdump
3+
4+
[rpms]
5+
util-linux
6+
7+
[debs]
8+
bsdmainutils
9+
10+
# only used from system packages currently
11+
[build]
12+
builder = nop

build/fbcode_builder/manifests/sapling

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ fbsource_path = fbcode/eden
44
shipit_project = eden
55
shipit_fbcode_builder = true
66

7+
[github.actions]
8+
required_locales = en_US.UTF-8
9+
710
[git]
811
repo_url = https://github.com/facebook/sapling.git
912

@@ -57,6 +60,9 @@ fb303
5760
fbthrift
5861
rust-shed
5962

63+
[dependencies.test=on]
64+
hexdump
65+
6066
[dependencies.not(os=windows)]
6167
python
6268

eden/scm/Makefile

+78-6
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ COMPILERFLAG_tmp_ =
6565
COMPILERFLAG_tmp_${COMPILER} ?= -c $(COMPILER)
6666
COMPILERFLAG=${COMPILERFLAG_tmp_${COMPILER}}
6767

68+
MAKE_PID := $(shell echo $$PPID)
69+
JOBS := $(shell ps T | sed -n 's%.*$(MAKE_PID).*$(MAKE).* \(-j\|--jobs=\) *\([0-9][0-9]*\).*%\2%p')
70+
6871
# Mac Big Sur doesn't find the standard library without this.
6972
export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
7073

@@ -172,17 +175,86 @@ install: build
172175
install-home: build
173176
$(PYTHON) setup.py $(PURE) install --home="$(HOME)" --prefix="" --force
174177

175-
install-getdeps: getdepsbuild
178+
install-getdeps:
176179
PYTHON_SYS_EXECUTABLE=$(shell $(PYTHON3) contrib/pick_python.py $(PYTHON3)) \
177180
GETDEPS_BUILD=1 $(shell $(PYTHON3) contrib/pick_python.py $(PYTHON3)) \
178-
setup.py $(PURE) install --root="$(DESTDIR)/" --prefix="$(PREFIX)" --install-lib="$(PREFIX)/bin" --force
181+
setup.py $(PURE) install --skip-build --prefix="$(PREFIX)" --install-scripts="$(PREFIX)/bin" --install-lib="$(PREFIX)/bin" --force && \
182+
cd "$(PREFIX)/bin" && ln -f "$(SL_BIN_NAME)" "$(HG_BIN_NAME)"
183+
184+
# Exclusions for OSS getdeps cli tests. Newline separated
185+
# test-cats.t: internal crpyto token test
186+
# test-check-execute.t: fails on CI, passes locally on ubuntu-22.04
187+
# test-clone-per-repo-config.t: fails in oss, looks like depends on fb hgrc.dynamic
188+
# test-clone-resume.t: fails on CI, passes locally on ubuntu-22.04
189+
# test-commitcloud-sync.t: flaky Last Sync Version on line 812, flips beteen 17 and 16
190+
# test-config-precedence.t: output mismatch: DEBUG configloader::hg: spawn ["false"] because * (glob)
191+
# test-dynamicconfig-unicode.t: output mismatch: cat: .hg/hgrc.dynamic: $ENOENT$
192+
# test-debugrefreshconfig.t: assumes an internal config location
193+
# test-fb-ext-fastlog.t: timesout, maybe due to internal endpoint assumptions
194+
# test-fb-ext-sampling.t: timeout
195+
# test-fb-ext-smartlog.t: output mismatch
196+
# test-help.t: help is different vs internal build
197+
# test-include-fail.t: fails on CI, passes locally on ubuntu-22.04
198+
# test-matcher-lots-of-globs.t: fails on CI, passes locally on ubuntu-22.04 (needs ~40GiB RAM)
199+
# test-network-doctor.t: times out
200+
# test-rust-checkout.t: fails on CI, passes locally on ubuntu-22.04
201+
# test-smartlog-interactive.t: smartlog format is different causing output mismatch
202+
# test-smartlog-interactive-highlighting.t: smartlog format is different causing output mismatch
203+
GETDEPS_TEST_EXCLUSION_LIST := test-cats.t \
204+
test-check-execute.t \
205+
test-clone-per-repo-config.t \
206+
test-clone-resume.t \
207+
test-commitcloud-sync.t \
208+
test-config-precedence.t \
209+
test-dynamicconfig-unicode.t \
210+
test-debugrefreshconfig.t \
211+
test-fb-ext-fastlog.t \
212+
test-fb-ext-sampling.t \
213+
test-fb-ext-smartlog.t \
214+
test-help.t \
215+
test-include-fail.t \
216+
test-matcher-lots-of-globs.t \
217+
test-network-doctor.t \
218+
test-rust-checkout.t \
219+
test-smartlog-interactive.t \
220+
test-smartlog-interactive-highlighting.t
221+
222+
# convert to a sed expression
223+
GETDEPS_TEST_EXCLUSIONS := $(subst $() $(),|,$(GETDEPS_TEST_EXCLUSION_LIST))
179224

180225
.PHONY: test-getdeps
181226
test-getdeps:
182-
# Run indicative tests to check the binary is minimally good as will be used later in Mononoke getdeps tests
183-
# Running all the tests requires a bit of filtering to run the good set (or deleting flaky ones)
184-
cd tests && PYTHON_SYS_EXECUTABLE=$(shell $(PYTHON3) contrib/pick_python.py $(PYTHON3)) \
185-
$(shell $(PYTHON3) contrib/pick_python.py $(PYTHON3)) run-tests.py -j2 --getdeps-build --with-hg="$(PREFIX)/bin/$(HGNAME)" test-status.t test-commit.t
227+
# Remove the .testfailed and .testerrored files so that after this next
228+
# step they are written clean
229+
rm -f ./tests/.test*
230+
# ensure that fbpython is present, as some tests depend on it being on PATH
231+
if ! which fbpython >/dev/null 2>&1; then \
232+
FBPYTHON="$(GETDEPS_INSTALL_DIR)/sapling/bin/fbpython"; \
233+
PYTHON_SYS_EXECUTABLE=$(shell $(PYTHON3) contrib/pick_python.py $(PYTHON3)); \
234+
printf "#!/bin/sh\nexec \"$$PYTHON_SYS_EXECUTABLE\" \"\$$@\"\n" > $$FBPYTHON; \
235+
chmod +x "$$FBPYTHON"; \
236+
fi;
237+
# Run tests and retry any failures
238+
export GETDEPS_BUILD=1; \
239+
export HGTEST_HG=$(GETDEPS_INSTALL_DIR)/sapling/bin/$(HG_BIN_NAME); \
240+
cd tests && export PYTHON_SYS_EXECUTABLE=$(shell $(PYTHON3) contrib/pick_python.py $(PYTHON3)); \
241+
for try in $$(seq 0 $(GETDEPS_TEST_RETRY)); do \
242+
RERUN_ARG=""; \
243+
GETDEPS_TEST_FILTER=$(GETDEPS_TEST_FILTER); \
244+
if [ $$try -gt 0 ]; then \
245+
GETDEPS_TEST_FILTER=$$(cat .testfailed .testerrored | sort -u | grep -v '^$$'); \
246+
if [ -z "$$GETDEPS_TEST_FILTER" ]; then "Echo no tests found for rerun on try $$try"; exit 2; fi; \
247+
echo "Rerunning: $$GETDEPS_TEST_FILTER on try $$try" 1>&2; \
248+
rm -f .testfailed .testerrored; \
249+
elif [ -z "$$GETDEPS_TEST_FILTER" ]; then \
250+
GETDEPS_TEST_FILTER=$$(echo *.t | sed -Ee 's/($(GETDEPS_TEST_EXCLUSIONS))//g'); \
251+
fi; \
252+
$$PYTHON_SYS_EXECUTABLE run-tests.py -j $(JOBS) --getdeps-build --with-hg="$(PREFIX)/bin/$(HGNAME)" $$GETDEPS_TEST_FILTER; \
253+
status=$$?; \
254+
# stop if all good \
255+
if [ $$status = 0 ]; then echo "passed on try $$try"; exit 0; fi; \
256+
done; \
257+
exit $$status
186258

187259
check: tests
188260

eden/scm/README.md

+29-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Sapling is a fast, easy to use, distributed revision control tool for software
44
developers.
55

66

7-
Basic install:
7+
# Basic install
88

99
```
1010
$ make install-oss
@@ -20,6 +20,33 @@ $ make oss # build for inplace usage
2020
$ ./sl --version # should show the latest version
2121
```
2222

23-
2423
See <https://sapling-scm.com/> for detailed installation instructions,
2524
platform-specific notes, and Sapling user information.
25+
26+
# Thrift enabled getdeps CLI build for use with Mononoke or EdenFS
27+
28+
Mononoke and EdenFS need the thrift enabled sapling CLI built via getdeps. Check github actions to see current OS version the Sapling CLI Getdeps CI runs with.
29+
30+
This build also provides a way to run the sapling .t tests in github CI and locally.
31+
32+
When building locally you don't need to separately build all the dependencies like the github CI does, command line steps are:
33+
34+
make sure required system packages are installed:
35+
`./build/fbcode_builder/getdeps.py install-system-deps --recursive sapling`
36+
37+
build sapling (and any dependencies it requires):
38+
`./build/fbcode_builder/getdeps.py build --allow-system-packages --src-dir=. sapling`
39+
40+
you can find the built binaries via:
41+
`./build/fbcode_builder/getdeps.py show-inst-dir --allow-system-packages --src-dir=. sapling`
42+
43+
run the tests (you can use --num-jobs=N to adjust concurrency):
44+
`./build/fbcode_builder/getdeps.py test --allow-system-packages --src-dir=. --num-jobs=64 sapling`
45+
46+
to iterate on one test run with --retry 0 --filter:
47+
`./build/fbcode_builder/getdeps.py test --allow-system-packages --src-dir=. sapling --retry 0 --filter test-check-execute.t`
48+
49+
to run multiple tests with --filter separate with spaces:
50+
`./build/fbcode_builder/getdeps.py test --allow-system-packages --src-dir=. sapling --retry 0 --filter "test-include-fail.t test-matcher-lots-of-globs.t"`
51+
52+
The getdeps build doesn't currently build/test ISL or other node integration.

eden/scm/tests/helpers-testrepo.sh

+23-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# Copyright (c) Meta Platforms, Inc. and affiliates.
2+
#
3+
# This software may be used and distributed according to the terms of the
4+
# GNU General Public License version 2.
5+
16
# In most cases, the mercurial repository can be read by the bundled hg, but
27
# that isn't always true because third-party extensions may change the store
38
# format, for example. In which case, the system hg installation is used.
@@ -13,6 +18,7 @@
1318
# Revert the environment so that running "hg" runs the system hg
1419
# rather than the test hg installation.
1520
syshgenv () {
21+
# shellcheck disable=SC1090
1622
. "$HGTEST_RESTOREENV"
1723
HGPLAIN=1
1824
export HGPLAIN
@@ -36,11 +42,23 @@ cat >> "$HGRCPATH" << EOF
3642
evolution = createmarkers
3743
EOF
3844

39-
# Unconditionally use the system hg to avoid auto migration logic from
40-
# the in-repo hg.
41-
testrepohgenv () {
42-
syshgenv
43-
}
45+
46+
SYSTEM_HG_VER=$(syshgenv; hg --version -q 2>/dev/null)
47+
case "$SYSTEM_HG_VER" in
48+
Sapling*)
49+
# Use the system hg environment if it has a has a chance
50+
# of reading a sapling repo
51+
testrepohgenv () {
52+
syshgenv
53+
}
54+
;;
55+
*)
56+
testrepohgenv () {
57+
# no suitable system hg, stick current.
58+
:
59+
}
60+
;;
61+
esac
4462

4563
testrepohg () {
4664
(

eden/scm/tests/test-eolfilename.t

+10-12
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,27 @@ Do error out if the naughty file is explicitly referenced:
3737
nothing changed
3838
[1]
3939
$ echo foo > "$A"
40-
$ hg debugwalk
40+
$ hg debugwalk 2>&1 | sort
4141
skipping invalid path 'he\rllo'
4242
skipping invalid path 'hell\no'
4343

4444
$ echo bla > quickfox
45-
$ hg add quickfox
45+
$ hg add quickfox 2>&1 | sort
4646
skipping invalid path 'he\rllo'
4747
skipping invalid path 'hell\no'
48-
$ hg ci -m 2
48+
$ hg ci -m 2 2>&1 | sort
4949
skipping invalid path 'he\rllo'
5050
skipping invalid path 'hell\no'
5151
$ A=`printf 'quick\rfox'`
52-
$ hg cp quickfox "$A"
52+
$ (hg cp quickfox "$A" 2>&1; echo "[$?]" 1>&2) | sort
53+
abort: '\n' and '\r' disallowed in filenames: 'quick\rfox'
5354
skipping invalid path 'he\rllo'
5455
skipping invalid path 'hell\no'
55-
abort: '\n' and '\r' disallowed in filenames: 'quick\rfox'
5656
[255]
57-
$ hg mv quickfox "$A"
57+
$ (hg mv quickfox "$A" 2>&1; echo "[$?]" 1>&2) | sort
58+
abort: '\n' and '\r' disallowed in filenames: 'quick\rfox'
5859
skipping invalid path 'he\rllo'
5960
skipping invalid path 'hell\no'
60-
abort: '\n' and '\r' disallowed in filenames: 'quick\rfox'
6161
[255]
6262

6363
https://bz.mercurial-scm.org/2036
@@ -78,10 +78,8 @@ test issue2039
7878
$ touch "$A"
7979
$ touch "$B"
8080

81-
$ hg status --color=always
82-
skipping invalid filename: 'foo
83-
bar.baz'
84-
skipping invalid filename: 'foo
85-
bar'
81+
$ hg status --color=always 2>&1 | sed -e 's/foo\n/foo<NEWLINE>/'| sort
82+
skipping invalid filename: 'foo<NEWLINE>bar'
83+
skipping invalid filename: 'foo<NEWLINE>bar.baz'
8684

8785
$ cd ..

eden/scm/tests/test-identity.t

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ Test we prefer ".sl" over ".hg"
9797

9898
Can choose flavor of dot dir using REPO_IDENTITY override:
9999
$ SL_IDENTITY=sl SL_REPO_IDENTITY=hg hg version -q
100-
Sapling 4.4.2_dev
100+
Sapling 4.* (glob)
101101
$ SL_IDENTITY=sl SL_REPO_IDENTITY=hg newrepo
102102
$ ls .hg/requires
103103
.hg/requires

0 commit comments

Comments
 (0)