I also like the idea of keeping the pool tree size down. Also I think
this will help in installing packages whose names begin with numbers.
I've attached a patch that exports Tree_Mkdir() and uses the approach
proposed by Magnus Holmgren to create the minimal pool tree.
--- debpool_released/share/DebPool/Dirs.pm      2007-12-03 14:10:49.000000000 -0500
+++ debpool/share/DebPool/Dirs.pm       2007-12-05 02:04:29.000000000 -0500
@@ -60,6 +60,7 @@
     @EXPORT_OK = qw(
         &Archfile
         &Create_Tree
+        &Tree_Mkdir
         &Monitor_Incoming
         &PoolBasePath
         &PoolDir
@@ -69,7 +70,7 @@
     );

     %EXPORT_TAGS = (
-        'functions' => [qw(&Archfile &Create_Tree &Monitor_Incoming
+        'functions' => [qw(&Archfile &Create_Tree &Tree_Mkdir &Monitor_Incoming
                            &PoolBasePath &PoolDir &Scan_Changes &Scan_All
                            &Strip_Subsection)],
         'vars' => [qw()],
@@ -198,19 +199,10 @@

     my($section);
     foreach $section (@{$Options{'sections'}}) {
+        next if $section =~ m/\s*\/debian-installer/;
         if (!Tree_Mkdir("$pool_dir/$section", $pool_dir_mode)) {
             return 0;
         }
-
-        my($letter);
-        foreach $letter ('a' .. 'z') {
-            if (!Tree_Mkdir("$pool_dir/$section/$letter", $pool_dir_mode)) {
-                return 0;
-            }
-            if (!Tree_Mkdir("$pool_dir/$section/lib$letter", $pool_dir_mode)) {
-                return 0;
-            }
-        }
     }

     return 1;
--- debpool_released/share/DebPool/Packages.pm	2007-12-03 14:10:49.000000000 -0500
+++ debpool/share/DebPool/Packages.pm	2007-12-05 02:12:24.000000000 -0500
@@ -488,7 +488,7 @@
 
     for $count (0..$#dsc) {
         if ($found) {
-            if ($dsc[$count] =~ m/^\s*$/) { # Blank line
+            if ($dsc[$count] =~ m/^(\s*$|\S)/) { # End of Files entry
                 $found = 0; # No longer in Files
             } elsif ($dsc[$count] =~ m/\s*([[:xdigit:]]+)\s+(\d+)\s+(\S+)/) {
                 my($md5, $size, $file) = ($1, $2, $3);
@@ -567,31 +567,37 @@
                 ($Options{'pool_dir'}, PoolDir($source, $section), $source));
             my($version) = Get_Version($distribution, $source, 'meta');
             my($target) = "$pool/${source}_" . Strip_Epoch($version);
-            $target .= '.package';
+            $target .= "_$arch\.package";
 
-            if (!open(PKG, '<', "$target")) {
-                my($msg) = "Skipping package entry for all packages from ";
-                $msg .= "${source}: couldn't open '$target' for reading: $!";
+            # Check if package for arch is installed and write entries if
+            # found
+            my($check_changes) = "$Options{'installed_dir'}/${source}_";
+            $check_changes .= Strip_Epoch($version) . "_$arch\.changes";
+            if (-e $check_changes) {
+                if (!open(PKG, '<', "$target")) {
+                    my($msg) = "Skipping package entry for all packages from ";
+                    $msg .= "${source}: couldn't open '$target' for reading: $!";
 
-                Log_Message($msg, LOG_GENERAL, LOG_ERROR);
-                next;
-            }
+                    Log_Message($msg, LOG_GENERAL, LOG_ERROR);
+                    next;
+                }
 
-            # Playing around with the record separator ($/) to make this
-            # easier.
+                # Playing around with the record separator ($/) to make this
+                # easier.
 
-            my($backup_RS) = $/;
-            $/ = "";
+                my($backup_RS) = $/;
+                $/ = "";
 
-            my(@entries) = <PKG>;
-            close(PKG);
+                my(@entries) = <PKG>;
+                close(PKG);
 
-            $/ = $backup_RS;
+                $/ = $backup_RS;
 
-            # Pare it down to the relevant entries, and print those out.
+                # Pare it down to the relevant entries, and print those out.
 
-            @entries = grep(/\nArchitecture: ($arch|all)\n/, @entries);
-            print $tmpfile_handle @entries;
+                @entries = grep(/\nArchitecture: ($arch|all)\n/, @entries);
+                print $tmpfile_handle @entries;
+            }
         }
     }
 
@@ -624,23 +630,27 @@
     my($pkg_name) = $chg_hashref->{'Source'};
     my($pkg_ver) = $chg_hashref->{'Version'};
 
+    # determine arch for packages being installed based on set archs from
+    # options
+    my($options_archs);
+    my($pkg_arch);
+    foreach $options_archs (@{$Options{'archs'}}) {
+        if ($changes =~ m/.*\Q_${options_archs}.changes\E/) {
+              $pkg_arch = $options_archs;
+        }
+    }
+
     my($guess_section) = Guess_Section($chg_hashref);
-    my($pkg_dir) = join('/',
-        ($pool_dir, PoolDir($pkg_name, $guess_section), $pkg_name));
+    my($pkg_pool_subdir) = join('/',
+        ($pool_dir, PoolDir($pkg_name, $guess_section)));
+    my($pkg_dir) = join('/', ($pkg_pool_subdir, $pkg_name));
 
-    # Make sure the package directory exists (and is a directory!)
+    # Create the directory or error out
 
-    if (! -e $pkg_dir) {
-        if (!mkdir($pkg_dir)) {
-            $Error = "Failed to mkdir '$pkg_dir': $!";
-            return 0;
-        }
-        if (!chmod($Options{'pool_dir_mode'}, $pkg_dir)) {
-            $Error = "Failed to chmod '$pkg_dir': $!";
-            return 0;
-        }
-    } elsif (! -d $pkg_dir) {
-        $Error = "Target '$pkg_dir' is not a directory.";
+    if (!Tree_Mkdir($pkg_pool_subdir, $Options{'pool_dir_mode'})) {
+        return 0;
+    }
+    if (!Tree_Mkdir($pkg_dir, $Options{'pool_dir_mode'})) {
         return 0;
     }
 
@@ -661,19 +671,22 @@
 
     # Generate and install .package and .source metadata files.
 
-    my($pkg_file) = Generate_Package($chg_hashref);
+    my($target);
+    if ($pkg_arch ne 'source') { #Don't generate for source only uploads
+        my($pkg_file) = Generate_Package($chg_hashref);
 
-    if (!defined($pkg_file)) {
-        $Error = "Failed to generate .package file: $Error";
-        return undef;
-    }
+        if (!defined($pkg_file)) {
+            $Error = "Failed to generate .package file: $Error";
+            return undef;
+        }
 
-    my($target) = "$pkg_dir/${pkg_name}_" . Strip_Epoch($pkg_ver) . '.package';
+        $target = "$pkg_dir/${pkg_name}_" . Strip_Epoch($pkg_ver) . "_$pkg_arch" . '.package';
 
-    if (!Move_File($pkg_file, $target, $Options{'pool_file_mode'})) {
-        $Error = "Failed to move '$pkg_file' to '$target': ";
-        $Error .= $DebPool::Util::Error;
-        return 0;
+        if (!Move_File($pkg_file, $target, $Options{'pool_file_mode'})) {
+            $Error = "Failed to move '$pkg_file' to '$target': ";
+            $Error .= $DebPool::Util::Error;
+            return 0;
+        }
     }
 
     if (defined($dsc) && defined($dsc_hashref)) {
@@ -719,6 +732,9 @@
             $chg_hashref->{'Files'});
         $ComponentDB{$distribution}->{$pkg_name} = $component;
     }
+    if ( $section eq 'debian-installer' ) {
+        $component .= '/debian-installer';
+    }
 
     return 1;
 }
@@ -820,6 +836,14 @@
 
     my($package, $changes_hashref) = @_;
 
+    my($with_source) = undef; # Checking for binary only upload
+    my($temp);
+    for $temp (@{$changes_hashref->{'Architecture'}}) {
+        if ('source' eq $temp) {
+            $with_source = 1;
+        }
+    }
+
     my($installed_dir) = $Options{'installed_dir'};
     my($pool_dir) = $Options{'pool_dir'};
 
@@ -872,7 +896,7 @@
             $bin_package = $1;
             $version = $2;
             $deb = 1;
-        } elsif ($file =~ m/^([^_]+)_([^_]+)\.package$/) { # package metadata
+        } elsif ($file =~ m/^([^_]+)_([^_]+)_.+\.package$/) { # package metadata
             $bin_package = $1;
             $version = $2;
         } elsif ($file =~ m/^([^_]+)_([^_]+)\.source$/) { # source metadata
@@ -885,7 +909,10 @@
         }
 
         # Skip it if we recognize it as a valid version.
-
+        # Also skip src files if doing a binary only upload
+        if (!$with_source) {
+            $src = 0;
+        }
         my($matched) = 0;
         my($dist);
         foreach $dist (@{$Options{'realdists'}}) {
@@ -981,8 +1008,7 @@
             # without the epoch" -- it is more or less arbitrary, as long
             # as it is a well-formed version number).
 
-            my($filepat) = "${package}_.*_${arch}\\.deb";
-            $filepat =~ s/\+/\\\+/;
+            my($filepat) = qr/^\Q${package}_\E.*\Q_${arch}.\Eu?deb/;
 
             my($section) = Guess_Section($changes_data);
             my($pool) = join('/', (PoolDir($source, $section), $source));
@@ -1054,9 +1080,9 @@
             print $tmpfile_handle "MD5sum: $files[$marker]->{'MD5Sum'}\n";
         
             print $tmpfile_handle "Description: $info->{'Description'}";
-        }
 
-        print $tmpfile_handle "\n";
+            print $tmpfile_handle "\n";
+        }
     }
 
     # All done
@@ -1117,7 +1143,8 @@
     print $tmpfile_handle 'Architecture: ';
     print $tmpfile_handle join(' ', @{$dsc_data->{'Architecture'}}) . "\n";
 
-    print $tmpfile_handle "Standards-Version: $dsc_data->{'Standards-Version'}\n";
+    print $tmpfile_handle "Standards-Version: $dsc_data->{'Standards-Version'}\n"
+      if  exists $dsc_data->{'Standards-Version'};
     print $tmpfile_handle "Format: $dsc_data->{'Format'}\n";
     print $tmpfile_handle "Directory: " .  join('/',
         (PoolBasePath(), PoolDir($source, $section), $source)) . "\n";

Reply via email to