tests/artifacts/scripts/generate-churning-bundle.py
changeset 52437 e26b738430a1
parent 52436 599c696bb514
child 52438 9feb175c028d
equal deleted inserted replaced
52436:599c696bb514 52437:e26b738430a1
    42 NB_LINES = 10500
    42 NB_LINES = 10500
    43 ALWAYS_CHANGE_LINES = 500
    43 ALWAYS_CHANGE_LINES = 500
    44 OTHER_CHANGES = 300
    44 OTHER_CHANGES = 300
    45 
    45 
    46 
    46 
       
    47 def build_graph():
       
    48     heads = {0}
       
    49     graph = {0: (None, None)}
       
    50     for idx in range(1, NB_CHANGESET + 1):
       
    51         p, _ = parents = [idx - 1, None]
       
    52         if (idx % PERIOD_BRANCHING) == 0:
       
    53             back = MOVE_BACK_MIN + (idx % MOVE_BACK_RANGE)
       
    54             for _ in range(back):
       
    55                 p = graph.get(p, (p,))[0]
       
    56                 parents[0] = p
       
    57         if (idx % PERIOD_MERGING) == 0:
       
    58             parents[1] = min(heads)
       
    59         for p in parents:
       
    60             heads.discard(p)
       
    61         heads.add(idx)
       
    62         graph[idx] = tuple(parents)
       
    63     return graph
       
    64 
       
    65 
       
    66 GRAPH = build_graph()
       
    67 
       
    68 
    47 def nextcontent(previous_content):
    69 def nextcontent(previous_content):
    48     """utility to produce a new file content from the previous one"""
    70     """utility to produce a new file content from the previous one"""
    49     return hashlib.md5(previous_content).hexdigest().encode('ascii')
    71     return hashlib.md5(previous_content).hexdigest().encode('ascii')
    50 
    72 
    51 
    73 
    54 
    76 
    55     The content is generated according the iteration index and previous
    77     The content is generated according the iteration index and previous
    56     content"""
    78     content"""
    57 
    79 
    58     # initial call
    80     # initial call
    59     if iteridx is None:
    81     if iteridx == 0:
    60         current = b''
    82         current = b''
    61     else:
    83     else:
    62         current = b"%d" % iteridx
    84         current = b"%d" % iteridx
    63 
    85 
    64     for idx in range(NB_LINES):
    86     for idx in range(NB_LINES):
    75 
    97 
    76 
    98 
    77 def updatefile(filename, idx):
    99 def updatefile(filename, idx):
    78     """update <filename> to be at appropriate content for iteration <idx>"""
   100     """update <filename> to be at appropriate content for iteration <idx>"""
    79     existing = None
   101     existing = None
    80     if idx is not None:
   102     if idx > 0:
    81         with open(filename, 'rb') as old:
   103         with open(filename, 'rb') as old:
    82             existing = old.readlines()
   104             existing = old.readlines()
    83     with open(filename, 'wb') as target:
   105     with open(filename, 'wb') as target:
    84         for line in filecontent(idx, existing):
   106         for line in filecontent(idx, existing):
    85             target.write(line)
   107             target.write(line)
   108 def run(target):
   130 def run(target):
   109     tmpdir = tempfile.mkdtemp(prefix='tmp-hg-test-big-file-bundle-')
   131     tmpdir = tempfile.mkdtemp(prefix='tmp-hg-test-big-file-bundle-')
   110     try:
   132     try:
   111         os.chdir(tmpdir)
   133         os.chdir(tmpdir)
   112         hg('init')
   134         hg('init')
   113         updatefile(FILENAME, None)
   135         for idx, (p1, p2) in GRAPH.items():
   114         hg('commit', '--addremove', '--message', 'initial commit')
       
   115         for idx in range(1, NB_CHANGESET + 1):
       
   116             if sys.stdout.isatty():
   136             if sys.stdout.isatty():
   117                 print("generating commit #%d/%d" % (idx, NB_CHANGESET))
   137                 print("generating commit #%d/%d" % (idx, NB_CHANGESET))
   118             if (idx % PERIOD_BRANCHING) == 0:
   138             if p1 is not None and p1 != idx - 1:
   119                 move_back = MOVE_BACK_MIN + (idx % MOVE_BACK_RANGE)
   139                 hg('update', "%d" % p1)
   120                 hg('update', "max(0+.~%d)" % move_back)
   140             if p2 is not None:
   121             if (idx % PERIOD_MERGING) == 0:
   141                 hg('merge', "%d" % p2)
   122                 hg('merge', 'min(head())')
       
   123             updatefile(FILENAME, idx)
   142             updatefile(FILENAME, idx)
   124             hg('commit', '--message', 'commit #%d' % idx)
   143             if idx == 0:
       
   144                 hg('add', FILENAME)
       
   145                 hg('commit', '--addremove', '--message', 'initial commit')
       
   146             else:
       
   147                 hg('commit', '--message', 'commit #%d' % idx)
   125         hg('bundle', '--all', target, '--config', 'devel.bundle.delta=p1')
   148         hg('bundle', '--all', target, '--config', 'devel.bundle.delta=p1')
   126         with open(target, 'rb') as bundle:
   149         with open(target, 'rb') as bundle:
   127             data = bundle.read()
   150             data = bundle.read()
   128             digest = hashlib.md5(data).hexdigest()
   151             digest = hashlib.md5(data).hexdigest()
   129         with open(target + '.md5', 'wb') as md5file:
   152         with open(target + '.md5', 'wb') as md5file: