[PATCH V2] subrepo: append subrepo path to subrepo push error messages
Mads Kiilerich
mads at kiilerich.com
Sun Dec 16 17:53:19 CST 2012
Angel Ezquerra wrote, On 12/16/2012 11:43 PM:
> On Sun, Dec 16, 2012 at 2:57 AM, Mads Kiilerich <mads at kiilerich.com> wrote:
>> Angel Ezquerra wrote, On 12/16/2012 01:29 AM:
>>
>>> # HG changeset patch
>>> # User Angel Ezquerra <angel.ezquerra at gmail.com>
>>> # Date 1355438273 -3600
>>> # Node ID cec32425a026c4aeb9a6495086b1a1fbe916be24
>>> # Parent 34a1a639d8358e43f4bcba7b0cff19f4e4e6958d
>>> subrepo: append subrepo path to subrepo push error messages
>>>
>>> This change appends the subrepo path to subrepo push errors. That is, when
>>> there
>>> is an error pushing a subrepo, rather than displaying:
>>>
>>> pushing subrepo MYSUBREPO to PATH
>>> searching for changes
>>> abort: push creates new remote head HEADHASH!
>>> hint: did you forget to merge? use push -f to force
>>>
>>> mercurial will show:
>>>
>>> pushing subrepo MYSUBREPO to PATH
>>> searching for changes
>>> abort: push creates new remote head HEADHASH! (on subrepo MYSUBREPO)
>>> hint: did you forget to merge? use push -f to force
>>>
>>> The rationale for this change is that the current error messages make it
>>> hard
>>> for TortoiseHg (and similar tools) to tell the user which subrepo caused
>>> the
>>> push failure.
>>>
>>> Note that I have also updated test-subrepo.t to reflect this change. The
>>> test
>>> passes on windows.
>>>
>>> diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
>>> --- a/mercurial/subrepo.py
>>> +++ b/mercurial/subrepo.py
>>> @@ -567,7 +567,12 @@
>>> self._repo.ui.status(_('pushing subrepo %s to %s\n') %
>>> (subrelpath(self), dsturl))
>>> other = hg.peer(self._repo, {'ssh': ssh}, dsturl)
>>> - return self._repo.push(other, force, newbranch=newbranch)
>>> + try:
>>> + res = self._repo.push(other, force, newbranch=newbranch)
>>> + except error.Abort, ex:
>>> + errormsg = ex.message + (' (on subrepo %s)' %
>>> subrelpath(self))
>>
>> The message should be marked up for localization.
> You are right. I believe that it would not be enough to put a "_" call
> around the ' (on subrepo %s)' string, because it would not be found,
> right? Instead I must do:
>
> errormsg = _('%s (on subrepo %s)' % (ex.message, subrelpath(self)))
>
> Is that correct?
No. _() will be found and the message extracted almost no matter where
you hide it. You can test with
xgettext mercurial/subrepo.py
and look at messages.po
> I think push is more important in the sense that it is (in my
> experience) the command that most commonly fails. That being said
> probably most (if not all) other commands could benefit from this. I
> decided to send this simple patch that fixes the main problem but if
> you guys agree I can try to do the same for other commands.
>
> As for using a decorator, are you thinking of something like this?:
>
> def handlessubrepoerror(func):
> def decoratedmethod(self, *args, **kargs):
> try:
> res = func(self, *args, **kargs)
> except error.Abort, ex:
> errormsg = _('%s (on subrepo %s)' % (ex.message, subrelpath(self)))
> raise util.Abort(errormsg, hint=ex.hint)
> return res
> return decoratedmethod
>
> If so, would we need to decorate every method on all the subrepo
> subclasses?
Yes, something like that. But it would perhaps be overkill.
> Maybe there is a simpler way to apply such a generator to
> all methods?
Some fancy meta class programming could do it ... but it would be very
magic and probably not a good idea.
> Also, I worry that adding ' (on subrepo %s)' to every
> error message may result on weird error messages? Maybe it should be
> changed to '(error happened on subrepo %s)' or something of the sort?
Keeping it short is probably what matters the most here.
(And it seems like we have a messy 50/50 between "subrepo" and
"subrepository" in the user facing messages.)
/Mads
More information about the Mercurial-devel
mailing list