Patch: make "hg qnew" and "hg qrefresh" accept options to generate "hg export"-style patches
Peter Arrenbrecht
peter.arrenbrecht at gmail.com
Tue Oct 30 16:57:03 CDT 2007
Hi list,
The mq extension in hg already supports patches that contain "#HG
changeset patch" headers for user and date. This proposed patch adds
options to qnew and qrefresh to automatically insert this header.
Is this the proper place to submit such patches? If not, where?
-peo
# HG changeset patch
# User peter.arrenbrecht at gmail.com
# Date 1193778440 -3600
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:
@@ -616,9 +618,9 @@ class queue:
try:
insert = self.full_series_end()
if msg:
- n = repo.commit(commitfiles, msg, force=True)
+ n = repo.commit(commitfiles, msg, user, date, force=True)
else:
- n = repo.commit(commitfiles, "[mq]: %s" % patch, force=True)
+ n = repo.commit(commitfiles, "[mq]: %s" % patch,
user, date, force=True)
if n == None:
raise util.Abort(_("repo commit failed"))
self.full_series[insert:insert] = [patch]
@@ -627,6 +629,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)
@@ -925,6 +934,8 @@ class queue:
self.diffopts().git = True
break
+ user = opts.get('user')
+ date = opts.get('date')
msg = opts.get('msg', '').rstrip()
if msg and comments:
# Remove existing message, keeping the rest of the comments
@@ -945,6 +956,21 @@ class queue:
del comments[ci]
if msg:
comments.append(msg)
+
+ if user or date:
+ 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 user:
+ setheader('# User ', user)
+ if date:
+ setheader('# Date ', date)
+ comments = headers + comments
patchf.seek(0)
patchf.truncate()
@@ -1067,10 +1093,13 @@ class queue:
message = "\n".join(message)
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, match=matchfn,
force=1)
self.applied[-1] = statusentry(revlog.hex(n), patchfn)
self.applied_dirty = 1
@@ -1603,6 +1632,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
@@ -1621,6 +1658,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
@@ -1646,6 +1684,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
@@ -2136,6 +2175,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":
@@ -2194,7 +2240,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]')),
@@ -2217,7 +2263,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]')),
More information about the Mercurial
mailing list