[PATCH] localrepo: abort commit if a subrepo is modified and ui.commitsubs=no

Patrick Mezard pmezard at gmail.com
Sat Feb 12 11:00:44 CST 2011

# HG changeset patch
# User Patrick Mezard <pmezard at gmail.com>
# Date 1297528291 -3600
# Node ID c144bfef2727616001b3c7fa6fd1db8049188497
# Parent  d4ab9486e514dd24e21a2ca3b6c439ea13d85cab
localrepo: abort commit if a subrepo is modified and ui.commitsubs=no

The default behaviour is to commit subrepositories with uncommitted changes. In
my experience this is usually undesirable:

- Changes to dependencies are often debugging leftovers
- Real changes should generally be applied on the source project directly,
  tested then committed. This is not always possible, subversion subrepos may
  include only a small part of the source project, without the tests.

Setting ui.commitsubs=no will now abort commits containing such modified
subrepositories like:

  $ hg --config ui.commitsubs=no ci -m msg
  abort: uncommitted changes in subrepo sub

I ruled out the hook solution because it does not easily take --include/exclude
options in account. Also, my main concern is whether this flag could cause
problems with extensions. If there are legitimate reasons for callers to
override this behaviour (I could not find any), they might either override at ui
level, or we could add an argument to localrepo.commit() later.

diff -r d4ab9486e514 -r c144bfef2727 doc/hgrc.5.txt
--- a/doc/hgrc.5.txt	Thu Feb 10 13:46:28 2011 -0600
+++ b/doc/hgrc.5.txt	Sat Feb 12 17:31:31 2011 +0100
@@ -876,6 +876,11 @@
     be prompted to enter a username. If no username is entered, the
     default ``USER at HOST`` is used instead.
     Default is False.
+    Whether to commit modified subrepositories when committing the
+    parent repository. If False and one subrepository has uncommitted
+    changes, abort the commit.
+    Default is True.
     Print debugging information. True or False. Default is False.
diff -r d4ab9486e514 -r c144bfef2727 mercurial/localrepo.py
--- a/mercurial/localrepo.py	Thu Feb 10 13:46:28 2011 -0600
+++ b/mercurial/localrepo.py	Sat Feb 12 17:31:31 2011 +0100
@@ -925,6 +925,12 @@
                 if '.hgsubstate' not in changes[0]:
                     changes[0].insert(0, '.hgsubstate')
+            if subs and not self.ui.configbool('ui', 'commitsubs', True):
+                changedsubs = [s for s in subs if wctx.sub(s).dirty(True)]
+                if changedsubs:
+                    raise util.Abort(_("uncommitted changes in subrepo %s")
+                                     % changedsubs[0])
             # make sure all explicit patterns are matched
             if not force and match.files():
                 matched = set(changes[0] + changes[1] + changes[2])
diff -r d4ab9486e514 -r c144bfef2727 tests/test-subrepo.t
--- a/tests/test-subrepo.t	Thu Feb 10 13:46:28 2011 -0600
+++ b/tests/test-subrepo.t	Sat Feb 12 17:31:31 2011 +0100
@@ -75,16 +75,19 @@
   commit: (clean)
   update: (current)
-bump sub rev
+bump sub rev (and check it is ignored by ui.commitsubs)
   $ echo b > s/a
   $ hg -R s ci -ms1
-  $ hg ci -m3
+  $ hg --config ui.commitsubs=no ci -m3
   committing subrepository s
-leave sub dirty
+leave sub dirty (and check ui.commitsubs=no aborts the commit)
   $ echo c > s/a
+  $ hg --config ui.commitsubs=no ci -m4
+  abort: uncommitted changes in subrepo s
+  [255]
   $ hg ci -m4
   committing subrepository s
   $ hg tip -R s

More information about the Mercurial-devel mailing list