# HG changeset patch # User FUJIWARA Katsunori # Date 1427259332 -32400 # Node ID 76b0b0fed2e33fb426d1386d863fa787ddc19f4a # Parent e71053ef0c46b5d0f518527d35de62e3146b5f9f subrepo: add dirtyreason to centralize composing dirty reason message This patch newly adds "dirtyreason()" to centralize composing dirty reason message like "uncommitted changes in subrepository 'xxxx'". There are 3 similar messages below, and this patch is a part of preparations for unifying them into (1), too. 1. uncommitted changes in subrepository 'XXXX' 2. uncommitted changes in subrepository XXXX 3. uncommitted changes in subrepo XXXX This patch chooses adding new method "dirtyreason()" instead of making "dirty()" return "reason string", because: - some of existing "dirty()" implementation is too complicated to do so simply, and - ill-mannered 3rd party subrepo classes, of which "dirty()" doesn't return "reason string", cause meaningless message (even though it is rare case) diff -r e71053ef0c46 -r 76b0b0fed2e3 mercurial/localrepo.py --- a/mercurial/localrepo.py Wed Mar 25 16:40:37 2015 -0700 +++ b/mercurial/localrepo.py Wed Mar 25 13:55:32 2015 +0900 @@ -1372,10 +1372,10 @@ if not force: raise util.Abort( _("commit with new subrepo %s excluded") % s) - if wctx.sub(s).dirty(True): + dirtyreason = wctx.sub(s).dirtyreason(True) + if dirtyreason: if not self.ui.configbool('ui', 'commitsubrepos'): - raise util.Abort( - _("uncommitted changes in subrepo %s") % s, + raise util.Abort(dirtyreason, hint=_("use --subrepos for recursive commit")) subs.append(s) commitsubs.add(s) diff -r e71053ef0c46 -r 76b0b0fed2e3 mercurial/subrepo.py --- a/mercurial/subrepo.py Wed Mar 25 16:40:37 2015 -0700 +++ b/mercurial/subrepo.py Wed Mar 25 13:55:32 2015 +0900 @@ -390,6 +390,18 @@ """ raise NotImplementedError + def dirtyreason(self, ignoreupdate=False): + """return reason string if it is ``dirty()`` + + Returned string should have enough information for the message + of exception. + + This returns None, otherwise. + """ + if self.dirty(ignoreupdate=ignoreupdate): + return _("uncommitted changes in subrepository '%s'" + ) % subrelpath(self) + def basestate(self): """current working directory base state, disregarding .hgsubstate state and working directory modifications""" diff -r e71053ef0c46 -r 76b0b0fed2e3 tests/test-largefiles-misc.t --- a/tests/test-largefiles-misc.t Wed Mar 25 16:40:37 2015 -0700 +++ b/tests/test-largefiles-misc.t Wed Mar 25 13:55:32 2015 +0900 @@ -248,7 +248,7 @@ commit: 1 subrepos update: (current) $ hg ci -m "this commit should fail without -S" - abort: uncommitted changes in subrepo subrepo + abort: uncommitted changes in subrepository 'subrepo' (use --subrepos for recursive commit) [255] diff -r e71053ef0c46 -r 76b0b0fed2e3 tests/test-subrepo-recursion.t --- a/tests/test-subrepo-recursion.t Wed Mar 25 16:40:37 2015 -0700 +++ b/tests/test-subrepo-recursion.t Wed Mar 25 13:55:32 2015 +0900 @@ -59,7 +59,7 @@ Commits: $ hg commit -m fails - abort: uncommitted changes in subrepo foo + abort: uncommitted changes in subrepository 'foo' (use --subrepos for recursive commit) [255] diff -r e71053ef0c46 -r 76b0b0fed2e3 tests/test-subrepo.t --- a/tests/test-subrepo.t Wed Mar 25 16:40:37 2015 -0700 +++ b/tests/test-subrepo.t Wed Mar 25 13:55:32 2015 +0900 @@ -146,7 +146,7 @@ $ echo c > s/a $ hg --config ui.commitsubrepos=no ci -m4 - abort: uncommitted changes in subrepo s + abort: uncommitted changes in subrepository 's' (use --subrepos for recursive commit) [255] $ hg id