##// END OF EJS Templates
rhg: use `Command::exec` instead of `Command::status`...
Raphaël Gomès -
r50043:006688e3 stable
parent child Browse files
Show More
@@ -1,1213 +1,1225 b''
1 # This file is automatically @generated by Cargo.
1 # This file is automatically @generated by Cargo.
2 # It is not intended for manual editing.
2 # It is not intended for manual editing.
3 version = 3
3 version = 3
4
4
5 [[package]]
5 [[package]]
6 name = "Inflector"
6 name = "Inflector"
7 version = "0.11.4"
7 version = "0.11.4"
8 source = "registry+https://github.com/rust-lang/crates.io-index"
8 source = "registry+https://github.com/rust-lang/crates.io-index"
9 checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
9 checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
10
10
11 [[package]]
11 [[package]]
12 name = "adler"
12 name = "adler"
13 version = "0.2.3"
13 version = "0.2.3"
14 source = "registry+https://github.com/rust-lang/crates.io-index"
14 source = "registry+https://github.com/rust-lang/crates.io-index"
15 checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
15 checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
16
16
17 [[package]]
17 [[package]]
18 name = "aho-corasick"
18 name = "aho-corasick"
19 version = "0.7.15"
19 version = "0.7.15"
20 source = "registry+https://github.com/rust-lang/crates.io-index"
20 source = "registry+https://github.com/rust-lang/crates.io-index"
21 checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
21 checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
22 dependencies = [
22 dependencies = [
23 "memchr",
23 "memchr",
24 ]
24 ]
25
25
26 [[package]]
26 [[package]]
27 name = "aliasable"
27 name = "aliasable"
28 version = "0.1.3"
28 version = "0.1.3"
29 source = "registry+https://github.com/rust-lang/crates.io-index"
29 source = "registry+https://github.com/rust-lang/crates.io-index"
30 checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd"
30 checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd"
31
31
32 [[package]]
32 [[package]]
33 name = "ansi_term"
33 name = "ansi_term"
34 version = "0.11.0"
34 version = "0.11.0"
35 source = "registry+https://github.com/rust-lang/crates.io-index"
35 source = "registry+https://github.com/rust-lang/crates.io-index"
36 checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
36 checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
37 dependencies = [
37 dependencies = [
38 "winapi",
38 "winapi",
39 ]
39 ]
40
40
41 [[package]]
41 [[package]]
42 name = "atty"
42 name = "atty"
43 version = "0.2.14"
43 version = "0.2.14"
44 source = "registry+https://github.com/rust-lang/crates.io-index"
44 source = "registry+https://github.com/rust-lang/crates.io-index"
45 checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
45 checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
46 dependencies = [
46 dependencies = [
47 "hermit-abi",
47 "hermit-abi",
48 "libc",
48 "libc",
49 "winapi",
49 "winapi",
50 ]
50 ]
51
51
52 [[package]]
52 [[package]]
53 name = "autocfg"
53 name = "autocfg"
54 version = "1.0.1"
54 version = "1.0.1"
55 source = "registry+https://github.com/rust-lang/crates.io-index"
55 source = "registry+https://github.com/rust-lang/crates.io-index"
56 checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
56 checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
57
57
58 [[package]]
58 [[package]]
59 name = "bitflags"
59 name = "bitflags"
60 version = "1.2.1"
60 version = "1.2.1"
61 source = "registry+https://github.com/rust-lang/crates.io-index"
61 source = "registry+https://github.com/rust-lang/crates.io-index"
62 checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
62 checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
63
63
64 [[package]]
64 [[package]]
65 name = "bitmaps"
65 name = "bitmaps"
66 version = "2.1.0"
66 version = "2.1.0"
67 source = "registry+https://github.com/rust-lang/crates.io-index"
67 source = "registry+https://github.com/rust-lang/crates.io-index"
68 checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2"
68 checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2"
69 dependencies = [
69 dependencies = [
70 "typenum",
70 "typenum",
71 ]
71 ]
72
72
73 [[package]]
73 [[package]]
74 name = "block-buffer"
74 name = "block-buffer"
75 version = "0.9.0"
75 version = "0.9.0"
76 source = "registry+https://github.com/rust-lang/crates.io-index"
76 source = "registry+https://github.com/rust-lang/crates.io-index"
77 checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
77 checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
78 dependencies = [
78 dependencies = [
79 "generic-array",
79 "generic-array",
80 ]
80 ]
81
81
82 [[package]]
82 [[package]]
83 name = "byteorder"
83 name = "byteorder"
84 version = "1.3.4"
84 version = "1.3.4"
85 source = "registry+https://github.com/rust-lang/crates.io-index"
85 source = "registry+https://github.com/rust-lang/crates.io-index"
86 checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
86 checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
87
87
88 [[package]]
88 [[package]]
89 name = "bytes-cast"
89 name = "bytes-cast"
90 version = "0.2.0"
90 version = "0.2.0"
91 source = "registry+https://github.com/rust-lang/crates.io-index"
91 source = "registry+https://github.com/rust-lang/crates.io-index"
92 checksum = "0d434f9a4ecbe987e7ccfda7274b6f82ea52c9b63742565a65cb5e8ba0f2c452"
92 checksum = "0d434f9a4ecbe987e7ccfda7274b6f82ea52c9b63742565a65cb5e8ba0f2c452"
93 dependencies = [
93 dependencies = [
94 "bytes-cast-derive",
94 "bytes-cast-derive",
95 ]
95 ]
96
96
97 [[package]]
97 [[package]]
98 name = "bytes-cast-derive"
98 name = "bytes-cast-derive"
99 version = "0.1.0"
99 version = "0.1.0"
100 source = "registry+https://github.com/rust-lang/crates.io-index"
100 source = "registry+https://github.com/rust-lang/crates.io-index"
101 checksum = "cb936af9de38476664d6b58e529aff30d482e4ce1c5e150293d00730b0d81fdb"
101 checksum = "cb936af9de38476664d6b58e529aff30d482e4ce1c5e150293d00730b0d81fdb"
102 dependencies = [
102 dependencies = [
103 "proc-macro2",
103 "proc-macro2",
104 "quote",
104 "quote",
105 "syn",
105 "syn",
106 ]
106 ]
107
107
108 [[package]]
108 [[package]]
109 name = "cc"
109 name = "cc"
110 version = "1.0.66"
110 version = "1.0.66"
111 source = "registry+https://github.com/rust-lang/crates.io-index"
111 source = "registry+https://github.com/rust-lang/crates.io-index"
112 checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48"
112 checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48"
113 dependencies = [
113 dependencies = [
114 "jobserver",
114 "jobserver",
115 ]
115 ]
116
116
117 [[package]]
117 [[package]]
118 name = "cfg-if"
118 name = "cfg-if"
119 version = "0.1.10"
119 version = "0.1.10"
120 source = "registry+https://github.com/rust-lang/crates.io-index"
120 source = "registry+https://github.com/rust-lang/crates.io-index"
121 checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
121 checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
122
122
123 [[package]]
123 [[package]]
124 name = "cfg-if"
124 name = "cfg-if"
125 version = "1.0.0"
125 version = "1.0.0"
126 source = "registry+https://github.com/rust-lang/crates.io-index"
126 source = "registry+https://github.com/rust-lang/crates.io-index"
127 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
127 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
128
128
129 [[package]]
129 [[package]]
130 name = "chrono"
130 name = "chrono"
131 version = "0.4.19"
131 version = "0.4.19"
132 source = "registry+https://github.com/rust-lang/crates.io-index"
132 source = "registry+https://github.com/rust-lang/crates.io-index"
133 checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
133 checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
134 dependencies = [
134 dependencies = [
135 "libc",
135 "libc",
136 "num-integer",
136 "num-integer",
137 "num-traits",
137 "num-traits",
138 "time",
138 "time",
139 "winapi",
139 "winapi",
140 ]
140 ]
141
141
142 [[package]]
142 [[package]]
143 name = "clap"
143 name = "clap"
144 version = "2.33.3"
144 version = "2.33.3"
145 source = "registry+https://github.com/rust-lang/crates.io-index"
145 source = "registry+https://github.com/rust-lang/crates.io-index"
146 checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
146 checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
147 dependencies = [
147 dependencies = [
148 "ansi_term",
148 "ansi_term",
149 "atty",
149 "atty",
150 "bitflags",
150 "bitflags",
151 "strsim",
151 "strsim",
152 "textwrap",
152 "textwrap",
153 "unicode-width",
153 "unicode-width",
154 "vec_map",
154 "vec_map",
155 ]
155 ]
156
156
157 [[package]]
157 [[package]]
158 name = "const_fn"
158 name = "const_fn"
159 version = "0.4.4"
159 version = "0.4.4"
160 source = "registry+https://github.com/rust-lang/crates.io-index"
160 source = "registry+https://github.com/rust-lang/crates.io-index"
161 checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826"
161 checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826"
162
162
163 [[package]]
163 [[package]]
164 name = "cpufeatures"
164 name = "cpufeatures"
165 version = "0.1.4"
165 version = "0.1.4"
166 source = "registry+https://github.com/rust-lang/crates.io-index"
166 source = "registry+https://github.com/rust-lang/crates.io-index"
167 checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8"
167 checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8"
168 dependencies = [
168 dependencies = [
169 "libc",
169 "libc",
170 ]
170 ]
171
171
172 [[package]]
172 [[package]]
173 name = "cpython"
173 name = "cpython"
174 version = "0.7.0"
174 version = "0.7.0"
175 source = "registry+https://github.com/rust-lang/crates.io-index"
175 source = "registry+https://github.com/rust-lang/crates.io-index"
176 checksum = "b7d46ba8ace7f3a1d204ac5060a706d0a68de6b42eafb6a586cc08bebcffe664"
176 checksum = "b7d46ba8ace7f3a1d204ac5060a706d0a68de6b42eafb6a586cc08bebcffe664"
177 dependencies = [
177 dependencies = [
178 "libc",
178 "libc",
179 "num-traits",
179 "num-traits",
180 "paste",
180 "paste",
181 "python27-sys",
181 "python27-sys",
182 "python3-sys",
182 "python3-sys",
183 ]
183 ]
184
184
185 [[package]]
185 [[package]]
186 name = "crc32fast"
186 name = "crc32fast"
187 version = "1.2.1"
187 version = "1.2.1"
188 source = "registry+https://github.com/rust-lang/crates.io-index"
188 source = "registry+https://github.com/rust-lang/crates.io-index"
189 checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
189 checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
190 dependencies = [
190 dependencies = [
191 "cfg-if 1.0.0",
191 "cfg-if 1.0.0",
192 ]
192 ]
193
193
194 [[package]]
194 [[package]]
195 name = "crossbeam-channel"
195 name = "crossbeam-channel"
196 version = "0.4.4"
196 version = "0.4.4"
197 source = "registry+https://github.com/rust-lang/crates.io-index"
197 source = "registry+https://github.com/rust-lang/crates.io-index"
198 checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
198 checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
199 dependencies = [
199 dependencies = [
200 "crossbeam-utils 0.7.2",
200 "crossbeam-utils 0.7.2",
201 "maybe-uninit",
201 "maybe-uninit",
202 ]
202 ]
203
203
204 [[package]]
204 [[package]]
205 name = "crossbeam-channel"
205 name = "crossbeam-channel"
206 version = "0.5.0"
206 version = "0.5.0"
207 source = "registry+https://github.com/rust-lang/crates.io-index"
207 source = "registry+https://github.com/rust-lang/crates.io-index"
208 checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
208 checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
209 dependencies = [
209 dependencies = [
210 "cfg-if 1.0.0",
210 "cfg-if 1.0.0",
211 "crossbeam-utils 0.8.1",
211 "crossbeam-utils 0.8.1",
212 ]
212 ]
213
213
214 [[package]]
214 [[package]]
215 name = "crossbeam-deque"
215 name = "crossbeam-deque"
216 version = "0.8.0"
216 version = "0.8.0"
217 source = "registry+https://github.com/rust-lang/crates.io-index"
217 source = "registry+https://github.com/rust-lang/crates.io-index"
218 checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
218 checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
219 dependencies = [
219 dependencies = [
220 "cfg-if 1.0.0",
220 "cfg-if 1.0.0",
221 "crossbeam-epoch",
221 "crossbeam-epoch",
222 "crossbeam-utils 0.8.1",
222 "crossbeam-utils 0.8.1",
223 ]
223 ]
224
224
225 [[package]]
225 [[package]]
226 name = "crossbeam-epoch"
226 name = "crossbeam-epoch"
227 version = "0.9.1"
227 version = "0.9.1"
228 source = "registry+https://github.com/rust-lang/crates.io-index"
228 source = "registry+https://github.com/rust-lang/crates.io-index"
229 checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d"
229 checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d"
230 dependencies = [
230 dependencies = [
231 "cfg-if 1.0.0",
231 "cfg-if 1.0.0",
232 "const_fn",
232 "const_fn",
233 "crossbeam-utils 0.8.1",
233 "crossbeam-utils 0.8.1",
234 "lazy_static",
234 "lazy_static",
235 "memoffset",
235 "memoffset",
236 "scopeguard",
236 "scopeguard",
237 ]
237 ]
238
238
239 [[package]]
239 [[package]]
240 name = "crossbeam-utils"
240 name = "crossbeam-utils"
241 version = "0.7.2"
241 version = "0.7.2"
242 source = "registry+https://github.com/rust-lang/crates.io-index"
242 source = "registry+https://github.com/rust-lang/crates.io-index"
243 checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
243 checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
244 dependencies = [
244 dependencies = [
245 "autocfg",
245 "autocfg",
246 "cfg-if 0.1.10",
246 "cfg-if 0.1.10",
247 "lazy_static",
247 "lazy_static",
248 ]
248 ]
249
249
250 [[package]]
250 [[package]]
251 name = "crossbeam-utils"
251 name = "crossbeam-utils"
252 version = "0.8.1"
252 version = "0.8.1"
253 source = "registry+https://github.com/rust-lang/crates.io-index"
253 source = "registry+https://github.com/rust-lang/crates.io-index"
254 checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d"
254 checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d"
255 dependencies = [
255 dependencies = [
256 "autocfg",
256 "autocfg",
257 "cfg-if 1.0.0",
257 "cfg-if 1.0.0",
258 "lazy_static",
258 "lazy_static",
259 ]
259 ]
260
260
261 [[package]]
261 [[package]]
262 name = "ctor"
262 name = "ctor"
263 version = "0.1.16"
263 version = "0.1.16"
264 source = "registry+https://github.com/rust-lang/crates.io-index"
264 source = "registry+https://github.com/rust-lang/crates.io-index"
265 checksum = "7fbaabec2c953050352311293be5c6aba8e141ba19d6811862b232d6fd020484"
265 checksum = "7fbaabec2c953050352311293be5c6aba8e141ba19d6811862b232d6fd020484"
266 dependencies = [
266 dependencies = [
267 "quote",
267 "quote",
268 "syn",
268 "syn",
269 ]
269 ]
270
270
271 [[package]]
271 [[package]]
272 name = "derive_more"
272 name = "derive_more"
273 version = "0.99.11"
273 version = "0.99.11"
274 source = "registry+https://github.com/rust-lang/crates.io-index"
274 source = "registry+https://github.com/rust-lang/crates.io-index"
275 checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c"
275 checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c"
276 dependencies = [
276 dependencies = [
277 "proc-macro2",
277 "proc-macro2",
278 "quote",
278 "quote",
279 "syn",
279 "syn",
280 ]
280 ]
281
281
282 [[package]]
282 [[package]]
283 name = "difference"
283 name = "difference"
284 version = "2.0.0"
284 version = "2.0.0"
285 source = "registry+https://github.com/rust-lang/crates.io-index"
285 source = "registry+https://github.com/rust-lang/crates.io-index"
286 checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
286 checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
287
287
288 [[package]]
288 [[package]]
289 name = "digest"
289 name = "digest"
290 version = "0.9.0"
290 version = "0.9.0"
291 source = "registry+https://github.com/rust-lang/crates.io-index"
291 source = "registry+https://github.com/rust-lang/crates.io-index"
292 checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
292 checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
293 dependencies = [
293 dependencies = [
294 "generic-array",
294 "generic-array",
295 ]
295 ]
296
296
297 [[package]]
297 [[package]]
298 name = "either"
298 name = "either"
299 version = "1.6.1"
299 version = "1.6.1"
300 source = "registry+https://github.com/rust-lang/crates.io-index"
300 source = "registry+https://github.com/rust-lang/crates.io-index"
301 checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
301 checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
302
302
303 [[package]]
303 [[package]]
304 name = "env_logger"
304 name = "env_logger"
305 version = "0.7.1"
305 version = "0.7.1"
306 source = "registry+https://github.com/rust-lang/crates.io-index"
306 source = "registry+https://github.com/rust-lang/crates.io-index"
307 checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
307 checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
308 dependencies = [
308 dependencies = [
309 "atty",
309 "atty",
310 "humantime",
310 "humantime",
311 "log",
311 "log",
312 "regex",
312 "regex",
313 "termcolor",
313 "termcolor",
314 ]
314 ]
315
315
316 [[package]]
316 [[package]]
317 name = "flate2"
317 name = "flate2"
318 version = "1.0.19"
318 version = "1.0.19"
319 source = "registry+https://github.com/rust-lang/crates.io-index"
319 source = "registry+https://github.com/rust-lang/crates.io-index"
320 checksum = "7411863d55df97a419aa64cb4d2f167103ea9d767e2c54a1868b7ac3f6b47129"
320 checksum = "7411863d55df97a419aa64cb4d2f167103ea9d767e2c54a1868b7ac3f6b47129"
321 dependencies = [
321 dependencies = [
322 "cfg-if 1.0.0",
322 "cfg-if 1.0.0",
323 "crc32fast",
323 "crc32fast",
324 "libc",
324 "libc",
325 "libz-sys",
325 "libz-sys",
326 "miniz_oxide",
326 "miniz_oxide",
327 ]
327 ]
328
328
329 [[package]]
329 [[package]]
330 name = "format-bytes"
330 name = "format-bytes"
331 version = "0.3.0"
331 version = "0.3.0"
332 source = "registry+https://github.com/rust-lang/crates.io-index"
332 source = "registry+https://github.com/rust-lang/crates.io-index"
333 checksum = "48942366ef93975da38e175ac9e10068c6fc08ca9e85930d4f098f4d5b14c2fd"
333 checksum = "48942366ef93975da38e175ac9e10068c6fc08ca9e85930d4f098f4d5b14c2fd"
334 dependencies = [
334 dependencies = [
335 "format-bytes-macros",
335 "format-bytes-macros",
336 ]
336 ]
337
337
338 [[package]]
338 [[package]]
339 name = "format-bytes-macros"
339 name = "format-bytes-macros"
340 version = "0.4.0"
340 version = "0.4.0"
341 source = "registry+https://github.com/rust-lang/crates.io-index"
341 source = "registry+https://github.com/rust-lang/crates.io-index"
342 checksum = "203aadebefcc73d12038296c228eabf830f99cba991b0032adf20e9fa6ce7e4f"
342 checksum = "203aadebefcc73d12038296c228eabf830f99cba991b0032adf20e9fa6ce7e4f"
343 dependencies = [
343 dependencies = [
344 "proc-macro2",
344 "proc-macro2",
345 "quote",
345 "quote",
346 "syn",
346 "syn",
347 ]
347 ]
348
348
349 [[package]]
349 [[package]]
350 name = "generic-array"
350 name = "generic-array"
351 version = "0.14.4"
351 version = "0.14.4"
352 source = "registry+https://github.com/rust-lang/crates.io-index"
352 source = "registry+https://github.com/rust-lang/crates.io-index"
353 checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
353 checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
354 dependencies = [
354 dependencies = [
355 "typenum",
355 "typenum",
356 "version_check",
356 "version_check",
357 ]
357 ]
358
358
359 [[package]]
359 [[package]]
360 name = "getrandom"
360 name = "getrandom"
361 version = "0.1.15"
361 version = "0.1.15"
362 source = "registry+https://github.com/rust-lang/crates.io-index"
362 source = "registry+https://github.com/rust-lang/crates.io-index"
363 checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
363 checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
364 dependencies = [
364 dependencies = [
365 "cfg-if 0.1.10",
365 "cfg-if 0.1.10",
366 "libc",
366 "libc",
367 "wasi 0.9.0+wasi-snapshot-preview1",
367 "wasi 0.9.0+wasi-snapshot-preview1",
368 ]
368 ]
369
369
370 [[package]]
370 [[package]]
371 name = "getrandom"
371 name = "getrandom"
372 version = "0.2.4"
372 version = "0.2.4"
373 source = "registry+https://github.com/rust-lang/crates.io-index"
373 source = "registry+https://github.com/rust-lang/crates.io-index"
374 checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c"
374 checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c"
375 dependencies = [
375 dependencies = [
376 "cfg-if 1.0.0",
376 "cfg-if 1.0.0",
377 "libc",
377 "libc",
378 "wasi 0.10.0+wasi-snapshot-preview1",
378 "wasi 0.10.0+wasi-snapshot-preview1",
379 ]
379 ]
380
380
381 [[package]]
381 [[package]]
382 name = "glob"
382 name = "glob"
383 version = "0.3.0"
383 version = "0.3.0"
384 source = "registry+https://github.com/rust-lang/crates.io-index"
384 source = "registry+https://github.com/rust-lang/crates.io-index"
385 checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
385 checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
386
386
387 [[package]]
387 [[package]]
388 name = "hermit-abi"
388 name = "hermit-abi"
389 version = "0.1.17"
389 version = "0.1.17"
390 source = "registry+https://github.com/rust-lang/crates.io-index"
390 source = "registry+https://github.com/rust-lang/crates.io-index"
391 checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
391 checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
392 dependencies = [
392 dependencies = [
393 "libc",
393 "libc",
394 ]
394 ]
395
395
396 [[package]]
396 [[package]]
397 name = "hex"
397 name = "hex"
398 version = "0.4.3"
398 version = "0.4.3"
399 source = "registry+https://github.com/rust-lang/crates.io-index"
399 source = "registry+https://github.com/rust-lang/crates.io-index"
400 checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
400 checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
401
401
402 [[package]]
402 [[package]]
403 name = "hg-core"
403 name = "hg-core"
404 version = "0.1.0"
404 version = "0.1.0"
405 dependencies = [
405 dependencies = [
406 "bitflags",
406 "bitflags",
407 "byteorder",
407 "byteorder",
408 "bytes-cast",
408 "bytes-cast",
409 "clap",
409 "clap",
410 "crossbeam-channel 0.4.4",
410 "crossbeam-channel 0.4.4",
411 "derive_more",
411 "derive_more",
412 "flate2",
412 "flate2",
413 "format-bytes",
413 "format-bytes",
414 "home",
414 "home",
415 "im-rc",
415 "im-rc",
416 "itertools",
416 "itertools",
417 "lazy_static",
417 "lazy_static",
418 "libc",
418 "libc",
419 "log",
419 "log",
420 "memmap2",
420 "memmap2",
421 "micro-timer",
421 "micro-timer",
422 "ouroboros",
422 "ouroboros",
423 "pretty_assertions",
423 "pretty_assertions",
424 "rand 0.8.4",
424 "rand 0.8.4",
425 "rand_distr",
425 "rand_distr",
426 "rand_pcg",
426 "rand_pcg",
427 "rayon",
427 "rayon",
428 "regex",
428 "regex",
429 "same-file",
429 "same-file",
430 "sha-1",
430 "sha-1",
431 "tempfile",
431 "tempfile",
432 "twox-hash",
432 "twox-hash",
433 "zstd",
433 "zstd",
434 ]
434 ]
435
435
436 [[package]]
436 [[package]]
437 name = "hg-cpython"
437 name = "hg-cpython"
438 version = "0.1.0"
438 version = "0.1.0"
439 dependencies = [
439 dependencies = [
440 "cpython",
440 "cpython",
441 "crossbeam-channel 0.4.4",
441 "crossbeam-channel 0.4.4",
442 "env_logger",
442 "env_logger",
443 "hg-core",
443 "hg-core",
444 "libc",
444 "libc",
445 "log",
445 "log",
446 "stable_deref_trait",
446 "stable_deref_trait",
447 "vcsgraph",
447 "vcsgraph",
448 ]
448 ]
449
449
450 [[package]]
450 [[package]]
451 name = "home"
451 name = "home"
452 version = "0.5.3"
452 version = "0.5.3"
453 source = "registry+https://github.com/rust-lang/crates.io-index"
453 source = "registry+https://github.com/rust-lang/crates.io-index"
454 checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654"
454 checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654"
455 dependencies = [
455 dependencies = [
456 "winapi",
456 "winapi",
457 ]
457 ]
458
458
459 [[package]]
459 [[package]]
460 name = "humantime"
460 name = "humantime"
461 version = "1.3.0"
461 version = "1.3.0"
462 source = "registry+https://github.com/rust-lang/crates.io-index"
462 source = "registry+https://github.com/rust-lang/crates.io-index"
463 checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
463 checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
464 dependencies = [
464 dependencies = [
465 "quick-error",
465 "quick-error",
466 ]
466 ]
467
467
468 [[package]]
468 [[package]]
469 name = "im-rc"
469 name = "im-rc"
470 version = "15.0.0"
470 version = "15.0.0"
471 source = "registry+https://github.com/rust-lang/crates.io-index"
471 source = "registry+https://github.com/rust-lang/crates.io-index"
472 checksum = "3ca8957e71f04a205cb162508f9326aea04676c8dfd0711220190d6b83664f3f"
472 checksum = "3ca8957e71f04a205cb162508f9326aea04676c8dfd0711220190d6b83664f3f"
473 dependencies = [
473 dependencies = [
474 "bitmaps",
474 "bitmaps",
475 "rand_core 0.5.1",
475 "rand_core 0.5.1",
476 "rand_xoshiro",
476 "rand_xoshiro",
477 "sized-chunks",
477 "sized-chunks",
478 "typenum",
478 "typenum",
479 "version_check",
479 "version_check",
480 ]
480 ]
481
481
482 [[package]]
482 [[package]]
483 name = "itertools"
483 name = "itertools"
484 version = "0.9.0"
484 version = "0.9.0"
485 source = "registry+https://github.com/rust-lang/crates.io-index"
485 source = "registry+https://github.com/rust-lang/crates.io-index"
486 checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
486 checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
487 dependencies = [
487 dependencies = [
488 "either",
488 "either",
489 ]
489 ]
490
490
491 [[package]]
491 [[package]]
492 name = "jobserver"
492 name = "jobserver"
493 version = "0.1.21"
493 version = "0.1.21"
494 source = "registry+https://github.com/rust-lang/crates.io-index"
494 source = "registry+https://github.com/rust-lang/crates.io-index"
495 checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
495 checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
496 dependencies = [
496 dependencies = [
497 "libc",
497 "libc",
498 ]
498 ]
499
499
500 [[package]]
500 [[package]]
501 name = "lazy_static"
501 name = "lazy_static"
502 version = "1.4.0"
502 version = "1.4.0"
503 source = "registry+https://github.com/rust-lang/crates.io-index"
503 source = "registry+https://github.com/rust-lang/crates.io-index"
504 checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
504 checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
505
505
506 [[package]]
506 [[package]]
507 name = "libc"
507 name = "libc"
508 version = "0.2.81"
508 version = "0.2.124"
509 source = "registry+https://github.com/rust-lang/crates.io-index"
509 source = "registry+https://github.com/rust-lang/crates.io-index"
510 checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb"
510 checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50"
511
511
512 [[package]]
512 [[package]]
513 name = "libm"
513 name = "libm"
514 version = "0.2.1"
514 version = "0.2.1"
515 source = "registry+https://github.com/rust-lang/crates.io-index"
515 source = "registry+https://github.com/rust-lang/crates.io-index"
516 checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
516 checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
517
517
518 [[package]]
518 [[package]]
519 name = "libz-sys"
519 name = "libz-sys"
520 version = "1.1.2"
520 version = "1.1.2"
521 source = "registry+https://github.com/rust-lang/crates.io-index"
521 source = "registry+https://github.com/rust-lang/crates.io-index"
522 checksum = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655"
522 checksum = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655"
523 dependencies = [
523 dependencies = [
524 "cc",
524 "cc",
525 "pkg-config",
525 "pkg-config",
526 "vcpkg",
526 "vcpkg",
527 ]
527 ]
528
528
529 [[package]]
529 [[package]]
530 name = "log"
530 name = "log"
531 version = "0.4.11"
531 version = "0.4.11"
532 source = "registry+https://github.com/rust-lang/crates.io-index"
532 source = "registry+https://github.com/rust-lang/crates.io-index"
533 checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
533 checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
534 dependencies = [
534 dependencies = [
535 "cfg-if 0.1.10",
535 "cfg-if 0.1.10",
536 ]
536 ]
537
537
538 [[package]]
538 [[package]]
539 name = "maybe-uninit"
539 name = "maybe-uninit"
540 version = "2.0.0"
540 version = "2.0.0"
541 source = "registry+https://github.com/rust-lang/crates.io-index"
541 source = "registry+https://github.com/rust-lang/crates.io-index"
542 checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
542 checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
543
543
544 [[package]]
544 [[package]]
545 name = "memchr"
545 name = "memchr"
546 version = "2.3.4"
546 version = "2.3.4"
547 source = "registry+https://github.com/rust-lang/crates.io-index"
547 source = "registry+https://github.com/rust-lang/crates.io-index"
548 checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
548 checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
549
549
550 [[package]]
550 [[package]]
551 name = "memmap2"
551 name = "memmap2"
552 version = "0.4.0"
552 version = "0.4.0"
553 source = "registry+https://github.com/rust-lang/crates.io-index"
553 source = "registry+https://github.com/rust-lang/crates.io-index"
554 checksum = "de5d3112c080d58ce560081baeaab7e1e864ca21795ddbf533d5b1842bb1ecf8"
554 checksum = "de5d3112c080d58ce560081baeaab7e1e864ca21795ddbf533d5b1842bb1ecf8"
555 dependencies = [
555 dependencies = [
556 "libc",
556 "libc",
557 "stable_deref_trait",
557 "stable_deref_trait",
558 ]
558 ]
559
559
560 [[package]]
560 [[package]]
561 name = "memoffset"
561 name = "memoffset"
562 version = "0.6.1"
562 version = "0.6.1"
563 source = "registry+https://github.com/rust-lang/crates.io-index"
563 source = "registry+https://github.com/rust-lang/crates.io-index"
564 checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87"
564 checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87"
565 dependencies = [
565 dependencies = [
566 "autocfg",
566 "autocfg",
567 ]
567 ]
568
568
569 [[package]]
569 [[package]]
570 name = "micro-timer"
570 name = "micro-timer"
571 version = "0.3.1"
571 version = "0.3.1"
572 source = "registry+https://github.com/rust-lang/crates.io-index"
572 source = "registry+https://github.com/rust-lang/crates.io-index"
573 checksum = "2620153e1d903d26b72b89f0e9c48d8c4756cba941c185461dddc234980c298c"
573 checksum = "2620153e1d903d26b72b89f0e9c48d8c4756cba941c185461dddc234980c298c"
574 dependencies = [
574 dependencies = [
575 "micro-timer-macros",
575 "micro-timer-macros",
576 "scopeguard",
576 "scopeguard",
577 ]
577 ]
578
578
579 [[package]]
579 [[package]]
580 name = "micro-timer-macros"
580 name = "micro-timer-macros"
581 version = "0.3.1"
581 version = "0.3.1"
582 source = "registry+https://github.com/rust-lang/crates.io-index"
582 source = "registry+https://github.com/rust-lang/crates.io-index"
583 checksum = "e28a3473e6abd6e9aab36aaeef32ad22ae0bd34e79f376643594c2b152ec1c5d"
583 checksum = "e28a3473e6abd6e9aab36aaeef32ad22ae0bd34e79f376643594c2b152ec1c5d"
584 dependencies = [
584 dependencies = [
585 "proc-macro2",
585 "proc-macro2",
586 "quote",
586 "quote",
587 "scopeguard",
587 "scopeguard",
588 "syn",
588 "syn",
589 ]
589 ]
590
590
591 [[package]]
591 [[package]]
592 name = "miniz_oxide"
592 name = "miniz_oxide"
593 version = "0.4.3"
593 version = "0.4.3"
594 source = "registry+https://github.com/rust-lang/crates.io-index"
594 source = "registry+https://github.com/rust-lang/crates.io-index"
595 checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d"
595 checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d"
596 dependencies = [
596 dependencies = [
597 "adler",
597 "adler",
598 "autocfg",
598 "autocfg",
599 ]
599 ]
600
600
601 [[package]]
601 [[package]]
602 name = "num-integer"
602 name = "num-integer"
603 version = "0.1.44"
603 version = "0.1.44"
604 source = "registry+https://github.com/rust-lang/crates.io-index"
604 source = "registry+https://github.com/rust-lang/crates.io-index"
605 checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
605 checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
606 dependencies = [
606 dependencies = [
607 "autocfg",
607 "autocfg",
608 "num-traits",
608 "num-traits",
609 ]
609 ]
610
610
611 [[package]]
611 [[package]]
612 name = "num-traits"
612 name = "num-traits"
613 version = "0.2.14"
613 version = "0.2.14"
614 source = "registry+https://github.com/rust-lang/crates.io-index"
614 source = "registry+https://github.com/rust-lang/crates.io-index"
615 checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
615 checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
616 dependencies = [
616 dependencies = [
617 "autocfg",
617 "autocfg",
618 "libm",
618 "libm",
619 ]
619 ]
620
620
621 [[package]]
621 [[package]]
622 name = "num_cpus"
622 name = "num_cpus"
623 version = "1.13.0"
623 version = "1.13.0"
624 source = "registry+https://github.com/rust-lang/crates.io-index"
624 source = "registry+https://github.com/rust-lang/crates.io-index"
625 checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
625 checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
626 dependencies = [
626 dependencies = [
627 "hermit-abi",
627 "hermit-abi",
628 "libc",
628 "libc",
629 ]
629 ]
630
630
631 [[package]]
631 [[package]]
632 name = "opaque-debug"
632 name = "opaque-debug"
633 version = "0.3.0"
633 version = "0.3.0"
634 source = "registry+https://github.com/rust-lang/crates.io-index"
634 source = "registry+https://github.com/rust-lang/crates.io-index"
635 checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
635 checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
636
636
637 [[package]]
637 [[package]]
638 name = "ouroboros"
638 name = "ouroboros"
639 version = "0.15.0"
639 version = "0.15.0"
640 source = "registry+https://github.com/rust-lang/crates.io-index"
640 source = "registry+https://github.com/rust-lang/crates.io-index"
641 checksum = "9f31a3b678685b150cba82b702dcdc5e155893f63610cf388d30cd988d4ca2bf"
641 checksum = "9f31a3b678685b150cba82b702dcdc5e155893f63610cf388d30cd988d4ca2bf"
642 dependencies = [
642 dependencies = [
643 "aliasable",
643 "aliasable",
644 "ouroboros_macro",
644 "ouroboros_macro",
645 "stable_deref_trait",
645 "stable_deref_trait",
646 ]
646 ]
647
647
648 [[package]]
648 [[package]]
649 name = "ouroboros_macro"
649 name = "ouroboros_macro"
650 version = "0.15.0"
650 version = "0.15.0"
651 source = "registry+https://github.com/rust-lang/crates.io-index"
651 source = "registry+https://github.com/rust-lang/crates.io-index"
652 checksum = "084fd65d5dd8b3772edccb5ffd1e4b7eba43897ecd0f9401e330e8c542959408"
652 checksum = "084fd65d5dd8b3772edccb5ffd1e4b7eba43897ecd0f9401e330e8c542959408"
653 dependencies = [
653 dependencies = [
654 "Inflector",
654 "Inflector",
655 "proc-macro-error",
655 "proc-macro-error",
656 "proc-macro2",
656 "proc-macro2",
657 "quote",
657 "quote",
658 "syn",
658 "syn",
659 ]
659 ]
660
660
661 [[package]]
661 [[package]]
662 name = "output_vt100"
662 name = "output_vt100"
663 version = "0.1.2"
663 version = "0.1.2"
664 source = "registry+https://github.com/rust-lang/crates.io-index"
664 source = "registry+https://github.com/rust-lang/crates.io-index"
665 checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9"
665 checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9"
666 dependencies = [
666 dependencies = [
667 "winapi",
667 "winapi",
668 ]
668 ]
669
669
670 [[package]]
670 [[package]]
671 name = "paste"
671 name = "paste"
672 version = "1.0.5"
672 version = "1.0.5"
673 source = "registry+https://github.com/rust-lang/crates.io-index"
673 source = "registry+https://github.com/rust-lang/crates.io-index"
674 checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58"
674 checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58"
675
675
676 [[package]]
676 [[package]]
677 name = "pkg-config"
677 name = "pkg-config"
678 version = "0.3.19"
678 version = "0.3.19"
679 source = "registry+https://github.com/rust-lang/crates.io-index"
679 source = "registry+https://github.com/rust-lang/crates.io-index"
680 checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
680 checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
681
681
682 [[package]]
682 [[package]]
683 name = "ppv-lite86"
683 name = "ppv-lite86"
684 version = "0.2.10"
684 version = "0.2.10"
685 source = "registry+https://github.com/rust-lang/crates.io-index"
685 source = "registry+https://github.com/rust-lang/crates.io-index"
686 checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
686 checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
687
687
688 [[package]]
688 [[package]]
689 name = "pretty_assertions"
689 name = "pretty_assertions"
690 version = "0.6.1"
690 version = "0.6.1"
691 source = "registry+https://github.com/rust-lang/crates.io-index"
691 source = "registry+https://github.com/rust-lang/crates.io-index"
692 checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427"
692 checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427"
693 dependencies = [
693 dependencies = [
694 "ansi_term",
694 "ansi_term",
695 "ctor",
695 "ctor",
696 "difference",
696 "difference",
697 "output_vt100",
697 "output_vt100",
698 ]
698 ]
699
699
700 [[package]]
700 [[package]]
701 name = "proc-macro-error"
701 name = "proc-macro-error"
702 version = "1.0.4"
702 version = "1.0.4"
703 source = "registry+https://github.com/rust-lang/crates.io-index"
703 source = "registry+https://github.com/rust-lang/crates.io-index"
704 checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
704 checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
705 dependencies = [
705 dependencies = [
706 "proc-macro-error-attr",
706 "proc-macro-error-attr",
707 "proc-macro2",
707 "proc-macro2",
708 "quote",
708 "quote",
709 "syn",
709 "syn",
710 "version_check",
710 "version_check",
711 ]
711 ]
712
712
713 [[package]]
713 [[package]]
714 name = "proc-macro-error-attr"
714 name = "proc-macro-error-attr"
715 version = "1.0.4"
715 version = "1.0.4"
716 source = "registry+https://github.com/rust-lang/crates.io-index"
716 source = "registry+https://github.com/rust-lang/crates.io-index"
717 checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
717 checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
718 dependencies = [
718 dependencies = [
719 "proc-macro2",
719 "proc-macro2",
720 "quote",
720 "quote",
721 "version_check",
721 "version_check",
722 ]
722 ]
723
723
724 [[package]]
724 [[package]]
725 name = "proc-macro2"
725 name = "proc-macro2"
726 version = "1.0.24"
726 version = "1.0.24"
727 source = "registry+https://github.com/rust-lang/crates.io-index"
727 source = "registry+https://github.com/rust-lang/crates.io-index"
728 checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
728 checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
729 dependencies = [
729 dependencies = [
730 "unicode-xid",
730 "unicode-xid",
731 ]
731 ]
732
732
733 [[package]]
733 [[package]]
734 name = "python27-sys"
734 name = "python27-sys"
735 version = "0.7.0"
735 version = "0.7.0"
736 source = "registry+https://github.com/rust-lang/crates.io-index"
736 source = "registry+https://github.com/rust-lang/crates.io-index"
737 checksum = "94670354e264300dde81a5864cbb6bfc9d56ac3dcf3a278c32cb52f816f4dfd1"
737 checksum = "94670354e264300dde81a5864cbb6bfc9d56ac3dcf3a278c32cb52f816f4dfd1"
738 dependencies = [
738 dependencies = [
739 "libc",
739 "libc",
740 "regex",
740 "regex",
741 ]
741 ]
742
742
743 [[package]]
743 [[package]]
744 name = "python3-sys"
744 name = "python3-sys"
745 version = "0.7.0"
745 version = "0.7.0"
746 source = "registry+https://github.com/rust-lang/crates.io-index"
746 source = "registry+https://github.com/rust-lang/crates.io-index"
747 checksum = "b18b32e64c103d5045f44644d7ddddd65336f7a0521f6fde673240a9ecceb77e"
747 checksum = "b18b32e64c103d5045f44644d7ddddd65336f7a0521f6fde673240a9ecceb77e"
748 dependencies = [
748 dependencies = [
749 "libc",
749 "libc",
750 "regex",
750 "regex",
751 ]
751 ]
752
752
753 [[package]]
753 [[package]]
754 name = "quick-error"
754 name = "quick-error"
755 version = "1.2.3"
755 version = "1.2.3"
756 source = "registry+https://github.com/rust-lang/crates.io-index"
756 source = "registry+https://github.com/rust-lang/crates.io-index"
757 checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
757 checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
758
758
759 [[package]]
759 [[package]]
760 name = "quote"
760 name = "quote"
761 version = "1.0.7"
761 version = "1.0.7"
762 source = "registry+https://github.com/rust-lang/crates.io-index"
762 source = "registry+https://github.com/rust-lang/crates.io-index"
763 checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
763 checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
764 dependencies = [
764 dependencies = [
765 "proc-macro2",
765 "proc-macro2",
766 ]
766 ]
767
767
768 [[package]]
768 [[package]]
769 name = "rand"
769 name = "rand"
770 version = "0.7.3"
770 version = "0.7.3"
771 source = "registry+https://github.com/rust-lang/crates.io-index"
771 source = "registry+https://github.com/rust-lang/crates.io-index"
772 checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
772 checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
773 dependencies = [
773 dependencies = [
774 "getrandom 0.1.15",
774 "getrandom 0.1.15",
775 "libc",
775 "libc",
776 "rand_chacha 0.2.2",
776 "rand_chacha 0.2.2",
777 "rand_core 0.5.1",
777 "rand_core 0.5.1",
778 "rand_hc 0.2.0",
778 "rand_hc 0.2.0",
779 ]
779 ]
780
780
781 [[package]]
781 [[package]]
782 name = "rand"
782 name = "rand"
783 version = "0.8.4"
783 version = "0.8.4"
784 source = "registry+https://github.com/rust-lang/crates.io-index"
784 source = "registry+https://github.com/rust-lang/crates.io-index"
785 checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
785 checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
786 dependencies = [
786 dependencies = [
787 "libc",
787 "libc",
788 "rand_chacha 0.3.1",
788 "rand_chacha 0.3.1",
789 "rand_core 0.6.3",
789 "rand_core 0.6.3",
790 "rand_hc 0.3.1",
790 "rand_hc 0.3.1",
791 ]
791 ]
792
792
793 [[package]]
793 [[package]]
794 name = "rand_chacha"
794 name = "rand_chacha"
795 version = "0.2.2"
795 version = "0.2.2"
796 source = "registry+https://github.com/rust-lang/crates.io-index"
796 source = "registry+https://github.com/rust-lang/crates.io-index"
797 checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
797 checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
798 dependencies = [
798 dependencies = [
799 "ppv-lite86",
799 "ppv-lite86",
800 "rand_core 0.5.1",
800 "rand_core 0.5.1",
801 ]
801 ]
802
802
803 [[package]]
803 [[package]]
804 name = "rand_chacha"
804 name = "rand_chacha"
805 version = "0.3.1"
805 version = "0.3.1"
806 source = "registry+https://github.com/rust-lang/crates.io-index"
806 source = "registry+https://github.com/rust-lang/crates.io-index"
807 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
807 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
808 dependencies = [
808 dependencies = [
809 "ppv-lite86",
809 "ppv-lite86",
810 "rand_core 0.6.3",
810 "rand_core 0.6.3",
811 ]
811 ]
812
812
813 [[package]]
813 [[package]]
814 name = "rand_core"
814 name = "rand_core"
815 version = "0.5.1"
815 version = "0.5.1"
816 source = "registry+https://github.com/rust-lang/crates.io-index"
816 source = "registry+https://github.com/rust-lang/crates.io-index"
817 checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
817 checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
818 dependencies = [
818 dependencies = [
819 "getrandom 0.1.15",
819 "getrandom 0.1.15",
820 ]
820 ]
821
821
822 [[package]]
822 [[package]]
823 name = "rand_core"
823 name = "rand_core"
824 version = "0.6.3"
824 version = "0.6.3"
825 source = "registry+https://github.com/rust-lang/crates.io-index"
825 source = "registry+https://github.com/rust-lang/crates.io-index"
826 checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
826 checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
827 dependencies = [
827 dependencies = [
828 "getrandom 0.2.4",
828 "getrandom 0.2.4",
829 ]
829 ]
830
830
831 [[package]]
831 [[package]]
832 name = "rand_distr"
832 name = "rand_distr"
833 version = "0.4.2"
833 version = "0.4.2"
834 source = "registry+https://github.com/rust-lang/crates.io-index"
834 source = "registry+https://github.com/rust-lang/crates.io-index"
835 checksum = "964d548f8e7d12e102ef183a0de7e98180c9f8729f555897a857b96e48122d2f"
835 checksum = "964d548f8e7d12e102ef183a0de7e98180c9f8729f555897a857b96e48122d2f"
836 dependencies = [
836 dependencies = [
837 "num-traits",
837 "num-traits",
838 "rand 0.8.4",
838 "rand 0.8.4",
839 ]
839 ]
840
840
841 [[package]]
841 [[package]]
842 name = "rand_hc"
842 name = "rand_hc"
843 version = "0.2.0"
843 version = "0.2.0"
844 source = "registry+https://github.com/rust-lang/crates.io-index"
844 source = "registry+https://github.com/rust-lang/crates.io-index"
845 checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
845 checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
846 dependencies = [
846 dependencies = [
847 "rand_core 0.5.1",
847 "rand_core 0.5.1",
848 ]
848 ]
849
849
850 [[package]]
850 [[package]]
851 name = "rand_hc"
851 name = "rand_hc"
852 version = "0.3.1"
852 version = "0.3.1"
853 source = "registry+https://github.com/rust-lang/crates.io-index"
853 source = "registry+https://github.com/rust-lang/crates.io-index"
854 checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
854 checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
855 dependencies = [
855 dependencies = [
856 "rand_core 0.6.3",
856 "rand_core 0.6.3",
857 ]
857 ]
858
858
859 [[package]]
859 [[package]]
860 name = "rand_pcg"
860 name = "rand_pcg"
861 version = "0.3.1"
861 version = "0.3.1"
862 source = "registry+https://github.com/rust-lang/crates.io-index"
862 source = "registry+https://github.com/rust-lang/crates.io-index"
863 checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e"
863 checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e"
864 dependencies = [
864 dependencies = [
865 "rand_core 0.6.3",
865 "rand_core 0.6.3",
866 ]
866 ]
867
867
868 [[package]]
868 [[package]]
869 name = "rand_xoshiro"
869 name = "rand_xoshiro"
870 version = "0.4.0"
870 version = "0.4.0"
871 source = "registry+https://github.com/rust-lang/crates.io-index"
871 source = "registry+https://github.com/rust-lang/crates.io-index"
872 checksum = "a9fcdd2e881d02f1d9390ae47ad8e5696a9e4be7b547a1da2afbc61973217004"
872 checksum = "a9fcdd2e881d02f1d9390ae47ad8e5696a9e4be7b547a1da2afbc61973217004"
873 dependencies = [
873 dependencies = [
874 "rand_core 0.5.1",
874 "rand_core 0.5.1",
875 ]
875 ]
876
876
877 [[package]]
877 [[package]]
878 name = "rayon"
878 name = "rayon"
879 version = "1.5.0"
879 version = "1.5.0"
880 source = "registry+https://github.com/rust-lang/crates.io-index"
880 source = "registry+https://github.com/rust-lang/crates.io-index"
881 checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
881 checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
882 dependencies = [
882 dependencies = [
883 "autocfg",
883 "autocfg",
884 "crossbeam-deque",
884 "crossbeam-deque",
885 "either",
885 "either",
886 "rayon-core",
886 "rayon-core",
887 ]
887 ]
888
888
889 [[package]]
889 [[package]]
890 name = "rayon-core"
890 name = "rayon-core"
891 version = "1.9.0"
891 version = "1.9.0"
892 source = "registry+https://github.com/rust-lang/crates.io-index"
892 source = "registry+https://github.com/rust-lang/crates.io-index"
893 checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
893 checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
894 dependencies = [
894 dependencies = [
895 "crossbeam-channel 0.5.0",
895 "crossbeam-channel 0.5.0",
896 "crossbeam-deque",
896 "crossbeam-deque",
897 "crossbeam-utils 0.8.1",
897 "crossbeam-utils 0.8.1",
898 "lazy_static",
898 "lazy_static",
899 "num_cpus",
899 "num_cpus",
900 ]
900 ]
901
901
902 [[package]]
902 [[package]]
903 name = "redox_syscall"
903 name = "redox_syscall"
904 version = "0.1.57"
904 version = "0.1.57"
905 source = "registry+https://github.com/rust-lang/crates.io-index"
905 source = "registry+https://github.com/rust-lang/crates.io-index"
906 checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
906 checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
907
907
908 [[package]]
908 [[package]]
909 name = "regex"
909 name = "regex"
910 version = "1.4.2"
910 version = "1.4.2"
911 source = "registry+https://github.com/rust-lang/crates.io-index"
911 source = "registry+https://github.com/rust-lang/crates.io-index"
912 checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
912 checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
913 dependencies = [
913 dependencies = [
914 "aho-corasick",
914 "aho-corasick",
915 "memchr",
915 "memchr",
916 "regex-syntax",
916 "regex-syntax",
917 "thread_local",
917 "thread_local",
918 ]
918 ]
919
919
920 [[package]]
920 [[package]]
921 name = "regex-syntax"
921 name = "regex-syntax"
922 version = "0.6.21"
922 version = "0.6.21"
923 source = "registry+https://github.com/rust-lang/crates.io-index"
923 source = "registry+https://github.com/rust-lang/crates.io-index"
924 checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
924 checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
925
925
926 [[package]]
926 [[package]]
927 name = "remove_dir_all"
927 name = "remove_dir_all"
928 version = "0.5.3"
928 version = "0.5.3"
929 source = "registry+https://github.com/rust-lang/crates.io-index"
929 source = "registry+https://github.com/rust-lang/crates.io-index"
930 checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
930 checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
931 dependencies = [
931 dependencies = [
932 "winapi",
932 "winapi",
933 ]
933 ]
934
934
935 [[package]]
935 [[package]]
936 name = "rhg"
936 name = "rhg"
937 version = "0.1.0"
937 version = "0.1.0"
938 dependencies = [
938 dependencies = [
939 "atty",
939 "atty",
940 "chrono",
940 "chrono",
941 "clap",
941 "clap",
942 "derive_more",
942 "derive_more",
943 "env_logger",
943 "env_logger",
944 "format-bytes",
944 "format-bytes",
945 "hg-core",
945 "hg-core",
946 "home",
946 "home",
947 "lazy_static",
947 "lazy_static",
948 "log",
948 "log",
949 "micro-timer",
949 "micro-timer",
950 "regex",
950 "regex",
951 "users",
951 "users",
952 "which",
952 ]
953 ]
953
954
954 [[package]]
955 [[package]]
955 name = "same-file"
956 name = "same-file"
956 version = "1.0.6"
957 version = "1.0.6"
957 source = "registry+https://github.com/rust-lang/crates.io-index"
958 source = "registry+https://github.com/rust-lang/crates.io-index"
958 checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
959 checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
959 dependencies = [
960 dependencies = [
960 "winapi-util",
961 "winapi-util",
961 ]
962 ]
962
963
963 [[package]]
964 [[package]]
964 name = "scopeguard"
965 name = "scopeguard"
965 version = "1.1.0"
966 version = "1.1.0"
966 source = "registry+https://github.com/rust-lang/crates.io-index"
967 source = "registry+https://github.com/rust-lang/crates.io-index"
967 checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
968 checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
968
969
969 [[package]]
970 [[package]]
970 name = "sha-1"
971 name = "sha-1"
971 version = "0.9.6"
972 version = "0.9.6"
972 source = "registry+https://github.com/rust-lang/crates.io-index"
973 source = "registry+https://github.com/rust-lang/crates.io-index"
973 checksum = "8c4cfa741c5832d0ef7fab46cabed29c2aae926db0b11bb2069edd8db5e64e16"
974 checksum = "8c4cfa741c5832d0ef7fab46cabed29c2aae926db0b11bb2069edd8db5e64e16"
974 dependencies = [
975 dependencies = [
975 "block-buffer",
976 "block-buffer",
976 "cfg-if 1.0.0",
977 "cfg-if 1.0.0",
977 "cpufeatures",
978 "cpufeatures",
978 "digest",
979 "digest",
979 "opaque-debug",
980 "opaque-debug",
980 ]
981 ]
981
982
982 [[package]]
983 [[package]]
983 name = "sized-chunks"
984 name = "sized-chunks"
984 version = "0.6.2"
985 version = "0.6.2"
985 source = "registry+https://github.com/rust-lang/crates.io-index"
986 source = "registry+https://github.com/rust-lang/crates.io-index"
986 checksum = "1ec31ceca5644fa6d444cc77548b88b67f46db6f7c71683b0f9336e671830d2f"
987 checksum = "1ec31ceca5644fa6d444cc77548b88b67f46db6f7c71683b0f9336e671830d2f"
987 dependencies = [
988 dependencies = [
988 "bitmaps",
989 "bitmaps",
989 "typenum",
990 "typenum",
990 ]
991 ]
991
992
992 [[package]]
993 [[package]]
993 name = "stable_deref_trait"
994 name = "stable_deref_trait"
994 version = "1.2.0"
995 version = "1.2.0"
995 source = "registry+https://github.com/rust-lang/crates.io-index"
996 source = "registry+https://github.com/rust-lang/crates.io-index"
996 checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
997 checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
997
998
998 [[package]]
999 [[package]]
999 name = "static_assertions"
1000 name = "static_assertions"
1000 version = "1.1.0"
1001 version = "1.1.0"
1001 source = "registry+https://github.com/rust-lang/crates.io-index"
1002 source = "registry+https://github.com/rust-lang/crates.io-index"
1002 checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
1003 checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
1003
1004
1004 [[package]]
1005 [[package]]
1005 name = "strsim"
1006 name = "strsim"
1006 version = "0.8.0"
1007 version = "0.8.0"
1007 source = "registry+https://github.com/rust-lang/crates.io-index"
1008 source = "registry+https://github.com/rust-lang/crates.io-index"
1008 checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
1009 checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
1009
1010
1010 [[package]]
1011 [[package]]
1011 name = "syn"
1012 name = "syn"
1012 version = "1.0.54"
1013 version = "1.0.54"
1013 source = "registry+https://github.com/rust-lang/crates.io-index"
1014 source = "registry+https://github.com/rust-lang/crates.io-index"
1014 checksum = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44"
1015 checksum = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44"
1015 dependencies = [
1016 dependencies = [
1016 "proc-macro2",
1017 "proc-macro2",
1017 "quote",
1018 "quote",
1018 "unicode-xid",
1019 "unicode-xid",
1019 ]
1020 ]
1020
1021
1021 [[package]]
1022 [[package]]
1022 name = "tempfile"
1023 name = "tempfile"
1023 version = "3.1.0"
1024 version = "3.1.0"
1024 source = "registry+https://github.com/rust-lang/crates.io-index"
1025 source = "registry+https://github.com/rust-lang/crates.io-index"
1025 checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
1026 checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
1026 dependencies = [
1027 dependencies = [
1027 "cfg-if 0.1.10",
1028 "cfg-if 0.1.10",
1028 "libc",
1029 "libc",
1029 "rand 0.7.3",
1030 "rand 0.7.3",
1030 "redox_syscall",
1031 "redox_syscall",
1031 "remove_dir_all",
1032 "remove_dir_all",
1032 "winapi",
1033 "winapi",
1033 ]
1034 ]
1034
1035
1035 [[package]]
1036 [[package]]
1036 name = "termcolor"
1037 name = "termcolor"
1037 version = "1.1.2"
1038 version = "1.1.2"
1038 source = "registry+https://github.com/rust-lang/crates.io-index"
1039 source = "registry+https://github.com/rust-lang/crates.io-index"
1039 checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
1040 checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
1040 dependencies = [
1041 dependencies = [
1041 "winapi-util",
1042 "winapi-util",
1042 ]
1043 ]
1043
1044
1044 [[package]]
1045 [[package]]
1045 name = "textwrap"
1046 name = "textwrap"
1046 version = "0.11.0"
1047 version = "0.11.0"
1047 source = "registry+https://github.com/rust-lang/crates.io-index"
1048 source = "registry+https://github.com/rust-lang/crates.io-index"
1048 checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
1049 checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
1049 dependencies = [
1050 dependencies = [
1050 "unicode-width",
1051 "unicode-width",
1051 ]
1052 ]
1052
1053
1053 [[package]]
1054 [[package]]
1054 name = "thread_local"
1055 name = "thread_local"
1055 version = "1.0.1"
1056 version = "1.0.1"
1056 source = "registry+https://github.com/rust-lang/crates.io-index"
1057 source = "registry+https://github.com/rust-lang/crates.io-index"
1057 checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
1058 checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
1058 dependencies = [
1059 dependencies = [
1059 "lazy_static",
1060 "lazy_static",
1060 ]
1061 ]
1061
1062
1062 [[package]]
1063 [[package]]
1063 name = "time"
1064 name = "time"
1064 version = "0.1.44"
1065 version = "0.1.44"
1065 source = "registry+https://github.com/rust-lang/crates.io-index"
1066 source = "registry+https://github.com/rust-lang/crates.io-index"
1066 checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
1067 checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
1067 dependencies = [
1068 dependencies = [
1068 "libc",
1069 "libc",
1069 "wasi 0.10.0+wasi-snapshot-preview1",
1070 "wasi 0.10.0+wasi-snapshot-preview1",
1070 "winapi",
1071 "winapi",
1071 ]
1072 ]
1072
1073
1073 [[package]]
1074 [[package]]
1074 name = "twox-hash"
1075 name = "twox-hash"
1075 version = "1.6.0"
1076 version = "1.6.0"
1076 source = "registry+https://github.com/rust-lang/crates.io-index"
1077 source = "registry+https://github.com/rust-lang/crates.io-index"
1077 checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59"
1078 checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59"
1078 dependencies = [
1079 dependencies = [
1079 "cfg-if 0.1.10",
1080 "cfg-if 0.1.10",
1080 "rand 0.7.3",
1081 "rand 0.7.3",
1081 "static_assertions",
1082 "static_assertions",
1082 ]
1083 ]
1083
1084
1084 [[package]]
1085 [[package]]
1085 name = "typenum"
1086 name = "typenum"
1086 version = "1.12.0"
1087 version = "1.12.0"
1087 source = "registry+https://github.com/rust-lang/crates.io-index"
1088 source = "registry+https://github.com/rust-lang/crates.io-index"
1088 checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
1089 checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
1089
1090
1090 [[package]]
1091 [[package]]
1091 name = "unicode-width"
1092 name = "unicode-width"
1092 version = "0.1.8"
1093 version = "0.1.8"
1093 source = "registry+https://github.com/rust-lang/crates.io-index"
1094 source = "registry+https://github.com/rust-lang/crates.io-index"
1094 checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
1095 checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
1095
1096
1096 [[package]]
1097 [[package]]
1097 name = "unicode-xid"
1098 name = "unicode-xid"
1098 version = "0.2.1"
1099 version = "0.2.1"
1099 source = "registry+https://github.com/rust-lang/crates.io-index"
1100 source = "registry+https://github.com/rust-lang/crates.io-index"
1100 checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
1101 checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
1101
1102
1102 [[package]]
1103 [[package]]
1103 name = "users"
1104 name = "users"
1104 version = "0.11.0"
1105 version = "0.11.0"
1105 source = "registry+https://github.com/rust-lang/crates.io-index"
1106 source = "registry+https://github.com/rust-lang/crates.io-index"
1106 checksum = "24cc0f6d6f267b73e5a2cadf007ba8f9bc39c6a6f9666f8cf25ea809a153b032"
1107 checksum = "24cc0f6d6f267b73e5a2cadf007ba8f9bc39c6a6f9666f8cf25ea809a153b032"
1107 dependencies = [
1108 dependencies = [
1108 "libc",
1109 "libc",
1109 "log",
1110 "log",
1110 ]
1111 ]
1111
1112
1112 [[package]]
1113 [[package]]
1113 name = "vcpkg"
1114 name = "vcpkg"
1114 version = "0.2.11"
1115 version = "0.2.11"
1115 source = "registry+https://github.com/rust-lang/crates.io-index"
1116 source = "registry+https://github.com/rust-lang/crates.io-index"
1116 checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb"
1117 checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb"
1117
1118
1118 [[package]]
1119 [[package]]
1119 name = "vcsgraph"
1120 name = "vcsgraph"
1120 version = "0.2.0"
1121 version = "0.2.0"
1121 source = "registry+https://github.com/rust-lang/crates.io-index"
1122 source = "registry+https://github.com/rust-lang/crates.io-index"
1122 checksum = "4cb68c231e2575f7503a7c19213875f9d4ec2e84e963a56ce3de4b6bee351ef7"
1123 checksum = "4cb68c231e2575f7503a7c19213875f9d4ec2e84e963a56ce3de4b6bee351ef7"
1123 dependencies = [
1124 dependencies = [
1124 "hex",
1125 "hex",
1125 "rand 0.7.3",
1126 "rand 0.7.3",
1126 "sha-1",
1127 "sha-1",
1127 ]
1128 ]
1128
1129
1129 [[package]]
1130 [[package]]
1130 name = "vec_map"
1131 name = "vec_map"
1131 version = "0.8.2"
1132 version = "0.8.2"
1132 source = "registry+https://github.com/rust-lang/crates.io-index"
1133 source = "registry+https://github.com/rust-lang/crates.io-index"
1133 checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
1134 checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
1134
1135
1135 [[package]]
1136 [[package]]
1136 name = "version_check"
1137 name = "version_check"
1137 version = "0.9.2"
1138 version = "0.9.2"
1138 source = "registry+https://github.com/rust-lang/crates.io-index"
1139 source = "registry+https://github.com/rust-lang/crates.io-index"
1139 checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
1140 checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
1140
1141
1141 [[package]]
1142 [[package]]
1142 name = "wasi"
1143 name = "wasi"
1143 version = "0.9.0+wasi-snapshot-preview1"
1144 version = "0.9.0+wasi-snapshot-preview1"
1144 source = "registry+https://github.com/rust-lang/crates.io-index"
1145 source = "registry+https://github.com/rust-lang/crates.io-index"
1145 checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
1146 checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
1146
1147
1147 [[package]]
1148 [[package]]
1148 name = "wasi"
1149 name = "wasi"
1149 version = "0.10.0+wasi-snapshot-preview1"
1150 version = "0.10.0+wasi-snapshot-preview1"
1150 source = "registry+https://github.com/rust-lang/crates.io-index"
1151 source = "registry+https://github.com/rust-lang/crates.io-index"
1151 checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
1152 checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
1152
1153
1153 [[package]]
1154 [[package]]
1155 name = "which"
1156 version = "4.2.5"
1157 source = "registry+https://github.com/rust-lang/crates.io-index"
1158 checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae"
1159 dependencies = [
1160 "either",
1161 "lazy_static",
1162 "libc",
1163 ]
1164
1165 [[package]]
1154 name = "winapi"
1166 name = "winapi"
1155 version = "0.3.9"
1167 version = "0.3.9"
1156 source = "registry+https://github.com/rust-lang/crates.io-index"
1168 source = "registry+https://github.com/rust-lang/crates.io-index"
1157 checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1169 checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1158 dependencies = [
1170 dependencies = [
1159 "winapi-i686-pc-windows-gnu",
1171 "winapi-i686-pc-windows-gnu",
1160 "winapi-x86_64-pc-windows-gnu",
1172 "winapi-x86_64-pc-windows-gnu",
1161 ]
1173 ]
1162
1174
1163 [[package]]
1175 [[package]]
1164 name = "winapi-i686-pc-windows-gnu"
1176 name = "winapi-i686-pc-windows-gnu"
1165 version = "0.4.0"
1177 version = "0.4.0"
1166 source = "registry+https://github.com/rust-lang/crates.io-index"
1178 source = "registry+https://github.com/rust-lang/crates.io-index"
1167 checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1179 checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1168
1180
1169 [[package]]
1181 [[package]]
1170 name = "winapi-util"
1182 name = "winapi-util"
1171 version = "0.1.5"
1183 version = "0.1.5"
1172 source = "registry+https://github.com/rust-lang/crates.io-index"
1184 source = "registry+https://github.com/rust-lang/crates.io-index"
1173 checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
1185 checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
1174 dependencies = [
1186 dependencies = [
1175 "winapi",
1187 "winapi",
1176 ]
1188 ]
1177
1189
1178 [[package]]
1190 [[package]]
1179 name = "winapi-x86_64-pc-windows-gnu"
1191 name = "winapi-x86_64-pc-windows-gnu"
1180 version = "0.4.0"
1192 version = "0.4.0"
1181 source = "registry+https://github.com/rust-lang/crates.io-index"
1193 source = "registry+https://github.com/rust-lang/crates.io-index"
1182 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1194 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1183
1195
1184 [[package]]
1196 [[package]]
1185 name = "zstd"
1197 name = "zstd"
1186 version = "0.5.3+zstd.1.4.5"
1198 version = "0.5.3+zstd.1.4.5"
1187 source = "registry+https://github.com/rust-lang/crates.io-index"
1199 source = "registry+https://github.com/rust-lang/crates.io-index"
1188 checksum = "01b32eaf771efa709e8308605bbf9319bf485dc1503179ec0469b611937c0cd8"
1200 checksum = "01b32eaf771efa709e8308605bbf9319bf485dc1503179ec0469b611937c0cd8"
1189 dependencies = [
1201 dependencies = [
1190 "zstd-safe",
1202 "zstd-safe",
1191 ]
1203 ]
1192
1204
1193 [[package]]
1205 [[package]]
1194 name = "zstd-safe"
1206 name = "zstd-safe"
1195 version = "2.0.5+zstd.1.4.5"
1207 version = "2.0.5+zstd.1.4.5"
1196 source = "registry+https://github.com/rust-lang/crates.io-index"
1208 source = "registry+https://github.com/rust-lang/crates.io-index"
1197 checksum = "1cfb642e0d27f64729a639c52db457e0ae906e7bc6f5fe8f5c453230400f1055"
1209 checksum = "1cfb642e0d27f64729a639c52db457e0ae906e7bc6f5fe8f5c453230400f1055"
1198 dependencies = [
1210 dependencies = [
1199 "libc",
1211 "libc",
1200 "zstd-sys",
1212 "zstd-sys",
1201 ]
1213 ]
1202
1214
1203 [[package]]
1215 [[package]]
1204 name = "zstd-sys"
1216 name = "zstd-sys"
1205 version = "1.4.17+zstd.1.4.5"
1217 version = "1.4.17+zstd.1.4.5"
1206 source = "registry+https://github.com/rust-lang/crates.io-index"
1218 source = "registry+https://github.com/rust-lang/crates.io-index"
1207 checksum = "b89249644df056b522696b1bb9e7c18c87e8ffa3e2f0dc3b0155875d6498f01b"
1219 checksum = "b89249644df056b522696b1bb9e7c18c87e8ffa3e2f0dc3b0155875d6498f01b"
1208 dependencies = [
1220 dependencies = [
1209 "cc",
1221 "cc",
1210 "glob",
1222 "glob",
1211 "itertools",
1223 "itertools",
1212 "libc",
1224 "libc",
1213 ]
1225 ]
@@ -1,19 +1,22 b''
1 pub type ExitCode = i32;
1 pub type ExitCode = i32;
2
2
3 /// Successful exit
3 /// Successful exit
4 pub const OK: ExitCode = 0;
4 pub const OK: ExitCode = 0;
5
5
6 /// Generic abort
6 /// Generic abort
7 pub const ABORT: ExitCode = 255;
7 pub const ABORT: ExitCode = 255;
8
8
9 // Abort when there is a config related error
9 // Abort when there is a config related error
10 pub const CONFIG_ERROR_ABORT: ExitCode = 30;
10 pub const CONFIG_ERROR_ABORT: ExitCode = 30;
11
11
12 // Abort when there is an error while parsing config
12 // Abort when there is an error while parsing config
13 pub const CONFIG_PARSE_ERROR_ABORT: ExitCode = 10;
13 pub const CONFIG_PARSE_ERROR_ABORT: ExitCode = 10;
14
14
15 /// Generic something completed but did not succeed
15 /// Generic something completed but did not succeed
16 pub const UNSUCCESSFUL: ExitCode = 1;
16 pub const UNSUCCESSFUL: ExitCode = 1;
17
17
18 /// Command or feature not implemented by rhg
18 /// Command or feature not implemented by rhg
19 pub const UNIMPLEMENTED: ExitCode = 252;
19 pub const UNIMPLEMENTED: ExitCode = 252;
20
21 /// The fallback path is not valid
22 pub const INVALID_FALLBACK: ExitCode = 253;
@@ -1,23 +1,24 b''
1 [package]
1 [package]
2 name = "rhg"
2 name = "rhg"
3 version = "0.1.0"
3 version = "0.1.0"
4 authors = [
4 authors = [
5 "Antoine Cezar <antoine.cezar@octobus.net>",
5 "Antoine Cezar <antoine.cezar@octobus.net>",
6 "Raphaël Gomès <raphael.gomes@octobus.net>",
6 "Raphaël Gomès <raphael.gomes@octobus.net>",
7 ]
7 ]
8 edition = "2018"
8 edition = "2018"
9
9
10 [dependencies]
10 [dependencies]
11 atty = "0.2"
11 atty = "0.2"
12 hg-core = { path = "../hg-core"}
12 hg-core = { path = "../hg-core"}
13 chrono = "0.4.19"
13 chrono = "0.4.19"
14 clap = "2.33.1"
14 clap = "2.33.1"
15 derive_more = "0.99"
15 derive_more = "0.99"
16 home = "0.5.3"
16 home = "0.5.3"
17 lazy_static = "1.4.0"
17 lazy_static = "1.4.0"
18 log = "0.4.11"
18 log = "0.4.11"
19 micro-timer = "0.3.1"
19 micro-timer = "0.3.1"
20 regex = "1.3.9"
20 regex = "1.3.9"
21 env_logger = "0.7.1"
21 env_logger = "0.7.1"
22 format-bytes = "0.3.0"
22 format-bytes = "0.3.0"
23 users = "0.11.0"
23 users = "0.11.0"
24 which = "4.2.5"
@@ -1,208 +1,211 b''
1 use crate::ui::utf8_to_local;
1 use crate::ui::utf8_to_local;
2 use crate::ui::UiError;
2 use crate::ui::UiError;
3 use crate::NoRepoInCwdError;
3 use crate::NoRepoInCwdError;
4 use format_bytes::format_bytes;
4 use format_bytes::format_bytes;
5 use hg::config::{ConfigError, ConfigParseError, ConfigValueParseError};
5 use hg::config::{ConfigError, ConfigParseError, ConfigValueParseError};
6 use hg::dirstate_tree::on_disk::DirstateV2ParseError;
6 use hg::dirstate_tree::on_disk::DirstateV2ParseError;
7 use hg::errors::HgError;
7 use hg::errors::HgError;
8 use hg::exit_codes;
8 use hg::exit_codes;
9 use hg::repo::RepoError;
9 use hg::repo::RepoError;
10 use hg::revlog::revlog::RevlogError;
10 use hg::revlog::revlog::RevlogError;
11 use hg::utils::files::get_bytes_from_path;
11 use hg::utils::files::get_bytes_from_path;
12 use hg::{DirstateError, DirstateMapError, StatusError};
12 use hg::{DirstateError, DirstateMapError, StatusError};
13 use std::convert::From;
13 use std::convert::From;
14
14
15 /// The kind of command error
15 /// The kind of command error
16 #[derive(Debug)]
16 #[derive(Debug)]
17 pub enum CommandError {
17 pub enum CommandError {
18 /// Exit with an error message and "standard" failure exit code.
18 /// Exit with an error message and "standard" failure exit code.
19 Abort {
19 Abort {
20 message: Vec<u8>,
20 message: Vec<u8>,
21 detailed_exit_code: exit_codes::ExitCode,
21 detailed_exit_code: exit_codes::ExitCode,
22 },
22 },
23
23
24 /// Exit with a failure exit code but no message.
24 /// Exit with a failure exit code but no message.
25 Unsuccessful,
25 Unsuccessful,
26
26
27 /// Encountered something (such as a CLI argument, repository layout, …)
27 /// Encountered something (such as a CLI argument, repository layout, …)
28 /// not supported by this version of `rhg`. Depending on configuration
28 /// not supported by this version of `rhg`. Depending on configuration
29 /// `rhg` may attempt to silently fall back to Python-based `hg`, which
29 /// `rhg` may attempt to silently fall back to Python-based `hg`, which
30 /// may or may not support this feature.
30 /// may or may not support this feature.
31 UnsupportedFeature { message: Vec<u8> },
31 UnsupportedFeature { message: Vec<u8> },
32 /// The fallback executable does not exist (or has some other problem if
33 /// we end up being more precise about broken fallbacks).
34 InvalidFallback { path: Vec<u8>, err: String },
32 }
35 }
33
36
34 impl CommandError {
37 impl CommandError {
35 pub fn abort(message: impl AsRef<str>) -> Self {
38 pub fn abort(message: impl AsRef<str>) -> Self {
36 CommandError::abort_with_exit_code(message, exit_codes::ABORT)
39 CommandError::abort_with_exit_code(message, exit_codes::ABORT)
37 }
40 }
38
41
39 pub fn abort_with_exit_code(
42 pub fn abort_with_exit_code(
40 message: impl AsRef<str>,
43 message: impl AsRef<str>,
41 detailed_exit_code: exit_codes::ExitCode,
44 detailed_exit_code: exit_codes::ExitCode,
42 ) -> Self {
45 ) -> Self {
43 CommandError::Abort {
46 CommandError::Abort {
44 // TODO: bytes-based (instead of Unicode-based) formatting
47 // TODO: bytes-based (instead of Unicode-based) formatting
45 // of error messages to handle non-UTF-8 filenames etc:
48 // of error messages to handle non-UTF-8 filenames etc:
46 // https://www.mercurial-scm.org/wiki/EncodingStrategy#Mixing_output
49 // https://www.mercurial-scm.org/wiki/EncodingStrategy#Mixing_output
47 message: utf8_to_local(message.as_ref()).into(),
50 message: utf8_to_local(message.as_ref()).into(),
48 detailed_exit_code: detailed_exit_code,
51 detailed_exit_code: detailed_exit_code,
49 }
52 }
50 }
53 }
51
54
52 pub fn unsupported(message: impl AsRef<str>) -> Self {
55 pub fn unsupported(message: impl AsRef<str>) -> Self {
53 CommandError::UnsupportedFeature {
56 CommandError::UnsupportedFeature {
54 message: utf8_to_local(message.as_ref()).into(),
57 message: utf8_to_local(message.as_ref()).into(),
55 }
58 }
56 }
59 }
57 }
60 }
58
61
59 /// For now we don’t differenciate between invalid CLI args and valid for `hg`
62 /// For now we don’t differenciate between invalid CLI args and valid for `hg`
60 /// but not supported yet by `rhg`.
63 /// but not supported yet by `rhg`.
61 impl From<clap::Error> for CommandError {
64 impl From<clap::Error> for CommandError {
62 fn from(error: clap::Error) -> Self {
65 fn from(error: clap::Error) -> Self {
63 CommandError::unsupported(error.to_string())
66 CommandError::unsupported(error.to_string())
64 }
67 }
65 }
68 }
66
69
67 impl From<HgError> for CommandError {
70 impl From<HgError> for CommandError {
68 fn from(error: HgError) -> Self {
71 fn from(error: HgError) -> Self {
69 match error {
72 match error {
70 HgError::UnsupportedFeature(message) => {
73 HgError::UnsupportedFeature(message) => {
71 CommandError::unsupported(message)
74 CommandError::unsupported(message)
72 }
75 }
73 HgError::Abort {
76 HgError::Abort {
74 message,
77 message,
75 detailed_exit_code,
78 detailed_exit_code,
76 } => {
79 } => {
77 CommandError::abort_with_exit_code(message, detailed_exit_code)
80 CommandError::abort_with_exit_code(message, detailed_exit_code)
78 }
81 }
79 _ => CommandError::abort(error.to_string()),
82 _ => CommandError::abort(error.to_string()),
80 }
83 }
81 }
84 }
82 }
85 }
83
86
84 impl From<ConfigValueParseError> for CommandError {
87 impl From<ConfigValueParseError> for CommandError {
85 fn from(error: ConfigValueParseError) -> Self {
88 fn from(error: ConfigValueParseError) -> Self {
86 CommandError::abort_with_exit_code(
89 CommandError::abort_with_exit_code(
87 error.to_string(),
90 error.to_string(),
88 exit_codes::CONFIG_ERROR_ABORT,
91 exit_codes::CONFIG_ERROR_ABORT,
89 )
92 )
90 }
93 }
91 }
94 }
92
95
93 impl From<UiError> for CommandError {
96 impl From<UiError> for CommandError {
94 fn from(_error: UiError) -> Self {
97 fn from(_error: UiError) -> Self {
95 // If we already failed writing to stdout or stderr,
98 // If we already failed writing to stdout or stderr,
96 // writing an error message to stderr about it would be likely to fail
99 // writing an error message to stderr about it would be likely to fail
97 // too.
100 // too.
98 CommandError::abort("")
101 CommandError::abort("")
99 }
102 }
100 }
103 }
101
104
102 impl From<RepoError> for CommandError {
105 impl From<RepoError> for CommandError {
103 fn from(error: RepoError) -> Self {
106 fn from(error: RepoError) -> Self {
104 match error {
107 match error {
105 RepoError::NotFound { at } => CommandError::Abort {
108 RepoError::NotFound { at } => CommandError::Abort {
106 message: format_bytes!(
109 message: format_bytes!(
107 b"abort: repository {} not found",
110 b"abort: repository {} not found",
108 get_bytes_from_path(at)
111 get_bytes_from_path(at)
109 ),
112 ),
110 detailed_exit_code: exit_codes::ABORT,
113 detailed_exit_code: exit_codes::ABORT,
111 },
114 },
112 RepoError::ConfigParseError(error) => error.into(),
115 RepoError::ConfigParseError(error) => error.into(),
113 RepoError::Other(error) => error.into(),
116 RepoError::Other(error) => error.into(),
114 }
117 }
115 }
118 }
116 }
119 }
117
120
118 impl<'a> From<&'a NoRepoInCwdError> for CommandError {
121 impl<'a> From<&'a NoRepoInCwdError> for CommandError {
119 fn from(error: &'a NoRepoInCwdError) -> Self {
122 fn from(error: &'a NoRepoInCwdError) -> Self {
120 let NoRepoInCwdError { cwd } = error;
123 let NoRepoInCwdError { cwd } = error;
121 CommandError::Abort {
124 CommandError::Abort {
122 message: format_bytes!(
125 message: format_bytes!(
123 b"abort: no repository found in '{}' (.hg not found)!",
126 b"abort: no repository found in '{}' (.hg not found)!",
124 get_bytes_from_path(cwd)
127 get_bytes_from_path(cwd)
125 ),
128 ),
126 detailed_exit_code: exit_codes::ABORT,
129 detailed_exit_code: exit_codes::ABORT,
127 }
130 }
128 }
131 }
129 }
132 }
130
133
131 impl From<ConfigError> for CommandError {
134 impl From<ConfigError> for CommandError {
132 fn from(error: ConfigError) -> Self {
135 fn from(error: ConfigError) -> Self {
133 match error {
136 match error {
134 ConfigError::Parse(error) => error.into(),
137 ConfigError::Parse(error) => error.into(),
135 ConfigError::Other(error) => error.into(),
138 ConfigError::Other(error) => error.into(),
136 }
139 }
137 }
140 }
138 }
141 }
139
142
140 impl From<ConfigParseError> for CommandError {
143 impl From<ConfigParseError> for CommandError {
141 fn from(error: ConfigParseError) -> Self {
144 fn from(error: ConfigParseError) -> Self {
142 let ConfigParseError {
145 let ConfigParseError {
143 origin,
146 origin,
144 line,
147 line,
145 message,
148 message,
146 } = error;
149 } = error;
147 let line_message = if let Some(line_number) = line {
150 let line_message = if let Some(line_number) = line {
148 format_bytes!(b":{}", line_number.to_string().into_bytes())
151 format_bytes!(b":{}", line_number.to_string().into_bytes())
149 } else {
152 } else {
150 Vec::new()
153 Vec::new()
151 };
154 };
152 CommandError::Abort {
155 CommandError::Abort {
153 message: format_bytes!(
156 message: format_bytes!(
154 b"config error at {}{}: {}",
157 b"config error at {}{}: {}",
155 origin,
158 origin,
156 line_message,
159 line_message,
157 message
160 message
158 ),
161 ),
159 detailed_exit_code: exit_codes::CONFIG_ERROR_ABORT,
162 detailed_exit_code: exit_codes::CONFIG_ERROR_ABORT,
160 }
163 }
161 }
164 }
162 }
165 }
163
166
164 impl From<(RevlogError, &str)> for CommandError {
167 impl From<(RevlogError, &str)> for CommandError {
165 fn from((err, rev): (RevlogError, &str)) -> CommandError {
168 fn from((err, rev): (RevlogError, &str)) -> CommandError {
166 match err {
169 match err {
167 RevlogError::WDirUnsupported => CommandError::abort(
170 RevlogError::WDirUnsupported => CommandError::abort(
168 "abort: working directory revision cannot be specified",
171 "abort: working directory revision cannot be specified",
169 ),
172 ),
170 RevlogError::InvalidRevision => CommandError::abort(format!(
173 RevlogError::InvalidRevision => CommandError::abort(format!(
171 "abort: invalid revision identifier: {}",
174 "abort: invalid revision identifier: {}",
172 rev
175 rev
173 )),
176 )),
174 RevlogError::AmbiguousPrefix => CommandError::abort(format!(
177 RevlogError::AmbiguousPrefix => CommandError::abort(format!(
175 "abort: ambiguous revision identifier: {}",
178 "abort: ambiguous revision identifier: {}",
176 rev
179 rev
177 )),
180 )),
178 RevlogError::Other(error) => error.into(),
181 RevlogError::Other(error) => error.into(),
179 }
182 }
180 }
183 }
181 }
184 }
182
185
183 impl From<StatusError> for CommandError {
186 impl From<StatusError> for CommandError {
184 fn from(error: StatusError) -> Self {
187 fn from(error: StatusError) -> Self {
185 CommandError::abort(format!("{}", error))
188 CommandError::abort(format!("{}", error))
186 }
189 }
187 }
190 }
188
191
189 impl From<DirstateMapError> for CommandError {
192 impl From<DirstateMapError> for CommandError {
190 fn from(error: DirstateMapError) -> Self {
193 fn from(error: DirstateMapError) -> Self {
191 CommandError::abort(format!("{}", error))
194 CommandError::abort(format!("{}", error))
192 }
195 }
193 }
196 }
194
197
195 impl From<DirstateError> for CommandError {
198 impl From<DirstateError> for CommandError {
196 fn from(error: DirstateError) -> Self {
199 fn from(error: DirstateError) -> Self {
197 match error {
200 match error {
198 DirstateError::Common(error) => error.into(),
201 DirstateError::Common(error) => error.into(),
199 DirstateError::Map(error) => error.into(),
202 DirstateError::Map(error) => error.into(),
200 }
203 }
201 }
204 }
202 }
205 }
203
206
204 impl From<DirstateV2ParseError> for CommandError {
207 impl From<DirstateV2ParseError> for CommandError {
205 fn from(error: DirstateV2ParseError) -> Self {
208 fn from(error: DirstateV2ParseError) -> Self {
206 HgError::from(error).into()
209 HgError::from(error).into()
207 }
210 }
208 }
211 }
@@ -1,708 +1,729 b''
1 extern crate log;
1 extern crate log;
2 use crate::error::CommandError;
2 use crate::error::CommandError;
3 use crate::ui::{local_to_utf8, Ui};
3 use crate::ui::{local_to_utf8, Ui};
4 use clap::App;
4 use clap::App;
5 use clap::AppSettings;
5 use clap::AppSettings;
6 use clap::Arg;
6 use clap::Arg;
7 use clap::ArgMatches;
7 use clap::ArgMatches;
8 use format_bytes::{format_bytes, join};
8 use format_bytes::{format_bytes, join};
9 use hg::config::{Config, ConfigSource};
9 use hg::config::{Config, ConfigSource};
10 use hg::exit_codes;
10 use hg::exit_codes;
11 use hg::repo::{Repo, RepoError};
11 use hg::repo::{Repo, RepoError};
12 use hg::utils::files::{get_bytes_from_os_str, get_path_from_bytes};
12 use hg::utils::files::{get_bytes_from_os_str, get_path_from_bytes};
13 use hg::utils::SliceExt;
13 use hg::utils::SliceExt;
14 use std::collections::HashSet;
14 use std::collections::HashSet;
15 use std::ffi::OsString;
15 use std::ffi::OsString;
16 use std::os::unix::prelude::CommandExt;
16 use std::path::PathBuf;
17 use std::path::PathBuf;
17 use std::process::Command;
18 use std::process::Command;
18
19
19 mod blackbox;
20 mod blackbox;
20 mod color;
21 mod color;
21 mod error;
22 mod error;
22 mod ui;
23 mod ui;
23 pub mod utils {
24 pub mod utils {
24 pub mod path_utils;
25 pub mod path_utils;
25 }
26 }
26
27
27 fn main_with_result(
28 fn main_with_result(
28 process_start_time: &blackbox::ProcessStartTime,
29 process_start_time: &blackbox::ProcessStartTime,
29 ui: &ui::Ui,
30 ui: &ui::Ui,
30 repo: Result<&Repo, &NoRepoInCwdError>,
31 repo: Result<&Repo, &NoRepoInCwdError>,
31 config: &Config,
32 config: &Config,
32 ) -> Result<(), CommandError> {
33 ) -> Result<(), CommandError> {
33 check_unsupported(config, repo)?;
34 check_unsupported(config, repo)?;
34
35
35 let app = App::new("rhg")
36 let app = App::new("rhg")
36 .global_setting(AppSettings::AllowInvalidUtf8)
37 .global_setting(AppSettings::AllowInvalidUtf8)
37 .global_setting(AppSettings::DisableVersion)
38 .global_setting(AppSettings::DisableVersion)
38 .setting(AppSettings::SubcommandRequired)
39 .setting(AppSettings::SubcommandRequired)
39 .setting(AppSettings::VersionlessSubcommands)
40 .setting(AppSettings::VersionlessSubcommands)
40 .arg(
41 .arg(
41 Arg::with_name("repository")
42 Arg::with_name("repository")
42 .help("repository root directory")
43 .help("repository root directory")
43 .short("-R")
44 .short("-R")
44 .long("--repository")
45 .long("--repository")
45 .value_name("REPO")
46 .value_name("REPO")
46 .takes_value(true)
47 .takes_value(true)
47 // Both ok: `hg -R ./foo log` or `hg log -R ./foo`
48 // Both ok: `hg -R ./foo log` or `hg log -R ./foo`
48 .global(true),
49 .global(true),
49 )
50 )
50 .arg(
51 .arg(
51 Arg::with_name("config")
52 Arg::with_name("config")
52 .help("set/override config option (use 'section.name=value')")
53 .help("set/override config option (use 'section.name=value')")
53 .long("--config")
54 .long("--config")
54 .value_name("CONFIG")
55 .value_name("CONFIG")
55 .takes_value(true)
56 .takes_value(true)
56 .global(true)
57 .global(true)
57 // Ok: `--config section.key1=val --config section.key2=val2`
58 // Ok: `--config section.key1=val --config section.key2=val2`
58 .multiple(true)
59 .multiple(true)
59 // Not ok: `--config section.key1=val section.key2=val2`
60 // Not ok: `--config section.key1=val section.key2=val2`
60 .number_of_values(1),
61 .number_of_values(1),
61 )
62 )
62 .arg(
63 .arg(
63 Arg::with_name("cwd")
64 Arg::with_name("cwd")
64 .help("change working directory")
65 .help("change working directory")
65 .long("--cwd")
66 .long("--cwd")
66 .value_name("DIR")
67 .value_name("DIR")
67 .takes_value(true)
68 .takes_value(true)
68 .global(true),
69 .global(true),
69 )
70 )
70 .arg(
71 .arg(
71 Arg::with_name("color")
72 Arg::with_name("color")
72 .help("when to colorize (boolean, always, auto, never, or debug)")
73 .help("when to colorize (boolean, always, auto, never, or debug)")
73 .long("--color")
74 .long("--color")
74 .value_name("TYPE")
75 .value_name("TYPE")
75 .takes_value(true)
76 .takes_value(true)
76 .global(true),
77 .global(true),
77 )
78 )
78 .version("0.0.1");
79 .version("0.0.1");
79 let app = add_subcommand_args(app);
80 let app = add_subcommand_args(app);
80
81
81 let matches = app.clone().get_matches_safe()?;
82 let matches = app.clone().get_matches_safe()?;
82
83
83 let (subcommand_name, subcommand_matches) = matches.subcommand();
84 let (subcommand_name, subcommand_matches) = matches.subcommand();
84
85
85 // Mercurial allows users to define "defaults" for commands, fallback
86 // Mercurial allows users to define "defaults" for commands, fallback
86 // if a default is detected for the current command
87 // if a default is detected for the current command
87 let defaults = config.get_str(b"defaults", subcommand_name.as_bytes());
88 let defaults = config.get_str(b"defaults", subcommand_name.as_bytes());
88 if defaults?.is_some() {
89 if defaults?.is_some() {
89 let msg = "`defaults` config set";
90 let msg = "`defaults` config set";
90 return Err(CommandError::unsupported(msg));
91 return Err(CommandError::unsupported(msg));
91 }
92 }
92
93
93 for prefix in ["pre", "post", "fail"].iter() {
94 for prefix in ["pre", "post", "fail"].iter() {
94 // Mercurial allows users to define generic hooks for commands,
95 // Mercurial allows users to define generic hooks for commands,
95 // fallback if any are detected
96 // fallback if any are detected
96 let item = format!("{}-{}", prefix, subcommand_name);
97 let item = format!("{}-{}", prefix, subcommand_name);
97 let hook_for_command = config.get_str(b"hooks", item.as_bytes())?;
98 let hook_for_command = config.get_str(b"hooks", item.as_bytes())?;
98 if hook_for_command.is_some() {
99 if hook_for_command.is_some() {
99 let msg = format!("{}-{} hook defined", prefix, subcommand_name);
100 let msg = format!("{}-{} hook defined", prefix, subcommand_name);
100 return Err(CommandError::unsupported(msg));
101 return Err(CommandError::unsupported(msg));
101 }
102 }
102 }
103 }
103 let run = subcommand_run_fn(subcommand_name)
104 let run = subcommand_run_fn(subcommand_name)
104 .expect("unknown subcommand name from clap despite AppSettings::SubcommandRequired");
105 .expect("unknown subcommand name from clap despite AppSettings::SubcommandRequired");
105 let subcommand_args = subcommand_matches
106 let subcommand_args = subcommand_matches
106 .expect("no subcommand arguments from clap despite AppSettings::SubcommandRequired");
107 .expect("no subcommand arguments from clap despite AppSettings::SubcommandRequired");
107
108
108 let invocation = CliInvocation {
109 let invocation = CliInvocation {
109 ui,
110 ui,
110 subcommand_args,
111 subcommand_args,
111 config,
112 config,
112 repo,
113 repo,
113 };
114 };
114
115
115 if let Ok(repo) = repo {
116 if let Ok(repo) = repo {
116 // We don't support subrepos, fallback if the subrepos file is present
117 // We don't support subrepos, fallback if the subrepos file is present
117 if repo.working_directory_vfs().join(".hgsub").exists() {
118 if repo.working_directory_vfs().join(".hgsub").exists() {
118 let msg = "subrepos (.hgsub is present)";
119 let msg = "subrepos (.hgsub is present)";
119 return Err(CommandError::unsupported(msg));
120 return Err(CommandError::unsupported(msg));
120 }
121 }
121 }
122 }
122
123
123 if config.is_extension_enabled(b"blackbox") {
124 if config.is_extension_enabled(b"blackbox") {
124 let blackbox =
125 let blackbox =
125 blackbox::Blackbox::new(&invocation, process_start_time)?;
126 blackbox::Blackbox::new(&invocation, process_start_time)?;
126 blackbox.log_command_start();
127 blackbox.log_command_start();
127 let result = run(&invocation);
128 let result = run(&invocation);
128 blackbox.log_command_end(exit_code(
129 blackbox.log_command_end(exit_code(
129 &result,
130 &result,
130 // TODO: show a warning or combine with original error if
131 // TODO: show a warning or combine with original error if
131 // `get_bool` returns an error
132 // `get_bool` returns an error
132 config
133 config
133 .get_bool(b"ui", b"detailed-exit-code")
134 .get_bool(b"ui", b"detailed-exit-code")
134 .unwrap_or(false),
135 .unwrap_or(false),
135 ));
136 ));
136 result
137 result
137 } else {
138 } else {
138 run(&invocation)
139 run(&invocation)
139 }
140 }
140 }
141 }
141
142
142 fn main() {
143 fn main() {
143 // Run this first, before we find out if the blackbox extension is even
144 // Run this first, before we find out if the blackbox extension is even
144 // enabled, in order to include everything in-between in the duration
145 // enabled, in order to include everything in-between in the duration
145 // measurements. Reading config files can be slow if they’re on NFS.
146 // measurements. Reading config files can be slow if they’re on NFS.
146 let process_start_time = blackbox::ProcessStartTime::now();
147 let process_start_time = blackbox::ProcessStartTime::now();
147
148
148 env_logger::init();
149 env_logger::init();
149
150
150 let early_args = EarlyArgs::parse(std::env::args_os());
151 let early_args = EarlyArgs::parse(std::env::args_os());
151
152
152 let initial_current_dir = early_args.cwd.map(|cwd| {
153 let initial_current_dir = early_args.cwd.map(|cwd| {
153 let cwd = get_path_from_bytes(&cwd);
154 let cwd = get_path_from_bytes(&cwd);
154 std::env::current_dir()
155 std::env::current_dir()
155 .and_then(|initial| {
156 .and_then(|initial| {
156 std::env::set_current_dir(cwd)?;
157 std::env::set_current_dir(cwd)?;
157 Ok(initial)
158 Ok(initial)
158 })
159 })
159 .unwrap_or_else(|error| {
160 .unwrap_or_else(|error| {
160 exit(
161 exit(
161 &None,
162 &None,
162 &Ui::new_infallible(&Config::empty()),
163 &Ui::new_infallible(&Config::empty()),
163 OnUnsupported::Abort,
164 OnUnsupported::Abort,
164 Err(CommandError::abort(format!(
165 Err(CommandError::abort(format!(
165 "abort: {}: '{}'",
166 "abort: {}: '{}'",
166 error,
167 error,
167 cwd.display()
168 cwd.display()
168 ))),
169 ))),
169 false,
170 false,
170 )
171 )
171 })
172 })
172 });
173 });
173
174
174 let mut non_repo_config =
175 let mut non_repo_config =
175 Config::load_non_repo().unwrap_or_else(|error| {
176 Config::load_non_repo().unwrap_or_else(|error| {
176 // Normally this is decided based on config, but we don’t have that
177 // Normally this is decided based on config, but we don’t have that
177 // available. As of this writing config loading never returns an
178 // available. As of this writing config loading never returns an
178 // "unsupported" error but that is not enforced by the type system.
179 // "unsupported" error but that is not enforced by the type system.
179 let on_unsupported = OnUnsupported::Abort;
180 let on_unsupported = OnUnsupported::Abort;
180
181
181 exit(
182 exit(
182 &initial_current_dir,
183 &initial_current_dir,
183 &Ui::new_infallible(&Config::empty()),
184 &Ui::new_infallible(&Config::empty()),
184 on_unsupported,
185 on_unsupported,
185 Err(error.into()),
186 Err(error.into()),
186 false,
187 false,
187 )
188 )
188 });
189 });
189
190
190 non_repo_config
191 non_repo_config
191 .load_cli_args(early_args.config, early_args.color)
192 .load_cli_args(early_args.config, early_args.color)
192 .unwrap_or_else(|error| {
193 .unwrap_or_else(|error| {
193 exit(
194 exit(
194 &initial_current_dir,
195 &initial_current_dir,
195 &Ui::new_infallible(&non_repo_config),
196 &Ui::new_infallible(&non_repo_config),
196 OnUnsupported::from_config(&non_repo_config),
197 OnUnsupported::from_config(&non_repo_config),
197 Err(error.into()),
198 Err(error.into()),
198 non_repo_config
199 non_repo_config
199 .get_bool(b"ui", b"detailed-exit-code")
200 .get_bool(b"ui", b"detailed-exit-code")
200 .unwrap_or(false),
201 .unwrap_or(false),
201 )
202 )
202 });
203 });
203
204
204 if let Some(repo_path_bytes) = &early_args.repo {
205 if let Some(repo_path_bytes) = &early_args.repo {
205 lazy_static::lazy_static! {
206 lazy_static::lazy_static! {
206 static ref SCHEME_RE: regex::bytes::Regex =
207 static ref SCHEME_RE: regex::bytes::Regex =
207 // Same as `_matchscheme` in `mercurial/util.py`
208 // Same as `_matchscheme` in `mercurial/util.py`
208 regex::bytes::Regex::new("^[a-zA-Z0-9+.\\-]+:").unwrap();
209 regex::bytes::Regex::new("^[a-zA-Z0-9+.\\-]+:").unwrap();
209 }
210 }
210 if SCHEME_RE.is_match(&repo_path_bytes) {
211 if SCHEME_RE.is_match(&repo_path_bytes) {
211 exit(
212 exit(
212 &initial_current_dir,
213 &initial_current_dir,
213 &Ui::new_infallible(&non_repo_config),
214 &Ui::new_infallible(&non_repo_config),
214 OnUnsupported::from_config(&non_repo_config),
215 OnUnsupported::from_config(&non_repo_config),
215 Err(CommandError::UnsupportedFeature {
216 Err(CommandError::UnsupportedFeature {
216 message: format_bytes!(
217 message: format_bytes!(
217 b"URL-like --repository {}",
218 b"URL-like --repository {}",
218 repo_path_bytes
219 repo_path_bytes
219 ),
220 ),
220 }),
221 }),
221 // TODO: show a warning or combine with original error if
222 // TODO: show a warning or combine with original error if
222 // `get_bool` returns an error
223 // `get_bool` returns an error
223 non_repo_config
224 non_repo_config
224 .get_bool(b"ui", b"detailed-exit-code")
225 .get_bool(b"ui", b"detailed-exit-code")
225 .unwrap_or(false),
226 .unwrap_or(false),
226 )
227 )
227 }
228 }
228 }
229 }
229 let repo_arg = early_args.repo.unwrap_or(Vec::new());
230 let repo_arg = early_args.repo.unwrap_or(Vec::new());
230 let repo_path: Option<PathBuf> = {
231 let repo_path: Option<PathBuf> = {
231 if repo_arg.is_empty() {
232 if repo_arg.is_empty() {
232 None
233 None
233 } else {
234 } else {
234 let local_config = {
235 let local_config = {
235 if std::env::var_os("HGRCSKIPREPO").is_none() {
236 if std::env::var_os("HGRCSKIPREPO").is_none() {
236 // TODO: handle errors from find_repo_root
237 // TODO: handle errors from find_repo_root
237 if let Ok(current_dir_path) = Repo::find_repo_root() {
238 if let Ok(current_dir_path) = Repo::find_repo_root() {
238 let config_files = vec![
239 let config_files = vec![
239 ConfigSource::AbsPath(
240 ConfigSource::AbsPath(
240 current_dir_path.join(".hg/hgrc"),
241 current_dir_path.join(".hg/hgrc"),
241 ),
242 ),
242 ConfigSource::AbsPath(
243 ConfigSource::AbsPath(
243 current_dir_path.join(".hg/hgrc-not-shared"),
244 current_dir_path.join(".hg/hgrc-not-shared"),
244 ),
245 ),
245 ];
246 ];
246 // TODO: handle errors from
247 // TODO: handle errors from
247 // `load_from_explicit_sources`
248 // `load_from_explicit_sources`
248 Config::load_from_explicit_sources(config_files).ok()
249 Config::load_from_explicit_sources(config_files).ok()
249 } else {
250 } else {
250 None
251 None
251 }
252 }
252 } else {
253 } else {
253 None
254 None
254 }
255 }
255 };
256 };
256
257
257 let non_repo_config_val = {
258 let non_repo_config_val = {
258 let non_repo_val = non_repo_config.get(b"paths", &repo_arg);
259 let non_repo_val = non_repo_config.get(b"paths", &repo_arg);
259 match &non_repo_val {
260 match &non_repo_val {
260 Some(val) if val.len() > 0 => home::home_dir()
261 Some(val) if val.len() > 0 => home::home_dir()
261 .unwrap_or_else(|| PathBuf::from("~"))
262 .unwrap_or_else(|| PathBuf::from("~"))
262 .join(get_path_from_bytes(val))
263 .join(get_path_from_bytes(val))
263 .canonicalize()
264 .canonicalize()
264 // TODO: handle error and make it similar to python
265 // TODO: handle error and make it similar to python
265 // implementation maybe?
266 // implementation maybe?
266 .ok(),
267 .ok(),
267 _ => None,
268 _ => None,
268 }
269 }
269 };
270 };
270
271
271 let config_val = match &local_config {
272 let config_val = match &local_config {
272 None => non_repo_config_val,
273 None => non_repo_config_val,
273 Some(val) => {
274 Some(val) => {
274 let local_config_val = val.get(b"paths", &repo_arg);
275 let local_config_val = val.get(b"paths", &repo_arg);
275 match &local_config_val {
276 match &local_config_val {
276 Some(val) if val.len() > 0 => {
277 Some(val) if val.len() > 0 => {
277 // presence of a local_config assures that
278 // presence of a local_config assures that
278 // current_dir
279 // current_dir
279 // wont result in an Error
280 // wont result in an Error
280 let canpath = hg::utils::current_dir()
281 let canpath = hg::utils::current_dir()
281 .unwrap()
282 .unwrap()
282 .join(get_path_from_bytes(val))
283 .join(get_path_from_bytes(val))
283 .canonicalize();
284 .canonicalize();
284 canpath.ok().or(non_repo_config_val)
285 canpath.ok().or(non_repo_config_val)
285 }
286 }
286 _ => non_repo_config_val,
287 _ => non_repo_config_val,
287 }
288 }
288 }
289 }
289 };
290 };
290 config_val.or(Some(get_path_from_bytes(&repo_arg).to_path_buf()))
291 config_val.or(Some(get_path_from_bytes(&repo_arg).to_path_buf()))
291 }
292 }
292 };
293 };
293
294
294 let repo_result = match Repo::find(&non_repo_config, repo_path.to_owned())
295 let repo_result = match Repo::find(&non_repo_config, repo_path.to_owned())
295 {
296 {
296 Ok(repo) => Ok(repo),
297 Ok(repo) => Ok(repo),
297 Err(RepoError::NotFound { at }) if repo_path.is_none() => {
298 Err(RepoError::NotFound { at }) if repo_path.is_none() => {
298 // Not finding a repo is not fatal yet, if `-R` was not given
299 // Not finding a repo is not fatal yet, if `-R` was not given
299 Err(NoRepoInCwdError { cwd: at })
300 Err(NoRepoInCwdError { cwd: at })
300 }
301 }
301 Err(error) => exit(
302 Err(error) => exit(
302 &initial_current_dir,
303 &initial_current_dir,
303 &Ui::new_infallible(&non_repo_config),
304 &Ui::new_infallible(&non_repo_config),
304 OnUnsupported::from_config(&non_repo_config),
305 OnUnsupported::from_config(&non_repo_config),
305 Err(error.into()),
306 Err(error.into()),
306 // TODO: show a warning or combine with original error if
307 // TODO: show a warning or combine with original error if
307 // `get_bool` returns an error
308 // `get_bool` returns an error
308 non_repo_config
309 non_repo_config
309 .get_bool(b"ui", b"detailed-exit-code")
310 .get_bool(b"ui", b"detailed-exit-code")
310 .unwrap_or(false),
311 .unwrap_or(false),
311 ),
312 ),
312 };
313 };
313
314
314 let config = if let Ok(repo) = &repo_result {
315 let config = if let Ok(repo) = &repo_result {
315 repo.config()
316 repo.config()
316 } else {
317 } else {
317 &non_repo_config
318 &non_repo_config
318 };
319 };
319 let ui = Ui::new(&config).unwrap_or_else(|error| {
320 let ui = Ui::new(&config).unwrap_or_else(|error| {
320 exit(
321 exit(
321 &initial_current_dir,
322 &initial_current_dir,
322 &Ui::new_infallible(&config),
323 &Ui::new_infallible(&config),
323 OnUnsupported::from_config(&config),
324 OnUnsupported::from_config(&config),
324 Err(error.into()),
325 Err(error.into()),
325 config
326 config
326 .get_bool(b"ui", b"detailed-exit-code")
327 .get_bool(b"ui", b"detailed-exit-code")
327 .unwrap_or(false),
328 .unwrap_or(false),
328 )
329 )
329 });
330 });
330 let on_unsupported = OnUnsupported::from_config(config);
331 let on_unsupported = OnUnsupported::from_config(config);
331
332
332 let result = main_with_result(
333 let result = main_with_result(
333 &process_start_time,
334 &process_start_time,
334 &ui,
335 &ui,
335 repo_result.as_ref(),
336 repo_result.as_ref(),
336 config,
337 config,
337 );
338 );
338 exit(
339 exit(
339 &initial_current_dir,
340 &initial_current_dir,
340 &ui,
341 &ui,
341 on_unsupported,
342 on_unsupported,
342 result,
343 result,
343 // TODO: show a warning or combine with original error if `get_bool`
344 // TODO: show a warning or combine with original error if `get_bool`
344 // returns an error
345 // returns an error
345 config
346 config
346 .get_bool(b"ui", b"detailed-exit-code")
347 .get_bool(b"ui", b"detailed-exit-code")
347 .unwrap_or(false),
348 .unwrap_or(false),
348 )
349 )
349 }
350 }
350
351
351 fn exit_code(
352 fn exit_code(
352 result: &Result<(), CommandError>,
353 result: &Result<(), CommandError>,
353 use_detailed_exit_code: bool,
354 use_detailed_exit_code: bool,
354 ) -> i32 {
355 ) -> i32 {
355 match result {
356 match result {
356 Ok(()) => exit_codes::OK,
357 Ok(()) => exit_codes::OK,
357 Err(CommandError::Abort {
358 Err(CommandError::Abort {
358 message: _,
359 message: _,
359 detailed_exit_code,
360 detailed_exit_code,
360 }) => {
361 }) => {
361 if use_detailed_exit_code {
362 if use_detailed_exit_code {
362 *detailed_exit_code
363 *detailed_exit_code
363 } else {
364 } else {
364 exit_codes::ABORT
365 exit_codes::ABORT
365 }
366 }
366 }
367 }
367 Err(CommandError::Unsuccessful) => exit_codes::UNSUCCESSFUL,
368 Err(CommandError::Unsuccessful) => exit_codes::UNSUCCESSFUL,
368
369 // Exit with a specific code and no error message to let a potential
369 // Exit with a specific code and no error message to let a potential
370 // wrapper script fallback to Python-based Mercurial.
370 // wrapper script fallback to Python-based Mercurial.
371 Err(CommandError::UnsupportedFeature { .. }) => {
371 Err(CommandError::UnsupportedFeature { .. }) => {
372 exit_codes::UNIMPLEMENTED
372 exit_codes::UNIMPLEMENTED
373 }
373 }
374 Err(CommandError::InvalidFallback { .. }) => {
375 exit_codes::INVALID_FALLBACK
376 }
374 }
377 }
375 }
378 }
376
379
377 fn exit(
380 fn exit(
378 initial_current_dir: &Option<PathBuf>,
381 initial_current_dir: &Option<PathBuf>,
379 ui: &Ui,
382 ui: &Ui,
380 mut on_unsupported: OnUnsupported,
383 mut on_unsupported: OnUnsupported,
381 result: Result<(), CommandError>,
384 result: Result<(), CommandError>,
382 use_detailed_exit_code: bool,
385 use_detailed_exit_code: bool,
383 ) -> ! {
386 ) -> ! {
384 if let (
387 if let (
385 OnUnsupported::Fallback { executable },
388 OnUnsupported::Fallback { executable },
386 Err(CommandError::UnsupportedFeature { message }),
389 Err(CommandError::UnsupportedFeature { message }),
387 ) = (&on_unsupported, &result)
390 ) = (&on_unsupported, &result)
388 {
391 {
389 let mut args = std::env::args_os();
392 let mut args = std::env::args_os();
390 let executable = match executable {
393 let executable = match executable {
391 None => {
394 None => {
392 exit_no_fallback(
395 exit_no_fallback(
393 ui,
396 ui,
394 OnUnsupported::Abort,
397 OnUnsupported::Abort,
395 Err(CommandError::abort(
398 Err(CommandError::abort(
396 "abort: 'rhg.on-unsupported=fallback' without \
399 "abort: 'rhg.on-unsupported=fallback' without \
397 'rhg.fallback-executable' set.",
400 'rhg.fallback-executable' set.",
398 )),
401 )),
399 false,
402 false,
400 );
403 );
401 }
404 }
402 Some(executable) => executable,
405 Some(executable) => executable,
403 };
406 };
404 let executable_path = get_path_from_bytes(&executable);
407 let executable_path = get_path_from_bytes(&executable);
405 let this_executable = args.next().expect("exepcted argv[0] to exist");
408 let this_executable = args.next().expect("exepcted argv[0] to exist");
406 if executable_path == &PathBuf::from(this_executable) {
409 if executable_path == &PathBuf::from(this_executable) {
407 // Avoid spawning infinitely many processes until resource
410 // Avoid spawning infinitely many processes until resource
408 // exhaustion.
411 // exhaustion.
409 let _ = ui.write_stderr(&format_bytes!(
412 let _ = ui.write_stderr(&format_bytes!(
410 b"Blocking recursive fallback. The 'rhg.fallback-executable = {}' config \
413 b"Blocking recursive fallback. The 'rhg.fallback-executable = {}' config \
411 points to `rhg` itself.\n",
414 points to `rhg` itself.\n",
412 executable
415 executable
413 ));
416 ));
414 on_unsupported = OnUnsupported::Abort
417 on_unsupported = OnUnsupported::Abort
415 } else {
418 } else {
416 log::debug!("falling back (see trace-level log)");
419 log::debug!("falling back (see trace-level log)");
417 log::trace!("{}", local_to_utf8(message));
420 log::trace!("{}", local_to_utf8(message));
421 if let Err(err) = which::which(executable_path) {
422 exit_no_fallback(
423 ui,
424 OnUnsupported::Abort,
425 Err(CommandError::InvalidFallback {
426 path: executable.to_owned(),
427 err: err.to_string(),
428 }),
429 use_detailed_exit_code,
430 )
431 }
418 // `args` is now `argv[1..]` since we’ve already consumed
432 // `args` is now `argv[1..]` since we’ve already consumed
419 // `argv[0]`
433 // `argv[0]`
420 let mut command = Command::new(executable_path);
434 let mut command = Command::new(executable_path);
421 command.args(args);
435 command.args(args);
422 if let Some(initial) = initial_current_dir {
436 if let Some(initial) = initial_current_dir {
423 command.current_dir(initial);
437 command.current_dir(initial);
424 }
438 }
425 let result = command.status();
439 // We don't use subprocess because proper signal handling is harder
426 match result {
440 // and we don't want to keep `rhg` around after a fallback anyway.
427 Ok(status) => std::process::exit(
441 // For example, if `rhg` is run in the background and falls back to
428 status.code().unwrap_or(exit_codes::ABORT),
442 // `hg` which, in turn, waits for a signal, we'll get stuck if
429 ),
443 // we're doing plain subprocess.
430 Err(error) => {
444 //
431 let _ = ui.write_stderr(&format_bytes!(
445 // If `exec` returns, we can only assume our process is very broken
432 b"tried to fall back to a '{}' sub-process but got error {}\n",
446 // (see its documentation), so only try to forward the error code
433 executable, format_bytes::Utf8(error)
447 // when exiting.
434 ));
448 let err = command.exec();
435 on_unsupported = OnUnsupported::Abort
449 std::process::exit(
436 }
450 err.raw_os_error().unwrap_or(exit_codes::ABORT),
437 }
451 );
438 }
452 }
439 }
453 }
440 exit_no_fallback(ui, on_unsupported, result, use_detailed_exit_code)
454 exit_no_fallback(ui, on_unsupported, result, use_detailed_exit_code)
441 }
455 }
442
456
443 fn exit_no_fallback(
457 fn exit_no_fallback(
444 ui: &Ui,
458 ui: &Ui,
445 on_unsupported: OnUnsupported,
459 on_unsupported: OnUnsupported,
446 result: Result<(), CommandError>,
460 result: Result<(), CommandError>,
447 use_detailed_exit_code: bool,
461 use_detailed_exit_code: bool,
448 ) -> ! {
462 ) -> ! {
449 match &result {
463 match &result {
450 Ok(_) => {}
464 Ok(_) => {}
451 Err(CommandError::Unsuccessful) => {}
465 Err(CommandError::Unsuccessful) => {}
452 Err(CommandError::Abort {
466 Err(CommandError::Abort {
453 message,
467 message,
454 detailed_exit_code: _,
468 detailed_exit_code: _,
455 }) => {
469 }) => {
456 if !message.is_empty() {
470 if !message.is_empty() {
457 // Ignore errors when writing to stderr, we’re already exiting
471 // Ignore errors when writing to stderr, we’re already exiting
458 // with failure code so there’s not much more we can do.
472 // with failure code so there’s not much more we can do.
459 let _ = ui.write_stderr(&format_bytes!(b"{}\n", message));
473 let _ = ui.write_stderr(&format_bytes!(b"{}\n", message));
460 }
474 }
461 }
475 }
462 Err(CommandError::UnsupportedFeature { message }) => {
476 Err(CommandError::UnsupportedFeature { message }) => {
463 match on_unsupported {
477 match on_unsupported {
464 OnUnsupported::Abort => {
478 OnUnsupported::Abort => {
465 let _ = ui.write_stderr(&format_bytes!(
479 let _ = ui.write_stderr(&format_bytes!(
466 b"unsupported feature: {}\n",
480 b"unsupported feature: {}\n",
467 message
481 message
468 ));
482 ));
469 }
483 }
470 OnUnsupported::AbortSilent => {}
484 OnUnsupported::AbortSilent => {}
471 OnUnsupported::Fallback { .. } => unreachable!(),
485 OnUnsupported::Fallback { .. } => unreachable!(),
472 }
486 }
473 }
487 }
488 Err(CommandError::InvalidFallback { path, err }) => {
489 let _ = ui.write_stderr(&format_bytes!(
490 b"abort: invalid fallback '{}': {}\n",
491 path,
492 err.as_bytes(),
493 ));
494 }
474 }
495 }
475 std::process::exit(exit_code(&result, use_detailed_exit_code))
496 std::process::exit(exit_code(&result, use_detailed_exit_code))
476 }
497 }
477
498
478 macro_rules! subcommands {
499 macro_rules! subcommands {
479 ($( $command: ident )+) => {
500 ($( $command: ident )+) => {
480 mod commands {
501 mod commands {
481 $(
502 $(
482 pub mod $command;
503 pub mod $command;
483 )+
504 )+
484 }
505 }
485
506
486 fn add_subcommand_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
507 fn add_subcommand_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
487 app
508 app
488 $(
509 $(
489 .subcommand(commands::$command::args())
510 .subcommand(commands::$command::args())
490 )+
511 )+
491 }
512 }
492
513
493 pub type RunFn = fn(&CliInvocation) -> Result<(), CommandError>;
514 pub type RunFn = fn(&CliInvocation) -> Result<(), CommandError>;
494
515
495 fn subcommand_run_fn(name: &str) -> Option<RunFn> {
516 fn subcommand_run_fn(name: &str) -> Option<RunFn> {
496 match name {
517 match name {
497 $(
518 $(
498 stringify!($command) => Some(commands::$command::run),
519 stringify!($command) => Some(commands::$command::run),
499 )+
520 )+
500 _ => None,
521 _ => None,
501 }
522 }
502 }
523 }
503 };
524 };
504 }
525 }
505
526
506 subcommands! {
527 subcommands! {
507 cat
528 cat
508 debugdata
529 debugdata
509 debugrequirements
530 debugrequirements
510 debugignorerhg
531 debugignorerhg
511 files
532 files
512 root
533 root
513 config
534 config
514 status
535 status
515 }
536 }
516
537
517 pub struct CliInvocation<'a> {
538 pub struct CliInvocation<'a> {
518 ui: &'a Ui,
539 ui: &'a Ui,
519 subcommand_args: &'a ArgMatches<'a>,
540 subcommand_args: &'a ArgMatches<'a>,
520 config: &'a Config,
541 config: &'a Config,
521 /// References inside `Result` is a bit peculiar but allow
542 /// References inside `Result` is a bit peculiar but allow
522 /// `invocation.repo?` to work out with `&CliInvocation` since this
543 /// `invocation.repo?` to work out with `&CliInvocation` since this
523 /// `Result` type is `Copy`.
544 /// `Result` type is `Copy`.
524 repo: Result<&'a Repo, &'a NoRepoInCwdError>,
545 repo: Result<&'a Repo, &'a NoRepoInCwdError>,
525 }
546 }
526
547
527 struct NoRepoInCwdError {
548 struct NoRepoInCwdError {
528 cwd: PathBuf,
549 cwd: PathBuf,
529 }
550 }
530
551
531 /// CLI arguments to be parsed "early" in order to be able to read
552 /// CLI arguments to be parsed "early" in order to be able to read
532 /// configuration before using Clap. Ideally we would also use Clap for this,
553 /// configuration before using Clap. Ideally we would also use Clap for this,
533 /// see <https://github.com/clap-rs/clap/discussions/2366>.
554 /// see <https://github.com/clap-rs/clap/discussions/2366>.
534 ///
555 ///
535 /// These arguments are still declared when we do use Clap later, so that Clap
556 /// These arguments are still declared when we do use Clap later, so that Clap
536 /// does not return an error for their presence.
557 /// does not return an error for their presence.
537 struct EarlyArgs {
558 struct EarlyArgs {
538 /// Values of all `--config` arguments. (Possibly none)
559 /// Values of all `--config` arguments. (Possibly none)
539 config: Vec<Vec<u8>>,
560 config: Vec<Vec<u8>>,
540 /// Value of all the `--color` argument, if any.
561 /// Value of all the `--color` argument, if any.
541 color: Option<Vec<u8>>,
562 color: Option<Vec<u8>>,
542 /// Value of the `-R` or `--repository` argument, if any.
563 /// Value of the `-R` or `--repository` argument, if any.
543 repo: Option<Vec<u8>>,
564 repo: Option<Vec<u8>>,
544 /// Value of the `--cwd` argument, if any.
565 /// Value of the `--cwd` argument, if any.
545 cwd: Option<Vec<u8>>,
566 cwd: Option<Vec<u8>>,
546 }
567 }
547
568
548 impl EarlyArgs {
569 impl EarlyArgs {
549 fn parse(args: impl IntoIterator<Item = OsString>) -> Self {
570 fn parse(args: impl IntoIterator<Item = OsString>) -> Self {
550 let mut args = args.into_iter().map(get_bytes_from_os_str);
571 let mut args = args.into_iter().map(get_bytes_from_os_str);
551 let mut config = Vec::new();
572 let mut config = Vec::new();
552 let mut color = None;
573 let mut color = None;
553 let mut repo = None;
574 let mut repo = None;
554 let mut cwd = None;
575 let mut cwd = None;
555 // Use `while let` instead of `for` so that we can also call
576 // Use `while let` instead of `for` so that we can also call
556 // `args.next()` inside the loop.
577 // `args.next()` inside the loop.
557 while let Some(arg) = args.next() {
578 while let Some(arg) = args.next() {
558 if arg == b"--config" {
579 if arg == b"--config" {
559 if let Some(value) = args.next() {
580 if let Some(value) = args.next() {
560 config.push(value)
581 config.push(value)
561 }
582 }
562 } else if let Some(value) = arg.drop_prefix(b"--config=") {
583 } else if let Some(value) = arg.drop_prefix(b"--config=") {
563 config.push(value.to_owned())
584 config.push(value.to_owned())
564 }
585 }
565
586
566 if arg == b"--color" {
587 if arg == b"--color" {
567 if let Some(value) = args.next() {
588 if let Some(value) = args.next() {
568 color = Some(value)
589 color = Some(value)
569 }
590 }
570 } else if let Some(value) = arg.drop_prefix(b"--color=") {
591 } else if let Some(value) = arg.drop_prefix(b"--color=") {
571 color = Some(value.to_owned())
592 color = Some(value.to_owned())
572 }
593 }
573
594
574 if arg == b"--cwd" {
595 if arg == b"--cwd" {
575 if let Some(value) = args.next() {
596 if let Some(value) = args.next() {
576 cwd = Some(value)
597 cwd = Some(value)
577 }
598 }
578 } else if let Some(value) = arg.drop_prefix(b"--cwd=") {
599 } else if let Some(value) = arg.drop_prefix(b"--cwd=") {
579 cwd = Some(value.to_owned())
600 cwd = Some(value.to_owned())
580 }
601 }
581
602
582 if arg == b"--repository" || arg == b"-R" {
603 if arg == b"--repository" || arg == b"-R" {
583 if let Some(value) = args.next() {
604 if let Some(value) = args.next() {
584 repo = Some(value)
605 repo = Some(value)
585 }
606 }
586 } else if let Some(value) = arg.drop_prefix(b"--repository=") {
607 } else if let Some(value) = arg.drop_prefix(b"--repository=") {
587 repo = Some(value.to_owned())
608 repo = Some(value.to_owned())
588 } else if let Some(value) = arg.drop_prefix(b"-R") {
609 } else if let Some(value) = arg.drop_prefix(b"-R") {
589 repo = Some(value.to_owned())
610 repo = Some(value.to_owned())
590 }
611 }
591 }
612 }
592 Self {
613 Self {
593 config,
614 config,
594 color,
615 color,
595 repo,
616 repo,
596 cwd,
617 cwd,
597 }
618 }
598 }
619 }
599 }
620 }
600
621
601 /// What to do when encountering some unsupported feature.
622 /// What to do when encountering some unsupported feature.
602 ///
623 ///
603 /// See `HgError::UnsupportedFeature` and `CommandError::UnsupportedFeature`.
624 /// See `HgError::UnsupportedFeature` and `CommandError::UnsupportedFeature`.
604 enum OnUnsupported {
625 enum OnUnsupported {
605 /// Print an error message describing what feature is not supported,
626 /// Print an error message describing what feature is not supported,
606 /// and exit with code 252.
627 /// and exit with code 252.
607 Abort,
628 Abort,
608 /// Silently exit with code 252.
629 /// Silently exit with code 252.
609 AbortSilent,
630 AbortSilent,
610 /// Try running a Python implementation
631 /// Try running a Python implementation
611 Fallback { executable: Option<Vec<u8>> },
632 Fallback { executable: Option<Vec<u8>> },
612 }
633 }
613
634
614 impl OnUnsupported {
635 impl OnUnsupported {
615 const DEFAULT: Self = OnUnsupported::Abort;
636 const DEFAULT: Self = OnUnsupported::Abort;
616
637
617 fn from_config(config: &Config) -> Self {
638 fn from_config(config: &Config) -> Self {
618 match config
639 match config
619 .get(b"rhg", b"on-unsupported")
640 .get(b"rhg", b"on-unsupported")
620 .map(|value| value.to_ascii_lowercase())
641 .map(|value| value.to_ascii_lowercase())
621 .as_deref()
642 .as_deref()
622 {
643 {
623 Some(b"abort") => OnUnsupported::Abort,
644 Some(b"abort") => OnUnsupported::Abort,
624 Some(b"abort-silent") => OnUnsupported::AbortSilent,
645 Some(b"abort-silent") => OnUnsupported::AbortSilent,
625 Some(b"fallback") => OnUnsupported::Fallback {
646 Some(b"fallback") => OnUnsupported::Fallback {
626 executable: config
647 executable: config
627 .get(b"rhg", b"fallback-executable")
648 .get(b"rhg", b"fallback-executable")
628 .map(|x| x.to_owned()),
649 .map(|x| x.to_owned()),
629 },
650 },
630 None => Self::DEFAULT,
651 None => Self::DEFAULT,
631 Some(_) => {
652 Some(_) => {
632 // TODO: warn about unknown config value
653 // TODO: warn about unknown config value
633 Self::DEFAULT
654 Self::DEFAULT
634 }
655 }
635 }
656 }
636 }
657 }
637 }
658 }
638
659
639 /// The `*` extension is an edge-case for config sub-options that apply to all
660 /// The `*` extension is an edge-case for config sub-options that apply to all
640 /// extensions. For now, only `:required` exists, but that may change in the
661 /// extensions. For now, only `:required` exists, but that may change in the
641 /// future.
662 /// future.
642 const SUPPORTED_EXTENSIONS: &[&[u8]] =
663 const SUPPORTED_EXTENSIONS: &[&[u8]] =
643 &[b"blackbox", b"share", b"sparse", b"narrow", b"*"];
664 &[b"blackbox", b"share", b"sparse", b"narrow", b"*"];
644
665
645 fn check_extensions(config: &Config) -> Result<(), CommandError> {
666 fn check_extensions(config: &Config) -> Result<(), CommandError> {
646 let enabled: HashSet<&[u8]> = config
667 let enabled: HashSet<&[u8]> = config
647 .get_section_keys(b"extensions")
668 .get_section_keys(b"extensions")
648 .into_iter()
669 .into_iter()
649 .map(|extension| {
670 .map(|extension| {
650 // Ignore extension suboptions. Only `required` exists for now.
671 // Ignore extension suboptions. Only `required` exists for now.
651 // `rhg` either supports an extension or doesn't, so it doesn't
672 // `rhg` either supports an extension or doesn't, so it doesn't
652 // make sense to consider the loading of an extension.
673 // make sense to consider the loading of an extension.
653 extension.split_2(b':').unwrap_or((extension, b"")).0
674 extension.split_2(b':').unwrap_or((extension, b"")).0
654 })
675 })
655 .collect();
676 .collect();
656
677
657 let mut unsupported = enabled;
678 let mut unsupported = enabled;
658 for supported in SUPPORTED_EXTENSIONS {
679 for supported in SUPPORTED_EXTENSIONS {
659 unsupported.remove(supported);
680 unsupported.remove(supported);
660 }
681 }
661
682
662 if let Some(ignored_list) = config.get_list(b"rhg", b"ignored-extensions")
683 if let Some(ignored_list) = config.get_list(b"rhg", b"ignored-extensions")
663 {
684 {
664 for ignored in ignored_list {
685 for ignored in ignored_list {
665 unsupported.remove(ignored.as_slice());
686 unsupported.remove(ignored.as_slice());
666 }
687 }
667 }
688 }
668
689
669 if unsupported.is_empty() {
690 if unsupported.is_empty() {
670 Ok(())
691 Ok(())
671 } else {
692 } else {
672 Err(CommandError::UnsupportedFeature {
693 Err(CommandError::UnsupportedFeature {
673 message: format_bytes!(
694 message: format_bytes!(
674 b"extensions: {} (consider adding them to 'rhg.ignored-extensions' config)",
695 b"extensions: {} (consider adding them to 'rhg.ignored-extensions' config)",
675 join(unsupported, b", ")
696 join(unsupported, b", ")
676 ),
697 ),
677 })
698 })
678 }
699 }
679 }
700 }
680
701
681 fn check_unsupported(
702 fn check_unsupported(
682 config: &Config,
703 config: &Config,
683 repo: Result<&Repo, &NoRepoInCwdError>,
704 repo: Result<&Repo, &NoRepoInCwdError>,
684 ) -> Result<(), CommandError> {
705 ) -> Result<(), CommandError> {
685 check_extensions(config)?;
706 check_extensions(config)?;
686
707
687 if std::env::var_os("HG_PENDING").is_some() {
708 if std::env::var_os("HG_PENDING").is_some() {
688 // TODO: only if the value is `== repo.working_directory`?
709 // TODO: only if the value is `== repo.working_directory`?
689 // What about relative v.s. absolute paths?
710 // What about relative v.s. absolute paths?
690 Err(CommandError::unsupported("$HG_PENDING"))?
711 Err(CommandError::unsupported("$HG_PENDING"))?
691 }
712 }
692
713
693 if let Ok(repo) = repo {
714 if let Ok(repo) = repo {
694 if repo.has_subrepos()? {
715 if repo.has_subrepos()? {
695 Err(CommandError::unsupported("sub-repositories"))?
716 Err(CommandError::unsupported("sub-repositories"))?
696 }
717 }
697 }
718 }
698
719
699 if config.has_non_empty_section(b"encode") {
720 if config.has_non_empty_section(b"encode") {
700 Err(CommandError::unsupported("[encode] config"))?
721 Err(CommandError::unsupported("[encode] config"))?
701 }
722 }
702
723
703 if config.has_non_empty_section(b"decode") {
724 if config.has_non_empty_section(b"decode") {
704 Err(CommandError::unsupported("[decode] config"))?
725 Err(CommandError::unsupported("[decode] config"))?
705 }
726 }
706
727
707 Ok(())
728 Ok(())
708 }
729 }
@@ -1,393 +1,386 b''
1 #require rhg
1 #require rhg
2
2
3 $ NO_FALLBACK="env RHG_ON_UNSUPPORTED=abort"
3 $ NO_FALLBACK="env RHG_ON_UNSUPPORTED=abort"
4
4
5 Unimplemented command
5 Unimplemented command
6 $ $NO_FALLBACK rhg unimplemented-command
6 $ $NO_FALLBACK rhg unimplemented-command
7 unsupported feature: error: Found argument 'unimplemented-command' which wasn't expected, or isn't valid in this context
7 unsupported feature: error: Found argument 'unimplemented-command' which wasn't expected, or isn't valid in this context
8
8
9 USAGE:
9 USAGE:
10 rhg [OPTIONS] <SUBCOMMAND>
10 rhg [OPTIONS] <SUBCOMMAND>
11
11
12 For more information try --help
12 For more information try --help
13
13
14 [252]
14 [252]
15 $ rhg unimplemented-command --config rhg.on-unsupported=abort-silent
15 $ rhg unimplemented-command --config rhg.on-unsupported=abort-silent
16 [252]
16 [252]
17
17
18 Finding root
18 Finding root
19 $ $NO_FALLBACK rhg root
19 $ $NO_FALLBACK rhg root
20 abort: no repository found in '$TESTTMP' (.hg not found)!
20 abort: no repository found in '$TESTTMP' (.hg not found)!
21 [255]
21 [255]
22
22
23 $ hg init repository
23 $ hg init repository
24 $ cd repository
24 $ cd repository
25 $ $NO_FALLBACK rhg root
25 $ $NO_FALLBACK rhg root
26 $TESTTMP/repository
26 $TESTTMP/repository
27
27
28 Reading and setting configuration
28 Reading and setting configuration
29 $ echo "[ui]" >> $HGRCPATH
29 $ echo "[ui]" >> $HGRCPATH
30 $ echo "username = user1" >> $HGRCPATH
30 $ echo "username = user1" >> $HGRCPATH
31 $ $NO_FALLBACK rhg config ui.username
31 $ $NO_FALLBACK rhg config ui.username
32 user1
32 user1
33 $ echo "[ui]" >> .hg/hgrc
33 $ echo "[ui]" >> .hg/hgrc
34 $ echo "username = user2" >> .hg/hgrc
34 $ echo "username = user2" >> .hg/hgrc
35 $ $NO_FALLBACK rhg config ui.username
35 $ $NO_FALLBACK rhg config ui.username
36 user2
36 user2
37 $ $NO_FALLBACK rhg --config ui.username=user3 config ui.username
37 $ $NO_FALLBACK rhg --config ui.username=user3 config ui.username
38 user3
38 user3
39
39
40 Unwritable file descriptor
40 Unwritable file descriptor
41 $ $NO_FALLBACK rhg root > /dev/full
41 $ $NO_FALLBACK rhg root > /dev/full
42 abort: No space left on device (os error 28)
42 abort: No space left on device (os error 28)
43 [255]
43 [255]
44
44
45 Deleted repository
45 Deleted repository
46 $ rm -rf `pwd`
46 $ rm -rf `pwd`
47 $ $NO_FALLBACK rhg root
47 $ $NO_FALLBACK rhg root
48 abort: error getting current working directory: $ENOENT$
48 abort: error getting current working directory: $ENOENT$
49 [255]
49 [255]
50
50
51 Listing tracked files
51 Listing tracked files
52 $ cd $TESTTMP
52 $ cd $TESTTMP
53 $ hg init repository
53 $ hg init repository
54 $ cd repository
54 $ cd repository
55 $ for i in 1 2 3; do
55 $ for i in 1 2 3; do
56 > echo $i >> file$i
56 > echo $i >> file$i
57 > hg add file$i
57 > hg add file$i
58 > done
58 > done
59 > hg commit -m "commit $i" -q
59 > hg commit -m "commit $i" -q
60
60
61 Listing tracked files from root
61 Listing tracked files from root
62 $ $NO_FALLBACK rhg files
62 $ $NO_FALLBACK rhg files
63 file1
63 file1
64 file2
64 file2
65 file3
65 file3
66
66
67 Listing tracked files from subdirectory
67 Listing tracked files from subdirectory
68 $ mkdir -p path/to/directory
68 $ mkdir -p path/to/directory
69 $ cd path/to/directory
69 $ cd path/to/directory
70 $ $NO_FALLBACK rhg files
70 $ $NO_FALLBACK rhg files
71 ../../../file1
71 ../../../file1
72 ../../../file2
72 ../../../file2
73 ../../../file3
73 ../../../file3
74
74
75 Listing tracked files through broken pipe
75 Listing tracked files through broken pipe
76 $ $NO_FALLBACK rhg files | head -n 1
76 $ $NO_FALLBACK rhg files | head -n 1
77 ../../../file1
77 ../../../file1
78
78
79 Debuging data in inline index
79 Debuging data in inline index
80 $ cd $TESTTMP
80 $ cd $TESTTMP
81 $ rm -rf repository
81 $ rm -rf repository
82 $ hg init repository
82 $ hg init repository
83 $ cd repository
83 $ cd repository
84 $ for i in 1 2 3 4 5 6; do
84 $ for i in 1 2 3 4 5 6; do
85 > echo $i >> file-$i
85 > echo $i >> file-$i
86 > hg add file-$i
86 > hg add file-$i
87 > hg commit -m "Commit $i" -q
87 > hg commit -m "Commit $i" -q
88 > done
88 > done
89 $ $NO_FALLBACK rhg debugdata -c 2
89 $ $NO_FALLBACK rhg debugdata -c 2
90 8d0267cb034247ebfa5ee58ce59e22e57a492297
90 8d0267cb034247ebfa5ee58ce59e22e57a492297
91 test
91 test
92 0 0
92 0 0
93 file-3
93 file-3
94
94
95 Commit 3 (no-eol)
95 Commit 3 (no-eol)
96 $ $NO_FALLBACK rhg debugdata -m 2
96 $ $NO_FALLBACK rhg debugdata -m 2
97 file-1\x00b8e02f6433738021a065f94175c7cd23db5f05be (esc)
97 file-1\x00b8e02f6433738021a065f94175c7cd23db5f05be (esc)
98 file-2\x005d9299349fc01ddd25d0070d149b124d8f10411e (esc)
98 file-2\x005d9299349fc01ddd25d0070d149b124d8f10411e (esc)
99 file-3\x002661d26c649684b482d10f91960cc3db683c38b4 (esc)
99 file-3\x002661d26c649684b482d10f91960cc3db683c38b4 (esc)
100
100
101 Debuging with full node id
101 Debuging with full node id
102 $ $NO_FALLBACK rhg debugdata -c `hg log -r 0 -T '{node}'`
102 $ $NO_FALLBACK rhg debugdata -c `hg log -r 0 -T '{node}'`
103 d1d1c679d3053e8926061b6f45ca52009f011e3f
103 d1d1c679d3053e8926061b6f45ca52009f011e3f
104 test
104 test
105 0 0
105 0 0
106 file-1
106 file-1
107
107
108 Commit 1 (no-eol)
108 Commit 1 (no-eol)
109
109
110 Specifying revisions by changeset ID
110 Specifying revisions by changeset ID
111 $ hg log -T '{node}\n'
111 $ hg log -T '{node}\n'
112 c6ad58c44207b6ff8a4fbbca7045a5edaa7e908b
112 c6ad58c44207b6ff8a4fbbca7045a5edaa7e908b
113 d654274993d0149eecc3cc03214f598320211900
113 d654274993d0149eecc3cc03214f598320211900
114 f646af7e96481d3a5470b695cf30ad8e3ab6c575
114 f646af7e96481d3a5470b695cf30ad8e3ab6c575
115 cf8b83f14ead62b374b6e91a0e9303b85dfd9ed7
115 cf8b83f14ead62b374b6e91a0e9303b85dfd9ed7
116 91c6f6e73e39318534dc415ea4e8a09c99cd74d6
116 91c6f6e73e39318534dc415ea4e8a09c99cd74d6
117 6ae9681c6d30389694d8701faf24b583cf3ccafe
117 6ae9681c6d30389694d8701faf24b583cf3ccafe
118 $ $NO_FALLBACK rhg files -r cf8b83
118 $ $NO_FALLBACK rhg files -r cf8b83
119 file-1
119 file-1
120 file-2
120 file-2
121 file-3
121 file-3
122 $ $NO_FALLBACK rhg cat -r cf8b83 file-2
122 $ $NO_FALLBACK rhg cat -r cf8b83 file-2
123 2
123 2
124 $ $NO_FALLBACK rhg cat --rev cf8b83 file-2
124 $ $NO_FALLBACK rhg cat --rev cf8b83 file-2
125 2
125 2
126 $ $NO_FALLBACK rhg cat -r c file-2
126 $ $NO_FALLBACK rhg cat -r c file-2
127 abort: ambiguous revision identifier: c
127 abort: ambiguous revision identifier: c
128 [255]
128 [255]
129 $ $NO_FALLBACK rhg cat -r d file-2
129 $ $NO_FALLBACK rhg cat -r d file-2
130 2
130 2
131 $ $NO_FALLBACK rhg cat -r 0000 file-2
131 $ $NO_FALLBACK rhg cat -r 0000 file-2
132 file-2: no such file in rev 000000000000
132 file-2: no such file in rev 000000000000
133 [1]
133 [1]
134
134
135 Cat files
135 Cat files
136 $ cd $TESTTMP
136 $ cd $TESTTMP
137 $ rm -rf repository
137 $ rm -rf repository
138 $ hg init repository
138 $ hg init repository
139 $ cd repository
139 $ cd repository
140 $ echo "original content" > original
140 $ echo "original content" > original
141 $ hg add original
141 $ hg add original
142 $ hg commit -m "add original" original
142 $ hg commit -m "add original" original
143 Without `--rev`
143 Without `--rev`
144 $ $NO_FALLBACK rhg cat original
144 $ $NO_FALLBACK rhg cat original
145 original content
145 original content
146 With `--rev`
146 With `--rev`
147 $ $NO_FALLBACK rhg cat -r 0 original
147 $ $NO_FALLBACK rhg cat -r 0 original
148 original content
148 original content
149 Cat copied file should not display copy metadata
149 Cat copied file should not display copy metadata
150 $ hg copy original copy_of_original
150 $ hg copy original copy_of_original
151 $ hg commit -m "add copy of original"
151 $ hg commit -m "add copy of original"
152 $ $NO_FALLBACK rhg cat original
152 $ $NO_FALLBACK rhg cat original
153 original content
153 original content
154 $ $NO_FALLBACK rhg cat -r 1 copy_of_original
154 $ $NO_FALLBACK rhg cat -r 1 copy_of_original
155 original content
155 original content
156
156
157
157
158 Fallback to Python
158 Fallback to Python
159 $ $NO_FALLBACK rhg cat original --exclude="*.rs"
159 $ $NO_FALLBACK rhg cat original --exclude="*.rs"
160 unsupported feature: error: Found argument '--exclude' which wasn't expected, or isn't valid in this context
160 unsupported feature: error: Found argument '--exclude' which wasn't expected, or isn't valid in this context
161
161
162 USAGE:
162 USAGE:
163 rhg cat [OPTIONS] <FILE>...
163 rhg cat [OPTIONS] <FILE>...
164
164
165 For more information try --help
165 For more information try --help
166
166
167 [252]
167 [252]
168 $ rhg cat original --exclude="*.rs"
168 $ rhg cat original --exclude="*.rs"
169 original content
169 original content
170
170
171 $ (unset RHG_FALLBACK_EXECUTABLE; rhg cat original --exclude="*.rs")
171 $ (unset RHG_FALLBACK_EXECUTABLE; rhg cat original --exclude="*.rs")
172 abort: 'rhg.on-unsupported=fallback' without 'rhg.fallback-executable' set.
172 abort: 'rhg.on-unsupported=fallback' without 'rhg.fallback-executable' set.
173 [255]
173 [255]
174
174
175 $ (unset RHG_FALLBACK_EXECUTABLE; rhg cat original)
175 $ (unset RHG_FALLBACK_EXECUTABLE; rhg cat original)
176 original content
176 original content
177
177
178 $ rhg cat original --exclude="*.rs" --config rhg.fallback-executable=false
178 $ rhg cat original --exclude="*.rs" --config rhg.fallback-executable=false
179 [1]
179 [1]
180
180
181 $ rhg cat original --exclude="*.rs" --config rhg.fallback-executable=hg-non-existent
181 $ rhg cat original --exclude="*.rs" --config rhg.fallback-executable=hg-non-existent
182 tried to fall back to a 'hg-non-existent' sub-process but got error $ENOENT$
182 abort: invalid fallback 'hg-non-existent': cannot find binary path
183 unsupported feature: error: Found argument '--exclude' which wasn't expected, or isn't valid in this context
183 [253]
184
185 USAGE:
186 rhg cat [OPTIONS] <FILE>...
187
188 For more information try --help
189
190 [252]
191
184
192 $ rhg cat original --exclude="*.rs" --config rhg.fallback-executable=rhg
185 $ rhg cat original --exclude="*.rs" --config rhg.fallback-executable=rhg
193 Blocking recursive fallback. The 'rhg.fallback-executable = rhg' config points to `rhg` itself.
186 Blocking recursive fallback. The 'rhg.fallback-executable = rhg' config points to `rhg` itself.
194 unsupported feature: error: Found argument '--exclude' which wasn't expected, or isn't valid in this context
187 unsupported feature: error: Found argument '--exclude' which wasn't expected, or isn't valid in this context
195
188
196 USAGE:
189 USAGE:
197 rhg cat [OPTIONS] <FILE>...
190 rhg cat [OPTIONS] <FILE>...
198
191
199 For more information try --help
192 For more information try --help
200
193
201 [252]
194 [252]
202
195
203 Fallback with shell path segments
196 Fallback with shell path segments
204 $ $NO_FALLBACK rhg cat .
197 $ $NO_FALLBACK rhg cat .
205 unsupported feature: `..` or `.` path segment
198 unsupported feature: `..` or `.` path segment
206 [252]
199 [252]
207 $ $NO_FALLBACK rhg cat ..
200 $ $NO_FALLBACK rhg cat ..
208 unsupported feature: `..` or `.` path segment
201 unsupported feature: `..` or `.` path segment
209 [252]
202 [252]
210 $ $NO_FALLBACK rhg cat ../..
203 $ $NO_FALLBACK rhg cat ../..
211 unsupported feature: `..` or `.` path segment
204 unsupported feature: `..` or `.` path segment
212 [252]
205 [252]
213
206
214 Fallback with filesets
207 Fallback with filesets
215 $ $NO_FALLBACK rhg cat "set:c or b"
208 $ $NO_FALLBACK rhg cat "set:c or b"
216 unsupported feature: fileset
209 unsupported feature: fileset
217 [252]
210 [252]
218
211
219 Fallback with generic hooks
212 Fallback with generic hooks
220 $ $NO_FALLBACK rhg cat original --config hooks.pre-cat=something
213 $ $NO_FALLBACK rhg cat original --config hooks.pre-cat=something
221 unsupported feature: pre-cat hook defined
214 unsupported feature: pre-cat hook defined
222 [252]
215 [252]
223
216
224 $ $NO_FALLBACK rhg cat original --config hooks.post-cat=something
217 $ $NO_FALLBACK rhg cat original --config hooks.post-cat=something
225 unsupported feature: post-cat hook defined
218 unsupported feature: post-cat hook defined
226 [252]
219 [252]
227
220
228 $ $NO_FALLBACK rhg cat original --config hooks.fail-cat=something
221 $ $NO_FALLBACK rhg cat original --config hooks.fail-cat=something
229 unsupported feature: fail-cat hook defined
222 unsupported feature: fail-cat hook defined
230 [252]
223 [252]
231
224
232 Fallback with [defaults]
225 Fallback with [defaults]
233 $ $NO_FALLBACK rhg cat original --config "defaults.cat=-r null"
226 $ $NO_FALLBACK rhg cat original --config "defaults.cat=-r null"
234 unsupported feature: `defaults` config set
227 unsupported feature: `defaults` config set
235 [252]
228 [252]
236
229
237
230
238 Requirements
231 Requirements
239 $ $NO_FALLBACK rhg debugrequirements
232 $ $NO_FALLBACK rhg debugrequirements
240 dotencode
233 dotencode
241 fncache
234 fncache
242 generaldelta
235 generaldelta
243 persistent-nodemap
236 persistent-nodemap
244 revlog-compression-zstd (zstd !)
237 revlog-compression-zstd (zstd !)
245 revlogv1
238 revlogv1
246 share-safe
239 share-safe
247 sparserevlog
240 sparserevlog
248 store
241 store
249
242
250 $ echo indoor-pool >> .hg/requires
243 $ echo indoor-pool >> .hg/requires
251 $ $NO_FALLBACK rhg files
244 $ $NO_FALLBACK rhg files
252 unsupported feature: repository requires feature unknown to this Mercurial: indoor-pool
245 unsupported feature: repository requires feature unknown to this Mercurial: indoor-pool
253 [252]
246 [252]
254
247
255 $ $NO_FALLBACK rhg cat -r 1 copy_of_original
248 $ $NO_FALLBACK rhg cat -r 1 copy_of_original
256 unsupported feature: repository requires feature unknown to this Mercurial: indoor-pool
249 unsupported feature: repository requires feature unknown to this Mercurial: indoor-pool
257 [252]
250 [252]
258
251
259 $ $NO_FALLBACK rhg debugrequirements
252 $ $NO_FALLBACK rhg debugrequirements
260 unsupported feature: repository requires feature unknown to this Mercurial: indoor-pool
253 unsupported feature: repository requires feature unknown to this Mercurial: indoor-pool
261 [252]
254 [252]
262
255
263 $ echo -e '\xFF' >> .hg/requires
256 $ echo -e '\xFF' >> .hg/requires
264 $ $NO_FALLBACK rhg debugrequirements
257 $ $NO_FALLBACK rhg debugrequirements
265 abort: parse error in 'requires' file
258 abort: parse error in 'requires' file
266 [255]
259 [255]
267
260
268 Persistent nodemap
261 Persistent nodemap
269 $ cd $TESTTMP
262 $ cd $TESTTMP
270 $ rm -rf repository
263 $ rm -rf repository
271 $ hg --config format.use-persistent-nodemap=no init repository
264 $ hg --config format.use-persistent-nodemap=no init repository
272 $ cd repository
265 $ cd repository
273 $ $NO_FALLBACK rhg debugrequirements | grep nodemap
266 $ $NO_FALLBACK rhg debugrequirements | grep nodemap
274 [1]
267 [1]
275 $ hg debugbuilddag .+5000 --overwritten-file --config "storage.revlog.nodemap.mode=warn"
268 $ hg debugbuilddag .+5000 --overwritten-file --config "storage.revlog.nodemap.mode=warn"
276 $ hg id -r tip
269 $ hg id -r tip
277 c3ae8dec9fad tip
270 c3ae8dec9fad tip
278 $ ls .hg/store/00changelog*
271 $ ls .hg/store/00changelog*
279 .hg/store/00changelog.d
272 .hg/store/00changelog.d
280 .hg/store/00changelog.i
273 .hg/store/00changelog.i
281 $ $NO_FALLBACK rhg files -r c3ae8dec9fad
274 $ $NO_FALLBACK rhg files -r c3ae8dec9fad
282 of
275 of
283
276
284 $ cd $TESTTMP
277 $ cd $TESTTMP
285 $ rm -rf repository
278 $ rm -rf repository
286 $ hg --config format.use-persistent-nodemap=True init repository
279 $ hg --config format.use-persistent-nodemap=True init repository
287 $ cd repository
280 $ cd repository
288 $ $NO_FALLBACK rhg debugrequirements | grep nodemap
281 $ $NO_FALLBACK rhg debugrequirements | grep nodemap
289 persistent-nodemap
282 persistent-nodemap
290 $ hg debugbuilddag .+5000 --overwritten-file --config "storage.revlog.nodemap.mode=warn"
283 $ hg debugbuilddag .+5000 --overwritten-file --config "storage.revlog.nodemap.mode=warn"
291 $ hg id -r tip
284 $ hg id -r tip
292 c3ae8dec9fad tip
285 c3ae8dec9fad tip
293 $ ls .hg/store/00changelog*
286 $ ls .hg/store/00changelog*
294 .hg/store/00changelog-*.nd (glob)
287 .hg/store/00changelog-*.nd (glob)
295 .hg/store/00changelog.d
288 .hg/store/00changelog.d
296 .hg/store/00changelog.i
289 .hg/store/00changelog.i
297 .hg/store/00changelog.n
290 .hg/store/00changelog.n
298
291
299 Specifying revisions by changeset ID
292 Specifying revisions by changeset ID
300 $ $NO_FALLBACK rhg files -r c3ae8dec9fad
293 $ $NO_FALLBACK rhg files -r c3ae8dec9fad
301 of
294 of
302 $ $NO_FALLBACK rhg cat -r c3ae8dec9fad of
295 $ $NO_FALLBACK rhg cat -r c3ae8dec9fad of
303 r5000
296 r5000
304
297
305 Crate a shared repository
298 Crate a shared repository
306
299
307 $ echo "[extensions]" >> $HGRCPATH
300 $ echo "[extensions]" >> $HGRCPATH
308 $ echo "share = " >> $HGRCPATH
301 $ echo "share = " >> $HGRCPATH
309
302
310 $ cd $TESTTMP
303 $ cd $TESTTMP
311 $ hg init repo1
304 $ hg init repo1
312 $ echo a > repo1/a
305 $ echo a > repo1/a
313 $ hg -R repo1 commit -A -m'init'
306 $ hg -R repo1 commit -A -m'init'
314 adding a
307 adding a
315
308
316 $ hg share repo1 repo2
309 $ hg share repo1 repo2
317 updating working directory
310 updating working directory
318 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
311 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
319
312
320 And check that basic rhg commands work with sharing
313 And check that basic rhg commands work with sharing
321
314
322 $ $NO_FALLBACK rhg files -R repo2
315 $ $NO_FALLBACK rhg files -R repo2
323 repo2/a
316 repo2/a
324 $ $NO_FALLBACK rhg -R repo2 cat -r 0 repo2/a
317 $ $NO_FALLBACK rhg -R repo2 cat -r 0 repo2/a
325 a
318 a
326
319
327 Same with relative sharing
320 Same with relative sharing
328
321
329 $ hg share repo2 repo3 --relative
322 $ hg share repo2 repo3 --relative
330 updating working directory
323 updating working directory
331 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
324 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
332
325
333 $ $NO_FALLBACK rhg files -R repo3
326 $ $NO_FALLBACK rhg files -R repo3
334 repo3/a
327 repo3/a
335 $ $NO_FALLBACK rhg -R repo3 cat -r 0 repo3/a
328 $ $NO_FALLBACK rhg -R repo3 cat -r 0 repo3/a
336 a
329 a
337
330
338 Same with share-safe
331 Same with share-safe
339
332
340 $ echo "[format]" >> $HGRCPATH
333 $ echo "[format]" >> $HGRCPATH
341 $ echo "use-share-safe = True" >> $HGRCPATH
334 $ echo "use-share-safe = True" >> $HGRCPATH
342
335
343 $ cd $TESTTMP
336 $ cd $TESTTMP
344 $ hg init repo4
337 $ hg init repo4
345 $ cd repo4
338 $ cd repo4
346 $ echo a > a
339 $ echo a > a
347 $ hg commit -A -m'init'
340 $ hg commit -A -m'init'
348 adding a
341 adding a
349
342
350 $ cd ..
343 $ cd ..
351 $ hg share repo4 repo5
344 $ hg share repo4 repo5
352 updating working directory
345 updating working directory
353 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
346 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
354
347
355 And check that basic rhg commands work with sharing
348 And check that basic rhg commands work with sharing
356
349
357 $ cd repo5
350 $ cd repo5
358 $ $NO_FALLBACK rhg files
351 $ $NO_FALLBACK rhg files
359 a
352 a
360 $ $NO_FALLBACK rhg cat -r 0 a
353 $ $NO_FALLBACK rhg cat -r 0 a
361 a
354 a
362
355
363 The blackbox extension is supported
356 The blackbox extension is supported
364
357
365 $ echo "[extensions]" >> $HGRCPATH
358 $ echo "[extensions]" >> $HGRCPATH
366 $ echo "blackbox =" >> $HGRCPATH
359 $ echo "blackbox =" >> $HGRCPATH
367 $ echo "[blackbox]" >> $HGRCPATH
360 $ echo "[blackbox]" >> $HGRCPATH
368 $ echo "maxsize = 1" >> $HGRCPATH
361 $ echo "maxsize = 1" >> $HGRCPATH
369 $ $NO_FALLBACK rhg files > /dev/null
362 $ $NO_FALLBACK rhg files > /dev/null
370 $ cat .hg/blackbox.log
363 $ cat .hg/blackbox.log
371 ????-??-?? ??:??:??.??? * @d3873e73d99ef67873dac33fbcc66268d5d2b6f4 (*)> (rust) files exited 0 after 0.??? seconds (glob)
364 ????-??-?? ??:??:??.??? * @d3873e73d99ef67873dac33fbcc66268d5d2b6f4 (*)> (rust) files exited 0 after 0.??? seconds (glob)
372 $ cat .hg/blackbox.log.1
365 $ cat .hg/blackbox.log.1
373 ????-??-?? ??:??:??.??? * @d3873e73d99ef67873dac33fbcc66268d5d2b6f4 (*)> (rust) files (glob)
366 ????-??-?? ??:??:??.??? * @d3873e73d99ef67873dac33fbcc66268d5d2b6f4 (*)> (rust) files (glob)
374
367
375 Subrepos are not supported
368 Subrepos are not supported
376
369
377 $ touch .hgsub
370 $ touch .hgsub
378 $ $NO_FALLBACK rhg files
371 $ $NO_FALLBACK rhg files
379 unsupported feature: subrepos (.hgsub is present)
372 unsupported feature: subrepos (.hgsub is present)
380 [252]
373 [252]
381 $ rhg files
374 $ rhg files
382 a
375 a
383 $ rm .hgsub
376 $ rm .hgsub
384
377
385 The `:required` extension suboptions are correctly ignored
378 The `:required` extension suboptions are correctly ignored
386
379
387 $ echo "[extensions]" >> $HGRCPATH
380 $ echo "[extensions]" >> $HGRCPATH
388 $ echo "blackbox:required = yes" >> $HGRCPATH
381 $ echo "blackbox:required = yes" >> $HGRCPATH
389 $ rhg files
382 $ rhg files
390 a
383 a
391 $ echo "*:required = yes" >> $HGRCPATH
384 $ echo "*:required = yes" >> $HGRCPATH
392 $ rhg files
385 $ rhg files
393 a
386 a
General Comments 0
You need to be logged in to leave comments. Login now