summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Jamfile.jam14
-rw-r--r--tests/archive.pl60
2 files changed, 64 insertions, 10 deletions
diff --git a/Jamfile.jam b/Jamfile.jam
index 9e41cda..ae986cc 100644
--- a/Jamfile.jam
+++ b/Jamfile.jam
@@ -148,18 +148,12 @@ RELEASE_FILES =
readme.txt
;
-actions ZipAction
+actions ArchiveAction
{
- zip -q -9 $(<) $(>)
+ perl tests/archive.pl $(<) $(>)
}
-actions TgzAction
-{
- tar cf $(<:S=) $(>)
- gzip -9 $(<:S=)
-}
-
-ZipAction pugixml-$(VERSION).zip : $(RELEASE_FILES) ;
-TgzAction pugixml-$(VERSION).tar.gz : $(RELEASE_FILES) ;
+ArchiveAction pugixml-$(VERSION).zip : $(RELEASE_FILES) ;
+ArchiveAction pugixml-$(VERSION).tar.gz : $(RELEASE_FILES) ;
Depends release : pugixml-$(VERSION).zip pugixml-$(VERSION).tar.gz : $(RELEASE_FILES) ;
NotFile release ;
diff --git a/tests/archive.pl b/tests/archive.pl
new file mode 100644
index 0000000..240dd02
--- /dev/null
+++ b/tests/archive.pl
@@ -0,0 +1,60 @@
+#!/usr/bin/perl
+
+use Archive::Tar;
+use Archive::Zip;
+
+my $target = shift @ARGV;
+my @sources = @ARGV;
+
+my $zip = $target =~ /\.zip$/;
+
+my $arch = $zip ? Archive::Zip->new : Archive::Tar->new;
+
+for $source (sort {$a cmp $b} @sources)
+{
+ my $contents = &readfile_contents($source);
+ my $meta = &readfile_meta($source);
+
+ if ($zip)
+ {
+ my $path = $source;
+ $arch->addDirectory($path) if $path =~ s/\/[^\/]+$/\// && !defined($arch->memberNamed($path));
+
+ my $member = $arch->addString($contents, $source);
+
+ $member->desiredCompressionMethod(COMPRESSION_DEFLATED);
+ $member->desiredCompressionLevel(9);
+
+ $member->setLastModFileDateTimeFromUnix($$meta{mtime});
+ }
+ else
+ {
+ # tgz releases are for Unix people, Unix people like Unix newlines
+ $contents =~ s/\r//g if (-T $source);
+
+ $arch->add_data($source, $contents, $meta);
+ }
+}
+
+$zip ? $arch->overwriteAs($target) : $arch->write($target, 9);
+
+sub readfile_contents
+{
+ my $file = shift;
+
+ open FILE, $file or die "Can't open $file: $!";
+ binmode FILE;
+ my @contents = <FILE>;
+ close FILE;
+
+ return join('', @contents);
+}
+
+sub readfile_meta
+{
+ my $file = shift;
+
+ my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat($file);
+
+ return {mtime => $mtime};
+}