hgext3rd/evolve/stablesort.py
changeset 3256 c82a2632327e
parent 3255 bb3f8c8c1232
child 3262 774f69d74ec2
equal deleted inserted replaced
3255:bb3f8c8c1232 3256:c82a2632327e
    44     'debugstablesort',
    44     'debugstablesort',
    45     [
    45     [
    46         ('r', 'rev', [], 'heads to start from'),
    46         ('r', 'rev', [], 'heads to start from'),
    47         ('', 'method', 'branchpoint', "method used for sorting, one of: "
    47         ('', 'method', 'branchpoint', "method used for sorting, one of: "
    48          "branchpoint, basic-mergepoint and basic-headstart"),
    48          "branchpoint, basic-mergepoint and basic-headstart"),
       
    49         ('l', 'limit', '', 'number of revision display (default to all)')
    49     ] + commands.formatteropts,
    50     ] + commands.formatteropts,
    50     _(''))
    51     _(''))
    51 def debugstablesort(ui, repo, **opts):
    52 def debugstablesort(ui, repo, **opts):
    52     """display the ::REVS set topologically sorted in a stable way
    53     """display the ::REVS set topologically sorted in a stable way
    53     """
    54     """
    59         valid_method = ', '.join(sorted(_methodmap))
    60         valid_method = ', '.join(sorted(_methodmap))
    60         raise error.Abort('unknown sorting method: "%s"' % method,
    61         raise error.Abort('unknown sorting method: "%s"' % method,
    61                           hint='pick one of: %s' % valid_method)
    62                           hint='pick one of: %s' % valid_method)
    62 
    63 
    63     displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
    64     displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
    64     for r in sorting(repo, revs):
    65     kwargs = {}
       
    66     if opts['limit']:
       
    67         kwargs['limit'] = int(opts['limit'])
       
    68     for r in sorting(repo, revs, **kwargs):
    65         ctx = repo[r]
    69         ctx = repo[r]
    66         displayer.show(ctx)
    70         displayer.show(ctx)
    67         displayer.flush(ctx)
    71         displayer.flush(ctx)
    68     displayer.close()
    72     displayer.close()
    69 
    73 
   226 
   230 
   227     result.reverse()
   231     result.reverse()
   228     assert len(result) == len(resultset)
   232     assert len(result) == len(resultset)
   229     return result
   233     return result
   230 
   234 
   231 def stablesort_mergepoint_head_basic(repo, revs):
   235 def stablesort_mergepoint_head_basic(repo, revs, limit=None):
   232     heads = repo.revs('heads(%ld)', revs)
   236     heads = repo.revs('heads(%ld)', revs)
   233     if not heads:
   237     if not heads:
   234         return []
   238         return []
   235     elif 2 < len(heads):
   239     elif 2 < len(heads):
   236         raise error.Abort('cannot use head based merging, %d heads found'
   240         raise error.Abort('cannot use head based merging, %d heads found'
   237                           % len(heads))
   241                           % len(heads))
   238     head = heads.first()
   242     head = heads.first()
   239     return stablesort_mergepoint_bounded(repo, head, repo.revs('::%d', head))
   243     revs = stablesort_mergepoint_bounded(repo, head, repo.revs('::%d', head))
       
   244     if limit is None:
       
   245         return revs
       
   246     return revs[-limit:]
   240 
   247 
   241 _methodmap = {
   248 _methodmap = {
   242     'branchpoint': stablesort_branchpoint,
   249     'branchpoint': stablesort_branchpoint,
   243     'basic-mergepoint': stablesort_mergepoint_multirevs,
   250     'basic-mergepoint': stablesort_mergepoint_multirevs,
   244     'basic-headstart': stablesort_mergepoint_head_basic,
   251     'basic-headstart': stablesort_mergepoint_head_basic,