from stgit.commands.common import *
from stgit.utils import *
from stgit.out import *
-from stgit import stack, git
-
+from stgit import argparse, stack, git
help = 'import a GNU diff file as a new patch'
usage = """%prog [options] [<file>|<url>]
help = 'use COMMNAME as the committer name'),
make_option('--commemail',
help = 'use COMMEMAIL as the committer e-mail')
- ] + make_sign_options()
+ ] + argparse.sign_options()
def __strip_patch_name(name):
backup = False)
out.done()
+def __mkpatchname(name, suffix):
+ if name.lower().endswith(suffix.lower()):
+ return name[:-len(suffix)]
+ return name
+
+def __get_handle_and_name(filename):
+ """Return a file object and a patch name derived from filename
+ """
+ # see if it's a gzip'ed or bzip2'ed patch
+ import bz2, gzip
+ for copen, ext in [(gzip.open, '.gz'), (bz2.BZ2File, '.bz2')]:
+ try:
+ f = copen(filename)
+ f.read(1)
+ f.seek(0)
+ return (f, __mkpatchname(filename, ext))
+ except IOError, e:
+ pass
+
+ # plain old file...
+ return (open(filename), filename)
+
def __import_file(filename, options, patch = None):
"""Import a patch from a file or standard input
"""
+ pname = None
if filename:
- f = file(filename)
+ (f, pname) = __get_handle_and_name(filename)
else:
f = sys.stdin
+ if patch:
+ pname = patch
+ elif not pname:
+ pname = filename
+
if options.mail:
try:
msg = email.message_from_file(f)
parse_mail(msg)
else:
message, author_name, author_email, author_date, diff = \
- parse_patch(f)
+ parse_patch(f.read())
if filename:
f.close()
- if patch:
- pname = patch
- else:
- pname = filename
-
__create_patch(pname, message, author_name, author_email,
author_date, diff, options)
else:
filename = None
+ if filename:
+ filename = os.path.abspath(filename)
+ directory.cd_to_topdir()
+
if options.series:
__import_series(filename, options)
elif options.mbox:
stg delete ..
'
+ test_expect_success \
+ 'Apply a patch created with "git diff" from a subdirectory' \
+ '
+ mkdir subdir && cd subdir &&
+ stg import ../../t1800-import/git-diff &&
+ [ $(git cat-file -p $(stg id) \
+ | grep -c "tree e96b1fba2160890ff600b675d7140d46b022b155") = 1 ] &&
+ stg delete .. &&
+ cd ..
+ '
+
test_expect_success \
'Apply a patch created with GNU diff' \
'
stg delete ..
'
+test_expect_success \
+ 'Apply a bzip2 patch created with "git diff"' \
+ '
+ bzip2 -c ../t1800-import/git-diff >../t1800-import/bzip2-git-diff &&
+ stg import ../t1800-import/bzip2-git-diff &&
+ [ $(git cat-file -p $(stg id) \
+ | grep -c "tree e96b1fba2160890ff600b675d7140d46b022b155") = 1 ] &&
+ rm ../t1800-import/bzip2-git-diff &&
+ stg delete ..
+ '
+test_expect_success \
+ 'Apply a bzip2 patch with a .bz2 suffix' \
+ '
+ bzip2 -c ../t1800-import/git-diff >../t1800-import/git-diff.bz2 &&
+ stg import ../t1800-import/git-diff.bz2 &&
+ [ $(git cat-file -p $(stg id) \
+ | grep -c "tree e96b1fba2160890ff600b675d7140d46b022b155") = 1 ] &&
+ rm ../t1800-import/git-diff.bz2 &&
+ stg delete ..
+ '
+
+test_expect_success \
+ 'Apply a gzip patch created with GNU diff' \
+ '
+ gzip -c ../t1800-import/gnu-diff >../t1800-import/gzip-gnu-diff &&
+ stg import ../t1800-import/gzip-gnu-diff &&
+ [ $(git cat-file -p $(stg id) \
+ | grep -c "tree e96b1fba2160890ff600b675d7140d46b022b155") = 1 ] &&
+ rm ../t1800-import/gzip-gnu-diff &&
+ stg delete ..
+ '
+test_expect_success \
+ 'Apply a gzip patch with a .gz suffix' \
+ '
+ gzip -c ../t1800-import/gnu-diff >../t1800-import/gnu-diff.gz &&
+ stg import ../t1800-import/gnu-diff.gz &&
+ [ $(git cat-file -p $(stg id) \
+ | grep -c "tree e96b1fba2160890ff600b675d7140d46b022b155") = 1 ] &&
+ rm ../t1800-import/gnu-diff.gz &&
+ stg delete ..
+ '
+
test_done