Jeff King | e349026 | 2007-09-18 03:26:27 -0400 | [diff] [blame] | 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 | |
| 7 | use strict; |
| 8 | use File::Find; |
| 9 | |
David Aguilar | dd3a4ad | 2013-02-23 16:50:18 -0800 | [diff] [blame] | 10 | my $USAGE = 'usage: git-import branch import-message'; |
Jeff King | e349026 | 2007-09-18 03:26:27 -0400 | [diff] [blame] | 11 | my $branch = shift or die "$USAGE\n"; |
| 12 | my $message = shift or die "$USAGE\n"; |
| 13 | |
| 14 | chomp(my $username = `git config user.name`); |
| 15 | chomp(my $email = `git config user.email`); |
| 16 | die 'You need to set user name and email' |
| 17 | unless $username && $email; |
| 18 | |
| 19 | system('git init'); |
| 20 | open(my $fi, '|-', qw(git fast-import --date-format=now)) |
| 21 | or die "unable to spawn fast-import: $!"; |
| 22 | |
| 23 | print $fi <<EOF; |
| 24 | commit refs/heads/$branch |
| 25 | committer $username <$email> now |
| 26 | data <<MSGEOF |
| 27 | $message |
| 28 | MSGEOF |
| 29 | |
| 30 | EOF |
| 31 | |
| 32 | find( |
| 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 | |
| 63 | close($fi); |
| 64 | exit $?; |