[Gpg4win-commits] r671 - in trunk: . src

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Tue Jan 8 01:54:30 CET 2008


Author: marcus
Date: 2008-01-08 01:54:28 +0100 (Tue, 08 Jan 2008)
New Revision: 671

Added:
   trunk/src/pkg-to-nsi.pl
Modified:
   trunk/ChangeLog
Log:
2008-01-08  Marcus Brinkmann  <marcus at g10code.de>

	* src/pkg-to-nsi.pl: New file.


Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-01-08 00:42:03 UTC (rev 670)
+++ trunk/ChangeLog	2008-01-08 00:54:28 UTC (rev 671)
@@ -1,5 +1,7 @@
 2008-01-08  Marcus Brinkmann  <marcus at g10code.de>
 
+	* src/pkg-to-nsi.pl: New file.
+
 	* src/inst-kleopatra.nsi: Add missing files.
 	* src/uninst-kleopatra.nsi: Likewise.
 

Added: trunk/src/pkg-to-nsi.pl
===================================================================
--- trunk/src/pkg-to-nsi.pl	2008-01-08 00:42:03 UTC (rev 670)
+++ trunk/src/pkg-to-nsi.pl	2008-01-08 00:54:28 UTC (rev 671)
@@ -0,0 +1,214 @@
+#! /usr/bin/perl -w
+# pkg-to-nsi.pl - Helper script to create NSI snippets from archive files.
+# Copyright (C) 2007 g10 Code GmbH
+# 
+# This file is part of Gpg4win.
+# 
+# Gpg4win is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# Gpg4win is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+use strict;
+use warnings;
+use diagnostics;
+
+# This is a small script to convert the list of files in a binary
+# package to an NSI install or uninstall snippet.
+#
+# Usage: ./pkg-to-nsi.pl [--filter FILTER1,FILTER2,...]... \
+#                        --inst|--uninst PACKAGE
+#
+# For example:
+#
+#  perl pkg-to-nsi.pl --filter crystal,22x22,32x32,48x48,64x64,128x128 \
+#                     --inst ../packages/oxygen-icons-20071220-bin.zip
+#
+# The result can be used as the basis for a NSI file.  Do NOT cut and paste
+# this without thinking.  Some merging needs to be done.  For example, some
+# files will be installed in different locations (bin,lib to root), and
+# files only included in previous installations may need to be removed from
+# future installations, etc.
+
+# Operation.
+$::op = '--inst';
+
+# Filter expressions.
+@::filter;
+
+while ($ARGV[0] =~ m,^-,)
+{
+    my $opt;
+    $opt = shift @ARGV;
+    if ($opt eq '--inst' or $opt eq '--uninst')
+    {
+        $::op = $opt;
+    }
+    elsif ($opt eq '--filter')
+    {
+	die "--filter needs argument" if ($#ARGV < 0);
+	push @::filter, split (',', shift @ARGV);
+    }
+    else
+    {
+	die "unknown option $opt";
+    }
+}
+
+if ($::op ne '--inst' and $::op ne '--uninst')
+{
+    die "unknown operation $::op";
+}
+
+$_ = shift @ARGV;
+@::files = ();
+
+if ($_ =~ m/\.zip$/)
+{
+    @::files = `unzip -l -qq $_ | colrm 1 28`;
+}
+elsif ($_ =~ m/\.tar\.gz$/)
+{
+    @::files = `tar tzf $_`;
+}
+elsif ($_ =~ m/\.tar\.bz2$/)
+{
+    @::files = `tar tjf $_`;
+}
+else
+{
+    die "unknown file type $_";
+}
+
+
+@::files = sort @::files;
+
+
+if ($::op eq '--inst')
+{
+    my $cdir;
+
+    foreach my $file (@::files)
+    {
+	chomp $file;
+	
+	next if ($file =~ m,/$,);
+	my $matches = 0;
+	foreach my $filter (@::filter)
+	{
+	    if ($file =~ m,$filter,)
+	    {
+		$matches = 1;
+		last;
+	    }
+	}
+	next if $matches;
+
+	$file =~ m,(?:(.*)/)?([^/]+),;
+	my $dir = $1;
+	my $base = $2;
+	if ($dir ne $cdir)
+	{
+	    $cdir = $dir;
+	    $dir =~ s,/,\\,g;
+	    
+	    print "\n" . '  SetOutPath "$INSTDIR\\' . $dir . '"' . "\n\n";
+	}
+	print '  File ${prefix}/' . $file . "\n";
+    }
+}
+elsif ($::op eq '--uninst')
+{
+    my $in_rmdir = 0;
+    # All directories we have seen.
+    my %dir_seen;
+    # All directories that occur.
+    my %dirs;
+
+    @::files = reverse @::files;
+
+    foreach my $file (@::files)
+    {
+	chomp $file;
+
+        # We handle all dirs at the end.
+	next if ($file =~ m,/$,);
+
+	my $matches = 0;
+
+	# Apply filters.
+	foreach my $filter (@::filter)
+	{
+	    if ($file =~ m,$filter,)
+	    {
+		$matches = 1;
+		last;
+	    }
+	}
+	next if $matches;
+
+	# Remember directories.
+	my $dir = $file;
+	
+	chomp $dir;
+	while ($dir =~ m,/,)
+	{
+	    $dir =~ s,/[^/]+$,/,;
+	    $dirs{$dir}++;
+		$dir =~ s,/$,,;
+	}
+	
+	# Delete file.
+	$file =~ m,(?:(.*)/)?([^/]+),;
+	my $dir = $1;
+	$dir_seen{$dir}++;
+	do
+	{
+	    $dir =~ s,/[^/]+$,,;
+	    $dir_seen{$dir}++;
+	}
+	while ($dir =~ m,/,);
+	
+	if ($in_rmdir)
+	{
+	    print "\n";
+	    $in_rmdir = 0;
+	    }
+	
+	$file =~ s,/,\\,g;
+	print '  Delete "$INSTDIR\\' . $file . '"' . "\n";
+    }
+
+    # Delete all dirs not yet deleted.
+    foreach my $file (reverse sort keys %dirs)
+    {
+	chomp $file;
+
+	if ($file =~ m,/$,)
+	{
+	    chop $file;
+
+	    next if not defined $dir_seen{$file};
+
+	    $file =~ s,/,\\,g;
+
+	    if (not $in_rmdir)
+	    {
+		print "\n";
+		$in_rmdir = 1;
+	    }
+
+	    print '  RMDir "$INSTDIR\\' . $file . '"' . "\n";
+	}
+    }
+    print '  RMDir "$INSTDIR"'. "\n";
+}



More information about the Gpg4win-commits mailing list