Compare commits

...

87 Commits

Author SHA1 Message Date
Sławomir Nizio 12e2ccd510 git-hooks: new scripts 2017-05-23 21:01:01 +02:00
Ettore Di Giacinto b91870c72d sabayon-buildpackages: add support for DETECT_OBSOLETE and TARGET_OVERLAY 2017-05-21 14:16:04 +02:00
Ettore Di Giacinto b1726fdb4d builder: add DETECT_OBSOLETE 2017-05-21 14:13:59 +02:00
Ettore Di Giacinto 6d0f26ceb7 sabayon-detectobsolete: more perlish 2017-03-29 14:46:34 +02:00
Ettore Di Giacinto 49ba945b63 builder: running emerge -C anyway 2017-03-29 14:19:39 +02:00
Ettore Di Giacinto f55338b552 sabayon-detectobsolete: utility to list possible obsolete packages in overlays 2017-03-29 14:19:39 +02:00
Ettore Di Giacinto 0c964e4b64 builder: PRETEND changes
move up the adjustment of emerge/equo arguments, avoid to copy artifacts when PRETEND mode is on
2017-03-22 14:40:27 +01:00
Ettore Di Giacinto 5f75f6e64b builder: do not emerge preserved rebuild if PRETEND is set 2017-03-20 11:19:17 +01:00
Ettore Di Giacinto 9fd7ce2582 builder: PRETEND avoids also package removals. 2017-03-20 11:17:59 +01:00
Ettore Di Giacinto a62baaf0ea builder: PRETEND, add -p to equo/emerge arguments 2017-03-19 11:50:09 +01:00
Ettore Di Giacinto bf78080418 Revert "builder: add PRETEND environment variable"
This reverts commit 575ec04147.
2017-03-18 13:54:12 +01:00
Ettore Di Giacinto 218dfa9dcd sabayon-buildpackages: add PRETEND support 2017-03-15 14:12:12 +01:00
Ettore Di Giacinto 575ec04147 builder: add PRETEND environment variable 2017-03-15 11:50:41 +01:00
Ben Roberts 903aa0fa0d add SYS_PTRACE capability to docker build, to prevent sandbox ptrace errors 2016-11-02 11:21:03 +00:00
Ettore Di Giacinto ada5793612 sabayondevkit-functions: set -e and make non-fatal commands return always true 2016-11-02 12:11:47 +01:00
Ettore Di Giacinto af32293577 fix syntax errors 2016-10-27 01:42:26 +02:00
Ben Roberts 411c142f00 Fixup perlisms 2016-10-24 10:48:36 +01:00
Ben Roberts 9446715e1a Attempt to only add/remove enman repos that need action
Since enman was changed to provide exit status 1 [1] if the requested
operation failed, builder attempting to re-add an already existing repo
caused the entire build to fail. Rather than run the command and hope
for the best, this commit changes builder to obtain a list of already
installed repositories, and only add/remove the requested repos that
aren't already in the correct state.

[1] Sabayon/enman@7f3a6c88
2016-10-24 09:16:35 +01:00
Ettore Di Giacinto 890206ba80 sabayondevkit-functions.sh: add -u as default emerge option to build_category_installed and build_obsolete 2016-10-11 14:48:01 +02:00
mudler 79567a647b sabayon-maint-helper: acquire lock before execution 2016-10-10 16:44:47 +02:00
Ettore Di Giacinto 0769169cc6 sabayondevkit-functions.sh: fix typo 2016-10-10 14:14:07 +02:00
mudler 03b7b4fd18 sabayon-maint-helper: fixes 2016-10-10 12:06:56 +02:00
mudler 39f437f0aa adding sabayon-maint-helper 2016-10-10 12:01:33 +02:00
Ben Roberts 4747e43752 Enable RSS feeds and changelogs on repos 2016-10-02 18:36:46 +01:00
Ettore Di Giacinto 2d1c16e76e builder: EQUO_SPLIT_INSTALL default is now 0 2016-09-22 00:05:52 +02:00
Ben Roberts 4dbbc6b34a Strip out package itself from package_deps
Package_deps returned the target package in the output which is not
strictly true (the package is not a dependency of itself really).
In calcuate_missing also means we install the package once using entropy
(if available), and then immediately replace it with portage,
which just wastes effort.

It breaks installation in the cases where the older equo version blocks the
new portage version (e.g. change of slot).

