--- a/mercurial/commands.py Thu Mar 11 15:38:35 2010 +0100
+++ b/mercurial/commands.py Thu Mar 11 15:52:17 2010 +0100
@@ -158,8 +158,10 @@
By default, the revision used is the parent of the working
directory; use -r/--rev to specify a different revision.
- To specify the type of archive to create, use -t/--type. Valid
- types are:
+ The archive type is automatically detected based on file
+ extension (or override using -t/--type).
+
+ Valid types are:
:``files``: a directory full of files (default)
:``tar``: tar archive, uncompressed
@@ -184,16 +186,32 @@
dest = cmdutil.make_filename(repo, dest, node)
if os.path.realpath(dest) == repo.root:
raise util.Abort(_('repository root cannot be destination'))
- matchfn = cmdutil.match(repo, [], opts)
- kind = opts.get('type') or 'files'
+
+ def guess_type():
+ exttypes = {
+ 'tar': ['.tar'],
+ 'tbz2': ['.tbz2', '.tar.bz2'],
+ 'tgz': ['.tgz', '.tar.gz'],
+ 'zip': ['.zip'],
+ }
+
+ for type, extensions in exttypes.items():
+ if any(dest.endswith(ext) for ext in extensions):
+ return type
+ return None
+
+ kind = opts.get('type') or guess_type() or 'files'
prefix = opts.get('prefix')
+
if dest == '-':
if kind == 'files':
raise util.Abort(_('cannot archive plain files to stdout'))
dest = sys.stdout
if not prefix:
prefix = os.path.basename(repo.root) + '-%h'
+
prefix = cmdutil.make_filename(repo, prefix, node)
+ matchfn = cmdutil.match(repo, [], opts)
archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
matchfn, prefix)