App-sbozyp

 view release on metacpan or  search on metacpan

bin/sbozyp  view on Meta::CPAN


sub pkgs_removable_dependencies {
    my @pkgs = @_; # we assume all pkgs in @pkgs are actually installed
    my %pkgs; $pkgs{$_->{PKGNAME}} = $_ for @pkgs;
    my %deps; for my $pkg (@pkgs) {
        for my $dep (pkg_dependencies_direct($pkg)) {
            next if exists $pkgs{$dep->{PKGNAME}};
            if (defined pkg_installed($dep)) {
                $deps{$dep->{PKGNAME}} = $dep;
                for my $dep (pkg_dependencies_recursive($dep)) {
                    next if exists $pkgs{$dep->{PKGNAME}};
                    $deps{$dep->{PKGNAME}} = $dep if defined pkg_installed($dep);
                }
            }
        }
    }
    for my $installed_sbo_pkg (map { pkg($_) } keys %{{ installed_sbo_pkgs() }}) {
        next if exists $pkgs{$installed_sbo_pkg->{PKGNAME}};
        next if exists $deps{$installed_sbo_pkg->{PKGNAME}};
        for my $dep (pkg_dependencies_direct($installed_sbo_pkg)) {
            if ($deps{$dep->{PKGNAME}}) {
                $deps{$dep->{PKGNAME}} = 0;
                for my $dep (pkg_dependencies_recursive($dep)) {
                    $deps{$dep->{PKGNAME}} = 0 if exists $deps{$dep->{PKGNAME}};
                }
            }
        }
    }
    my @removable_deps; for my $pkgname (keys %deps) {
        if (my $dep = $deps{$pkgname}) {
            push @removable_deps, $dep;
        }
    }
    @removable_deps = pkgs_sorted(@removable_deps);
    return @removable_deps;
}

sub pkg_prepare_for_build {
    my ($pkg, $keep_src, $skip_md5) = @_;
    my $arch = arch();
    if (my $arch_problem = $pkg->{ARCH_UNSUPPORTED}) {
        sbozyp_die("$pkg->{PKGNAME} is $arch_problem on $arch");
    }
    my %url_md5;
    if ($arch eq 'x86_64' and my @urls = @{$pkg->{DOWNLOAD_x86_64}}) {
        @url_md5{@urls} = @{$pkg->{MD5SUM_x86_64}};
    } else {
        my @urls = @{$pkg->{DOWNLOAD}};
        @url_md5{@urls} = @{$pkg->{MD5SUM}};
    }
    my $staging_dir = File::Temp->newdir(DIR => $CONFIG{TMPDIR}, TEMPLATE => 'sbozyp_XXXXXX');
    sbozyp_copy($pkg->{PKGDIR}, $staging_dir);
    for my $url (sort keys %url_md5) {
        my $src_filename = decode_url(basename($url));
        if ($keep_src && -r "$CONFIG{SRCDIR}/$src_filename") {
            # Sources stored from previous downloads have already been md5 checked
            sbozyp_print_stderr("$pkg->{PKGNAME}: using previously downloaded src: $src_filename\n");
            sbozyp_copy("$CONFIG{SRCDIR}/$src_filename", "$staging_dir/$src_filename");
        } else {
            my $md5 = $url_md5{$url};
            sbozyp_system('wget', '-e', 'background=off', '-O', "$staging_dir/$src_filename", $url);
            unless ($skip_md5) {
                my $got_md5 = do {
                    my $fh = sbozyp_open('<', "$staging_dir/$src_filename");
                    binmode($fh);
                    Digest::MD5->new->addfile($fh)->hexdigest;
                };
                if ($md5 ne $got_md5) {
                    sbozyp_die("md5sum mismatch for '$url': expected '$md5': got '$got_md5'");
                }
            }
            if ($keep_src) {
                sbozyp_mkdir($CONFIG{SRCDIR});
                sbozyp_copy("$staging_dir/$src_filename", "$CONFIG{SRCDIR}/$src_filename");
            }
        }	
    }
    return $staging_dir;
}

sub build_slackware_pkg {
    my ($pkg, $keep_src, $skip_md5) = @_;
    local $ENV{OUTPUT} = $CONFIG{TMPDIR}; # all SlackBuilds use the $OUTPUT env var to determine output pkg location
    sbozyp_mkdir($CONFIG{TMPDIR});
    my $staging_dir = pkg_prepare_for_build($pkg, $keep_src, $skip_md5);
    my $slackbuild = $pkg->{PRGNAM} . '.SlackBuild';
    my $cmd = with_cwd($staging_dir, sub {
        sbozyp_chmod(0755, "./$slackbuild");
        return sbozyp_open('-|', "./$slackbuild");
    });
    my $slackware_pkg; while (my $line = <$cmd>) {
        $slackware_pkg = $1 if $line =~ /^Slackware package (.+) created\.$/;
        print $line;
    }
    close $cmd;
    sbozyp_die("failed to build $pkg->{PKGNAME}") if $? != 0;
    sbozyp_die("successfully built $pkg->{PKGNAME} but couldn't determine the path of the created Slackware package") if !defined $slackware_pkg;
    return $slackware_pkg;
}

sub built_slackware_pkg {
    my ($pkg) = @_;
    my $output = $CONFIG{TMPDIR};
    return [ glob "$output/$pkg->{PRGNAM}*$pkg->{VERSION}*_SBo*" ]->[0];
}

sub install_slackware_pkg {
    my ($slackware_pkg) = @_;
    sbozyp_system('upgradepkg', '--reinstall', '--install-new', $slackware_pkg);
}

sub remove_slackware_pkg {
    my ($slackware_pkg) = @_;
    sbozyp_system('removepkg', $slackware_pkg);
}

            ####################################################
            #               REPOSITORY MANAGEMENT              #
            ####################################################

sub set_repo_name_or_die {



( run in 2.010 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )