[PATCH 1 of 2] Add tolerant option to log command

Jason Harris jason.f.harris at gmail.com
Sat Dec 11 23:28:45 CST 2010


On Dec 12, 2010, at 6:08 AM, Augie Fackler wrote:

> On Dec 11, 2010, at 9:20 PM, Jason Harris wrote:
>> 
>> # HG changeset patch
>> # User jfh <jason at jasonfharris.com>
>> # Date 1292119613 -3600
>> # Node ID 5eec305ce06f7f096871f70aacedcd838eb802c2
>> # Parent  4a13ca2c21cefc6409072d9f3bd55a1e8d75b6e1
>> Add tolerant option to log command
>> 
>> Allow revision ranges outside the repository to be handled tolerantly. For
>> instance assume that the repository has 15 changesets and the user asks for log
>> --tolerant --rev "0:23" then Mercurial should interpret this request as --rev
>> "0:15" and not fail with an abort: unknown revision '23'! error.
>> 
>> This is important for GUI clients which are working in a multithreaded way when
>> strip or collapse or histedit operations are taking place the size of the
>> repository can become smaller while a status update of the size of the
>> repository is underway.
>> 
>> Conceivably this should just happen automatically for --noninteractive?
> 
> Why can't you do --rev 0:-1 for that use case and have it work?

Ahhh... The message here is dealing with a simplified case so its easily understood what I am doing. However in practice the GUI works in a very incremental way. More likely in practice the requested range will be something like eg --rev "1589:1689" . Its not at all clear that you want to go to the tip, the tip might be at 3000 but if the instruction executed is "hg strip 1200" then I'll have problems...

Cheers,
  Jas


>> 
>> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
>> --- a/mercurial/cmdutil.py
>> +++ b/mercurial/cmdutil.py
>> @@ -134,14 +134,27 @@
>> 
>>    return repo.lookup(l[0]), repo.lookup(l[-1])
>> 
>> -def revrange(repo, revs):
>> +def revrange(repo, revs, opts = {}):
>>    """Yield revision as strings from a list of revision specifications."""
>> 
>> -    def revfix(repo, val, defval):
>> +    def revfix(repo, val, defval, tolerant):
>>        if not val and val != 0 and defval is not None:
>>            return defval
>> +        if tolerant:
>> +            #constrain a numerical revision to be inside 0:tip
>> +            max = len(repo) - 1
>> +            try:
>> +                rev = int(val)
>> +                if str(rev) == val:
>> +                    if rev > max:
>> +                        val = str(max)
>> +                    elif rev < -max-1:
>> +                        val = str(-max-1)
>> +            except:
>> +                pass
>>        return repo.changelog.rev(repo.lookup(val))
>> 
>> +    tolerant = opts.get('tolerant')
>>    seen, l = set(), []
>>    for spec in revs:
>>        # attempt to parse old-style ranges first to deal with
>> @@ -154,8 +167,8 @@
>> 
>>            if revrangesep in spec:
>>                start, end = spec.split(revrangesep, 1)
>> -                start = revfix(repo, start, 0)
>> -                end = revfix(repo, end, len(repo) - 1)
>> +                start = revfix(repo, start, 0, tolerant)
>> +                end = revfix(repo, end, len(repo) - 1, tolerant)
>>                step = start > end and -1 or 1
>>                for rev in xrange(start, end + step, step):
>>                    if rev in seen:
>> @@ -164,7 +177,7 @@
>>                    l.append(rev)
>>                continue
>>            elif spec and spec in repo: # single unquoted rev
>> -                rev = revfix(repo, spec, None)
>> +                rev = revfix(repo, spec, None, tolerant)
>>                if rev in seen:
>>                    continue
>>                seen.add(rev)
>> @@ -1106,7 +1119,7 @@
>>        defrange = '%s:0' % repo['.'].rev()
>>    else:
>>        defrange = '-1:0'
>> -    revs = revrange(repo, opts['rev'] or [defrange])
>> +    revs = revrange(repo, opts['rev'] or [defrange], opts)
>>    if not revs:
>>        return []
>>    wanted = set()
>> diff --git a/mercurial/commands.py b/mercurial/commands.py
>> --- a/mercurial/commands.py
>> +++ b/mercurial/commands.py
>> @@ -3974,6 +3974,8 @@
>>     _('limit number of changes displayed'), _('NUM')),
>>    ('M', 'no-merges', None, _('do not show merges')),
>>    ('', 'stat', None, _('output diffstat-style summary of changes')),
>> +    ('', 'tolerant', None,
>> +     _('tolerate revision ranges outside the repository')),
>> ] + templateopts
>> 
>> diffopts = [
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at selenic.com
>> http://selenic.com/mailman/listinfo/mercurial-devel
> 
> 
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list