[PATCH 3 of 3 STABLE?] cmdutil: delay examination of dirstate parents until editor invocation

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Nov 17 02:54:00 UTC 2015



On 11/15/2015 01:14 AM, Yuya Nishihara wrote:
> On Sat, 14 Nov 2015 03:46:25 +0900, FUJIWARA Katsunori wrote:
>> # HG changeset patch
>> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
>> # Date 1447437921 -32400
>> #      Sat Nov 14 03:05:21 2015 +0900
>> # Branch stable
>> # Node ID f90cd44b9860347b58e04e2bf4228bb9566de3f5
>> # Parent  24e29f6c10ed52935786e394954e01af8b0e258b
>> cmdutil: delay examination of dirstate parents until editor invocation
>>
>> Before this patch, 'mergeeditform()' immediately examines dirstate
>> parents, even though it may be invoked outside wlock scope (normal "hg
>> commit" is typical case).
>>
>> This may show "ignoring unknown working parent" message occasionally,
>> because current dirstate parents may not be contained in changelog,
>> which is cached outside wlock scope (see issue4378 for detail).
>>
>> In such case, "editform" may have ".normal" suffix, even if the
>> working directory has actually two parents.
>>
>> This patch delays examination of dirstate parents until editor
>> invocation by returning callable object if examination of dirstate
>> parents is needed.
>>
>> This callable object is evaluated at external editor invocation, and
>> wlock should be already acquired at that point.
>>
>> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
>> --- a/mercurial/cmdutil.py
>> +++ b/mercurial/cmdutil.py
>> @@ -333,19 +333,26 @@ def logmessage(ui, opts):
>>       return message
>>
>>   def mergeeditform(ctxorbool, baseformname):
>> -    """return appropriate editform name (referencing a committemplate)
>> +    """return appropriate editform name or the callable object to get it
>>
>>       'ctxorbool' is either a ctx to be committed, or a bool indicating whether
>>       merging is committed.
>>
>> -    This returns baseformname with '.merge' appended if it is a merge,
>> -    otherwise '.normal' is appended.
>> +    This (or the returned callable object) returns baseformname with
>> +    '.merge' appended if it is a merge, otherwise '.normal' is appended.
>>       """
>>       if isinstance(ctxorbool, bool):
>>           if ctxorbool:
>>               return baseformname + ".merge"
>> -    elif 1 < len(ctxorbool.parents()):
>> -        return baseformname + ".merge"
>> +    else:
>> +        # delay accessing to changelog via localrepository.dirstate
>> +        # (see issue4378 for detail)
>> +        def geteditform():
>> +            if 1 < len(ctxorbool.parents()):
>> +                return baseformname + ".merge"
>> +            else:
>> +                return baseformname + ".normal"
>> +        return geteditform
>
> These patches make me think that the problem is the locking scope is too
> narrow to do commit consistently. Is it wrong to take both lock and wlock
> earlier, at cmdutil.commit() for example?

I agree with Yuya that we have a wider locking scope issue here. We 
should prepare the commit on a locked repository, otherwise we will end 
up with a strange state.

(also the branchheads() things is a bug we just uncovered)

Patch 1 seems correct in itself, Foozy, can you confirm we should still 
take it ?

-- 
Pierre-Yves David



More information about the Mercurial-devel mailing list