diff --git a/hgext3rd/undo.py b/hgext3rd/undo.py --- a/hgext3rd/undo.py +++ b/hgext3rd/undo.py @@ -357,7 +357,44 @@ reverseindex = revsetlang.getinteger(args.get('reverseindex'), _('index must be a positive integer'), 1) revs = _getolddrafts(repo, reverseindex) - return smartset.baseset(revs) + return subset & smartset.baseset(revs) + +def _getlocalbranch(repo, changectx): + localctxs = [] + bases = repo.revs('roots(draft())') + for base in bases: + localbranch = repo.revs(revsetlang.formatspec('descendants(%s)', base)) + if changectx in localbranch: + localctxs.append(base) + return localctxs + +@revsetpredicate('localbranch') +def _localbranch(repo, subset, x): + """``localbranch(changeset)`` + localbranch changesets + + Returns all commits within the same localbranch as the changeset. A local + branch is all draft changesets that are connected, uninterupted by public + changesets. + """ + args = revset.getargsdict(x, 'branchrevset', 'changeset') + revstring = revsetlang.getstring(args.get('changeset'), + _('localbranch argument must be a changeset')) + revs = repo.revs(revstring) + localbranch = [] + for i in revs: + # get the local branches that are attached to a public commit + if repo.revs(revsetlang.formatspec('public() and %s', i)): + for j in repo.revs(revsetlang.formatspec('children(%s)', i)): + localbranch.extend(_getlocalbranch(repo, j)) + else: + localbranch.extend(_getlocalbranch(repo, i)) + branchroots = [] + for i in localbranch: + if i not in branchroots: + branchroots.append(i) + localbranchstring = revsetlang.formatspec('descendants(%ls)', branchroots) + return subset & smartset.baseset(repo.revs(localbranchstring)) # Undo: diff --git a/tests/test-undo.t b/tests/test-undo.t --- a/tests/test-undo.t +++ b/tests/test-undo.t @@ -177,6 +177,32 @@ @ 10[tip][master] aa430c8afedf 1970-01-01 00:00 +0000 test | a5 ~ + $ hg log -G -r 'olddraft(1) and draft()' -T compact + o 9 1dafc0b43612 1970-01-01 00:00 +0000 test + | cmiss + | + o 8:4 0a3dd3e15e65 1970-01-01 00:00 +0000 test + | words + | + | o 7[feature2]:4 296fda51a303 1970-01-01 00:00 +0000 test + |/ d + | + o 4 38d85b506754 1970-01-01 00:00 +0000 test + | c2 + | + o 3:1 ec7553f7b382 1970-01-01 00:00 +0000 test + | c1 + | + | o 2[feature1] 49cdb4091aca 1970-01-01 00:00 +0000 test + |/ b + | + o 1 b68836a6e2ca 1970-01-01 00:00 +0000 test + | a2 + | + o 0 df4fd610a3d6 1970-01-01 00:00 +0000 test + a1 + + $ hg log -G -r 'olddraft(1) and public()' -T compact Test undolog lock $ hg log --config hooks.duringundologlock="sleep 1" > /dev/null & @@ -414,3 +440,103 @@ #endif $ hg debugundohistory -l 0: -- gap in log -- + +localbranch revset tests + $ hg log -r 'localbranch(75f63379f12b)' + changeset: 0:df4fd610a3d6 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: a1 + + changeset: 1:b68836a6e2ca + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: a2 + + changeset: 2:49cdb4091aca + bookmark: feature1 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: b + + changeset: 3:ec7553f7b382 + parent: 1:b68836a6e2ca + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: c1 + + changeset: 4:38d85b506754 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: c2 + + changeset: 7:296fda51a303 + bookmark: feature2 + parent: 4:38d85b506754 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: d + + changeset: 8:0a3dd3e15e65 + parent: 4:38d85b506754 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: words + + changeset: 9:1dafc0b43612 + bookmark: master + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: cmiss + + changeset: 17:d0fdb9510dbf + parent: 9:1dafc0b43612 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: newfiles + + changeset: 18:75f63379f12b + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: newfiles + + $ hg phase -r 0a3dd3e15e65 -p + $ hg log -r 'localbranch(75f63379f12b)' + changeset: 9:1dafc0b43612 + bookmark: master + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: cmiss + + changeset: 17:d0fdb9510dbf + parent: 9:1dafc0b43612 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: newfiles + + changeset: 18:75f63379f12b + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: newfiles + + $ hg log -r 'localbranch(0a3dd3e15e65)' + changeset: 9:1dafc0b43612 + bookmark: master + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: cmiss + + changeset: 17:d0fdb9510dbf + parent: 9:1dafc0b43612 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: newfiles + + changeset: 18:75f63379f12b + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: newfiles +