- print "Generating list of active CVS files...\n";
- my($dir, @files);
- open(CVS, '-|', 'cvs status 2>&1') or die $!;
- while (<CVS>) {
- if (/^cvs status: Examining (.*)/) {
- if ($1 eq '.') {
- $dir = '';
- } else {
- push(@files, $1);
- $dir = $1 . '/';
- }
- } elsif (/^File: (.*?)\s+Status: (.*)/ && $1 ne '.cvsignore') {
- push(@files, $dir . $1);
- if ($2 ne 'Up-to-date') {
- print "*** Not up-to-date: $dir$1\n";
- }
- }
- }
- close CVS;
-
- print "Creating $unpacked/$name.tar.gz\n";
- chdir('..') or die $!;
- rename($unpacked, $name) or die $!;
- open(TAR, '|-', "fakeroot tar --files-from=- --no-recursion --mode=g-w -czf $nightly/$name.tar.gz $name") or die $!;
- foreach (@files) {
- print TAR "$name/$_\n";
- }
- close TAR;
- rename($name, $unpacked) or die $!;
+ open(IN, '-|', 'git-status') or die $!;
+ my $status = join('', <IN>);
+ close IN;
+ die "The checkout is not clean:\n", $status unless $status =~ /\nnothing to commit \(working directory clean\)/;
+ die "The checkout is not on the master branch.\n" unless $status =~ /^# On branch master\n/;
+
+ open(IN, '<', 'prepare-source.mak') or die "Couldn't open prepare-source.mak: $!\n";
+ $_ = join('', <IN>);
+ close IN;
+
+ my @extra_files = m{\n([^\s:]+):.*\n\t\S}g;
+ map { s#^#$name/# } @extra_files;
+
+ print "Creating $name.tar.gz\n";
+ system "./prepare-source && touch proto.h";
+ symlink('.', $name);
+ system "git-archive --format=tar --prefix=$name/ HEAD >$dest/$name.tar";
+ system "fakeroot tar rf $dest/$name.tar @extra_files; gzip -9 $dest/$name.tar";
+ unlink($name);