Git fork
at reftables-rust 64 lines 1.5 kB view raw
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 $?;