contrib / fast-import / git-import.perlon commit Merge branch 'jt/avoid-ls-refs-with-http' (f67bf53)
   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.
   6
   7use strict;
   8use File::Find;
   9
  10my $USAGE = 'usage: git-import branch import-message';
  11my $branch = shift or die "$USAGE\n";
  12my $message = shift or die "$USAGE\n";
  13
  14chomp(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;
  18
  19system('git init');
  20open(my $fi, '|-', qw(git fast-import --date-format=now))
  21  or die "unable to spawn fast-import: $!";
  22
  23print $fi <<EOF;
  24commit refs/heads/$branch
  25committer $username <$email> now
  26data <<MSGEOF
  27$message
  28MSGEOF
  29
  30EOF
  31
  32find(
  33  sub {
  34    if($File::Find::name eq './.git') {
  35      $File::Find::prune = 1;
  36      return;
  37    }
  38    return unless -f $_;
  39
  40    my $fn = $File::Find::name;
  41    $fn =~ s#^.\/##;
  42
  43    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
  49    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
  60  }, '.'
  61);
  62
  63close($fi);
  64exit $?;