1#!/usr/bin/perl
   2#
   3# Performs an initial import of a directory. This is the equivalent
   4# of doing 'git init; git add .; git commit'. It's a little slower,
   5# but is meant to be a simple fast-import example.
   6use strict;
   8use File::Find;
   9my $USAGE = 'usage: git-import branch import-message';
  11my $branch = shift or die "$USAGE\n";
  12my $message = shift or die "$USAGE\n";
  13chomp(my $username = `git config user.name`);
  15chomp(my $email = `git config user.email`);
  16die 'You need to set user name and email'
  17  unless $username && $email;
  18system('git init');
  20open(my $fi, '|-', qw(git fast-import --date-format=now))
  21  or die "unable to spawn fast-import: $!";
  22print $fi <<EOF;
  24commit refs/heads/$branch
  25committer $username <$email> now
  26data <<MSGEOF
  27$message
  28MSGEOF
  29EOF
  31find(
  33  sub {
  34    if($File::Find::name eq './.git') {
  35      $File::Find::prune = 1;
  36      return;
  37    }
  38    return unless -f $_;
  39    my $fn = $File::Find::name;
  41    $fn =~ s#^.\/##;
  42    open(my $in, '<', $_)
  44      or die "unable to open $fn: $!";
  45    my @st = stat($in)
  46      or die "unable to stat $fn: $!";
  47    my $len = $st[7];
  48    print $fi "M 644 inline $fn\n";
  50    print $fi "data $len\n";
  51    while($len > 0) {
  52      my $r = read($in, my $buf, $len < 4096 ? $len : 4096);
  53      defined($r) or die "read error from $fn: $!";
  54      $r > 0 or die "premature EOF from $fn: $!";
  55      print $fi $buf;
  56      $len -= $r;
  57    }
  58    print $fi "\n";
  59  }, '.'
  61);
  62close($fi);
  64exit $?;