diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -109,12 +109,13 @@ def loglimit(opts): limit = None return limit -def makefilename(repo, pat, node, +def makefilename(repo, pat, node, desc=None, total=None, seqno=None, revwidth=None, pathname=None): node_expander = { 'H': lambda: hex(node), 'R': lambda: str(repo.changelog.rev(node)), 'h': lambda: short(node), + 'm': lambda: re.sub('[^\w]', '_', str(desc)) } expander = { '%': lambda: '%', @@ -154,7 +155,7 @@ def makefilename(repo, pat, node, raise util.Abort(_("invalid format spec '%%%s' in output filename") % inst.args[0]) -def makefileobj(repo, pat, node=None, total=None, +def makefileobj(repo, pat, node=None, desc=None, total=None, seqno=None, revwidth=None, mode='wb', pathname=None): writable = mode not in ('r', 'rb') @@ -181,7 +182,7 @@ def makefileobj(repo, pat, node=None, to return pat if util.safehasattr(pat, 'read') and 'r' in mode: return pat - return open(makefilename(repo, pat, node, total, seqno, revwidth, + return open(makefilename(repo, pat, node, desc, total, seqno, revwidth, pathname), mode) @@ -516,8 +517,10 @@ def export(repo, revs, template='hg-%h.p shouldclose = False if not fp: - fp = makefileobj(repo, template, node, total=total, seqno=seqno, - revwidth=revwidth, mode='ab') + desc_lines = ctx.description().rstrip().split('\n') + desc = desc_lines[0] #Commit always has a first line. + fp = makefileobj(repo, template, node, desc=desc, total=total, + seqno=seqno, revwidth=revwidth, mode='ab') if fp != template: shouldclose = True if fp != sys.stdout and util.safehasattr(fp, 'name'): diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -2229,6 +2229,7 @@ def export(ui, repo, *changesets, **opts :``%R``: changeset revision number :``%b``: basename of the exporting repository :``%h``: short-form changeset hash (12 hexadecimal digits) + :``%m``: first line of the commit message (only alphanumeric characters) :``%n``: zero-padded sequence number, starting at 1 :``%r``: zero-padded changeset revision number diff --git a/tests/test-export.t b/tests/test-export.t --- a/tests/test-export.t +++ b/tests/test-export.t @@ -7,7 +7,7 @@ > hg ci -m "foo-$i" > done - $ for out in "%nof%N" "%%%H" "%b-%R" "%h" "%r"; do + $ for out in "%nof%N" "%%%H" "%b-%R" "%h" "%r" "%m"; do > echo > echo "# foo-$out.patch" > hg export -v -o "foo-$out.patch" 2:tip @@ -77,6 +77,19 @@ foo-09.patch foo-10.patch foo-11.patch + + # foo-%m.patch + exporting patches: + foo-foo_2.patch + foo-foo_3.patch + foo-foo_4.patch + foo-foo_5.patch + foo-foo_6.patch + foo-foo_7.patch + foo-foo_8.patch + foo-foo_9.patch + foo-foo_10.patch + foo-foo_11.patch Exporting 4 changesets to a file: @@ -108,3 +121,11 @@ Exporting revision -2 to a file: foo-9 +foo-10 +Checking if only alphanumeric characters are used in the file name (%m option): + + $ echo "line" >> foo + $ hg commit -m " !\"#$%&(,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\`abcdefghijklmnopqrstuvwxyz{|}~" + $ hg export -v -o %m.patch tip + exporting patch: + ____________0123456789_______ABCDEFGHIJKLMNOPQRSTUVWXYZ______abcdefghijklmnopqrstuvwxyz____.patch +