Subject: [PATCH] import-tars: Make it possible to include the original commit ID

From: Gabriel <[email-masked]>
Date: Thu, 18 Feb 2010 16:02:12 +0100

From: Peter Krefting <[email-masked]>

Add an option --readpax which makes import-tars read the commit ID
stored by git-archive, adding it to the default commit message.

Signed-off-by: Peter Krefting <[email-masked]>
Signed-off-by: Gabriel <[email-masked]>
---

That's a sensible patch, thanks.

A small correction; when both --readpax and --metainfo=msg are passed,
incorporate both message and original sha1. I amended your commit.

 contrib/fast-import/import-tars.perl |   27 ++++++++++++++++++++++++---
 1 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/contrib/fast-import/import-tars.perl b/contrib/fast-import/import-tars.perl
index a5170a1..f41480e 100755
--- a/contrib/fast-import/import-tars.perl
+++ b/contrib/fast-import/import-tars.perl
@@ -14,14 +14,20 @@
 ##
 ##  echo 'This is the commit message' > myfile.tar.bz2.msg
 ##  perl import-tars.perl --metainfo=msg myfile.tar.bz2
+##
+## Use --readpax to read the pax_global_header generated by git archive.
+## The commit ID stored in the header will be appended to the default
+## generated commit message for the imported tarball. If the parameter
+## is not given, the pax_global_header is ignored.
 
 use strict;
 use Getopt::Long;
 
 my $metaext = '';
+my $readpax;
 
-die "usage: import-tars [--metainfo=extension] *.tar.{gz,bz2,lzma,xz,Z}\n"
-	unless GetOptions('metainfo=s' => \$metaext) && @ARGV;
+die "usage: import-tars [--metainfo=extension] [--readpax] *.tar.{gz,bz2,lzma,xz,Z}\n"
+	unless GetOptions('metainfo=s' => \$metaext, 'readpax' => \$readpax) && @ARGV;
 
 my $branch_name = 'import-tars';
 my $branch_ref = "refs/heads/$branch_name";
@@ -61,6 +67,7 @@ foreach my $tar_file (@ARGV)
 	my $author_time = 0;
 	my $next_mark = 1;
 	my $have_top_dir = 1;
+	my $orig_commitid = '';
 	my ($top_dir, %files);
 
 	while (read(I, $_, 512) == 512) {
@@ -95,6 +102,16 @@ foreach my $tar_file (@ARGV)
 		$size = oct $size;
 		$mtime = oct $mtime;
 		next if $typeflag == 5; # directory
+		if (defined $readpax && $typeflag eq 'g' && $name eq 'pax_global_header')
+		{
+			while ($size > 0 && read(I, $_, 512) == 512) {
+				if (/52 comment=([0-9a-f]{40})/)
+				{
+					$orig_commitid = $1;
+				}
+			}
+			next;
+		}
 
 		print FI "blob\n", "mark :$next_mark\n";
 		if ($typeflag == 2) { # symbolic link
@@ -124,7 +141,7 @@ foreach my $tar_file (@ARGV)
 		$have_top_dir = 0 if $top_dir ne $1;
 	}
 
-	my $commit_msg = "Imported from $tar_file.";
+	my $commit_msg = "Imported from $tar_file.\n";
 	my $this_committer_name = $committer_name;
 	my $this_committer_email = $committer_email;
 	my $this_author_name = $author_name;
@@ -154,6 +171,10 @@ foreach my $tar_file (@ARGV)
 			close MSG;
 		}
 	}
+	if ($orig_commitid ne '')
+	{
+		$commit_msg .= "\nThis tarball was generated by git, from commit id\n$orig_commitid.";
+	}
 
 	print FI <<EOF;
 commit $branch_ref
-- 
1.7.0.rc2.31.g618d1