Patch to allow import from compressed files (gzip and bzip2) From: Clark Williams Signed-off-by: Clark Williams --- stgit/commands/imprt.py | 42 ++++++++++++++++++++++++++++++++++++------ t/t1800-import.sh | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 6 deletions(-) diff --git a/stgit/commands/imprt.py b/stgit/commands/imprt.py index 4a4b792..fc5cdce 100644 --- a/stgit/commands/imprt.py +++ b/stgit/commands/imprt.py @@ -175,14 +175,49 @@ def __create_patch(filename, message, author_name, author_email, backup = False) out.done() +def __mkpatchname(name, suffix): + if name.lower().endswith(suffix.lower()): + return name[:-len(suffix)] + return name + +def __gethandleandname(filename): + """return a file handle and a patch name derived from filename + """ + # see if it's a gzip'ed patch + try: + import gzip + f = gzip.open(filename) + f.read(1) + f.seek(0) + return (f, __mkpatchname(filename, '.gz')) + except IOError, e: + pass + # see if it's a bzip2'ed patch + try: + import bz2 + f = bz2.BZ2File(filename) + f.read(1) + f.seek(0) + return (f, __mkpatchname(filename, '.bz2')) + 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) = __gethandleandname(filename) else: f = sys.stdin + if patch: + pname = patch + elif not pname: + pname = filename + if options.mail: try: msg = email.message_from_file(f) @@ -197,11 +232,6 @@ def __import_file(filename, options, patch = None): if filename: f.close() - if patch: - pname = patch - else: - pname = filename - __create_patch(pname, message, author_name, author_email, author_date, diff, options) diff --git a/t/t1800-import.sh b/t/t1800-import.sh index 8c8c9a0..1352743 100755 --- a/t/t1800-import.sh +++ b/t/t1800-import.sh @@ -80,4 +80,46 @@ test_expect_success \ 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