[PATCH] Add --setheader, --setuser, --setdate, --user, --date options to qnew and qrefresh
Peter Arrenbrecht
peter.arrenbrecht at gmail.com
Wed Dec 5 14:09:57 CST 2007
Hi all
This patch adds a UI to the existing option to have "hg export" style
headers in mq patches. These headers can include the user and date,
which is what seems interesting in mq patches. Adding the user, in
particular, allows for proper change attribution in shared patch
queues.
The patch tries to be as non-invasive as possible. One consequence is
that, even if a patch already contains a user and date, neither of
each is automatically updated on "qrefresh". You have to explicitly do
"qrefresh -U -D" (or "qrefresh -H" for short) to force the update.
The patch (hopefully) ensures that "qnew", "qrefresh", and "qpush"
write the correct user and/or date into the log.
Comments welcome.
-peter
On Dec 5, 2007 9:08 PM, Peter Arrenbrecht <peter.arrenbrecht at gmail.com> wrote:
> # HG changeset patch
> # User peter.arrenbrecht at gmail.com
> # Date 1196884918 -3600
> # Node ID a2b6efcccff92808cf046e2af4e6b373294377a3
> # Parent 3e464d10ffe731a2e5037fcec1c6ce448f84e54e
> Add --setheader, --setuser, --setdate, --user, --date options to qnew and qrefresh.
> These options make qnew and qrefresh add/update the "# HG changeset patch" header info,
> as exported by "hg export". This patch, for instance, starts with
>
> # HG changeset patch
> # User peter.arrenbrecht at gmail.com
> # Date 1193778440 -3600
> ...
>
> This allows proper attribution of patches in patch queues managed by multiple persons.
>
> diff --git a/hgext/mq.py b/hgext/mq.py
> --- a/hgext/mq.py
> +++ b/hgext/mq.py
> @@ -603,6 +603,8 @@ class queue:
> def new(self, repo, patch, *pats, **opts):
> msg = opts.get('msg')
> force = opts.get('force')
> + user = opts.get('user')
> + date = opts.get('date')
> if os.path.exists(self.join(patch)):
> raise util.Abort(_('patch "%s" already exists') % patch)
> if opts.get('include') or opts.get('exclude') or pats:
> @@ -617,7 +619,7 @@ class queue:
> try:
> insert = self.full_series_end()
> commitmsg = msg and msg or ("[mq]: %s" % patch)
> - n = repo.commit(commitfiles, commitmsg, match=match, force=True)
> + n = repo.commit(commitfiles, commitmsg, user, date, match=match, force=True)
> if n == None:
> raise util.Abort(_("repo commit failed"))
> self.full_series[insert:insert] = [patch]
> @@ -626,6 +628,13 @@ class queue:
> self.series_dirty = 1
> self.applied_dirty = 1
> p = self.opener(patch, "w")
> + if user or date:
> + header = "# HG changeset patch\n"
> + if user:
> + header = header + '# User ' + user + "\n"
> + if date:
> + header = header + '# Date ' + date + "\n"
> + p.write(header)
> if msg:
> msg = msg + "\n"
> p.write(msg)
> @@ -927,6 +936,8 @@ class queue:
> self.diffopts().git = True
> break
>
> + newuser = opts.get('user')
> + newdate = opts.get('date')
> msg = opts.get('msg', '').rstrip()
> if msg and comments:
> # Remove existing message, keeping the rest of the comments
> @@ -947,6 +958,23 @@ class queue:
> del comments[ci]
> if msg:
> comments.append(msg)
> +
> + if newuser or newdate:
> + headers = []
> + def setheader(prefix, suffix=''):
> + for i in xrange(len(comments)):
> + if comments[i].startswith(prefix):
> + comments.pop(i)
> + break
> + headers.append(prefix+suffix)
> + setheader('# HG changeset patch')
> + if newuser:
> + user = newuser
> + setheader('# User ', user)
> + if newdate:
> + date = newdate
> + setheader('# Date ', date)
> + comments = headers + comments
>
> patchf.seek(0)
> patchf.truncate()
> @@ -1070,9 +1098,12 @@ class queue:
> else:
> message = msg
>
> + if not user:
> + user = changes[1]
> +
> self.strip(repo, top, update=False,
> backup='strip')
> - n = repo.commit(filelist, message, changes[1], match=matchfn,
> + n = repo.commit(filelist, message, user, date, match=matchfn,
> force=1)
> self.applied[-1] = statusentry(revlog.hex(n), patchfn)
> self.applied_dirty = 1
> @@ -1605,6 +1636,14 @@ def prev(ui, repo, **opts):
> return q.qseries(repo, start=l-2, length=1, status='A',
> summary=opts.get('summary'))
>
> +def setupheaderopts(ui, opts):
> + setheader = opts['setheader']
> + def do(opt,val):
> + if not opts[opt] and (setheader or opts['set' + opt]):
> + opts[opt] = val
> + do('user', ui.username())
> + do('date', "%d %d" % util.makedate())
> +
> def new(ui, repo, patch, *args, **opts):
> """create a new patch
>
> @@ -1623,6 +1662,7 @@ def new(ui, repo, patch, *args, **opts):
> if opts['edit']:
> message = ui.edit(message, ui.username())
> opts['msg'] = message
> + setupheaderopts(ui, opts)
> q.new(repo, patch, *args, **opts)
> q.save_dirty()
> return 0
> @@ -1648,6 +1688,7 @@ def refresh(ui, repo, *pats, **opts):
> patch = q.applied[-1].name
> (message, comment, user, date, hasdiff) = q.readheaders(patch)
> message = ui.edit('\n'.join(message), user or ui.username())
> + setupheaderopts(ui, opts)
> ret = q.refresh(repo, pats, msg=message, **opts)
> q.save_dirty()
> return ret
> @@ -2138,6 +2179,13 @@ def reposetup(ui, repo):
>
> seriesopts = [('s', 'summary', None, _('print first line of patch header'))]
>
> +headeropts = [
> + ('H', 'setheader', None, _('make "hg export" formatted patch and set user and date to current values')),
> + ('U', 'setuser', None, _('make "hg export" formatted patch and set user to current user')),
> + ('D', 'setdate', None, _('make "hg export" formatted patch and set date to current date')),
> + ('u', 'user', '', _('make "hg export" formatted patch and set user to this')),
> + ('d', 'date', '', _('make "hg export" formatted patch and set date to this'))]
> +
> cmdtable = {
> "qapplied": (applied, [] + seriesopts, _('hg qapplied [-s] [PATCH]')),
> "qclone":
> @@ -2196,7 +2244,7 @@ cmdtable = {
> [('e', 'edit', None, _('edit commit message')),
> ('f', 'force', None, _('import uncommitted changes into patch')),
> ('g', 'git', None, _('use git extended diff format')),
> - ] + commands.walkopts + commands.commitopts,
> + ] + commands.walkopts + commands.commitopts + headeropts,
> _('hg qnew [-e] [-m TEXT] [-l FILE] [-f] PATCH [FILE]...')),
> "qnext": (next, [] + seriesopts, _('hg qnext [-s]')),
> "qprev": (prev, [] + seriesopts, _('hg qprev [-s]')),
> @@ -2219,7 +2267,7 @@ cmdtable = {
> [('e', 'edit', None, _('edit commit message')),
> ('g', 'git', None, _('use git extended diff format')),
> ('s', 'short', None, _('refresh only files already in the patch')),
> - ] + commands.walkopts + commands.commitopts,
> + ] + commands.walkopts + commands.commitopts + headeropts,
> _('hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]...')),
> 'qrename|qmv':
> (rename, [], _('hg qrename PATCH1 [PATCH2]')),
> diff --git a/tests/test-mq-headers b/tests/test-mq-headers
> new file mode 100755
> --- /dev/null
> +++ b/tests/test-mq-headers
> @@ -0,0 +1,92 @@
> +#!/bin/sh
> +
> +echo "[extensions]" >> $HGRCPATH
> +echo "mq=" >> $HGRCPATH
> +echo "[diff]" >> $HGRCPATH
> +echo "nodates=true" >> $HGRCPATH
> +
> +echo ==== init
> +hg init a
> +cd a
> +hg qinit
> +
> +echo ==== qnew -U -d
> +hg qnew -U -d '3 0' 1.patch
> +cat .hg/patches/1.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +
> +echo ==== qref
> +echo "1" >1
> +hg add
> +hg qref
> +cat .hg/patches/1.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +
> +echo ==== qref -u
> +hg qref -u mary
> +cat .hg/patches/1.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +
> +echo ==== qref -d
> +hg qref -d '4 0'
> +cat .hg/patches/1.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +
> +echo ==== qref -d -u
> +hg qref -u john -d '5 0'
> +cat .hg/patches/1.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +
> +echo ==== qnew
> +hg qnew 2.patch
> +echo "2" >2
> +hg add
> +hg qref
> +cat .hg/patches/2.patch
> +hg log --template "{rev}: {desc} - {author}\n"
> +
> +echo ==== qref -d -u
> +echo "2" >2
> +hg add
> +hg qref -u jane -d '6 0'
> +cat .hg/patches/2.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +
> +echo ==== qnew, qref -d, qref, qref -u, qref
> +hg qnew 3.patch
> +echo "3" >3
> +hg add
> +hg qref -d '7 0'
> +cat .hg/patches/3.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +echo ".." >>3
> +hg qref
> +cat .hg/patches/3.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +hg qref -u tarzan
> +cat .hg/patches/3.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +echo ".." >>3
> +hg qref
> +cat .hg/patches/3.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +
> +echo ==== qnew, qref -u, qref, qref -d
> +hg qnew 4.patch
> +echo "4" >4
> +hg add
> +hg qref -u mowgli
> +cat .hg/patches/4.patch
> +hg log --template "{rev}: {desc} - {author}\n"
> +echo ".." >>4
> +hg qref
> +cat .hg/patches/4.patch
> +hg log --template "{rev}: {desc} - {author}\n"
> +hg qref -d '8 0'
> +cat .hg/patches/4.patch
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> +
> +echo ==== qpop -a / qpush -a
> +hg qpop -a
> +hg qpush -a
> +hg log --template "{rev}: {desc} - {author} {date}\n"
> diff --git a/tests/test-mq-headers.out b/tests/test-mq-headers.out
> new file mode 100644
> --- /dev/null
> +++ b/tests/test-mq-headers.out
> @@ -0,0 +1,176 @@
> +==== init
> +==== qnew -U -d
> +# HG changeset patch
> +# User test
> +# Date 3 0
> +0: [mq]: 1.patch - test 3.00
> +==== qref
> +adding 1
> +# HG changeset patch
> +# User test
> +# Date 3 0
> +
> +diff -r 000000000000 1
> +--- /dev/null
> ++++ b/1
> +@@ -0,0 +1,1 @@
> ++1
> +0: [mq]: 1.patch - test 3.00
> +==== qref -u
> +# HG changeset patch
> +# User mary
> +# Date 3 0
> +
> +diff -r 000000000000 1
> +--- /dev/null
> ++++ b/1
> +@@ -0,0 +1,1 @@
> ++1
> +0: [mq]: 1.patch - mary 3.00
> +==== qref -d
> +# HG changeset patch
> +# Date 4 0
> +# User mary
> +
> +diff -r 000000000000 1
> +--- /dev/null
> ++++ b/1
> +@@ -0,0 +1,1 @@
> ++1
> +0: [mq]: 1.patch - mary 4.00
> +==== qref -d -u
> +# HG changeset patch
> +# User john
> +# Date 5 0
> +
> +diff -r 000000000000 1
> +--- /dev/null
> ++++ b/1
> +@@ -0,0 +1,1 @@
> ++1
> +0: [mq]: 1.patch - john 5.00
> +==== qnew
> +adding 2
> +diff -r 3738185084ab 2
> +--- /dev/null
> ++++ b/2
> +@@ -0,0 +1,1 @@
> ++2
> +1: [mq]: 2.patch - test
> +0: [mq]: 1.patch - john
> +==== qref -d -u
> +# HG changeset patch
> +# User jane
> +# Date 6 0
> +
> +diff -r 3738185084ab 2
> +--- /dev/null
> ++++ b/2
> +@@ -0,0 +1,1 @@
> ++2
> +1: [mq]: 2.patch - jane 6.00
> +0: [mq]: 1.patch - john 5.00
> +==== qnew, qref -d, qref, qref -u, qref
> +adding 3
> +# HG changeset patch
> +# Date 7 0
> +
> +diff -r a60be5ce795c 3
> +--- /dev/null
> ++++ b/3
> +@@ -0,0 +1,1 @@
> ++3
> +2: [mq]: 3.patch - test 7.00
> +1: [mq]: 2.patch - jane 6.00
> +0: [mq]: 1.patch - john 5.00
> +# HG changeset patch
> +# Date 7 0
> +
> +diff -r a60be5ce795c 3
> +--- /dev/null
> ++++ b/3
> +@@ -0,0 +1,2 @@
> ++3
> ++..
> +2: [mq]: 3.patch - test 7.00
> +1: [mq]: 2.patch - jane 6.00
> +0: [mq]: 1.patch - john 5.00
> +# HG changeset patch
> +# User tarzan
> +# Date 7 0
> +
> +diff -r a60be5ce795c 3
> +--- /dev/null
> ++++ b/3
> +@@ -0,0 +1,2 @@
> ++3
> ++..
> +2: [mq]: 3.patch - tarzan 7.00
> +1: [mq]: 2.patch - jane 6.00
> +0: [mq]: 1.patch - john 5.00
> +# HG changeset patch
> +# User tarzan
> +# Date 7 0
> +
> +diff -r a60be5ce795c 3
> +--- /dev/null
> ++++ b/3
> +@@ -0,0 +1,3 @@
> ++3
> ++..
> ++..
> +2: [mq]: 3.patch - tarzan 7.00
> +1: [mq]: 2.patch - jane 6.00
> +0: [mq]: 1.patch - john 5.00
> +==== qnew, qref -u, qref, qref -d
> +adding 4
> +# HG changeset patch
> +# User mowgli
> +
> +diff -r 18d5abbe1759 4
> +--- /dev/null
> ++++ b/4
> +@@ -0,0 +1,1 @@
> ++4
> +3: [mq]: 4.patch - mowgli
> +2: [mq]: 3.patch - tarzan
> +1: [mq]: 2.patch - jane
> +0: [mq]: 1.patch - john
> +# HG changeset patch
> +# User mowgli
> +
> +diff -r 18d5abbe1759 4
> +--- /dev/null
> ++++ b/4
> +@@ -0,0 +1,2 @@
> ++4
> ++..
> +3: [mq]: 4.patch - mowgli
> +2: [mq]: 3.patch - tarzan
> +1: [mq]: 2.patch - jane
> +0: [mq]: 1.patch - john
> +# HG changeset patch
> +# Date 8 0
> +# User mowgli
> +
> +diff -r 18d5abbe1759 4
> +--- /dev/null
> ++++ b/4
> +@@ -0,0 +1,2 @@
> ++4
> ++..
> +3: [mq]: 4.patch - mowgli 8.00
> +2: [mq]: 3.patch - tarzan 7.00
> +1: [mq]: 2.patch - jane 6.00
> +0: [mq]: 1.patch - john 5.00
> +==== qpop -a / qpush -a
> +Patch queue now empty
> +applying 1.patch
> +applying 2.patch
> +applying 3.patch
> +applying 4.patch
> +Now at: 4.patch
> +3: imported patch 4.patch - mowgli 8.00
> +2: imported patch 3.patch - tarzan 7.00
> +1: imported patch 2.patch - jane 6.00
> +0: imported patch 1.patch - john 5.00
>
More information about the Mercurial
mailing list