Submitter | Pierre-Yves David |
---|---|
Date | March 31, 2014, 6:39 p.m. |
Message ID | <c49f6dae96445ee65830.1396291148@marginatus.alto.octopoid.net> |
Download | mbox | patch |
Permalink | /patch/4161/ |
State | Superseded |
Commit | 97b2f26dfc43be63ef48f7cdddfb984ecfd462fc |
Headers | show |
Comments
pierre-yves.david@ens-lyon.org writes: > # HG changeset patch > # User Pierre-Yves David <pierre-yves.david@fb.com> > # Date 1395366265 25200 > # Thu Mar 20 18:44:25 2014 -0700 > # Node ID c49f6dae96445ee65830f21dc76466d9384c659d > # Parent 8a6a86c9a5b58ccc020de1ff0429e72dfa5599fc > revpair: smartset compatibility > > Since recent revset changes, revrange now return a smartset. This smart set > probably does not support indexing (_addset does not). This led to crash. > Instead when the smartset is ordered with use the `min` and `max` method of "with use the" ? do you mean "we use the..." ? > smart set. Otherwise we turn is into a list and use indexing on it. > > The tests have been updated to catch such regression. > > diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py > --- a/mercurial/scmutil.py > +++ b/mercurial/scmutil.py > @@ -468,17 +468,30 @@ def revpair(repo, revs): > if not revs: > return repo.dirstate.p1(), None > > l = revrange(repo, revs) > > - if len(l) == 0: > + if not l: > + first = second = None > + elif l.isascending(): > + first = l.min() > + second = l.max() > + elif l.isdescending(): > + first = l.max() > + second = l.min() > + else: > + l = list(l) > + first = l[0] > + second = l[-1] > + > + if first is None: > raise util.Abort(_('empty revision range')) > > - if len(l) == 1 and len(revs) == 1 and _revrangesep not in revs[0]: > - return repo.lookup(l[0]), None > + if first==second and len(revs) == 1 and _revrangesep not in revs[0]: first == second besides the nits it looks good.
Patch
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -468,17 +468,30 @@ def revpair(repo, revs): if not revs: return repo.dirstate.p1(), None l = revrange(repo, revs) - if len(l) == 0: + if not l: + first = second = None + elif l.isascending(): + first = l.min() + second = l.max() + elif l.isdescending(): + first = l.max() + second = l.min() + else: + l = list(l) + first = l[0] + second = l[-1] + + if first is None: raise util.Abort(_('empty revision range')) - if len(l) == 1 and len(revs) == 1 and _revrangesep not in revs[0]: - return repo.lookup(l[0]), None + if first==second and len(revs) == 1 and _revrangesep not in revs[0]: + return repo.lookup(first), None - return repo.lookup(l[0]), repo.lookup(l[-1]) + return repo.lookup(first), repo.lookup(second) _revrangesep = ':' def revrange(repo, revs): """Yield revision as strings from a list of revision specifications.""" diff --git a/tests/test-revset.t b/tests/test-revset.t --- a/tests/test-revset.t +++ b/tests/test-revset.t @@ -742,10 +742,47 @@ multiple revspecs 4 5 6 7 +test usage in revpair (with "+") + +(real pair) + + $ hg diff -r 'tip^^' -r 'tip' + diff -r 2326846efdab -r 24286f4ae135 .hgtags + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +e0cc66ef77e8b6f711815af4e001a6594fde3ba5 1.0 + $ hg diff -r 'tip^^::tip' + diff -r 2326846efdab -r 24286f4ae135 .hgtags + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +e0cc66ef77e8b6f711815af4e001a6594fde3ba5 1.0 + +(single rev) + + $ hg diff -r 'tip^' -r 'tip^' + $ hg diff -r 'tip^::tip^ or tip^' + +(single rev that does not looks like a range) + + $ hg diff -r 'tip^ or tip^' + diff -r d5d0dcbdc4d9 .hgtags + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/.hgtags * (glob) + @@ -0,0 +1,1 @@ + +e0cc66ef77e8b6f711815af4e001a6594fde3ba5 1.0 + +(no rev) + + $ hg diff -r 'author("babar") or author("celeste")' + abort: empty revision range + [255] + aliases: $ echo '[revsetalias]' >> .hg/hgrc $ echo 'm = merge()' >> .hg/hgrc $ echo 'sincem = descendants(m)' >> .hg/hgrc