# HG changeset patch # User Alain Leufroy # Date 1317206155 -7200 # Node ID 7d0617e584ffd213b264b1afaa23c447dc1a4b5c # Parent 67a3aa020d912e0367e26a554879b807ced89414 [states] fix strip but one thing still stay wrong (see test test-state-strip.t) diff -r 67a3aa020d91 -r 7d0617e584ff hgext/states.py --- a/hgext/states.py Tue Sep 27 11:25:13 2011 +0200 +++ b/hgext/states.py Wed Sep 28 12:35:55 2011 +0200 @@ -1038,35 +1038,28 @@ def strip(ui, repo, node, backup="all"): cl = repo.changelog - striprev = cl.rev(node) revstostrip = set(cl.descendants(striprev)) revstostrip.add(striprev) - tostrip = set(cl.node(rev) for rev in revstostrip) # XXX stay in nodes? - - baserevstostrip = revstostrip - set(cl.descendants(*revstostrip)) - basetostrip = set(cl.node(rev) for rev in baserevstostrip) # XXX stay in nodes? - newstatesheads = reduce(or_, - (set(cl.parents(n)) for n in basetostrip), - set([])) - - statesheads={} # use this cache as repo.nodestate shall work - for nd in newstatesheads: + tostrip = set(map(cl.node, revstostrip)) + # compute the potentially new created states bondaries which are any + # parent of the stripped node that are not stripped (may not be heads) + newbondaries = set(par for nod in tostrip for par in cl.parents(nod) + if par not in tostrip) + # save the current states of newbondaries in a chache as repo.nodestate + # must work along the loop. We will use the next loop to add them. + statesheads={} + for nd in newbondaries: state = repo.nodestate(nd) - if not state.trackheads: - continue - statesheads.setdefault(state, set([])).add(nd) + if state.trackheads: + statesheads.setdefault(state, set([])).add(nd) for state, heads in repo._statesheads.iteritems(): - if not state.trackheads: - continue - heads = set(heads) - headstostrip = tostrip & heads - heads.difference_update(headstostrip) - heads.update(statesheads.get(state, set([]))) - repo._statesheads[state] = list(heads) - _writestateshead(repo) # after ostrip ? - + if state.trackheads: + heads = set(heads) - tostrip | statesheads.get(state, set([])) + repo._statesheads[state] = list(heads) + _writestateshead(repo) return ostrip(ui, repo, node, backup) + mercurial.repair.strip = strip diff -r 67a3aa020d91 -r 7d0617e584ff tests/test-state-strip.t --- a/tests/test-state-strip.t Tue Sep 27 11:25:13 2011 +0200 +++ b/tests/test-state-strip.t Wed Sep 28 12:35:55 2011 +0200 @@ -121,6 +121,83 @@ $ hg log --template "{rev} {node}\n" -r 'readyheads()' 2 a00ba83de58390cbbdae1fc580df0bb0db2e8e88 +More complecated case: a merging changeset inheritate a ready state of one of +its child and have another child in draft. And We strip the ready child + $ hg up 1 + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg merge 2 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m 3 + $ mkcommit 4 + $ hg up 3 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit 5 + created new head + $ mkcommit 6 + $ hg ready 6 + $ hglog + @ 6 ready bfd1096b3dd69e57c184e9f43646a9b7e0dd5927 + | + o 5 ready 8195da2a3c382a4acd7ce796b4bc74092f1875eb + | + | o 4 draft 6aaadc67da669af964adabe681c0a78f46b7ce58 + |/ + o 3 ready e7cd12398be70c568cefab9b4ad86a8a2a728a09 + |\ + | o 2 ready a00ba83de58390cbbdae1fc580df0bb0db2e8e88 + | | + o | 1 published e8342c9a2ed18fb27f9fdfc48a3105d164a06e77 + |/ + o 0 published 06254b90631198c9b9e426be9886af92fedc9a2d + + $ hg strip -n 3 + 0 files updated, 0 files merged, 3 files removed, 0 files unresolved + $ hglog + o 2 ready a00ba83de58390cbbdae1fc580df0bb0db2e8e88 + | + | @ 1 published e8342c9a2ed18fb27f9fdfc48a3105d164a06e77 + |/ + o 0 published 06254b90631198c9b9e426be9886af92fedc9a2d + +Quitelly the same as before but we strip before the merging node, from another +branch than the ready changeset, so this changeset is not a parent of the +the explicitly stripped node. + $ hg up 1 + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ mkcommit 3 + $ hg up 2 + 1 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ hg merge 3 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m '4' + $ mkcommit 5 + $ hg published 3 + $ hg ready 4 + $ hglog + @ 5 draft 0777a3135ec5396c57db4402c71ab8cba2a0ef7e + | + o 4 ready 667667458ecc8cf7763dee1ae172a5a9ebf115f3 + |\ + | o 3 published 03fc50a1c0074093104ff6c5357c486781742b64 + | | + o | 2 ready a00ba83de58390cbbdae1fc580df0bb0db2e8e88 + | | + | o 1 published e8342c9a2ed18fb27f9fdfc48a3105d164a06e77 + |/ + o 0 published 06254b90631198c9b9e426be9886af92fedc9a2d + + $ hg strip -n 3 + 0 files updated, 0 files merged, 3 files removed, 0 files unresolved + $ hglog + o 2 ready a00ba83de58390cbbdae1fc580df0bb0db2e8e88 + | + | @ 1 published e8342c9a2ed18fb27f9fdfc48a3105d164a06e77 + |/ + o 0 published 06254b90631198c9b9e426be9886af92fedc9a2d + + pathologic case $ hg up 1 0 files updated, 0 files merged, 0 files removed, 0 files unresolved @@ -162,4 +239,50 @@ |/ o 0 published 06254b90631198c9b9e426be9886af92fedc9a2d -# +pathologic case + $ hg up 1 + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg merge 2 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m 3 + $ hg up 2 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit 4 + created new head + $ hg merge 3 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m 5 + $ hg up 4 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit 6 + created new head + $ hg ready 4 + $ hglog + @ 6 draft 036d507f2b771a3b7cc88580c93d5037bf4bf1bf + | + | o 5 draft 19788060dab104e9385a14c4be2fc5678b9433f0 + |/| + o | 4 ready 0fc8455e844047eab375a1f51816f697551e34cf + | | + | o 3 draft e7cd12398be70c568cefab9b4ad86a8a2a728a09 + |/| + o | 2 ready a00ba83de58390cbbdae1fc580df0bb0db2e8e88 + | | + | o 1 published e8342c9a2ed18fb27f9fdfc48a3105d164a06e77 + |/ + o 0 published 06254b90631198c9b9e426be9886af92fedc9a2d + + $ hg strip -n 1 + $ hglog + @ 3 draft 036d507f2b771a3b7cc88580c93d5037bf4bf1bf + | + o 2 ready 0fc8455e844047eab375a1f51816f697551e34cf + | + o 1 ready a00ba83de58390cbbdae1fc580df0bb0db2e8e88 + | + o 0 published 06254b90631198c9b9e426be9886af92fedc9a2d + + $ hg log --template '{rev} {state} {node}\n' -r 'readyheads()' + 2 ready 0fc8455e844047eab375a1f51816f697551e34cf