[PATCH] commit: add --extra argument to set extra user fields

Angel Ezquerra angel.ezquerra at gmail.com
Wed Mar 5 16:32:03 CST 2014


# HG changeset patch
# User Angel Ezquerra <angel.ezquerra at gmail.com>
# Date 1394000996 -3600
#      Wed Mar 05 07:29:56 2014 +0100
# Node ID 1658e55e8c9e2518236aeb8e7d1d89a1714b6f37
# Parent  779ceb84f4f782d32dfe47f6684107c08d2f6142
commit: add --extra argument to set extra user fields

This lets the user set a key/value pair on the extra commit field dictionary.
The user can use this new parameter more than once to set more than one
key/value pair.

Extra entries added this way are added in the "user" namespace within the extra
field. This is done to avoid the possibility of a clash between a user defined
field and a field used by mercurial or one of its extensions.

This is useful to "mark" revisions at commit time, or to add extra information
related to the commit in a more structured manner than adding them to the
commit message.

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -1318,6 +1318,7 @@
      _('mark a branch as closed, hiding it from the branch list')),
     ('', 'amend', None, _('amend the parent of the working dir')),
     ('s', 'secret', None, _('use the secret phase for committing')),
+    ('', 'extra', [], _('set a user extra value')),
     ] + walkopts + commitopts + commitopts2 + subrepoopts,
     _('[OPTION]... [FILE]...'))
 def commit(ui, repo, *pats, **opts):
@@ -1371,6 +1372,15 @@
     bheads = repo.branchheads(branch)
 
     extra = {}
+    userextra = opts.get('extra', [])
+    for el in userextra:
+        try:
+            key, value = el.split('=', 1)
+        except ValueError:
+            raise util.Abort(_('malformed --extra option: %r '
+                               '(use --extra name=value)') % el)
+        extra['user.%s' % key.strip()] = value.strip()
+
     if opts.get('close_branch'):
         extra['close'] = 1
 
diff --git a/tests/test-commit.t b/tests/test-commit.t
--- a/tests/test-commit.t
+++ b/tests/test-commit.t
@@ -306,4 +306,48 @@
        0         0       6  .....       0 26d3ca0dfd18 000000000000 000000000000 (re)
        1         6       7  .....       1 d267bddd54f7 26d3ca0dfd18 000000000000 (re)
 
+commit extra fields
+
+  $ echo dubidu > foobar
+  $ hg add foobar
+  $ hg ci -m 'add foobar' --extra field1
+  abort: malformed --extra option: 'field1' (use --extra name=value)
+  [255]
+  $ hg ci -m 'add foobar' --extra field1=value1 --extra 'second field=value 2'
+  $ hg log -r 'extra(user.field1)' --debug
+  changeset:   2:6a90106531466bd139db022a63bb6a03cc0a68fd
+  tag:         tip
+  phase:       draft
+  parent:      1:3c23404d6e68f029181eb82dae39c93aa3e6aee0
+  parent:      -1:0000000000000000000000000000000000000000
+  manifest:    2:585686d55b420d059a2442798b83f80f0b871f93
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  files+:      foobar
+  extra:       branch=default
+  extra:       user.field1=value1
+  extra:       user.second field=value 2
+  description:
+  add foobar
+  
+  
+
+  $ hg log -r 'extra("user.second field", "value 2")' --debug
+  changeset:   2:6a90106531466bd139db022a63bb6a03cc0a68fd
+  tag:         tip
+  phase:       draft
+  parent:      1:3c23404d6e68f029181eb82dae39c93aa3e6aee0
+  parent:      -1:0000000000000000000000000000000000000000
+  manifest:    2:585686d55b420d059a2442798b83f80f0b871f93
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  files+:      foobar
+  extra:       branch=default
+  extra:       user.field1=value1
+  extra:       user.second field=value 2
+  description:
+  add foobar
+  
+  
+
   $ cd ..
diff --git a/tests/test-completion.t b/tests/test-completion.t
--- a/tests/test-completion.t
+++ b/tests/test-completion.t
@@ -199,7 +199,7 @@
   add: include, exclude, subrepos, dry-run
   annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, ignore-all-space, ignore-space-change, ignore-blank-lines, include, exclude
   clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd, insecure
-  commit: addremove, close-branch, amend, secret, include, exclude, message, logfile, date, user, subrepos
+  commit: addremove, close-branch, amend, secret, extra, include, exclude, message, logfile, date, user, subrepos
   diff: rev, change, text, git, nodates, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude, subrepos
   export: output, switch-parent, rev, text, git, nodates
   forget: include, exclude
diff --git a/tests/test-qrecord.t b/tests/test-qrecord.t
--- a/tests/test-qrecord.t
+++ b/tests/test-qrecord.t
@@ -62,6 +62,7 @@
                             list
       --amend               amend the parent of the working dir
    -s --secret              use the secret phase for committing
+      --extra VALUE [+]     set a user extra value
    -I --include PATTERN [+] include names matching the given patterns
    -X --exclude PATTERN [+] exclude names matching the given patterns
    -m --message TEXT        use text as commit message


More information about the Mercurial-devel mailing list