Show More
@@ -10,13 +10,16 b' from __future__ import absolute_import' | |||
|
10 | 10 | |
|
11 | 11 | import errno |
|
12 | 12 | import os |
|
13 | import random | |
|
13 | 14 | import re |
|
14 | 15 | import struct |
|
15 | 16 | |
|
16 | 17 | from ..node import hex |
|
17 | 18 | |
|
18 | 19 | from .. import ( |
|
20 | encoding, | |
|
19 | 21 | error, |
|
22 | pycompat, | |
|
20 | 23 | util, |
|
21 | 24 | ) |
|
22 | 25 | |
@@ -288,6 +291,45 b' def _make_uid():' | |||
|
288 | 291 | return hex(os.urandom(ID_SIZE)) |
|
289 | 292 | |
|
290 | 293 | |
|
294 | # some special test logic to avoid anoying random output in the test | |
|
295 | stable_docket_file = encoding.environ.get(b'HGTEST_DOCKETIDFILE') | |
|
296 | ||
|
297 | if stable_docket_file: | |
|
298 | ||
|
299 | def _make_uid(): | |
|
300 | try: | |
|
301 | with open(stable_docket_file, mode='rb') as f: | |
|
302 | seed = f.read().strip() | |
|
303 | except IOError as inst: | |
|
304 | if inst.errno != errno.ENOENT: | |
|
305 | raise | |
|
306 | seed = b'4' # chosen by a fair dice roll. garanteed to be random | |
|
307 | if pycompat.ispy3: | |
|
308 | iter_seed = iter(seed) | |
|
309 | else: | |
|
310 | iter_seed = (ord(c) for c in seed) | |
|
311 | # some basic circular sum hashing on 64 bits | |
|
312 | int_seed = 0 | |
|
313 | low_mask = int('1' * 35, 2) | |
|
314 | for i in iter_seed: | |
|
315 | high_part = int_seed >> 35 | |
|
316 | low_part = (int_seed & low_mask) << 28 | |
|
317 | int_seed = high_part + low_part + i | |
|
318 | r = random.Random() | |
|
319 | if pycompat.ispy3: | |
|
320 | r.seed(int_seed, version=1) | |
|
321 | else: | |
|
322 | r.seed(int_seed) | |
|
323 | # once we drop python 3.8 support we can simply use r.randbytes | |
|
324 | raw = r.getrandbits(ID_SIZE * 8) | |
|
325 | assert ID_SIZE == 8 | |
|
326 | p = struct.pack('>Q', raw) | |
|
327 | new = hex(p) | |
|
328 | with open(stable_docket_file, 'wb') as f: | |
|
329 | f.write(new) | |
|
330 | return new | |
|
331 | ||
|
332 | ||
|
291 | 333 | class NodeMapDocket(object): |
|
292 | 334 | """metadata associated with persistent nodemap data |
|
293 | 335 |
@@ -1386,6 +1386,8 b' class Test(unittest.TestCase):' | |||
|
1386 | 1386 | env['PYTHONUSERBASE'] = sysconfig.get_config_var('userbase') or '' |
|
1387 | 1387 | env['HGEMITWARNINGS'] = '1' |
|
1388 | 1388 | env['TESTTMP'] = _bytes2sys(self._testtmp) |
|
1389 | docket_id_file = os.path.join(_bytes2sys(self._testtmp), 'DOCKETID') | |
|
1390 | env['HGTEST_DOCKETIDFILE'] = docket_id_file | |
|
1389 | 1391 | env['TESTNAME'] = self.name |
|
1390 | 1392 | env['HOME'] = _bytes2sys(self._testtmp) |
|
1391 | 1393 | if os.name == 'nt': |
General Comments 0
You need to be logged in to leave comments.
Login now