#!/usr/bin/perl -w # ----------------------------------------------------------------------------- use strict; use File::Find (); my $workdir = "make-archive-dir"; my $empty = "nothing-to-see-here"; mkdir ($workdir,0777); if (-d "$workdir/.git") { } else { &git_run ("git", "init-db"); } &cleanup (); my $trees = 0; foreach my $arch (@ARGV) { my $tag = uc $arch; $tag =~ s|.*/||; $tag =~ s|\.tar\b.*||i; $tag =~ s/0+(\d)/$1/; $tag =~ s|[-.]|_|g; if ($arch !~ m'-(\d+(\.\d+)*[a-z]?)(\.tgz|\.tar(|\.gz|\.bz2))$'i) { die "$0: Cannot extract version number from $arch\n"; } my $version = $1; $version =~ s/0+(\d)/$1/; print STDERR "$arch $version\n"; my @compress = (); if ($arch =~ /\.(tar\.gz|tgz)$/i) { push @compress, '-z'; } elsif ($arch =~ /\.tar\.bz2$/i) { push @compress, '-j'; } &run ("tar", "-x", @compress, "-C", $workdir, "--strip-components=1", "-f", $arch); &git_run ("git", "add", "."); &git_run ("git", "commit", '-a', '-m', "Release $version"); &git_run ("git", "tag", $tag); if (++$trees == 10) { &git_run ("git", "repack", "-d"); $trees = 0; } &cleanup (); } &git_run ("git", "repack", "-a" , "-d", '--depth=50'); sub cleanup { my @files; File::Find::find (sub { if ($_ eq '.git') { $File::Find::prune = 1; return 0; } return 0 if ($_ eq '.' || $_ eq '..'); if (-d $_ || !-w _) { chmod ((stat(_))[2] | 0200, $_) or die "$0: Cannot chmod $_: $!\n"; } push @files, $File::Find::name; }, $workdir); foreach my $file (reverse @files) { rmdir ($file) or unlink ($file) or die "$0: Cannot remove $file: $!\n"; } } sub run { my $cmd = join (' ', @_); # print STDERR "Running $cmd\n"; system (@_); die "Failed to run $cmd: $?\n" if $?; } sub git_run { chdir $workdir or die "$0: Failed to chdir $workdir: $!\n"; &run (@_); chdir ".." or die "$0: Failed to chdir ..: $!\n"; } sub git_repack { }