Subject: Re: [PATCH] import-tars: use Archive::Tar instead of unpack()

From: "Shawn O. Pearce" <[email-masked]>
Date: Mon, 12 Feb 2007 12:28:48 -0500

Michael Loeffler <[email-masked]> wrote:
> This version does no longer support bzip2 or compress which will be fixed in
> an amend. I did this patch to solve 2 problems. Maybe I do another patch with
> GetoptLong and bzip2/compress support.

bzip2 and compress are popular formats applied to tars.
 
> @@ -10,6 +10,10 @@
>  ##
>  
>  use strict;
> +use Archive::Tar;
> +use Archive::Tar::File;
> +use Archive::Tar::Constant;
> +

I did not apply this hunk.  Not everyone has Archive::Tar installed.
But then again, not everyone will use this example program either.
I'm debating it.  Archive::Tar's parser will certainly be much
more robust than the one I hand-crafted.  It might also let us deal
with symlinks.  ;)

I would considering applying something like this if it would also
support at least bz2.  This is an example program meant to teach
people how to use fast-import, and maybe also to help someone who
wants to quickly import one or more .tar.gz for use with git-grep.
Requiring Archive::Tar here is not the end of Git as we know it. :)

> @@ -83,10 +64,8 @@ EOF
>  	foreach my $path (keys %files)
>  	{
>  		my ($mark, $mode) = @{$files{$path}};
> -		my $git_mode = 0644;
> -		$git_mode |= 0700 if $mode & 0111;
>  		$path =~ s,^([^/]+)/,, if $have_top_dir;
> -		printf FI "M %o :%i %s\n", $git_mode, $mark, $path;
> +		printf FI "M %o :%i %s\n", $mode & 0111 ? 0755 : 0644, $mark, $path;
>  	}
>  	print FI "\n";

This hunk is completely unrelated to the Archive::Tar rewrite.
It also fixes a rather embarrassing bug on my part; I should
have been able to get the mode right!  :-)

I've applied this hunk (and only this hunk) to my fastimport tree
and pushed it out.

-- 
Shawn.