blob: ab8115757666242c55285558ffa924d63446c919 [file] [log] [blame]
#! /usr/bin/perl
use strict;
use warnings;
use Errno ();
use File::Basename qw(basename);
die "Usage: $0 <https://github.com/user/repo> <commit> <dest-dir> [<path>]\n"
if @ARGV < 3;
my ($repo, $commit, $dest, $path) = @ARGV;
my $strip_components = 1;
my ($rm_path, $tar_path);
if (defined $path) {
$path =~ s|/*$||;
$strip_components += scalar(split "/", $path) - 1;
$rm_path = "$dest/" . basename $path;
$tar_path = "*/$path";
} else {
$path = "";
$rm_path = "$dest";
$tar_path = "";
}
run("rm -rf $rm_path");
mkdir("$dest")
or $! == Errno::EEXIST or die "failed to (re)create directory:$dest:$!";
run("curl --silent --show-error --location $repo/archive/$commit.tar.gz | (cd $dest && tar x --strip-components $strip_components -zf - $tar_path)") == 0
or die "failed to extract $repo/archive/$commit.tar.gz to $dest";
run("git add -f `find $rm_path -type f`") == 0
or die "failed to add files under $dest";
run("git commit --allow-empty -m 'extract $repo @ $commit @{[defined $path ? qq{($path)} : '']} at $dest' $dest") == 0
or die "failed to commit";
sub run {
my $cmd = shift;
print "$cmd\n";
system($cmd);
}