cea7504964
When doing repeated testing, the mirrorsort can add unwanted delay. This commit adds support for setting EQUO_MIRRORSORT=0 to disable this and use the default sort order while testing. It preserves the previous behaviour and defaults to 1.
233 lines
7.4 KiB
Perl
Executable File
233 lines
7.4 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
|
|
use Getopt::Long;
|
|
|
|
my $profile = $ENV{BUILDER_PROFILE} // 3;
|
|
my $jobs = $ENV{BUILDER_JOBS} // 1;
|
|
my $use_equo = $ENV{USE_EQUO} // 1;
|
|
my $preserved_rebuild = $ENV{PRESERVED_REBUILD} // 0;
|
|
my $emerge_defaults_args = $ENV{EMERGE_DEFAULTS_ARGS}
|
|
// "--accept-properties=-interactive --verbose --oneshot --complete-graph --buildpkg";
|
|
$ENV{FEATURES} = $ENV{FEATURES}
|
|
// "parallel-fetch protect-owned compressdebug splitdebug -userpriv";
|
|
|
|
my $equo_install_atoms = $ENV{EQUO_INSTALL_ATOMS} // 1;
|
|
my $equo_install_version = $ENV{EQUO_INSTALL_VERSION} // 0;
|
|
my $equo_split_install = $ENV{EQUO_SPLIT_INSTALL} // 0;
|
|
my $equo_mirrorsort = $ENV{EQUO_MIRRORSORT} // 1;
|
|
my $entropy_repository = $ENV{ENTROPY_REPOSITORY} // "main"; # Can be weekly, main, testing
|
|
my $artifacts_folder = $ENV{ARTIFACTS_DIR};
|
|
|
|
my $make_conf = $ENV{MAKE_CONF};
|
|
|
|
my @overlays;
|
|
|
|
GetOptions( 'layman|overlay:s{,}' => \@overlays, 'equo|install:s{,}' => \@equo_install,'equorm|remove:s{,}' => \@equo_remove );
|
|
|
|
if ( @ARGV == 0 ) {
|
|
help();
|
|
die();
|
|
}
|
|
|
|
$ENV{LC_ALL} = "en_US.UTF-8"; #here be dragons
|
|
|
|
# A barely print replacement
|
|
sub say { print join( "\n", @_ ) . "\n"; }
|
|
|
|
# Input: package, depth, and atom. Package: sys-fs/foobarfs, Depth: 1 (depth of the package tree) , Atom: 1/0 (enable disable atom output)
|
|
sub package_deps {
|
|
my $package = shift;
|
|
my $depth = shift // 1; # defaults to 1 level of depthness of the tree
|
|
my $atom = shift // 0;
|
|
return
|
|
map { $_ =~ s/\[.*\]|\s//g; &atom($_) if $atom; $_ }
|
|
qx/equery -C -q g --depth=$depth $package/; #depth=0 it's all
|
|
}
|
|
|
|
#Input: nothing
|
|
#Output: returns all available packages across all the repository installed in the machine
|
|
sub available_packages {
|
|
my @packages;
|
|
my @repos = qx|equo repo list -q|;
|
|
chomp(@repos);
|
|
push( @packages, qx|equo q list available -q $_| ) for @repos;
|
|
chomp(@packages);
|
|
return @packages;
|
|
}
|
|
|
|
# Input: package (sys-fs/foobarfs)
|
|
# Output: Array of packages to be installed, that aren't installed in a Sabayon machine
|
|
sub calculate_missing {
|
|
my $package = shift;
|
|
my $depth = shift;
|
|
|
|
# Getting the package dependencies and the installed packages
|
|
say "[$package] Getting the package dependencies and the installed packages";
|
|
my @Packages = package_deps( $package, $depth, 1 );
|
|
my @Installed_Packages = qx/equo q --quiet list installed/;
|
|
chomp(@Installed_Packages);
|
|
say "[$package] Getting the package dependencies and the installed packages";
|
|
|
|
#taking only the 4th column of output as key of the hashmap
|
|
my %installed_packs =
|
|
map { ( split( /\s/, $_ ) )[3] => 1 } @Installed_Packages;
|
|
my %available_packs = map { $_ => 1 } available_packages();
|
|
|
|
# removing from packages the one that are already installed and keeping only the available in the entropy repositories
|
|
my @to_install = grep( defined $available_packs{$_},
|
|
uniq( grep( !defined $installed_packs{$_}, @Packages ) ) );
|
|
@to_install=grep { length } @to_install;
|
|
say "[$package] packages that will be installed with equo: @to_install" if @to_install>0;
|
|
|
|
return @to_install;
|
|
}
|
|
|
|
# Input : complete gentoo package (sys-fs/foobarfs-1.9.2)
|
|
# Output: atom form (sys-fs/foobarfs)
|
|
sub atom { s/-[0-9]{1,}.*$//; }
|
|
|
|
# Input: Array
|
|
# Output: array with unique elements
|
|
sub uniq {
|
|
keys %{ { map { $_ => 1 } @_ } };
|
|
}
|
|
|
|
sub help {
|
|
say "-> You should feed me with something", "", "Examples:", "",
|
|
"\t$0 app-text/tree", "\t$0 plasma-meta --layman kde", "",
|
|
"\t$0 app-foo/foobar --equo foo-misc/foobar --equo net-foo/foobar --layman foo --layman bar foo",
|
|
"**************************", "",
|
|
"You can supply multiple overlays as well: $0 plasma-meta --layman kde plab",
|
|
"";
|
|
}
|
|
|
|
say
|
|
"************* IF YOU WANT TO SUPPLY ADDITIONAL ARGS TO EMERGE, pass to docker EMERGE_DEFAULT_OPTS env with your options *************";
|
|
|
|
if ( @overlays > 0 ) {
|
|
say "Overlay(s) to add";
|
|
foreach my $overlay (@overlays) {
|
|
say "\t- $overlay";
|
|
}
|
|
}
|
|
|
|
say "Installing:";
|
|
|
|
say "\t* " . $_ for @ARGV;
|
|
|
|
say "* Syncing stuff for you, if it's the first time, can take a while";
|
|
|
|
# Syncronizing portage configuration and adding overlays
|
|
system("echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen"); #be sure about that.
|
|
system(
|
|
"cd /etc/portage/;git checkout master; git stash; git pull"
|
|
);
|
|
|
|
if (`uname -m` eq "x86_64\n"){
|
|
system(
|
|
"cd /etc/portage/;rm -rfv make.conf;ln -s make.conf.amd64 make.conf"
|
|
);
|
|
}
|
|
|
|
system("echo 'y' | layman -f -a $_") for @overlays;
|
|
|
|
my $reponame = "LocalOverlay";
|
|
|
|
# Setting up a local overlay if doesn't exists
|
|
if ( !-f "/usr/local/portage/profiles/repo_name" ) {
|
|
system("mkdir -p /usr/local/portage/{metadata,profiles}");
|
|
system("echo 'LocalOverlay' > /usr/local/portage/profiles/repo_name");
|
|
system("echo 'masters = gentoo' > /usr/local/portage/metadata/layout.conf");
|
|
system("chown -R portage:portage /usr/local/portage");
|
|
}
|
|
else {
|
|
open FILE, "</usr/local/portage/profiles/repo_name";
|
|
my @FILE = <FILE>;
|
|
close FILE;
|
|
chomp(@FILE);
|
|
$reponame = $FILE[0];
|
|
}
|
|
|
|
qx{
|
|
echo '[$reponame]
|
|
location = /usr/local/portage
|
|
masters = gentoo
|
|
priority=9999
|
|
auto-sync = no' > /etc/portage/repos.conf/local.conf
|
|
}; # Declaring the repo and giving priority
|
|
|
|
system("mkdir -p /usr/portage/distfiles/git3-src");
|
|
|
|
# sync portage and overlays
|
|
system("layman -S;emerge --sync");
|
|
|
|
# preparing for MOAR automation
|
|
qx|eselect profile set $profile|;
|
|
qx{ls /usr/portage/licenses -1 | xargs -0 > /etc/entropy/packages/license.accept}
|
|
; #HAHA
|
|
|
|
if ($use_equo && $entropy_repository eq "weekly" ) {
|
|
qx|equo repo disable sabayonlinux.org|;
|
|
qx|equo repo enable sabayon-weekly|;
|
|
} elsif( $use_equo && $entropy_repository eq "testing") {
|
|
qx|equo repo disable sabayon-weekly|;
|
|
qx|equo repo enable sabayonlinux.org|;
|
|
qx|equo repo enable sabayon-limbo|;
|
|
}
|
|
|
|
if ($use_equo) {
|
|
system("equo repo mirrorsort sabayonlinux.org") if $equo_mirrorsort;
|
|
system("equo up && equo u")
|
|
}
|
|
|
|
system("cp -rf $make_conf /etc/portage/make.conf") if $make_conf;
|
|
|
|
qx|echo 'ACCEPT_LICENSE="*"' >> /etc/portage/make.conf|; #just plain evil
|
|
|
|
my @packages = @ARGV;
|
|
|
|
if ($use_equo) {
|
|
my @packages_deps;
|
|
foreach my $p (@packages) {
|
|
say "[$p] Getting the package dependencies which aren't already installed on the system.. ";
|
|
push( @packages_deps, calculate_missing( $p , 2) )
|
|
if $equo_install_atoms;
|
|
push( @packages_deps, package_deps( $p, 2, 0 ) )
|
|
if $equo_install_version;
|
|
say "[$p] Done"
|
|
}
|
|
@packages_deps = grep { defined() and length() } @packages_deps; #cleaning
|
|
say "", "[install] Installing missing dependencies with equo", @packages_deps, "";
|
|
if ($equo_split_install) {
|
|
system("equo i --bdeps $_") for (@packages_deps,@equo_install);
|
|
if (@equo_remove > 0){
|
|
system("equo rm --nodeps $_") for (@equo_remove);
|
|
}
|
|
}
|
|
else {
|
|
system("equo i --bdeps @packages_deps @equo_install");
|
|
if (@equo_remove > 0){
|
|
system("equo rm --nodeps @equo_remove");
|
|
}
|
|
}
|
|
}
|
|
|
|
say "* Ready to compile, finger crossed";
|
|
|
|
my $rt = system("emerge $emerge_defaults_args -j $jobs @packages");
|
|
|
|
my $return = $rt >> 8;
|
|
|
|
if ($preserved_rebuild) {
|
|
|
|
system("emerge -j $jobs --buildpkg \@preserved-rebuild");
|
|
|
|
}
|
|
|
|
# Copy files to artifacts folder
|
|
system(
|
|
"mkdir -p $artifacts_folder;cp -rfv /usr/portage/packages $artifacts_folder"
|
|
) if ( $artifacts_folder and !$return );
|
|
|
|
exit($return);
|