App-sbozyp
view release on metacpan or search on metacpan
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 )