[PATCH] export: clobber files with -o (bc) (issue3652)

Augie Fackler raf at durin42.com
Sat Feb 9 16:16:17 CST 2013


Kevin and Bryan generously looked this over in meatspace. Pushed.

On Feb 9, 2013, at 9:42 PM, Augie Fackler <raf at durin42.com> wrote:

> # HG changeset patch
> # User Augie Fackler <raf at durin42.com>
> # Date 1360445937 21600
> # Node ID 1a2f4c633410f6bc49b94c65d74939165bbc2dd7
> # Parent  0b6e6eacc939c303136cb38af108e307d640c26e
> export: clobber files with -o (bc) (issue3652)
> 
> This violated user expectation. Updated the code to clobber files, but
> preserve the behavior of appending multiple patches requested in a
> single export. Includes tests.
> 
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -170,7 +170,8 @@
>                          inst.args[0])
> 
> def makefileobj(repo, pat, node=None, desc=None, total=None,
> -                seqno=None, revwidth=None, mode='wb', pathname=None):
> +                seqno=None, revwidth=None, mode='wb', modemap={},
> +                pathname=None):
> 
>     writable = mode not in ('r', 'rb')
> 
> @@ -196,9 +197,11 @@
>         return pat
>     if util.safehasattr(pat, 'read') and 'r' in mode:
>         return pat
> -    return open(makefilename(repo, pat, node, desc, total, seqno, revwidth,
> -                              pathname),
> -                mode)
> +    fn = makefilename(repo, pat, node, desc, total, seqno, revwidth, pathname)
> +    mode = modemap.get(fn, mode)
> +    if mode == 'wb':
> +        modemap[fn] = 'ab'
> +    return open(fn, mode)
> 
> def openrevlog(repo, cmd, file_, opts):
>     """opens the changelog, manifest, a filelog or a given revlog"""
> @@ -539,6 +542,7 @@
> 
>     total = len(revs)
>     revwidth = max([len(str(rev)) for rev in revs])
> +    filemode = {}
> 
>     def single(rev, seqno, fp):
>         ctx = repo[rev]
> @@ -554,7 +558,8 @@
>             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')
> +                             seqno=seqno, revwidth=revwidth, mode='wb',
> +                             modemap=filemode)
>             if fp != template:
>                 shouldclose = True
>         if fp and fp != sys.stdout and util.safehasattr(fp, 'name'):
> diff --git a/tests/test-export.t b/tests/test-export.t
> --- a/tests/test-export.t
> +++ b/tests/test-export.t
> @@ -91,13 +91,28 @@
>   foo-foo_10.patch
>   foo-foo_11.patch
> 
> +Doing it again clobbers the files rather than appending:
> +  $ hg export -v -o "foo-%m.patch" 2:3
> +  exporting patches:
> +  foo-foo_2.patch
> +  foo-foo_3.patch
> +  $ grep HG foo-foo_2.patch | wc -l
> +  \s*1 (re)
> +  $ grep HG foo-foo_3.patch | wc -l
> +  \s*1 (re)
> +
> Exporting 4 changesets to a file:
> 
>   $ hg export -o export_internal 1 2 3 4
>   $ grep HG export_internal | wc -l
>   \s*4 (re)
> 
> -Exporting 4 changesets to a file:
> +Doing it again clobbers the file rather than appending:
> +  $ hg export -o export_internal 1 2 3 4
> +  $ grep HG export_internal | wc -l
> +  \s*4 (re)
> +
> +Exporting 4 changesets to stdout:
> 
>   $ hg export 1 2 3 4 | grep HG | wc -l
>   \s*4 (re)
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list