##// END OF EJS Templates
discovery-helper: use reflink copy if available...
marmoute -
r42094:cae3f7e3 default
parent child Browse files
Show More
@@ -1,105 +1,107 b''
1 #!/bin/bash
1 #!/bin/bash
2 #
2 #
3 # produces two repositories with different common and missing subsets
3 # produces two repositories with different common and missing subsets
4 #
4 #
5 # $ discovery-helper.sh REPO NBHEADS DEPT
5 # $ discovery-helper.sh REPO NBHEADS DEPT
6 #
6 #
7 # The Goal is to produce two repositories with some common part and some
7 # The Goal is to produce two repositories with some common part and some
8 # exclusive part on each side. Provide a source repository REPO, it will
8 # exclusive part on each side. Provide a source repository REPO, it will
9 # produce two repositories REPO-left and REPO-right.
9 # produce two repositories REPO-left and REPO-right.
10 #
10 #
11 # Each repository will be missing some revisions exclusive to NBHEADS of the
11 # Each repository will be missing some revisions exclusive to NBHEADS of the
12 # repo topological heads. These heads and revisions exclusive to them (up to
12 # repo topological heads. These heads and revisions exclusive to them (up to
13 # DEPTH depth) are stripped.
13 # DEPTH depth) are stripped.
14 #
14 #
15 # The "left" repository will use the NBHEADS first heads (sorted by
15 # The "left" repository will use the NBHEADS first heads (sorted by
16 # description). The "right" use the last NBHEADS one.
16 # description). The "right" use the last NBHEADS one.
17 #
17 #
18 # To find out how many topological heads a repo has, use:
18 # To find out how many topological heads a repo has, use:
19 #
19 #
20 # $ hg heads -t -T '{rev}\n' | wc -l
20 # $ hg heads -t -T '{rev}\n' | wc -l
21 #
21 #
22 # Example:
22 # Example:
23 #
23 #
24 # The `pypy-2018-09-01` repository has 192 heads. To produce two repositories
24 # The `pypy-2018-09-01` repository has 192 heads. To produce two repositories
25 # with 92 common heads and ~50 exclusive heads on each side.
25 # with 92 common heads and ~50 exclusive heads on each side.
26 #
26 #
27 # $ ./discovery-helper.sh pypy-2018-08-01 50 10
27 # $ ./discovery-helper.sh pypy-2018-08-01 50 10
28
28
29 set -euo pipefail
29 set -euo pipefail
30
30
31 printusage () {
31 printusage () {
32 echo "usage: `basename $0` REPO NBHEADS DEPTH [left|right]" >&2
32 echo "usage: `basename $0` REPO NBHEADS DEPTH [left|right]" >&2
33 }
33 }
34
34
35 if [ $# -lt 3 ]; then
35 if [ $# -lt 3 ]; then
36 printusage
36 printusage
37 exit 64
37 exit 64
38 fi
38 fi
39
39
40 repo="$1"
40 repo="$1"
41 shift
41 shift
42
42
43 nbheads="$1"
43 nbheads="$1"
44 shift
44 shift
45
45
46 depth="$1"
46 depth="$1"
47 shift
47 shift
48
48
49 doleft=1
49 doleft=1
50 doright=1
50 doright=1
51 if [ $# -gt 1 ]; then
51 if [ $# -gt 1 ]; then
52 printusage
52 printusage
53 exit 64
53 exit 64
54 elif [ $# -eq 1 ]; then
54 elif [ $# -eq 1 ]; then
55 if [ "$1" == "left" ]; then
55 if [ "$1" == "left" ]; then
56 doleft=1
56 doleft=1
57 doright=0
57 doright=0
58 elif [ "$1" == "right" ]; then
58 elif [ "$1" == "right" ]; then
59 doleft=0
59 doleft=0
60 doright=1
60 doright=1
61 else
61 else
62 printusage
62 printusage
63 exit 64
63 exit 64
64 fi
64 fi
65 fi
65 fi
66
66
67 leftrepo="${repo}-${nbheads}h-${depth}d-left"
67 leftrepo="${repo}-${nbheads}h-${depth}d-left"
68 rightrepo="${repo}-${nbheads}h-${depth}d-right"
68 rightrepo="${repo}-${nbheads}h-${depth}d-right"
69
69
70 left="first(sort(heads(all()), 'desc'), $nbheads)"
70 left="first(sort(heads(all()), 'desc'), $nbheads)"
71 right="last(sort(heads(all()), 'desc'), $nbheads)"
71 right="last(sort(heads(all()), 'desc'), $nbheads)"
72
72
73 leftsubset="ancestors($left, $depth) and only($left, heads(all() - $left))"
73 leftsubset="ancestors($left, $depth) and only($left, heads(all() - $left))"
74 rightsubset="ancestors($right, $depth) and only($right, heads(all() - $right))"
74 rightsubset="ancestors($right, $depth) and only($right, heads(all() - $right))"
75
75
76 echo '### creating left/right repositories with missing changesets:'
76 echo '### creating left/right repositories with missing changesets:'
77 if [ $doleft -eq 1 ]; then
77 if [ $doleft -eq 1 ]; then
78 echo '# left revset:' '"'${leftsubset}'"'
78 echo '# left revset:' '"'${leftsubset}'"'
79 fi
79 fi
80 if [ $doright -eq 1 ]; then
80 if [ $doright -eq 1 ]; then
81 echo '# right revset:' '"'${rightsubset}'"'
81 echo '# right revset:' '"'${rightsubset}'"'
82 fi
82 fi
83
83
84 buildone() {
84 buildone() {
85 side="$1"
85 side="$1"
86 dest="$2"
86 dest="$2"
87 revset="$3"
87 revset="$3"
88 echo "### building $side repository: $dest"
88 echo "### building $side repository: $dest"
89 if [ -e "$dest" ]; then
89 if [ -e "$dest" ]; then
90 echo "destination repo already exists: $dest" >&2
90 echo "destination repo already exists: $dest" >&2
91 exit 1
91 exit 1
92 fi
92 fi
93 echo '# cloning'
93 echo '# cloning'
94 hg clone --noupdate "${repo}" "${dest}"
94 if ! cp --recursive --reflink=always ${repo} ${dest}; then
95 hg clone --noupdate "${repo}" "${dest}"
96 fi
95 echo '# stripping' '"'${revset}'"'
97 echo '# stripping' '"'${revset}'"'
96 hg -R "${dest}" --config extensions.strip= strip --rev "$revset" --no-backup
98 hg -R "${dest}" --config extensions.strip= strip --rev "$revset" --no-backup
97 }
99 }
98
100
99 if [ $doleft -eq 1 ]; then
101 if [ $doleft -eq 1 ]; then
100 buildone left "$leftrepo" "$leftsubset"
102 buildone left "$leftrepo" "$leftsubset"
101 fi
103 fi
102
104
103 if [ $doright -eq 1 ]; then
105 if [ $doright -eq 1 ]; then
104 buildone right "$rightrepo" "$rightsubset"
106 buildone right "$rightrepo" "$rightsubset"
105 fi
107 fi
General Comments 0
You need to be logged in to leave comments. Login now