[PATCH] histedit: don't allow to strip nodes which are necessary to continue histedit

Augie Fackler raf at durin42.com
Tue Feb 10 09:35:28 CST 2015


On Feb 9, 2015, at 6:52 PM, Augie Fackler <raf at durin42.com> wrote:

> On Thu, Feb 05, 2015 at 05:56:16PM -0800, Mateusz Kwapich wrote:
>> # HG changeset patch
>> # User Mateusz Kwapich <mitrandir at fb.com>
>> # Date 1422665255 28800
>> #      Fri Jan 30 16:47:35 2015 -0800
>> # Node ID 1e028495b7e6e34f1be12e3c78ff50165e9810b7
>> # Parent  c53bc2e52514825cbd40d29dd08693c8a640256e
>> histedit: don't allow to strip nodes which are necessary to continue histedit
> 
> Queued, because this is obviously correct.

Also, check-code wants you to be its valentine.

> 
> That said, should we be blocking strip at all points when you have to
> run a hg $SOMETHING --continue? It might mess with rebase to do strip
> mid-rebase (if you had to resolve conflicts, for example).
> 
>> 
>> During histedit we don't want user to do any operation resulting in
>> stripping nodes needed to continue history editing. This patch
>> wraps the strip function to detect such situations.
>> 
>> diff --git a/hgext/histedit.py b/hgext/histedit.py
>> --- a/hgext/histedit.py
>> +++ b/hgext/histedit.py
>> @@ -158,6 +158,7 @@
>> from mercurial import error
>> from mercurial import copies
>> from mercurial import context
>> +from mercurial import extensions
>> from mercurial import hg
>> from mercurial import node
>> from mercurial import repair
>> @@ -674,6 +675,7 @@
>>         actfunc = actiontable[action]
>>         state.parentctx, replacement_ = actfunc(ui, state, ha, opts)
>>         state.replacements.extend(replacement_)
>> +    state.write()
>> 
>>     hg.update(repo, state.parentctx.node())
>> 
>> @@ -971,6 +973,22 @@
>>     finally:
>>         release(lock)
>> 
>> +def stripwrapper(orig, ui, repo, nodelist, *args, **kwargs):
>> +    if isinstance(nodelist, str):
>> +        nodelist = [nodelist]
>> +    if os.path.exists(os.path.join(repo.path, 'histedit-state')):
>> +        state = histeditstate(repo)
>> +        state.read()
>> +        histedit_nodes= set([ctx for (action, ctx) in state.rules])
>> +        strip_nodes = set([str(repo[n]) for n in nodelist])
>> +        common_nodes = histedit_nodes & strip_nodes
>> +        if common_nodes:
>> +            raise util.Abort(_('unable to strip %s. Nodes are '
>> +                               'used by history edit in progress.'% ', '.join(common_nodes)))
>> +    return orig(ui, repo, nodelist, *args, **kwargs)
>> +
>> +extensions.wrapfunction(repair, 'strip', stripwrapper)
>> +
>> def summaryhook(ui, repo):
>>     if not os.path.exists(repo.join('histedit-state')):
>>         return
>> diff --git a/tests/test-histedit-edit.t b/tests/test-histedit-edit.t
>> --- a/tests/test-histedit-edit.t
>> +++ b/tests/test-histedit-edit.t
>> @@ -3,6 +3,7 @@
>>   $ cat >> $HGRCPATH <<EOF
>>> [extensions]
>>> histedit=
>> +  > strip=
>>> EOF
>> 
>>   $ initrepo ()
>> @@ -72,6 +73,11 @@
>>   (use 'hg histedit --continue' or 'hg histedit --abort')
>>   [255]
>> 
>> +Try to delete necessary commit
>> +  $ hg strip -r 652413bf663e
>> +  abort: unable to strip 652413bf663e. Nodes are used by history edit in progress.
>> +  [255]
>> +
>> commit, then edit the revision
>>   $ hg ci -m 'wat'
>>   created new head
>> _______________________________________________
>> 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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://selenic.com/pipermail/mercurial-devel/attachments/20150210/90c6dc73/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://selenic.com/pipermail/mercurial-devel/attachments/20150210/90c6dc73/attachment.pgp>


More information about the Mercurial-devel mailing list