atoms_cc/buildtoolbox.pl:
Simon Lipp [Wed, 25 Jun 2008 16:00:38 +0000 (16:00 +0000)]
 * correct usage (see wiki:atoms_cc)
 * get_tree* returns a hash (easier to use, said Pierre)
 * no \n in filenames
 * get check_tree working (not finished)

atoms_cc/buildtoolbox.pl

index 8235597..827e726 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 
 # buildtoolbox.pl
-# Usage: buildtoolbox.pl toolbox-archive [toolbox-name]
+# Usage: buildtoolbox.pl toolbox-archive [config file [stage]]
 
 use strict;
 use Cwd;
@@ -18,36 +18,41 @@ sub is_zip {
 # get_tree_from_tgz:
 #   Get all files (names) of the compressed (in tar.gz) sources
 sub get_tree_from_tgz {
-       my (@files);
+       my %files;
        
        open my $fd, "tar -tzf ${TOOLBOXFILE}|";
-       push(@files, $_) while <$fd>;
-       chomp(@files);
+       
+       while(<$fd>) {
+               chomp;
+               $files{$_} = 1;
+       }
+       
        close $fd;
-       return @files;
+       return %files;
 }
 
 # get_tree_from_zip:
 #   Get all files (names) of the compressed (in zip) sources
 sub get_tree_from_zip {
-       my (@files, $line);
+       my (%files, $line);
        
        # tail & head are here to skip header & footer
        open my $fd, "unzip -l ${TOOLBOXFILE} | tail -n +4 | head -n -2 |";
        
        while(<$fd>) {
-               # output format: size date time filename
+               # zip output format: size date time filename
                /\s*\d+\s+\d+-\d+-\d+\s+\d+:\d+\s+(.+)/ or die "Bad output of unzip";
-               push(@files, $1);
+               chomp $1;
+               $files{$1} = 1;
        }
        
-       chomp(@files);
        close $fd;
-       return @files;
+       return %files;
 }
 
 # get_tree:
-#   Get all files (names) of the compressed sources
+#   Get all files (names) of the compressed sources, in a hash
+#   (hash values are meaningless, set to 1)
 sub get_tree {
        if(is_zip()) {
                return get_tree_from_zip();
@@ -137,41 +142,32 @@ sub read_description {
        return %infos;
 }
 
-
-
 # check_tree:
 #   Given a source tree of a toolbox (see get_tree), check if it is correct
 #   (required files are present, files are at their right place, and so on...)
 sub check_tree {
-       #~ my @tree = shift;
-       #~ my %treehash;
+       my %tree = @_;
        
-       #~ print "$#tree\n";
-       foreach (@_) { print "=> $_ \n"; };
+       # Check that all files are under a root which has the same name as the toolbox
+       foreach (keys %tree) {
+               if(!m#^\Q$TOOLBOXNAME\E/#) {
+                       die "Incorrect archive: \"$_\" is not a child of \"$TOOLBOXNAME\"";
+               }
+       }
        
-       #~ foreach (@tree) {
-               #~ # Make a hash from the tree (paths are keys, values are all to 1)
-               #~ $treehash{$_} = 1;
-               
-               #~ # Check that all files are under a root which has the same name as the toolbox
-               #~ if(!m#^\Q$TOOLBOXNAME\E/#) {
-                       #~ die "Incorrect archive: \"$_\" is not a child of \"$TOOLBOXNAME\"";
-               #~ }
-       #~ }
+       # Check that basic files are here
+       my @required = qw(DESCRIPTION DESCRIPTION-FUNCTIONS readme.txt license.txt
+                         builder.sce loader.sce);
+       push(@required, "etc/$TOOLBOXNAME.start");
+       push(@required, "etc/$TOOLBOXNAME.end");
        
-       #~ # Check that basic files are here
-       #~ my @required = qw(DESCRIPTION DESCRIPTION-FUNCTIONS readme.txt license.txt
-                         #~ builder.sce loader.sce);
-       #~ push(@required, "etc/$TOOLBOXNAME.start");
-       #~ push(@required, "etc/$TOOLBOXNAME.end");
+       foreach (@required) {
+               if(!defined($tree{"$TOOLBOXNAME/$_"})) {
+                       die "Incorrect archive: required file \"$_\" not present";
+               }
+       }
        
-       #~ foreach (@required) {
-               #~ print "$TOOLBOXNAME/$_\n";
-               #~ print %treehash;
-               #~ if(!defined($treehash{"$TOOLBOXNAME/$_"})) {
-                       #~ die "Incorrect archive: required file \"$_\" not present";
-               #~ }
-       #~ }
+       # 
 }
 
 # Init global vars, check arguments
@@ -184,12 +180,8 @@ if(! -r $TOOLBOXFILE) {
        die "$TOOLBOXFILE doesn't exists or can't be read";
 }
 
-$TOOLBOXNAME = shift || $1 if ($TOOLBOXFILE =~ /^([^.]+)/);
-
-
-
+$TOOLBOXNAME = $1 if ($TOOLBOXFILE =~ /^([^.]+)/);
 
-my @tree = get_tree();
 
-check_tree(@tree, 1);
+check_tree(get_tree());