Compare commits

..

49 Commits

Author SHA1 Message Date
Ettore Di Giacinto 66284024a2 Use new eit options 2018-06-02 13:38:31 +02:00
Ettore Di Giacinto 64f8ee54a3 functions: make /opt/sabayon-build/ configurable 2018-02-15 00:07:41 +01:00
Ettore Di Giacinto 6cc8d3d7ae switch default profile 2018-02-03 22:56:16 +01:00
Ettore Di Giacinto 7512a7f184 push experimental sabayon-commit 2018-01-23 21:51:28 +01:00
Ettore Di Giacinto bdd6ffac8c Merge pull request #17 from geaaru/fix_builder_debug
[builder] Fix print of $remove_layman_overlay
2018-01-17 17:52:22 +01:00
Geaaru b42ef2feb7 [builder] Fix print of $remove_layman_overlay 2018-01-17 09:31:13 +01:00
Ettore Di Giacinto cf77609a7b Merge pull request #16 from geaaru/documentation
Add documentation
2018-01-15 18:42:33 +01:00
Geaaru dc05aace0b Add documentation 2018-01-15 15:45:13 +01:00
Ettore Di Giacinto 928d6da693 Refactorize and quote package when getting deps of package 2017-07-30 01:43:17 +02:00
Ettore Di Giacinto 5c927a25c6 Refactorizations 2017-07-30 01:26:11 +02:00
Ettore Di Giacinto 813148303c Add support for new options exposed in builder
- INTERNAL_BUILDER: swaps the builder supplied in the env var with the one executed in the container
- BUILDER_VERBOSE: enable verbose mode
- SHARE_WORKSPACE: enable sharing of the build directory with the container
- PRE_SCRIPT/POST_SCRIPT: absolute paths of scripts that have to be executed in the container
2017-07-30 01:18:37 +02:00
Ettore Di Giacinto 5a3be7c0f1 Add support for pre_script and post_script, executed before and after the build
Also add support for package major/minor syntax and verbose option
2017-07-30 01:17:03 +02:00
Ettore Di Giacinto 6fbd3f4f22 functions: remove sudo calls 2017-07-09 11:25:46 +02:00
Ettore Di Giacinto 0be7f76824 sabayon-buildpackages: add support for INTERNAL_BUILDER, swap the builder image with the local installed one 2017-07-09 11:25:28 +02:00
Ettore Di Giacinto 7b2adad931 builder: include also injected_packages in overlays detection 2017-06-18 12:58:21 +02:00
Ettore Di Giacinto 6283b34be8 builder: parse overlays also from package list 2017-06-18 12:26:07 +02:00
Ettore Di Giacinto 11812ff1a2 move QA checks on the bottom, enhance output display and fix depchecking when package contain overlay name 2017-06-05 21:13:30 +02:00
Ettore Di Giacinto e31a06cee3 add gitignore 2017-05-21 14:33:36 +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
9 changed files with 713 additions and 173 deletions
+1
View File
@@ -0,0 +1 @@
*.bak
+178
View File
@@ -0,0 +1,178 @@
# Scripts
Devkit contains a list of scripts used by Sabayon for building process and
for manage package injection to repositories.
## List of files
* `depcheck`: a tool to report both undeclared and potentially-unused
runtime dependencies.
* `dynlink-scanner`: a tool for retrieve list of linked libraries used
by a package. Use try_dlopen execute binary.
* `sabayon-brokenlibs`: a tool for retrieve list of all dependencies
of a binary through equo and equery tools. Print list of dependencies.
This script depends on:
- equo
- equery
- sabayondevkit-functions.sh
* `sabayon-buildpackages`: Script for Spawning the package builder container.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-bz2brokenlibs`: Unpack bz2 tarball and execute sabayon-brokenlibs
to every files unpacked.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-createrepo`: Script for spawning container for commit packages to
a repository and create it if doesn't exists.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-createrepo-cleanup`: Script for spawning container for cleanup
expired packages from a repository.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-createrepo-remove`: Script for spawning container for remove a list
of packages from a repository.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-detectobsolete`: Perl script for found obsolete packages in an
overlay. Possible options are: --arch, --overlay and --verbose.
This script depends on:
- querypkg
* `sabayon-entropypreservedlibs`: Perl script for retrieve list of packages that has
dependencies to old libraries.
See also [here](https://wiki.sabayon.org/index.php?title=En:Sabayon_Devkit#sabayon-entropypreservedlibs)
* `sabayon-help-info`: Bash script for grabbing system information and post to
sabayon pastebin.
This script depends on:
- pastebunz
* `sabayon-maint-helper`: Script for builder boxes maintenance.
Possible options are:
- `--installed`: For upgrades all the packages installed in the box.
- `--obsolete`: Upgrade ONLY the packages that are listed obsolete
- `--all`: Tries to upgrade all packages
- `--category`: Tries to upgrade/install all packages present in a specified category.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-tbz2extract`: Python script for extract tbz2 package.
* `sabayon-tbz2truncate`: Python script for truncate tbz2 package
* `sabayon-xpakextract`: Python script for convert tbz2 in .xpak file
* `builder`: Perl script for build packages.
## Scripts Variables
### sabayon-createrepo
| Env Variable | Default | Description |
|--------------|---------|-------------|
| SAB_WORKSPACE | $PWD | Workspace directory |
| REPOSITORY_NAME | default | Name of the repository to create. |
| REPOSITORY_DESCRIPTION | My Sabayon repository | Description of the repository to create. |
| DOCKER_IMAGE | sabayon/eit-amd64 | Docker image to use on create repository |
| PORTAGE_ARTIFACTS | $SAB_WORKSPACE/portage_artifacts | Directory of the artifacts to insert on repository |
| OUTPUT_DIR | $SAB_WORKSPACE/entropy_artifacts | Output directory of the repository |
| DOCKER_OPTS | --ti --rm | Docker options to pass on run container. |
| PUBKEY | - | Define file to mount as volume to /etc/entropy/mykeys/key.pub |
| PRIVATEKEY | - | Define file to mount as volume to /etc/entropy/mykeys/private.key |
### sabayon-createrepo-cleanup
| Env Variable | Default | Description |
|--------------|---------|-------------|
| SAB_WORKSPACE | $PWD | Workspace directory |
| REPOSITORY_NAME | default | Name of the repository to clean. |
| REPOSITORY_DESCRIPTION | My Sabayon repository | Description of the repository to clean. |
| DOCKER_IMAGE | sabayon/eit-amd64 | Docker image to use on clean repository |
| OUTPUT_DIR | $SAB_WORKSPACE/entropy_artifacts | Directory of the repository |
| DOCKER_OPTS | --ti --rm | Docker options to pass on run container. |
| PUBKEY | - | Define file to mount as volume to /etc/entropy/mykeys/key.pub |
| PRIVATEKEY | - | Define file to mount as volume to /etc/entropy/mykeys/private.key |
### sabayon-createrepo-remove
| Env Variable | Default | Description |
|--------------|---------|-------------|
| SAB_WORKSPACE | $PWD | Workspace directory |
| REPOSITORY_NAME | default | Name of the repository where remove packages. |
| REPOSITORY_DESCRIPTION | My Sabayon repository | Description of the repository. |
| DOCKER_IMAGE | sabayon/eit-amd64 | Docker image to use on clean repository |
| OUTPUT_DIR | $SAB_WORKSPACE/entropy_artifacts | Directory of the repository |
| DOCKER_OPTS | --ti --rm | Docker options to pass on run container. |
| PUBKEY | - | Define file to mount as volume to /etc/entropy/mykeys/key.pub |
| PRIVATEKEY | - | Define file to mount as volume to /etc/entropy/mykeys/private.key |
### sabayon-buildpackages
| Env Variable | Default | Description |
|--------------|---------|-------------|
| SAB_WORKSPACE | $PWD | Workspace directory |
| DOCKER_IMAGE | sabayon/builder-amd64 | Docker image to use for compilation |
| SAB_ARCH | intel | Name of arch to use defined on build Sabayon project |
| DOCKER_PULL_IMAGE | 0 | If try to pull last image (1) or use local version |
| MAKE_CONF | $SAB_WORKSPACE/specs/make.conf | Path of make.conf custom to supply on compilation |
| OUTPUT_DIR | $SAB_WORKSPACE/portage_artifacts/ | Where are written portage artifacts compiled |
| LOCAL_OVERLAY | $SAB_WORKSPACE/local_overlay/ | Directory to use for supply local overlay as volume of the image on compilation |
| ENTROPY_REPOSITORY | main | Sabayon repository to use: weekly, main or testing |
| DOCKER_OPTS | --ti --rm --cap-add=SYS_PTRACE | Options to use on running Docker image |
| PORTAGE_CACHE | - | If present permit to supply host portage directory to container |
| BUILDER_PROFILE | - | Permit to choice Gentoo Profile to use |
| EMERGE_SPLIT_INSTALL | - | Possible values are 0/1. |
| BUILDER_JOBS | 1 | Define number of jobs for emerge phase. |
| USE_EQUO | 1 | Use equo for install and align compilation environment. |
| PRESERVED_REBUILD | 0 | Execute (emerge @preserve-rebuild) |
| EQUO_INSTALL_ATOMS | 1 | Try to install existing dependencies from equo repositories |
| DEPENDENCY_SCAN_DEPTH | 2 | Define depth level for dependencies calculation |
| FEATURES | "parallel-fetch protect-owned compressdebug splitdebug -userpriv" | Override Gentoo FEATURES variable |
| EMERGE_DEFAULTS_ARGS | "--accept-properties=-interactive --verbose --oneshot --complete-graph --buildpkg" | Override default emerge options |
| EQUO_INSTALL_VERSION | 0 | |
| EQUO_SPLIT_INSTALL | 0 | |
| ARTIFACTS_DIR | - | Additional directory where copy artifacts |
| ENTROPY_REPOSITORY | main | Choice repository to use. Values: main, weekly, testing |
| SKIP_PORTAGE_SYNC | 0 | Skip portage sync before compilation |
| EQUO_MIRRORSORT | 1 | Execute equo mirrorsort before compilation |
| WEBRSYNC | 0 | Use webrsync instead of defult rsync |
| ENMAN_REPOSITORIES | - | Define list of enman repositories to add |
| REMOVE_ENMAN_REPOSITORIES | - | Define list of enman repositories to remove |
| DISTFILES | - | Permit to mount volume to /usr/portage/distfiles directory and speedup download phase if packages are already available |
| INTERNAL_BUILDER | - | Define a host builder to use instead of docker builder binary |
| ENTROPY_DOWNLOADED_PACKAGES | - | Mount volume to /var/lib/entropy/client/packages to use caching on download equo packages |
| DISTCC_HOSTS | - | Override Gentoo DISTCC_HOSTS variable to use DISTCC |
| PRUNE_VIRTUALS | 0 | Prune virtuals packages to avoid conflicts. |
| REPOSITORY_NAME | - | Add single enman repository (for compilation of scr repository itself) |
| ENMAN_ADD_SELF | 0 | If add with enman repository define on REPOSITORY_NAME variable |
| EQUO_MASKS | - | Define a list of packages to mask with equo mask command |
| EQUO_UNMASKS | - | Define a list of packages to unmask with equo unmask command |
| EMERGE_REMOVE | - | Define a list of packages to remove with emerge -C command before compilation |
| REMOTE_OVERLAY | - | Define a list of overlay to add before compilation |
| REMOVE_LAYMAN_OVERLAY | - | Define a list of overlays to remove before compilation |
| REMOTE_REMOTE_OVERLAY | - | Define a list of files under /etc/portage to remove |
| QA_CHECKS | - | Execute quality check on packages. repoman, dynlink-scanner and depcheck |
| REMOTE_CONF_PORTDIR | - | If defined permit to define a git repository to clone under /etc/portage directory. |
| REMOTE_PORTDIR | - | If defined permit to define a git repository to clone under /usr/portage directory. |
| ETP_NOCACHE | - | Define ETP_NOCACHE variable on environment |
| PRETEND | 0 | If set to 1 append -p option to emerge commands. |
| BUILDER_VERBOSE | 0 | If set to 1 add verbose to builder program. |
| DETECT_OBSOLETE | 0 | Execute script sabayon-detectobsolete to target overlay to found obsolete ebuilds. |
| TARGET_OVERLAY | - | Define overlay where execute sabayon-detectobsolete script. Require DETECT_OBSOLETE variable set to 1. |
| LOCAL_OVERLAY | - | Define a directory to mount as volume to /usr/local/local_portage |
| SHARE_WORKSPACE | - | If defined mount volume defined on SAB_WORKSPACE variable to /devkit-workspace |
| PRE_SCRIPT | - | Mount a custom script to /pre-script execute before compilation |
| POST_SCRIPT | - | Mount a custom script to /post-script execute after packages compilation |
| MAKE_CONF | - | If defined mount defined file to /etc/portage/make.conf.custom and define variable MAKE_CONF to bet to mounted path. |
+221 -137
View File
@@ -3,22 +3,23 @@
use Getopt::Long;
use v5.10;
no feature "say";
use Storable 'dclone';
my $profile = $ENV{BUILDER_PROFILE} // 3;
my $profile = $ENV{BUILDER_PROFILE} // 16;
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} // 1;
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
// "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;
@@ -40,6 +41,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 $verbose = $ENV{BUILDER_VERBOSE} // 0;
my $make_conf = $ENV{MAKE_CONF};
@@ -63,11 +68,16 @@ sub say { print join( "\n", @_ ) . "\n"; }
sub safe_call {
my $cmd = shift;
my $rt = system($cmd);
my $rt = _system($cmd);
my $return = $rt >> 8;
exit($return) if ($rt);
}
sub _system {
say "Executing: @_" if $verbose;
return system(@_);
}
sub append_to_file {
my ( $file_name, $package ) = @_;
@@ -75,7 +85,7 @@ sub append_to_file {
# Check that the package was not already there
open my $fh_ro, '<:encoding(UTF-8)', $file_name
or die("Cannot open: $file_name");
or die("Cannot open: $file_name");
while ( my $line = <$fh_ro> ) {
return if $line eq $package . "\n";
}
@@ -83,11 +93,15 @@ sub append_to_file {
}
open( my $fh_a, '>>', $file_name )
or die "Could not open file '$filename' $!";
or die "Could not open file '$filename' $!";
print $fh_a $package . "\n";
close $fh_a;
}
sub parse_overlays {
map { $_ =~ s/.*?\:\://g; $_ } grep {/\:\:/} @{ dclone( \@_ ) };
}
sub add_portage_repository {
my $repo = $_[0];
my $reponame;
@@ -100,15 +114,15 @@ sub add_portage_repository {
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";
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/" );
_system("mkdir -p /etc/portage/repos.conf/")
if ( !-d "/etc/portage/repos.conf/" );
say "==== Adding $reponame ====";
qx{
@@ -119,22 +133,23 @@ sync-uri = $repo
auto-sync = yes' > /etc/portage/repos.conf/$reponame.conf
}; # Declaring the repo and giving priority
system("emaint sync -r $reponame");
_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
@@ -143,15 +158,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; &abs_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
@@ -178,33 +193,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;
}
@@ -213,21 +240,30 @@ sub calculate_missing {
# Output: atom form (sys-fs/foobarfs)
sub atom { s/-[0-9]{1,}.*$//; }
sub abs_atom { atom; s/^(\<|\>|=)+// }
# Same again as a function
sub to_atom { my $p = shift; local $_ = $p; atom; return $_; }
sub to_abs_atom { my $p = shift; local $_ = $p; abs_atom; return $_; }
# Input: Array
# Output: array with unique elements
sub uniq {
keys %{ { map { $_ => 1 } @_ } };
}
sub detect_useflags
{ # Detect useflags defined as [-alsa,avahi] in atom, and fill $hash within the $target sub-hash
# 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 ) ];
$per_package_useflags->{$target}->[$i] =
[ +split( /,/, $flags ) ];
}
}
}
@@ -242,44 +278,60 @@ sub compile_packs {
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 )
and @{ $per_package_useflags->{$target}->[$package_counter] }
> 0 )
{
say "USEFLAGS: "
. join( " ",
. join( " ",
@{ $per_package_useflags->{$target}->[$package_counter] } );
$tmp_rt = system(
$tmp_rt = _system(
"USE=\""
. join( " ",
@{ $per_package_useflags->{$target}->[$package_counter] } )
. "\" emerge $emerge_defaults_args -j $jobs $extra_arg $pack"
. 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");
_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!
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;
}
say "****************************************************";
my $per_package_useflags;
my @packages = @ARGV;
my @injected_packages =
$build_injected_args ? split( / /, $build_injected_args ) : ();
my @parsed_overlays =
grep { $_ !~ /gentoo/i } parse_overlays( @packages, @injected_packages );
say "Detected overlays: @parsed_overlays" if @parsed_overlays;
@overlays = uniq( @overlays, @parsed_overlays );
if ( @overlays > 0 ) {
say "Overlay(s) to add";
foreach my $overlay (@overlays) {
@@ -293,41 +345,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.
# 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");
_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");
_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("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;
_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"
_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("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");
}
else {
open FILE, "</usr/local/portage/profiles/repo_name";
@@ -336,8 +400,8 @@ else {
chomp(@FILE);
$reponame = $FILE[0];
}
system("chown -R portage:portage /usr/local/portage");
system("chmod -R 755 /usr/local/portage");
_system("chown -R portage:portage /usr/local/portage");
_system("chmod -R 755 /usr/local/portage");
qx{
echo '[$reponame]
@@ -352,75 +416,85 @@ if ( $remote_overlay and $remote_overlay ne "" ) {
}
if ( $remove_layman_overlay and $remove_layman_overlay ne "" ) {
say "===== Removing overlays: $remove_remote_overlay =====";
say "===== Removing overlays: $remove_layman_overlay =====";
system("layman -d $_") for ( split( / /, $remove_layman_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( "rm -rfv /etc/portage/" . $_ . ".conf" )
for ( split( / /, $remote_overlay ) );
}
system("mkdir -p /usr/portage/distfiles/git3-src");
_system("mkdir -p /usr/portage/distfiles/git3-src");
unless ( $skip_portage_sync == 1 ) {
# sync portage and overlays
system("layman -S");
_system("layman -S");
if ( $webrsync == 1 ) {
system("emerge-webrsync");
_system("emerge-webrsync");
}
else {
system("emerge --sync");
_system("emerge --sync");
}
}
# preparing for MOAR automation
qx|eselect profile set $profile|;
say "Setting new profile to $profile" if defined $profile;
_system("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|;
qx|equo repo enable sabayon-weekly|;
_system("equo repo disable sabayonlinux.org");
_system("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|;
_system("equo repo disable sabayon-weekly");
_system("equo repo enable sabayonlinux.org");
_system("equo repo enable sabayon-limbo");
}
if ($use_equo) {
say "Devkit version:";
system("equo s -vq app-misc/sabayon-devkit");
_system("equo s -vq app-misc/sabayon-devkit");
_system("enman list --installed -q");
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 );
system("enman remove $_") for @enman_toremove;
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 "" );
system("equo repo mirrorsort sabayonlinux.org") if $equo_mirrorsort;
system("equo up && equo u");
_system("enman add $repository_name")
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;
_system("cp -rf $make_conf /etc/portage/make.conf") if $make_conf;
my $per_package_useflags;
my @packages = @ARGV;
my @injected_packages = ();
if ($build_injected_args) {
@injected_packages = split( / /, $build_injected_args );
if (@injected_packages) {
say "[*] Injected installs:";
say "\t* " . $_ for @injected_packages;
}
# Allow users to specify atoms as: media-tv/kodi[-alsa,avahi]
@@ -430,8 +504,8 @@ if ($emerge_split_install)
}
else {
map { $_ =~ s/\[.*?\]//g; $_; }
@packages
; # Clean up [] if user didn't specified split_install, but specified a useflag combination
@packages
; # Clean up [] if user didn't specified split_install, but specified a useflag combination
}
detect_useflags( "injected_targets", \@injected_packages );
@@ -440,13 +514,13 @@ if ($use_equo) {
# best effort mask
if ($equo_masks) {
append_to_file( "/etc/entropy/packages/package.mask", $_ )
for ( split( / /, $equo_masks ) );
for ( split( / /, $equo_masks ) );
}
# best effort unmask
if ($equo_unmasks) {
append_to_file( "/etc/entropy/packages/package.unmask", $_ )
for ( split( / /, $equo_unmasks ) );
for ( split( / /, $equo_unmasks ) );
}
my @packages_deps;
@@ -455,14 +529,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(
@@ -472,54 +546,51 @@ 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 $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 ) {
system("equo rm --nodeps $_") for (@equo_remove);
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 $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");
my @p = map {"'$_'"} ( @packages_deps, @equo_install );
my @r = map {"'$_'"} @equo_remove;
safe_call("equo i $equo_install_args --bdeps @p")
if ( @p > 0 )
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
_system("equo rm --nodeps @r") if ( @r > 0 );
}
}
say "*** Ready to compile, finger crossed ***";
system("emerge --info")
; #always give detailed information about the building environment, helpful to debug
_system("emerge --info")
; #always give detailed information about the building environment, helpful to debug
my $rt;
if ( $emerge_remove and $emerge_remove ne "" ) {
system("emerge -C $_") for split( / /, $emerge_remove );
say "Removing with emerge: $emerge_remove";
_system("emerge -C '$_'") for split( / /, $emerge_remove );
}
_system("chmod +x /pre-script;./pre-script") if -e "/pre-script";
if ($emerge_split_install) {
compile_packs( "targets", @packages );
$rt = 0; #consider the build good anyway, like a "keep-going"
}
else {
$rt = system("emerge $emerge_defaults_args -j $jobs @packages");
my @p = map {"'$_'"} @packages;
$rt = _system("emerge $emerge_defaults_args -j $jobs @p");
}
my $return = $rt >> 8;
@@ -527,25 +598,38 @@ my $return = $rt >> 8;
# best effort -B
compile_packs( "injected_targets", @injected_packages );
if ($preserved_rebuild) {
_system("chmod +x /post-script;./post-script") if -e "/post-script";
system("emerge -j $jobs --buildpkg \@preserved-rebuild");
system("revdep-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 $_");
say "*** Quality assurance ***";
foreach my $pn ( map { abs_atom; $_ } ( @packages, @injected_packages ) )
{
say ">> Running repoman on $pn";
_system(
"pushd \$(dirname \$(equery which '$pn' 2>/dev/null)); repoman; popd"
);
$pn =~ s/\:\:.*//g;
say ">> Detecting missing dependencies for $pn";
_system("dynlink-scanner '$pn'");
_system("depcheck '$pn'");
}
}
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);
+12 -3
View File
@@ -8,7 +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}"
DOCKER_OPTS="${DOCKER_OPTS:--ti --rm --cap-add=SYS_PTRACE}"
. /sbin/sabayondevkit-functions.sh
@@ -41,6 +41,7 @@ docker_volumes=( -v "$OUTPUT_DIR:/usr/portage/packages" )
[ -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 "$INTERNAL_BUILDER" ] || docker_volumes+=(-v "$INTERNAL_BUILDER:/usr/sbin/builder")
[ -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")
[ -z "${PRUNE_VIRTUALS}" ] || docker_env+=(-e "PRUNE_VIRTUALS=$PRUNE_VIRTUALS")
@@ -56,7 +57,14 @@ docker_volumes=( -v "$OUTPUT_DIR:/usr/portage/packages" )
[ -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 "$BUILDER_VERBOSE" ] || docker_env+=(-e "BUILDER_VERBOSE=$BUILDER_VERBOSE")
[ -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")
[ -z "$SHARE_WORKSPACE" ] || docker_volumes+=(-v "$SAB_WORKSPACE:/devkit-workspace")
[ -z "$PRE_SCRIPT" ] || docker_volumes+=(-v "$PRE_SCRIPT:/pre-script")
[ -z "$POST_SCRIPT" ] || docker_volumes+=(-v "$POST_SCRIPT:/post-script")
if [ -e $MAKE_CONF ]; then
echo "You specified a make.conf. I hope you know what are you doing"
@@ -76,11 +84,12 @@ if [ -d "$SAB_WORKSPACE"/specs ]; then
[ -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 $@
docker run $DOCKER_OPTS "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE "$@"
+80
View File
@@ -0,0 +1,80 @@
#!/usr/bin/perl
use feature 'say';
use Cwd;
use File::Temp;
my $current_git_directory = qx|git rev-parse --show-toplevel 2>/dev/null|;
chomp $current_git_directory;
my $cwd = getcwd;
chdir($current_git_directory);
my $commit_message_tmpfile = File::Temp->new();
my @changed_files = qx|git status -s|;
my $n_changed_files = scalar @changed_files;
die "No files changed. Exiting." if $n_changed_files <= 0;
my %atoms = ();
sub _build_git_repo {
my ($file_name) = @_;
my $commit_message;
if ( $file_name
=~ /conf\/(home|intel|arm(arch|hfp|v6l|vtl))\/(entropy|portage|repo)\/(.*)/
)
{
$commit_message = "$1/$4: ";
}
elsif ( $filename eq
"conf/noarch/entropy/packages/packages.server.dep_blacklist" )
{
$commit_message = "dep_blacklist: ";
}
elsif ( $filename eq
"conf/noarch/entropy/packages/packages.server.dep_rewrite" )
{
$commit_message = "dep_rewrite: ";
}
if ($commit_message) {
print $commit_message_tmpfile $commit_message;
system( "git commit -eF " . $commit_message_tmpfile->filename );
unlink($commit_message_tmpfile) if -e $commit_message_tmpfile;
}
}
sub _overlay_git_repo {
die "If you are in the overlay, call me in the ebuild dir"
if $current_git_directory eq getcwd;
chdir($cwd);
die "I'm not pleased.. but you could force with --force"
if ( _system("repoman") && $ARGV[0] ne "--force" );
_system("repoman commit $ARGV[0]");
}
sub _system {
my $prog = shift;
my $rv = system( {$prog} $prog => @_ );
if ( $rv == -1 ) { say("Can't launch $prog: $!"); return 1; }
elsif ( my $s = $rv & 127 ) {
say("$prog died from signal $s");
return 1;
}
elsif ( my $e = $rv >> 8 ) { say("$prog exited with code $e"); return 1; }
return 0;
}
foreach my $file (@changed_files) {
chomp $file;
my @words = split( ' ', $file, 2 );
next if $words[0] eq "??"; # allow "dangling" files
my $file_name = $words[1];
if ( $file_name =~ /conf\/(intel|arm|noarch)/ ) {
_build_git_repo($file_name);
}
elsif ( $file_name =~ /\.ebuild/ ) {
_overlay_git_repo($file_name);
}
}
+4 -4
View File
@@ -68,8 +68,8 @@ fi
eit key import \$repo /etc/entropy/mykeys/private.key /etc/entropy/mykeys/key.pub && { eit key sign \$repo || true; } && { echo "=== Repository key imported successfully ==="; }
echo "=== Injecting packages ==="
echo "Yes" | eit inject \${built_pkgs} || { echo "ouch unable to inject" && exit 3; }
echo "Yes Yes Yes" | eit commit --quick
eit inject --quick \${built_pkgs} || { echo "ouch unable to inject" && exit 3; }
eit commit --quick
echo "=== Pushing built packages locally ==="
eit push --quick --force
@@ -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/
+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 "$@"
+58 -29
View File
@@ -1,59 +1,88 @@
#!/bin/bash
set -e
export BUILD_DIR="${BUILD_DIR:-/opt/sabayon-build/}"
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 || true
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" && 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 --noreplace --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
echo "Building $i"
emerge $EMERGE_DEFAULT_ARGS -o $i && \
emerge $EMERGE_DEFAULT_ARGS $i
done
build_sync() {
layman -S
emerge --sync
eix-update
pushd "${BUILD_DIR}"
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 --noreplace --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
echo "Building $i"
emerge $EMERGE_DEFAULT_ARGS $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
}