This should remove the target package from the list of packages to be
installed with entropy.
2016-09-13 22:08:43 +01:00
Ettore Di Giacinto 36999309c2 builder: adding checks to fix a broken layman configuration 2016-09-13 10:06:05 +02:00
Ettore Di Giacinto 1ef3938a96 builder: enhance debug of profile setting 2016-09-12 13:17:29 +02:00
Ben Roberts 9119c8c973 Merge branch 'prune_virtual_fixes' 2016-09-11 17:41:08 +01:00
Ben Roberts 632053fc2f Print the builder docker commandline to aid in debugging 2016-09-11 17:19:11 +01:00
Ben Roberts 6fc14f7605 Expose /vagrant from the buildbox into the docker container to aid in debugging 2016-09-11 17:18:49 +01:00
Ben Roberts 4268b06305 Fix virtual pruning by switching from state to global variable for package_deps cache 2016-09-11 17:18:20 +01:00
mudler a66dc7bb23 builder: added check for missing DEPEND/RDEPEND in QA phase 2016-09-10 15:00:09 +02:00
mudler 1c4389a8aa Makefile: cleanup 2016-09-10 14:49:24 +02:00
mudler c2a14afdf9 dynlink-scanner: add original author to the file 2016-09-10 14:42:30 +02:00
mudler 2e7c359b8c add dynlink scanner 2016-09-10 14:41:06 +02:00
mudler e86c134e61 add depcheck 2016-09-10 12:40:45 +02:00
mudler b34388c259 Merge branch 'dev' 2016-08-15 15:13:45 +02:00
mudler a1957a0587 [builder] fixes 2016-08-15 15:12:26 +02:00
mudler fcfb218a17 [builder] turn on split_install by default 2016-08-15 14:56:46 +02:00
mudler bac150a267 [builder] enhancing output 2016-08-15 14:48:18 +02:00
mudler 350e3d1000 [builder] split up into functions 2016-08-13 13:04:45 +02:00
mudler 10ef5244e3 [builder] allow to specify custom use flags per-package in the lists instead of in custom.use
* if emerge_split_install is enabled, then build.targets can contain useflags. (e.g. media-tv/kodi[-avahi] )
* for injected packages, this feature is always on
2016-08-13 12:40:36 +02:00
mudler 4b2cf1141c [sabayon-buildpackages] add support for ETP_NOCACHE 2016-08-04 11:25:21 +02:00
Ettore Di Giacinto 6e3ae4db29 builder: cleanup 2016-07-23 18:33:13 +02:00
Ettore Di Giacinto d3e174eb10 sabayon-buildpackages: add support for REMOTE_PORTDIR and REMOTE_CONF_PORTDIR 2016-07-23 18:30:43 +02:00
Ettore Di Giacinto 4c4279e707 builder: add support for remote portdir and portage configurations 2016-07-23 18:30:03 +02:00
mudler 0e33e0d75f builder: enable more verbosity to debug QA_CHECKS 2016-07-21 10:23:16 +02:00
mudler cd19f3b85b [builder] add equo args (multifetch && co.) 2016-07-21 10:20:06 +02:00
Ettore Di Giacinto b899a21852 [sabayon-buildpackages] support mounting of /etc/portage/env 2016-07-18 22:36:00 +02:00
Ettore Di Giacinto c9ad172bd4 [sabayon-buildpackages] mount packages.env instead populating packages.env/ 2016-07-18 22:26:33 +02:00
Ettore Di Giacinto cdac817e59 sabayondevkit-functions: trying softly to start docker daemon 2016-07-16 15:36:57 +02:00
Ettore Di Giacinto b33b4aa619 [builder] print qa checks if we are doing et 2016-07-16 10:27:54 +02:00
mudler c8cd58df4b [builder, sabayon-buildpackages] add QA_CHECKS env variable 2016-07-08 00:28:18 +02:00
Ettore Di Giacinto 44d7510792 [builder] removing append to make.conf, now the env variable is set and working also on the entropy side 2016-07-03 14:48:44 +02:00
Ettore Di Giacinto c7891958ea [functions] add --noreplace to default args 2016-05-28 12:56:52 +02:00
mudler c8a1ece37c [functions] build() and build_installed() echoing packages being installed 2016-05-28 12:33:09 +02:00
Ettore Di Giacinto fb745c8ed8 [builder] use ACCEPT_LICENSE with wildcard since Entropy 302 2016-05-26 12:17:07 +02:00
mudler 36fc5a6656 [sabayon-buildpackages] adding support for REMOVE_REMOTE_OVERLAY REMOVE_LAYMAN_OVERLAY 2016-05-17 19:31:52 +02:00
mudler a65f1acdca [builder] add support for REMOVE_REMOTE_OVERLAY and REMOVE_LAYMAN_OVERLAY 2016-05-17 19:30:40 +02:00
mudler 02fd49a321 [builder] better output for logs 2016-05-17 19:23:27 +02:00
mudler 868dfb767d [builder] clone user defined local_portage only if dir exists 2016-05-17 19:20:20 +02:00
mudler 5855d12d75 [builder] allow to pass to remote overlay the name and the sync-type 2016-05-17 19:18:24 +02:00
mudler 44aa54b031 [builder] removing dots from repository name 2016-05-16 11:12:02 +02:00
mudler 6bcf4abfee [builder] changing namespace allocation 2016-05-16 00:18:34 +02:00
mudler 31d3bca34b [builder] guessing sync_type from url 2016-05-13 22:45:30 +02:00
mudler 869f6a4363 [builder] url must be given in absolute form 2016-05-13 22:12:21 +02:00
mudler 3709d50006 [builder] default masters = gentoo https://github.com/Sabayon/community-buildspec/issues/9 2016-05-13 21:59:05 +02:00
mudler 939acad797 [builder] fixes and enhancement to add_portage_repository() https://github.com/Sabayon/community-buildspec/issues/9 2016-05-13 21:56:09 +02:00
mudler d9042cc4b5 [sabayon-buildpackages] TEMPDIR now is useless https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 12:16:30 +02:00
mudler 64d7085cb6 [builder/sabayon-buildpackages] passing REMOTE_OVERLAY to builder and adding repos as listed https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 12:09:44 +02:00
mudler 795aab5d24 [builder] don't re-add the repository if already there, sync instead. name of overlay now will be in the form namespace-name https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 12:04:34 +02:00
mudler b57f8905fe [builder] adding add_portage_repository() https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 11:58:14 +02:00
mudler 93a1093560 [builder] set ETP_NONINTERACTIVE to 1 2016-05-11 10:43:30 +02:00
mudler 84e62c332b [builder/buildpackages] adding EMERGE_REMOVE env 2016-05-10 11:40:08 +02:00
mudler 4430495086 [builder] printing what package we are compiling 2016-05-09 10:25:02 +02:00
mudler 70a7542692 [builder] remove workaround no longer needed 2016-05-03 23:55:27 +02:00
Ettore Di Giacinto 8aed3a00fa [builder] ENMAN_ADD_SELF defaults to 0 2016-05-03 10:47:29 +02:00
mudler 35f27e7b3b [builder/buildpackages] adding REMOVE_ENMAN_REPOSITORIES 2016-05-02 14:11:50 +02:00
Ettore Di Giacinto 6b1d8377b6 Update README.md 2016-04-30 14:33:34 +02:00
mudler db91098e92 [sabayon-createrepo-*] fixup typo 2016-04-22 17:42:35 +02:00
mudler 6fcccf99b8 [builder] do not check if string is contained in append_to_file if doesn't exists 2016-04-22 11:13:34 +02:00
mudler 67781838d3 [builder/sabayon-buildpackages] safe copy /usr/local/portage 2016-04-21 22:01:22 +02:00
mudler 69d8e28ac1 [builder] fixing permissions on local overlay 2016-04-21 21:52:41 +02:00
mudler b491ffccae [builder] check if the content is already there before appending content to file 2016-04-21 21:30:09 +02:00
mudler 066fb07d72 [builder] typo fixes 2016-04-17 19:47:01 +02:00
mudler c89721ab2e [builder] dropping equo (un)mask call, writing directly to packages.(un)mask files 2016-04-16 16:20:28 +02:00
15 changed files with 1056 additions and 133 deletions
+4
View File
@@ -25,4 +25,8 @@ install:
install -m 0755 builder $(DESTDIR)/$(USBINDIR)/
install -d $(DESTDIR)/$(UBINDIR)
install -m 0755 depcheck $(DESTDIR)/$(UBINDIR)/
install -m 0755 dynlink-scanner $(DESTDIR)/$(UBINDIR)/
gcc try_dlopen.c -o try_dlopen -ldl
install -m 0755 try_dlopen $(DESTDIR)/$(UBINDIR)/
install -m 0755 sabayon-* $(DESTDIR)/$(UBINDIR)/
+3 -1
View File
@@ -11,7 +11,7 @@ sudo equo i sabayon-devkit
## Prerequisites
* docker installed in the machine (`sudo equo i docker`), and the daemon started (`sudo systemctl start docker`)
* if you don't want to run that as root, the user where are you running the script must be in the docker group (`sudo gpasswd -a $USER docker`)
* if you don't want to run that as root, the user where are you running the script must be in the docker group (`sudo gpasswd -a $USER docker`), or granting permission to yourself adding your user to the sudoer file.
Packages can be built in a clean environment with docker by running `sabayon-buildpackages`.
@@ -92,6 +92,8 @@ you can override the Architecture folder in which files are placed specifying in
- DOCKER_PULL_IMAGE -- tells the script to update the docker image before compiling, enable it with 1, disable with 0
- OUTPUT_DIR -- optional, default to "portage_artifacts" in your current working directory, it is the path where emerge generated tbz2 are stored (absolute path)
- LOCAL_OVERLAY -- optional, you can specify the path to your local overlay (absolute path)
- REMOTE_OVERLAY -- optional, a space separated list of overlays that can be cloned with git.
The arguments are the packages that you want compile, they can be also in the complete form *e.g. =foo-bar/misc-1.2*
+331 -82
View File
@@ -9,28 +9,40 @@ 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";
// "--accept-properties=-interactive --verbose --oneshot --complete-graph --buildpkg";
$ENV{FEATURES} = $ENV{FEATURES}
// "parallel-fetch protect-owned compressdebug splitdebug -userpriv";
// "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 $dep_scan_depth = $ENV{DEPENDENCY_SCAN_DEPTH} // 2;
my $skip_portage_sync = $ENV{SKIP_PORTAGE_SYNC} // 0;
my $emerge_split_install = $ENV{EMERGE_SPLIT_INSTALL} // 0;
my $webrsync = $ENV{WEBRSYNC} // 0;
my $enman_repositories = $ENV{ENMAN_REPOSITORIES};
my $prune_virtuals = $ENV{PRUNE_VIRTUALS} // 0;
my $repository_name = $ENV{REPOSITORY_NAME};
my $enman_add_self = $ENV{ENMAN_ADD_SELF} // 1;
my $build_injected_args = $ENV{BUILD_INJECTED_ARGS};
my $equo_masks = $ENV{EQUO_MASKS};
my $equo_unmasks = $ENV{EQUO_UNMASKS};
// "main"; # Can be weekly, main, testing
my $artifacts_folder = $ENV{ARTIFACTS_DIR};
my $dep_scan_depth = $ENV{DEPENDENCY_SCAN_DEPTH} // 2;
my $skip_portage_sync = $ENV{SKIP_PORTAGE_SYNC} // 0;
my $emerge_split_install = $ENV{EMERGE_SPLIT_INSTALL} // 0;
my $webrsync = $ENV{WEBRSYNC} // 0;
my $enman_repositories = $ENV{ENMAN_REPOSITORIES};
my $emerge_remove = $ENV{EMERGE_REMOVE};
my $remove_enman_repositories = $ENV{REMOVE_ENMAN_REPOSITORIES};
my $remove_remote_overlay = $ENV{REMOVE_REMOTE_OVERLAY};
my $remove_layman_overlay = $ENV{REMOVE_LAYMAN_OVERLAY};
my $prune_virtuals = $ENV{PRUNE_VIRTUALS} // 0;
my $repository_name = $ENV{REPOSITORY_NAME};
my $enman_add_self = $ENV{ENMAN_ADD_SELF} // 0;
my $build_injected_args = $ENV{BUILD_INJECTED_ARGS};
my $equo_masks = $ENV{EQUO_MASKS};
my $equo_unmasks = $ENV{EQUO_UNMASKS};
my $equo_install_args = $ENV{EQUO_INSTALL_ARGS} // "--multifetch=10";
my $remote_overlay = $ENV{REMOTE_OVERLAY};
my $qualityassurance_checks = $ENV{QA_CHECKS} // 0;
my $remote_conf_portdir = $ENV{REMOTE_CONF_PORTDIR};
my $remote_portdir = $ENV{REMOTE_PORTDIR};
my $pretend = $ENV{PRETEND} // 0;
my $obsoleted = $ENV{DETECT_OBSOLETE} // 0;
my $target_overlay = $ENV{TARGET_OVERLAY};
my $make_conf = $ENV{MAKE_CONF};
@@ -45,7 +57,9 @@ GetOptions(
help() if $help;
$ENV{LC_ALL} = "en_US.UTF-8"; #here be dragons
$ENV{LC_ALL} = "en_US.UTF-8"; #here be dragons
$ENV{ETP_NONINTERACTIVE} = 1;
$ENV{ACCEPT_LICENSE} = "*"; # we can use wildcard since entropy 302
# A barely print replacement
sub say { print join( "\n", @_ ) . "\n"; }
@@ -57,19 +71,74 @@ sub safe_call {
exit($return) if ($rt);
}
sub append_to_file {
my ( $file_name, $package ) = @_;
if ( -f $file_name ) {
# Check that the package was not already there
open my $fh_ro, '<:encoding(UTF-8)', $file_name
or die("Cannot open: $file_name");
while ( my $line = <$fh_ro> ) {
return if $line eq $package . "\n";
}
close $fh_ro;
}
open( my $fh_a, '>>', $file_name )
or die "Could not open file '$filename' $!";
print $fh_a $package . "\n";
close $fh_a;
}
sub add_portage_repository {
my $repo = $_[0];
my $reponame;
my $sync_type;
my @repodef = split( /\|/, $repo );
( $reponame, $repo ) = @repodef if ( @repodef == 2 );
( $reponame, $sync_type, $repo ) = @repodef if ( @repodef == 3 );
# try to detect sync-type
if ( !$sync_type ) {
$sync_type = ( split( /\:/, $repo ) )[0];
$sync_type = "git"
if $repo =~ /github|bitbucket/
or $sync_type eq "https"
or $sync_type eq "http";
$sync_type = "svn" if $repo =~ /\/svn\//;
}
$reponame = ( split( /\//, $repo ) )[-1] if !$reponame;
$reponame =~ s/\.|//g; #clean
system("mkdir -p /etc/portage/repos.conf/")
if ( !-d "/etc/portage/repos.conf/" );
say "==== Adding $reponame ====";
qx{
echo '[$reponame]
location = /usr/local/overlay/$reponame
sync-type = $sync_type
sync-uri = $repo
auto-sync = yes' > /etc/portage/repos.conf/$reponame.conf
}; # Declaring the repo and giving priority
system("emaint sync -r $reponame");
}
# Input: package, depth, and atom. Package: sys-fs/foobarfs, Depth: 1 (depth of the package tree) , Atom: 1/0 (enable disable atom output)
my %package_dep_cache;
sub package_deps {
my $package = shift;
my $depth = shift // 1; # defaults to 1 level of depthness of the tree
my $depth = shift // 1; # defaults to 1 level of depthness of the tree
my $atom = shift // 0;
# Since we expect this sub to be called multiple times with the same arguments, cache the results
state %cache;
$cache_key = "${package}:${depth}:${atom}";
if ( !exists $cache{$cache_key} ) {
@dependencies =
qx/equery -C -q g --depth=$depth $package/; #depth=0 it's all
if ( !exists $package_dep_cache{$cache_key} ) {
my @dependencies =
qx/equery -C -q g --depth=$depth $package/; #depth=0 it's all
chomp @dependencies;
# If an unversioned atom is given, equery returns results for all versions in the portage tree
@@ -78,15 +147,15 @@ sub package_deps {
# accurate results, pass in a versioned atom.
@dependencies = uniq(
sort
grep { $_ }
map { $_ =~ s/\[.*\]|\s//g; &atom($_) if $atom; $_ }
@dependencies
grep {$_}
map { $_ =~ s/\[.*\]|\s//g; &atom($_) if $atom; $_ }
@dependencies
);
$cache{$cache_key} = \@dependencies;
$package_dep_cache{$cache_key} = \@dependencies;
}
return @{ $cache{$cache_key} };
return @{ $package_dep_cache{$cache_key} };
}
#Input: nothing
@@ -113,33 +182,45 @@ sub calculate_missing {
my @dependencies = package_deps( $package, $depth, 1 );
if ($prune_virtuals) {
say "[$package] Pruning dependencies of virtual packages";
my %install_dependencies = map { $_ => 1 } @dependencies;
# Look for any virtuals and remove its immediate dependencies to avoid
# installing multiple conflicting packages one by one
my @virtual_deps;
my @virtual_deps = ();
for my $dep (@dependencies) {
push( @virtual_deps, package_deps( $dep, 1, 1 ) )
if ( $dep =~ /^virtual\// );
if ( $dep =~ /^virtual\// ) {
my @child_deps = package_deps( $dep, 1, 1 );
push( @virtual_deps, @child_deps );
}
}
# Deduplicate the list
@virtual_deps = uniq(@virtual_deps);
# Prune the dependencies of the virtual packages from the dependencies list
for my $dep (@virtual_deps) {
$install_dependencies{$dep} = 0 if ( $dep !~ /^virtual\// );
if ( $dep !~ /^virtual\// ) {
$install_dependencies{$dep} = 0;
}
}
@dependencies = grep { $install_dependencies{$_} } @dependencies;
}
#taking only the 4th column of output as key of the hashmap
my %installed_packs =
map { $_ => 1 } @Installed_Packages;
map { $_ => 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{$_}, @dependencies ) ) );
@to_install = grep { length } @to_install;
@to_install = grep {length} @to_install;
# Strip out the target package from the dependency list
@to_install = grep { to_atom($_) ne to_atom($package) } @to_install;
say "[$package] packages that will be installed with equo: @to_install"
if @to_install > 0;
if @to_install > 0;
return @to_install;
}
@@ -148,20 +229,78 @@ sub calculate_missing {
# Output: atom form (sys-fs/foobarfs)
sub atom { s/-[0-9]{1,}.*$//; }
# Same again as a function
sub to_atom { my $p = shift; $p =~ s/-[0-9]{1,}.*$//; return $p; }
# Input: Array
# Output: array with unique elements
sub uniq {
keys %{ { map { $_ => 1 } @_ } };
}
# Detect useflags defined as [-alsa,avahi] in atom,
# and fill $hash within the $target sub-hash
sub detect_useflags {
my ( $target, $packages ) = @_;
my @packs = @{$packages};
for my $i ( 0 .. $#packs ) {
if ( $packages->[$i] =~ /\[(.*?)\]/ ) {
my $flags = $1;
$packages->[$i] =~ s/\[.*?\]//g;
$per_package_useflags->{$target}->[$i] =
[ +split( /,/, $flags ) ];
}
}
}
sub compile_packs {
my ( $target, @packages ) = @_;
my $extra_arg;
$extra_arg = "-B" if $target eq "injected_targets";
my $package_counter = 0;
my $return;
for my $pack (@packages) {
my $tmp_rt;
say "\n" x 2, "==== Compiling $pack ====", "\n" x 2;
if ( defined $per_package_useflags->{$target}->[$package_counter]
and @{ $per_package_useflags->{$target}->[$package_counter] }
> 0 )
{
say "USEFLAGS: "
. join( " ",
@{ $per_package_useflags->{$target}->[$package_counter] } );
$tmp_rt = system(
"USE=\""
. join(
" ",
@{ $per_package_useflags->{$target}->[$package_counter]
}
)
. "\" emerge $emerge_defaults_args -j $jobs $extra_arg $pack"
);
}
else {
$tmp_rt =
system(
"emerge $emerge_defaults_args -j $jobs $extra_arg $pack");
}
$package_counter++;
$return = $tmp_rt
if ( $? == -1 or $? & 127 or !$rt )
; # if one fails, the build should be considered failed!
}
return $return;
}
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",
"The documentation is available at https://github.com/Sabayon/devkit",
"";
"\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",
"The documentation is available at https://github.com/Sabayon/devkit",
"";
exit 0;
}
@@ -180,25 +319,53 @@ say "\t* " . $_ for @ARGV;
say "[*] Syncing configurations files, Layman and Portage";
if ($pretend) {
say "[*] PRETEND enabled, no real action will be performed.";
say " Bear in mind that in such way the list of packages";
say " that emerge will try to compile will be bigger";
$equo_install_args .= " -p";
$emerge_defaults_args .= " -p";
}
# 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");
# If defined, fetch a remote /etc/portage
if ( $remote_conf_portdir ne "" ) {
system("rm -rf /etc/portage");
system("git clone $remote_conf_portdir /etc/portage");
system("chown -R portage:portage /etc/portage");
system("chmod -R ug+w,a+rX /etc/portage");
}
else {
system("cd /etc/portage/;git checkout master; git stash; git pull");
}
# If defined, fetch a remote /usr/portage
if ( $remote_portdir ne "" ) {
system("rm -rf /usr/portage");
system("git clone $remote_portdir /usr/portage");
system("chown -R portage:portage /usr/portage");
system("chmod -R ug+w,a+rX /usr/portage");
}
system("mkdir /var/lib/layman") if ( !-d "/var/lib/layman" );
system("touch /var/lib/layman/make.conf && layman-updater -R")
if ( !-e "/var/lib/layman/make.conf" );
system("echo 'y' | layman -f -a $_") for @overlays;
my $reponame = "LocalOverlay";
# Setting up a local overlay if doesn't exists
system(
"rm -rf /usr/local/portage;cp -rf /usr/local/local_portage /usr/local/portage"
) if ( -d "/usr/local/local_portage" );
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");
system(
"echo 'masters = gentoo' > /usr/local/portage/metadata/layout.conf");
}
else {
open FILE, "</usr/local/portage/profiles/repo_name";
@@ -207,6 +374,8 @@ else {
chomp(@FILE);
$reponame = $FILE[0];
}
system("chown -R portage:portage /usr/local/portage");
system("chmod -R 755 /usr/local/portage");
qx{
echo '[$reponame]
@@ -216,6 +385,21 @@ priority=9999
auto-sync = no' > /etc/portage/repos.conf/local.conf
}; # Declaring the repo and giving priority
if ( $remote_overlay and $remote_overlay ne "" ) {
add_portage_repository($_) for ( split( / /, $remote_overlay ) );
}
if ( $remove_layman_overlay and $remove_layman_overlay ne "" ) {
say "===== Removing overlays: $remove_remote_overlay =====";
system("layman -d $_") for ( split( / /, $remove_layman_overlay ) );
}
if ( $remove_remote_overlay and $remove_remote_overlay ne "" ) {
say "===== Removing overlays: $remove_remote_overlay =====";
system( "rm -rfv /etc/portage/" . $_ . ".conf" )
for ( split( / /, $remote_overlay ) );
}
system("mkdir -p /usr/portage/distfiles/git3-src");
unless ( $skip_portage_sync == 1 ) {
@@ -231,9 +415,9 @@ unless ( $skip_portage_sync == 1 ) {
}
# preparing for MOAR automation
qx|eselect profile set $profile|;
qx{ls /usr/portage/licenses -1 | xargs -0 > /etc/entropy/packages/license.accept}
; #HAHA
say "Setting new profile to $profile" if defined $profile;
qx|eselect profile set $profile| if defined $profile;
system("eselect profile list") if defined $profile;
if ( $use_equo && $entropy_repository eq "weekly" ) {
qx|equo repo disable sabayonlinux.org|;
@@ -246,33 +430,77 @@ elsif ( $use_equo && $entropy_repository eq "testing" ) {
}
if ($use_equo) {
say "Devkit version:";
system("equo s -vq app-misc/sabayon-devkit");
my $enman_list_output = qx|enman list --installed -q|;
chomp($enman_list_output);
my @installed_enman_repos = split( /\n/, $enman_list_output );
if ( $enman_repositories and $enman_repositories ne "" ) {
my @enman_toadd = split( / /, $enman_repositories );
safe_call("enman add $_") for @enman_toadd;
for my $enman_add (@enman_toadd) {
if ( !grep ( $enman_add, @installed_enman_repos ) ) {
safe_call("enman add $_");
}
}
}
if ( $remove_enman_repositories and $remove_enman_repositories ne "" ) {
my @enman_toremove = split( / /, $remove_enman_repositories );
for my $enman_remove (@enman_toremove) {
if ( grep ( $enman_remove, @installed_enman_repos ) ) {
safe_call("enman remove $_");
}
}
}
system("enman add $repository_name")
if ( $enman_add_self and $repository_name and $repository_name ne "" );
if ($enman_add_self
and $repository_name
and $repository_name ne "" );
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 $per_package_useflags;
my @packages = @ARGV;
my @injected_packages = ();
if ($build_injected_args) {
@injected_packages = split( / /, $build_injected_args );
say "[*] Injected installs:";
my @packages = @ARGV;
say "\t* " . $_ for @injected_packages;
}
# Allow users to specify atoms as: media-tv/kodi[-alsa,avahi]
if ($emerge_split_install)
{ # For targets this will be available only if split_install is enabled
detect_useflags( "targets", \@packages );
}
else {
map { $_ =~ s/\[.*?\]//g; $_; }
@packages
; # Clean up [] if user didn't specified split_install, but specified a useflag combination
}
detect_useflags( "injected_targets", \@injected_packages );
if ($use_equo) {
# best effort mask
if ($equo_masks) {
system("equo mask $_") for ( split( / /, $equo_masks ) );
append_to_file( "/etc/entropy/packages/package.mask", $_ )
for ( split( / /, $equo_masks ) );
}
# best effort unmask
if ($equo_unmasks) {
system("equo unmask $_") for ( split( / /, $equo_unmasks ) );
append_to_file( "/etc/entropy/packages/package.unmask", $_ )
for ( split( / /, $equo_unmasks ) );
}
my @packages_deps;
@@ -281,14 +509,14 @@ if ($use_equo) {
chomp(@Installed_Packages);
my %installed_packs =
map { $_ => 1 } @Installed_Packages;
map { $_ => 1 } @Installed_Packages;
# Remove any already installed packages from the list of entropy packages to install in the build spec
@equo_install = grep { !exists $installed_packs{$_} } @equo_install;
foreach my $p (@packages) {
say
"[$p] Getting the package dependencies which aren't already installed on the system.. ";
"[$p] Getting the package dependencies which aren't already installed on the system.. ";
push(
@packages_deps,
calculate_missing(
@@ -298,43 +526,53 @@ if ($use_equo) {
)
) if $equo_install_atoms;
push( @packages_deps, package_deps( $p, $dep_scan_depth, 0 ) )
if $equo_install_version;
if $equo_install_version;
}
@packages_deps = grep { defined() and length() } @packages_deps; #cleaning
@packages_deps = grep { defined() and length() } @packages_deps; #cleaning
say "", "[install] Those dependencies will be installed with equo :",
@packages_deps, "";
@packages_deps, "";
if ($equo_split_install) {
safe_call("equo i --bdeps $_")
for ( @packages_deps, @equo_install )
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
if ( @equo_remove > 0 ) {
safe_call("equo i $equo_install_args --bdeps $_")
for ( @packages_deps, @equo_install )
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
if ( @equo_remove > 0 and !$pretend ) {
say "Removing with equo: @equo_remove";
system("equo rm --nodeps $_") for (@equo_remove);
}
}
else {
safe_call("equo i --bdeps @packages_deps @equo_install")
if ( @packages_deps > 0 or @equo_install > 0 )
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
safe_call(
"equo i $equo_install_args --bdeps @packages_deps @equo_install")
if ( @packages_deps > 0 or @equo_install > 0 )
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
system("equo rm --nodeps @equo_remove") if ( @equo_remove > 0 );
}
}
if ( $qualityassurance_checks == 1 ) {
say "*** Repoman checks ***";
for ( @packages, @injected_packages ) {
say "*** QA checks for $_";
system(
"pushd \$(dirname \$(equery which $_ 2>/dev/null)); repoman; popd"
);
}
}
say "*** Ready to compile, finger crossed ***";
system("emerge --info")
; #always give detailed information about the building environment, helpful to debug
say "Devkit version:";
system("equo s -vq app-misc/sabayon-devkit");
; #always give detailed information about the building environment, helpful to debug
my $rt;
if ($emerge_split_install) {
for my $pack (@packages) {
my $tmp_rt = system("emerge $emerge_defaults_args -j $jobs $pack");
if ( $emerge_remove and $emerge_remove ne "" ) {
say "Removing with emerge: $emerge_remove";
system("emerge -C $_") for split( / /, $emerge_remove );
}
# $rt=$tmp_rt if ($? == -1 or $? & 127 or !$rt); # if one fails, the build should be considered failed!
}
if ($emerge_split_install) {
compile_packs( "targets", @packages );
$rt = 0; #consider the build good anyway, like a "keep-going"
}
else {
@@ -344,21 +582,32 @@ else {
my $return = $rt >> 8;
# best effort -B
if ($build_injected_args) {
system("emerge $emerge_defaults_args -j $jobs -B $_")
for ( split( / /, $build_injected_args ) );
}
compile_packs( "injected_targets", @injected_packages );
if ($preserved_rebuild) {
if ( $preserved_rebuild and !$pretend ) {
system("emerge -j $jobs --buildpkg \@preserved-rebuild");
system("revdep-rebuild");
}
if ( $qualityassurance_checks == 1 ) {
say "*** Missing dependencies checks ***";
for (@packages) {
say "*** DEPEND for $_";
system("dynlink-scanner $_");
system("depcheck $_");
}
}
if ( $obsoleted and $target_overlay ) {
say "*** Detecting obsoletes ***";
system("sabayon-detectobsolete --overlay ${target_overlay}");
}
# Copy files to artifacts folder
system(
"mkdir -p $artifacts_folder;cp -rfv /usr/portage/packages $artifacts_folder"
) if ( $artifacts_folder and !$return );
) if ( $artifacts_folder and !$return and !$pretend );
exit($return);
+303
View File
@@ -0,0 +1,303 @@
#!/bin/bash
# PODNAME: depcheck
#
# Copyright (c) 2014 Michael Palimaka <kensington@gentoo.org>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# A tool to report both undeclared and potentially-unused runtime dependencies.
#
# Depends on app-misc/pax-utils, app-portage/portage-utils and
# sys-apps/gentoo-functions.
DEBUG=FALSE
IGNORE_DEPS=( "sys-libs/glibc" "sys-devel/gcc" )
IGNORE_LINKS=( "/lib64/libgcc_s.so.1" )
PKG_DIR="/var/db/pkg/"
. /lib/gentoo/functions.sh
bold() {
echo $@
return
local bold=$(tput bold)
local normal=$(tput sgr0)
echo "${bold}${@}${normal}"
}
debug() {
if [ $DEBUG = TRUE ]; then
# write to stderr so as not to interfere with function returns
echo "$@" 1>&2
fi
}
# app-foo/bar-1.2.3-r1 -> app-foo/bar
remove_atom_version() {
local atom=`qatom "${1}" | cut -d " " -f 1-2 | tr " " /`
echo $atom
}
virtualcheck() {
debug Checking if ${libowner_pn} is provided by a virtual
for virtual in $(qdepends --nocolor --name-only --${1} --query ${libowner_pn} | grep ^virtual/)
do
debug Checking if ${virtual} is in dependencies
local isvirtualdep=$(qdepends --${1} ${atom} | grep ${virtual})
if [ $? -eq 0 ]; then
used_virtuals+=( ${virtual} )
continue 2
fi
done
if [ "${1}" = "depend" ]; then
eerror "${obj} links to ${link}"
fi
eindent
eerror Missing ${1^^} on $(bold ${libowner_pn})
eoutdent
errors=1
}
check_atom() {
local errors=0
local atom=$1
local checked=()
local rdepends=()
local used_virtuals=()
local objects=`qlist -qo ${atom}`
if [ ! "${objects}" ]; then
einfo ${atom} does not have any objects installed, skipping...
echo
return
fi
if [ -z "${INSIDE_PORTAGE}" ]; then
einfo Checking ${atom} for undeclared dependencies
eindent
fi
local obj
for obj in $objects
do
debug "Checking ${obj}"
readelf -h ${obj} > /dev/null 2>&1
# can it have stuff linked to it?
if [ $? -ne 0 ]; then
debug "It can't have links, skipping"
continue
fi
local elf=`scanelf --format "#f%n" --nobanner --use-ldpath ${obj} 2>&1`
local links=`echo ${elf} | tr "," " "`
# get a list of everything that it's linked to
local link
for link in $links
do
local ignore
for ignore in "${IGNORE_LINKS[@]}"; do
if [ "${ignore}" = "${link}" ]; then
debug "Ignoring ${link} due to blacklist"
continue 2
fi
done
# only check a library once per atom for performance reasons
local check
for check in "${checked[@]}"; do
if [ "${check}" = "${link}" ]; then
debug "Already checked ${link} for this atom, skipping"
continue 2
fi
done
checked=( "${checked[@]}" "${link}" )
debug "Found ${link}"
local libowner=`qfile -vqC ${link} | uniq`
if [ ! "${libowner}" ]; then
ewarn "Warning: installed file ${obj} is linked to ${link} which is not owned by any installed atom."
continue
fi
debug "Owning package for ${link} is ${libowner}"
local libowner_pn=$(remove_atom_version ${libowner})
local my_pn=$(remove_atom_version ${atom})
rdepends+=( "${libowner_pn}" )
if [ "${libowner_pn}" = "${my_pn}" ]; then
debug "Owning package is self, ignoring"
continue
fi
local ignorelib
for ignorelib in "${IGNORE_DEPS[@]}"
do
if [ "${libowner_pn}" = "${ignorelib}" ]; then
debug "Ignoring objects belonging to ${ignorelib}"
continue 2
fi
done
debug "Checking if ${libowner_pn} is in the [R]DEPEND list of ${atom}"
local isdep
isdep=`qdepends -d ${atom} | grep ${libowner_pn}`
if [ $? -ne 0 ]; then
virtualcheck depend
fi
local isrdep
isrdep=`qdepends -r ${atom} | grep ${libowner_pn}`
if [ $? -ne 0 ]; then
virtualcheck rdepend
fi
done
done
local ebuild_rdepends=()
for rdepend in $(qdepends --nocolor --quiet --rdepend ${atom} | sed -e "s/\[[^]]*\]//g" | cut -d : -f 2-)
do
if [[ ${rdepend} = !* ]] ; then
debug Skipping blocker: ${rdepend}
continue
elif [[ ${rdepend} = virtual/* ]] ; then
for virtual in "${used_virtuals[@]}"
do
if [[ ${virtual} == $(remove_atom_version ${rdepend}) ]]; then
debug Skipping virtual: ${rdepend}
continue 2
fi
done
fi
ebuild_rdepends+=( $(remove_atom_version $rdepend) )
done
debug "Ebuild RDEPENDS: ${ebuild_rdepends[@]}"
debug "Linked RDEPENDS: ${rdepends[@]}"
local suspect_rdepends=$(comm -13 <(echo ${rdepends[@]} | sed 's/ /\n/g' | sort -u) <(echo ${ebuild_rdepends[@]} | sed 's/ /\n/g' | sort -u))
if [ "${suspect_rdepends}" ]; then
ewarn "Suspect RDEPEND: $(bold ${suspect_rdepends})"
fi
if [ -z "${INSIDE_PORTAGE}" ]; then
eoutdent
if [ -n "${CAT}" ]; then
echo
fi
fi
return $errors
}
check_package() {
local package=$1
local atoms=`qlist -IcCS ${package} | tr ' ' '-' | cut -d : -f1`
debug Package ${package} own atoms: ${atoms}
if [ ! "${atoms}" ]; then
eerror ERROR: ${package} is not a valid atom
exit 1
fi
for atom in ${atoms}; do
check_atom ${atom}
done
}
check_category() {
local errors=0
for package in `ls "${PKG_DIR}/${1}"`; do
check_package "${1}/${package}"
if [ $? -ne 0 ]; then
errors=1
fi
done;
return $errors
}
BINNAME=`basename ${0}`
if [ -z $1 ]; then
echo "Checks emerged package(s) for undeclared depedencies"
echo
echo "Usage: ${BINNAME} [ atom | -c category | -a ]"
echo
echo "Examples:"
echo "Check a single package: ${BINNAME} app-foo/bar-1.2.3"
echo "Check a category: ${BINNAME} -c app-foo"
echo "Check everything: ${BINNAME} -a"
exit 1
fi
# check a particular category
if [ "$1" = "-c" ]; then
CAT=$2
if [ ! -d "${PKG_DIR}/${CAT}" ]; then
eerror ERROR: No packages from the category ${CAT} have been emerged yet
exit 1
fi
check_category $CAT
# check everything
elif [ "$1" = "-a" ]; then
for category in `ls ${PKG_DIR}`; do
check_category $category
done;
else
check_package $1
fi
if [ $DEBUG = TRUE ]; then
if [ $? -eq 0 ]; then
einfo Checking complete, no errors found
else
eerror Checking complete, errors found
fi
fi
+50
View File
@@ -0,0 +1,50 @@
#!/bin/bash
# Maciej Mrozowski <reavertm@gentoo.org>
# Returns colon separated list of linking dependencies
get_link_deps()
{
KEY=
for dep in `scanelf --use-ldpath -yBF '%f %n' "$1"`; do
if [[ -z $KEY ]]; then
KEY="$dep"
continue
fi
echo $dep
done
}
# Print linking deps for given executable or shared object in alphabetical order.
# Also try to dlopen shared objects in order to detect missing/broken dependencies.
if [[ "$1" = --linking-deps ]]; then
# Sanity check, file-5.12 is broken, bail out early
if [[ `file --version | grep --color=never file- | cut -d'-' -f2` == '5.12' ]]; then
echo "file-5.12 is broken, bailing out"
exit 1
fi
mime=`file -b --mime-type "$2"`
if [[ "$mime" == 'application/x-executable' ]] || [[ "${mime}" == 'application/x-sharedlib' ]]; then
LINK=`get_link_deps "$2"`
[[ "$mime" == 'application/x-sharedlib' ]] && /usr/bin/try_dlopen "$2"
[[ -n $LINK ]] && echo -e ${LINK//,/\\n} | sort -u
exit 0
fi
exit 1
fi
[[ -z $* ]] && echo "usage: `basename $0` <package>" && exit 0
# Check whether package is installed
if ! portageq has_version $ROOT/ $1; then
echo "$1 is not installed"
exit 1
fi
# For each installed slot
for cpv in `portageq match $ROOT/ $1`; do
echo "Processing $cpv"
# For each file that belongs to package
# run dynlink-scanner --linking-deps <file> to obtain its linking dependencies
# Assign all linking deps to packages and print package names
qfile -eR $ROOT `portageq contents $ROOT/ $cpv | xargs -r -L 1 "$0" --linking-deps` | cut -f1 -d' ' | sort -u
done
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/env perl
# This code is licenced GPLv2 or newer.
use warnings;
use strict;
use 5.010;
my $g_thres = shift // 3;
sub set_atoms {
my %atoms = ();
my $fh = shift;
while (my $line = <$fh>) {
chomp $line;
my @words = split(' ', $line, 2);
next if $words[0] eq "??"; # allow "dangling" files
my $what = $words[1];
@words = split(m:/:, $what);
my $pkg;
if (@words >= 2) {
$pkg = join("/", @words[0..1]);
} else {
$pkg = $words[0]
}
$atoms{$pkg} = 1;
}
keys %atoms
}
sub num {
my $what = shift;
my @arr = @_;
my $num = 0;
for (@arr) {
$num++ if index($_, "$what-") == 0
}
$num
}
sub replace {
my $atom = shift;
my @arr = @_;
my @new_arr;
for my $item (@arr) {
if( index($item, $atom) == 0 ) {
1;
} else {
push @new_arr, $item;
}
}
push @new_arr, "$atom*";
@new_arr;
}
# try to make (a*, b, c*) from (a-1, a, a-2, b, c, c-1),
# for example, if numberOf(/^a-?/) >= $thres
sub do_reduce {
my $thres = shift;
my @atoms = @_;
my @processed_atoms = @atoms;
for my $atom (@atoms) {
@processed_atoms = replace($atom, @processed_atoms)
if (num($atom, @processed_atoms) >= $thres);
}
@processed_atoms
}
#my @atoms = set_atoms(*DATA);
my @atoms = set_atoms(*STDIN);
@atoms = do_reduce($g_thres, @atoms);
say join ",", sort @atoms;
__DATA__
M net-p2p/transmission-base/metadata.xml
M net-p2p/transmission-cli/metadata.xml
M net-p2p/transmission-daemon/metadata.xml
M net-p2p/transmission-gtk/metadata.xml
M net-p2p/transmission-qt4/metadata.xml
M net-p2p/transmission/metadata.xml
M cat/pkg-1
M cat/pkg-2
M cat/pkg
M net-p2p/nic
?? betr.pl
+20
View File
@@ -0,0 +1,20 @@
#!/bin/sh
# This code is licenced GPLv2 or newer.
# An example hook script to prepare the commit log message.
# Called by "git commit" with the name of the file that has the
# commit message, followed by the description of the commit
# message's source. The hook's purpose is to edit the commit
# message file. If the hook fails with a non-zero status,
# the commit is aborted.
_out=$(git status -s | overlays-commit-msg.pl)
_ver=$(git status -s | sed -rn 's/^[AR] *(.* -> )?.*-([^-]+)\.ebuild$/\2/p' | head -n 1)
_bump=${_ver:+version bump to $_ver}
case $2 in
#message)
# sed -i -e "1s:^:[$_subdir/$_curdir] :" "$1" ;;
"")
sed -i -e "1i[$_out] $_bump" "$1" ;;
esac
+18 -17
View File
@@ -8,8 +8,7 @@ MAKE_CONF="${MAKE_CONF:-$SAB_WORKSPACE/specs/make.conf}"
OUTPUT_DIR="${OUTPUT_DIR:-$SAB_WORKSPACE/portage_artifacts/}"
LOCAL_OVERLAY="${LOCAL_OVERLAY:-$SAB_WORKSPACE/local_overlay}"
ENTROPY_REPOSITORY="${ENTROPY_REPOSITORY:-main}" # Can be weekly, main, testing
DOCKER_OPTS="${DOCKER_OPTS:--ti --rm}"
TEMPDIR=$(mktemp -d)
DOCKER_OPTS="${DOCKER_OPTS:--ti --rm --cap-add=SYS_PTRACE}"
. /sbin/sabayondevkit-functions.sh
@@ -40,6 +39,7 @@ docker_volumes=( -v "$OUTPUT_DIR:/usr/portage/packages" )
[ -z "$EQUO_MIRRORSORT" ] || docker_env+=(-e "EQUO_MIRRORSORT=$EQUO_MIRRORSORT")
[ -z "$WEBRSYNC" ] || docker_env+=(-e "WEBRSYNC=$WEBRSYNC")
[ -z "$ENMAN_REPOSITORIES" ] || docker_env+=(-e "ENMAN_REPOSITORIES=$ENMAN_REPOSITORIES")
[ -z "$REMOVE_ENMAN_REPOSITORIES" ] || docker_env+=(-e "REMOVE_ENMAN_REPOSITORIES=$REMOVE_ENMAN_REPOSITORIES")
[ -z "$DISTFILES" ] || docker_volumes+=(-v "$DISTFILES:/usr/portage/distfiles")
[ -z "$ENTROPY_DOWNLOADED_PACKAGES" ] || docker_volumes+=(-v "$ENTROPY_DOWNLOADED_PACKAGES:/var/lib/entropy/client/packages")
[ -z "$DISTCC_HOSTS" ] || docker_env+=(-e "DISTCC_HOSTS=$DISTCC_HOSTS")
@@ -48,19 +48,18 @@ docker_volumes=( -v "$OUTPUT_DIR:/usr/portage/packages" )
[ -z "$ENMAN_ADD_SELF" ] || docker_env+=(-e "ENMAN_ADD_SELF=$ENMAN_ADD_SELF")
[ -z "$EQUO_MASKS" ] || docker_env+=(-e "EQUO_MASKS=$EQUO_MASKS")
[ -z "$EQUO_UNMASKS" ] || docker_env+=(-e "EQUO_UNMASKS=$EQUO_UNMASKS")
if [ -n "$REMOTE_OVERLAY" ]; then
git clone "$REMOTE_OVERLAY" "$TEMPDIR"
LOCAL_OVERLAY=$TEMPDIR
fi
function cleanup {
rm -rf "$TEMPDIR"
}
trap cleanup EXIT
[ -d "$LOCAL_OVERLAY" ] && docker_volumes+=(-v "$LOCAL_OVERLAY:/usr/local/portage")
[ -z "$EMERGE_REMOVE" ] || docker_env+=(-e "EMERGE_REMOVE=$EMERGE_REMOVE")
[ -z "$REMOTE_OVERLAY" ] || docker_env+=(-e "REMOTE_OVERLAY=$REMOTE_OVERLAY")
[ -z "$REMOVE_LAYMAN_OVERLAY" ] || docker_env+=(-e "REMOVE_LAYMAN_OVERLAY=$REMOVE_LAYMAN_OVERLAY")
[ -z "$REMOVE_REMOTE_OVERLAY" ] || docker_env+=(-e "REMOVE_REMOTE_OVERLAY=$REMOVE_REMOTE_OVERLAY")
[ -z "$QA_CHECKS" ] || docker_env+=(-e "QA_CHECKS=$QA_CHECKS")
[ -z "$REMOTE_CONF_PORTDIR" ] || docker_env+=(-e "REMOTE_CONF_PORTDIR=$REMOTE_CONF_PORTDIR")
[ -z "$REMOTE_PORTDIR" ] || docker_env+=(-e "REMOTE_PORTDIR=$REMOTE_PORTDIR")
[ -z "$ETP_NOCACHE" ] || docker_env+=(-e "ETP_NOCACHE=$ETP_NOCACHE")
[ -z "$PRETEND" ] || docker_env+=(-e "PRETEND=$PRETEND")
[ -z "$DETECT_OBSOLETE" ] || docker_env+=(-e "DETECT_OBSOLETE=$DETECT_OBSOLETE")
[ -z "$TARGET_OVERLAY" ] || docker_env+=(-e "TARGET_OVERLAY=$TARGET_OVERLAY")
[ -d "$LOCAL_OVERLAY" ] && docker_volumes+=(-v "$LOCAL_OVERLAY:/usr/local/local_portage")
if [ -e $MAKE_CONF ]; then
echo "You specified a make.conf. I hope you know what are you doing"
@@ -77,13 +76,15 @@ if [ -d "$SAB_WORKSPACE"/specs ]; then
[ -e "$SAB_WORKSPACE"/specs/custom.mask ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.mask:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.mask/99-custom.mask")
[ -e "$SAB_WORKSPACE"/specs/custom.unmask ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.unmask:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.unmask/99-custom.unmask")
[ -e "$SAB_WORKSPACE"/specs/custom.use ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.use:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.use/99-custom.use")
[ -e "$SAB_WORKSPACE"/specs/custom.env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.env:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.env/99-custom.env")
[ -e "$SAB_WORKSPACE"/specs/custom.env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.env:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.env")
[ -e "$SAB_WORKSPACE"/specs/custom.keywords ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.keywords:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.keywords/99-custom.keywords")
[ -d "$SAB_WORKSPACE"/specs/env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/env/:/opt/sabayon-build/conf/$SAB_ARCH/portage/env/")
[ -d "/vagrant" ] && docker_volumes+=(-v "/vagrant:/vagrant")
fi
echo "Spawning the package builder container for '$@'."
echo ""
#echo "docker run $DOCKER_OPTS ${docker_env[@]} ${docker_volumes[@]} $DOCKER_IMAGE $@"
echo "docker run $DOCKER_OPTS \"${docker_env[@]}\" \"${docker_volumes[@]}\" $DOCKER_IMAGE $@"
docker run $DOCKER_OPTS "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE $@
+2 -2
View File
@@ -88,8 +88,8 @@ database-format = bz2
# disabled-eapis = 1,2
# expiration-based-scope = disable
# nonfree-packages-directory-support = disable
rss-feed = disable
changelog = disable
rss-feed = enable
changelog = enable
rss-name = packages.rss
rss-base-url = http://packages.sabayon.org/?quicksearch=
rss-website-url = http://www.sabayon.org/
+1 -1
View File
@@ -42,7 +42,7 @@ repo="\${REPOSITORY:-default}"
if [ -d "/sabayon/artifacts/standard" ]; then
eit unlock \$repo || true
eit pull --quick $repo || true
eit pull --quick \$repo || true
#eit sync \$repo
else
echo "ouch no repository there" && exit 3;
+1 -1
View File
@@ -41,7 +41,7 @@ repo="\${REPOSITORY:-default}"
if [ -d "/sabayon/artifacts/standard" ]; then
eit unlock \$repo || true
eit pull --quick $repo || true
eit pull --quick \$repo || true
#eit sync \$repo
else
echo "ouch no repository there" && exit 3;
+65
View File
@@ -0,0 +1,65 @@
#!/usr/bin/perl
# mudler <mudler@sabayon.org>
# this tool requires querypkg
use Getopt::Long;
use strict;
use warnings;
my $arch;
my $verbose;
my $overlay;
GetOptions(
"arch=s" => \$arch,
"overlay=s" => \$overlay,
"verbose" => \$verbose
) or die("Error in command line arguments\n");
die("You should at least supply an overlay with --overlay") if !$overlay;
# Input: Overlay absolute path
# Output: array with package names (category/name)
sub get_packages {
keys %{
{ map {
s/$overlay\/|\.ebuild//g;
$_ = join( '/', ( split( /\//, $_ ) )[ 0, 1 ] );
$_ => 1
} glob( $_[0] . "/*/*/*.ebuild" )
}
};
}
# Input: package (category/name)
# Output: returns 1 if obsolete and can be removed
sub obsolete_package($$) {
my $package = $_[0];
my $arch = $_[1];
my $l_arch = ( defined $arch and $arch ne "" ? "--arch $arch" : "" );
print "querypkg -q $l_arch $package --show spm_repo\n" if $verbose;
my @out = `querypkg -q $l_arch $package --show spm_repo`;
chomp(@out);
return 1 if "@out" eq "";
foreach my $l (@out) {
print " >> $l\n" if $verbose;
return 1 if ( $l =~ /$package.*\{spm_repo\:gent.*/ );
}
return 0;
}
my @packages = get_packages($overlay);
my @obsoletes;
foreach my $p (@packages) {
print "[$p] Checking if there is a version in the repositories.... ";
print "\n" if $verbose;
if ( obsolete_package( $p, $arch ) ) {
print " OBSOLETE! \n";
push( @obsoletes, $p );
}
else {
print " ok \n";
}
}
print "\n";
print "Obsoletes found:\n\n";
print "$_\n" for @obsoletes;
+94
View File
@@ -0,0 +1,94 @@
#!/bin/bash
set -e
. /sbin/sabayondevkit-functions.sh
help_msg() {
echo "
sabayon-maint-helper:
Script for builder boxes maintenance.
-h|--help This message.
--installed Upgrades all the packages installed in the box.
--obsolete Upgrades ONLY the packages that are listed obsolete in eix-test-obsolete.
--all Tries to upgrade all package without any euristics
--category Tries to upgrade/install all the packages in the specified category
e.g. sabayon-maint-helper 'app-office'
Some options could be set also as environment variables:
EMERGE_DEFAULT_ARGS Default emerge options
NOTE: This script MUST be execute as root.
"
}
parse_args() {
local short_opts="h"
local long_opts="help arch: host-arch: unprivileged stagingdir: image-descr: image:"
$(set -- $(getopt -u -q -a -o "$short_opts" -l "$long_opts" -- "$@"))
while [ $# -gt 0 ] ; do
case "$1" in
-h|--help)
help_msg
exit 1
;;
--installed)
echo "Trying to upgrade all the installed packages"
rebuild_all
;;
--obsolete)
echo "Upgrading the packages that are marked as obsolete"
build_obsolete
;;
--all)
echo "Upgrading/Installing everything available to install"
build_all_availables
;;
--category)
echo "Upgrading/Installing everything inside the '$2' category"
build_category_installed "$2"
shift
;;
--)
help_msg
exit 1
;;
*)
echo "Invalid parameter $1."
exit 1
;;
esac
shift
done
return 0
}
main() {
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
[ -z "$@" ] && help_msg && exit 1
(
echo "Acquiring lock"
flock -x -w 10 200 || ( echo "Failed acquiring lock in 10 seconds" && exit 1 )
parse_args "$@"
) 200>/var/lock/.repomaint
}
main "$@"
+57 -29
View File
@@ -1,58 +1,86 @@
#!/bin/bash
set -e
check_docker_requirements(){
if [ "$(id -u)" != "0" ]; then
groups | grep -q docker || echo "--> If you are not running the script as root, your user should be in the docker group to use it. (sudo gpasswd -a $USER docker)"
fi
ps aux | grep -q '[d]ocker' || echo "--> Be sure to have the docker daemon running (sudo systemctl start docker) of configure it to run on boot (sudo systemctl enable docker). Trying to start it anyway" && sudo systemctl start docker
ps aux | grep -q '[d]ocker' || echo "--> Be sure to have the docker daemon running (sudo systemctl start docker) of configure it to run on boot (sudo systemctl enable docker). Trying to start it anyway" && sudo systemctl start docker || true
}
die() { echo "$@" 1>&2 ; exit 1; }
build() {
local SEARCH=$1
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
emerge $EMERGE_DEFAULT_ARGS -o $i && \
emerge $EMERGE_DEFAULT_ARGS $i
done
build_sync() {
layman -S
emerge --sync
eix-update
pushd /opt/sabayon-build/
git stash
git fetch --all || true
git checkout master || true
git reset --hard origin/master || true
popd
}
build_installed() {
build_category() {
local SEARCH=$1
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --newuse --changed-use --update --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
build_sync
for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
echo "Building $i"
emerge ${EMERGE_DEFAULT_ARGS:---accept-properties=-interactive --verbose --oneshot --nospinner --noreplace --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg} $i || true
done
}
build_obsolete() {
build_sync
for i in $(EIX_LIMIT=0 eix-test-obsolete | grep '\[U\]' | awk '{ print $2 }' | xargs echo | uniq);
do
echo "Build $i"
emerge ${EMERGE_DEFAULT_ARGS:---accept-properties=-interactive -u --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg --noreplace} $i || true
done
}
build_category_installed() {
local SEARCH=$1
build_sync
for i in $(EIX_LIMIT=0 eix -I --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
#emerge $EMERGE_DEFAULT_ARGS -o $i && \
emerge $EMERGE_DEFAULT_ARGS $i
echo "Building $i"
emerge ${EMERGE_DEFAULT_ARGS:---accept-properties=-interactive -u --newuse --noreplace --changed-use --update --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg} $i || true
done
}
build_all_availables() {
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
build "$i/"
done
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
build_category "$i/"
done
}
rebuild_all() {
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
build_installed "$i/"
build_category_installed "$i/"
done
}
build_sync() {
emerge-webrsync || exit 1
emerge --sync
layman -S
eix-update || exit 1
pushd /opt/sabayon-build/
git stash
git fetch --all
git checkout master
git reset --heard origin/master
popd
get_category() {
local CATEGORY=$1
local PACKS
for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$CATEGORY/" | xargs echo | uniq);
do
PACKS+="$i "
done
echo $PACKS
}
get_all_availables() {
local RES
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
RES+="$(get_category $i) "
done
echo $RES
}
+23
View File
@@ -0,0 +1,23 @@
#include <stdio.h>
#include <dlfcn.h>
/**
* Attempts to load shared libraries
* @param argc
* @param argv files to check (pass only shared libs)
* @return 0 - all shared libs loaded, 1 - error occured (invalid or broken files passed)
*/
int main(int argc, char* argv[])
{
int i;
for (i = 1; i < argc; ++i) {
void* handle = dlopen(argv[i], RTLD_NOW);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return 1;
} else {
dlclose(handle);
}
}
return 0;
}