git/contrib/fast-import/git-import.perl
Jeff King e349026812 contrib/fast-import: add perl version of simple example
This is based on the git-import.sh script, but is a little
more robust and efficient. More importantly, it should
serve as a quick template for interfacing fast-import with
perl scripts.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-09-18 03:14:18 -07:00

65 lines
1.4 KiB
Perl
Executable File

#!/usr/bin/perl
#
# Performs an initial import of a directory. This is the equivalent
# of doing 'git init; git add .; git commit'. It's a little slower,
# but is meant to be a simple fast-import example.
use strict;
use File::Find;
my $USAGE = 'Usage: git-import branch import-message';
my $branch = shift or die "$USAGE\n";
my $message = shift or die "$USAGE\n";
chomp(my $username = `git config user.name`);
chomp(my $email = `git config user.email`);
die 'You need to set user name and email'
unless $username && $email;
system('git init');
open(my $fi, '|-', qw(git fast-import --date-format=now))
or die "unable to spawn fast-import: $!";
print $fi <<EOF;
commit refs/heads/$branch
committer $username <$email> now
data <<MSGEOF
$message
MSGEOF
EOF
find(
sub {
if($File::Find::name eq './.git') {
$File::Find::prune = 1;
return;
}
return unless -f $_;
my $fn = $File::Find::name;
$fn =~ s#^.\/##;
open(my $in, '<', $_)
or die "unable to open $fn: $!";
my @st = stat($in)
or die "unable to stat $fn: $!";
my $len = $st[7];
print $fi "M 644 inline $fn\n";
print $fi "data $len\n";
while($len > 0) {
my $r = read($in, my $buf, $len < 4096 ? $len : 4096);
defined($r) or die "read error from $fn: $!";
$r > 0 or die "premature EOF from $fn: $!";
print $fi $buf;
$len -= $r;
}
print $fi "\n";
}, '.'
);
close($fi);
exit $?;