Control: tag -1 + pending

Attached patch seems to work.
diff --git a/mmdebstrap b/mmdebstrap
index 6219035..003c1ca 100755
--- a/mmdebstrap
+++ b/mmdebstrap
@@ -1465,7 +1465,11 @@ sub setup {
     }
 
     # run setup hooks
-    run_hooks('setup', $options);
+    if (!$options->{dryrun}) {
+        run_hooks('setup', $options);
+    } else {
+        info "not running setup-hooks because of --dry-run";
+    }
 
     info "running apt-get update...";
     run_apt_progress({
@@ -1520,8 +1524,11 @@ sub setup {
         info "downloading packages with apt...";
         run_apt_progress({
                 ARGV => [
-                    'apt-get',                        '--yes',
-                    '-oApt::Get::Download-Only=true', 'install'
+                    'apt-get',
+                    '--yes',
+                    '-oApt::Get::Download-Only=true',
+                    $options->{dryrun} ? '-oAPT::Get::Simulate=true' : (),
+                    'install'
                 ],
                 PKGS => [@pkgs_to_install],
             });
@@ -1542,8 +1549,11 @@ sub setup {
         info "downloading packages with apt...";
         run_apt_progress({
                 ARGV => [
-                    'apt-get',                        '--yes',
-                    '-oApt::Get::Download-Only=true', 'dist-upgrade'
+                    'apt-get',
+                    '--yes',
+                    '-oApt::Get::Download-Only=true',
+                    $options->{dryrun} ? '-oAPT::Get::Simulate=true' : (),
+                    'dist-upgrade'
                 ],
             });
     } elsif (
@@ -1648,8 +1658,11 @@ sub setup {
         info "downloading packages with apt...";
         run_apt_progress({
                 ARGV => [
-                    'apt-get',                        '--yes',
-                    '-oApt::Get::Download-Only=true', 'install'
+                    'apt-get',
+                    '--yes',
+                    '-oApt::Get::Download-Only=true',
+                    $options->{dryrun} ? '-oAPT::Get::Simulate=true' : (),
+                    'install'
                 ],
                 PKGS => [keys %ess_pkgs],
             });
@@ -1659,7 +1672,7 @@ sub setup {
 
     # extract the downloaded packages
     my @essential_pkgs;
-    {
+    if (!$options->{dryrun}) {
         my $apt_archives = "/var/cache/apt/archives/";
         opendir my $dh, "$options->{root}/$apt_archives"
           or error "cannot read $apt_archives";
@@ -1674,28 +1687,30 @@ sub setup {
             push @essential_pkgs, $deb;
         }
         close $dh;
-    }
 
-    if (scalar @essential_pkgs == 0) {
-        # check if a file:// URI was used
-        open(my $pipe_apt, '-|', 'apt-get', 'indextargets', '--format',
-            '$(URI)', 'Created-By: Packages')
-          or error "cannot start apt-get indextargets: $!";
-        while (my $uri = <$pipe_apt>) {
-            if ($uri =~ /^file:\/\//) {
-                error
-                  "nothing got downloaded -- use copy:// instead of file://";
+        if (scalar @essential_pkgs == 0) {
+            # check if a file:// URI was used
+            open(my $pipe_apt, '-|', 'apt-get', 'indextargets', '--format',
+                '$(URI)', 'Created-By: Packages')
+              or error "cannot start apt-get indextargets: $!";
+            while (my $uri = <$pipe_apt>) {
+                if ($uri =~ /^file:\/\//) {
+                    error "nothing got downloaded -- use copy:// instead of"
+                      . " file://";
+                }
             }
+            error "nothing got downloaded";
         }
-        error "nothing got downloaded";
     }
 
     # We have to extract the packages from @essential_pkgs either if we run in
     # chrootless mode and extract variant or in any other mode.
     # In other words, the only scenario in which the @essential_pkgs are not
     # extracted are in chrootless mode in any other than the extract variant.
-    if ($options->{mode} eq 'chrootless' and $options->{variant} ne 'extract')
-    {
+    #
+    # or: if this is a dry run
+    if (($options->{mode} eq 'chrootless' and $options->{variant} ne 'extract')
+        or $options->{dryrun}) {
         # nothing to do
     } else {
         info "extracting archives...";
@@ -1742,7 +1757,8 @@ sub setup {
             '-oDPkg::Options::=--force-not-root',
             '-oDPkg::Options::=--force-script-chrootless',
             '-oDPkg::Options::=--root=' . $options->{root},
-            '-oDPkg::Options::=--log=' . "$options->{root}/var/log/dpkg.log"
+            '-oDPkg::Options::=--log=' . "$options->{root}/var/log/dpkg.log",
+            $options->{dryrun} ? '-oAPT::Get::Simulate=true' : (),
         );
         if (defined $options->{qemu}) {
             # The binfmt support on the outside is used, so qemu needs to know
@@ -1773,7 +1789,11 @@ sub setup {
             )
         ) {
             # run essential hooks
-            run_hooks('essential', $options);
+            if (!$options->{dryrun}) {
+                run_hooks('essential', $options);
+            } else {
+                info "not running essential-hooks because of --dry-run";
+            }
 
             if (scalar @pkgs_to_install > 0) {
                 run_apt_progress({
@@ -2001,23 +2021,26 @@ sub setup {
             # into account and thus doesn't install them in the right order
             # And the --predep-package option is broken: #539133
             info "installing packages...";
-            run_chroot(
-                sub {
-                    run_dpkg_progress({
-                            ARGV => [
-                                @chrootcmd,       'env',
-                                '--unset=TMPDIR', 'dpkg',
-                                '--install',      '--force-depends'
-                            ],
-                            PKGS => \@essential_pkgs,
-                        });
-                },
-                $options
-            );
+            if (!$options->{dryrun}) {
+                run_chroot(
+                    sub {
+                        run_dpkg_progress({
+                                ARGV => [
+                                    @chrootcmd,       'env',
+                                    '--unset=TMPDIR', 'dpkg',
+                                    '--install',      '--force-depends'
+                                ],
+                                PKGS => \@essential_pkgs,
+                            });
+                    },
+                    $options
+                );
+            }
 
             # if the path-excluded option was added to the dpkg config,
             # reinstall all packages
-            if (-e "$options->{root}/etc/dpkg/dpkg.cfg.d/99mmdebstrap") {
+            if ((!$options->{dryrun})
+                and -e "$options->{root}/etc/dpkg/dpkg.cfg.d/99mmdebstrap") {
                 open(my $fh, '<',
                     "$options->{root}/etc/dpkg/dpkg.cfg.d/99mmdebstrap")
                   or error "cannot open /etc/dpkg/dpkg.cfg.d/99mmdebstrap: $!";
@@ -2045,7 +2068,11 @@ sub setup {
 
             # run essential hooks
             if ($options->{variant} ne 'custom') {
-                run_hooks('essential', $options);
+                if (!$options->{dryrun}) {
+                    run_hooks('essential', $options);
+                } else {
+                    info "not running essential-hooks because of --dry-run";
+                }
             }
 
             if ($options->{variant} ne 'custom'
@@ -2098,67 +2125,89 @@ sub setup {
                       . (join ', ', @pkgs_to_install_from_outside) . "...";
                     run_apt_progress({
                             ARGV => [
-                                'apt-get',                        '--yes',
-                                '-oApt::Get::Download-Only=true', 'install'
+                                'apt-get',
+                                '--yes',
+                                '-oApt::Get::Download-Only=true',
+                                $options->{dryrun}
+                                ? '-oAPT::Get::Simulate=true'
+                                : (),
+                                'install'
                             ],
                             PKGS => [@pkgs_to_install_from_outside],
                         });
-                    my @debs_to_install;
-                    my $apt_archives = "/var/cache/apt/archives/";
-                    opendir my $dh, "$options->{root}/$apt_archives"
-                      or error "cannot read $apt_archives";
-                    while (my $deb = readdir $dh) {
-                        if ($deb !~ /\.deb$/) {
-                            next;
-                        }
-                        $deb = "$apt_archives/$deb";
-                        if (!-f "$options->{root}/$deb") {
-                            next;
+                    if (!$options->{dryrun}) {
+                        my @debs_to_install;
+                        my $apt_archives = "/var/cache/apt/archives/";
+                        opendir my $dh, "$options->{root}/$apt_archives"
+                          or error "cannot read $apt_archives";
+                        while (my $deb = readdir $dh) {
+                            if ($deb !~ /\.deb$/) {
+                                next;
+                            }
+                            $deb = "$apt_archives/$deb";
+                            if (!-f "$options->{root}/$deb") {
+                                next;
+                            }
+                            push @debs_to_install, $deb;
                         }
-                        push @debs_to_install, $deb;
-                    }
-                    close $dh;
-                    if (scalar @debs_to_install == 0) {
-                        warning "nothing got downloaded -- maybe the packages"
-                          . " were already installed?";
-                    } else {
-                        # we need --force-depends because dpkg does not take
-                        # Pre-Depends into account and thus doesn't install
-                        # them in the right order
-                        info 'installing '
-                          . (join ', ', @pkgs_to_install_from_outside) . "...";
-                        run_dpkg_progress({
-                                ARGV => [
-                                    @chrootcmd,       'env',
-                                    '--unset=TMPDIR', 'dpkg',
-                                    '--install',      '--force-depends'
-                                ],
-                                PKGS => \@debs_to_install,
-                            });
-                        foreach my $deb (@debs_to_install) {
-                            unlink "$options->{root}/$deb"
-                              or error "cannot unlink $deb: $!";
+                        close $dh;
+                        if (scalar @debs_to_install == 0) {
+                            warning
+                              "nothing got downloaded -- maybe the packages"
+                              . " were already installed?";
+                        } else {
+                           # we need --force-depends because dpkg does not take
+                           # Pre-Depends into account and thus doesn't install
+                           # them in the right order
+                            info 'installing '
+                              . (join ', ', @pkgs_to_install_from_outside)
+                              . "...";
+                            run_dpkg_progress({
+                                    ARGV => [
+                                        @chrootcmd,       'env',
+                                        '--unset=TMPDIR', 'dpkg',
+                                        '--install',      '--force-depends'
+                                    ],
+                                    PKGS => \@debs_to_install,
+                                });
+                            foreach my $deb (@debs_to_install) {
+                                unlink "$options->{root}/$deb"
+                                  or error "cannot unlink $deb: $!";
+                            }
                         }
                     }
                 }
 
-                run_chroot(
-                    sub {
-                        info
-                          "installing remaining packages inside the chroot...";
-                        run_apt_progress({
-                                ARGV => [
-                                    @chrootcmd,           'env',
-                                    '--unset=APT_CONFIG', '--unset=TMPDIR',
-                                    'apt-get',            '--yes',
-                                    'install'
-                                ],
-                                PKGS => [@pkgs_to_install],
-                            });
-                    },
-                    $options
-                );
-
+                if (!$options->{dryrun}) {
+                    run_chroot(
+                        sub {
+                            info "installing remaining packages inside the"
+                              . " chroot...";
+                            run_apt_progress({
+                                    ARGV => [
+                                        @chrootcmd,
+                                        'env',
+                                        '--unset=APT_CONFIG',
+                                        '--unset=TMPDIR',
+                                        'apt-get',
+                                        '--yes',
+                                        'install'
+                                    ],
+                                    PKGS => [@pkgs_to_install],
+                                });
+                        },
+                        $options
+                    );
+                } else {
+                    info "installing remaining packages inside the chroot...";
+                    run_apt_progress({
+                            ARGV => [
+                                'apt-get',                   '--yes',
+                                '-oAPT::Get::Simulate=true', 'install'
+                            ],
+                            PKGS => [@pkgs_to_install],
+                        });
+                }
             }
         } else {
             error "unknown variant: $options->{variant}";
@@ -2167,7 +2216,11 @@ sub setup {
         error "unknown mode: $options->{mode}";
     }
 
-    run_hooks('customize', $options);
+    if (!$options->{dryrun}) {
+        run_hooks('customize', $options);
+    } else {
+        info "not running customize-hooks because of --dry-run";
+    }
 
     # clean up temporary configuration file
     unlink "$options->{root}/etc/apt/apt.conf.d/00mmdebstrap"
@@ -2534,6 +2587,7 @@ sub main() {
         setup_hook      => [],
         essential_hook  => [],
         customize_hook  => [],
+        dryrun          => 0,
     };
     my $logfile = undef;
     Getopt::Long::Configure('default', 'bundling', 'auto_abbrev',
@@ -2587,6 +2641,8 @@ sub main() {
         'setup-hook=s@'     => \$options->{setup_hook},
         'essential-hook=s@' => \$options->{essential_hook},
         'customize-hook=s@' => \$options->{customize_hook},
+        'simulate'          => \$options->{dryrun},
+        'dry-run'           => \$options->{dryrun},
     ) or pod2usage(-exitval => 2, -verbose => 1);
 
     if (defined($logfile)) {
@@ -2598,6 +2654,14 @@ sub main() {
           . " with some debootstrap wrappers.";
     }
 
+    if ($options->{dryrun}) {
+        foreach my $hook ('setup', 'essential', 'customize') {
+            if (scalar @{ $options->{"${hook}_hook"} } > 0) {
+                warning "In dry-run mode, --$hook-hook options have no effect";
+            }
+        }
+    }
+
     my @valid_variants = (
         'extract',     'custom',  'essential', 'apt',
         'required',    'minbase', 'buildd',    'important',
@@ -3245,9 +3309,14 @@ sub main() {
         # try to fail early if target tarball or squashfs image cannot be
         # opened for writing
         if ($options->{target} ne '-') {
-            open my $fh, '>', $options->{target}
-              or error "cannot open $options->{target} for writing: $!";
-            close $fh;
+            if ($options->{dryrun}) {
+                info
+                  "not overwriting $options->{target} because in dry-run mode";
+            } else {
+                open my $fh, '>', $options->{target}
+                  or error "cannot open $options->{target} for writing: $!";
+                close $fh;
+            }
         }
         # since the output is a tarball, we create the rootfs in a temporary
         # directory
@@ -3918,14 +3987,19 @@ sub main() {
             } else {
                 if ($options->{makesqfs} or defined $tar_compressor) {
                     my @argv = ();
-                    if ($options->{makesqfs}) {
-                        push @argv, 'tar2sqfs',
-                          '--quiet', '--no-skip', '--force', '--exportable',
-                          '--compressor', 'xz',
-                          '--block-size', '1048576',
-                          $options->{target};
+                    if ($options->{dryrun}) {
+                        push @argv, 'cat';
                     } else {
-                        push @argv, @{$tar_compressor};
+                        if ($options->{makesqfs}) {
+                            push @argv, 'tar2sqfs',
+                              '--quiet', '--no-skip', '--force',
+                              '--exportable',
+                              '--compressor', 'xz',
+                              '--block-size', '1048576',
+                              $options->{target};
+                        } else {
+                            push @argv, @{$tar_compressor};
+                        }
                     }
                     POSIX::sigprocmask(SIG_BLOCK, $sigset)
                       or error "Can't block signals: $!";
@@ -3942,7 +4016,7 @@ sub main() {
                         POSIX::sigprocmask(SIG_UNBLOCK, $sigset)
                           or error "Can't unblock signals: $!";
 
-                        if ($options->{makesqfs}) {
+                        if ($options->{makesqfs} or $options->{dryrun}) {
                             open(STDOUT, '>', '/dev/null')
                               or error "cannot open /dev/null for writing: $!";
                         } else {

Attachment: signature.asc
Description: signature



Reply via email to