From: Felix Bier <Felix.Bier@rohde-schwarz.com>
To: "gentoo-catalyst@lists.gentoo.org" <gentoo-catalyst@lists.gentoo.org>
Subject: [gentoo-catalyst] Re: [PATCH 2/2] Move from PORTDIR_OVERLAY to repos.conf
Date: Sun, 18 Oct 2020 15:15:16 +0000 [thread overview]
Message-ID: <c7763cd2b8f97543c00a39a5b369daf0be4122f3.camel@rohde-schwarz.com> (raw)
In-Reply-To: <914cce4739709511771f27bed773c7e4e01c3c9a.camel@rohde-schwarz.com>
This commit fixes the following issues:
* The PORTDIR_OVERLAY variable has been deprecated by Gentoo.
With this commit, the variable is no longer written to the
generated make.conf. Instead, a config file
/etc/portage/repos.conf/<repo-name>.conf
is generated for each overlay. The repo name is read from the
overlay using the portage API. Internally, portage parses
metadata/layout.conf and profiles/repo_name to obtain the name.
References:
https://wiki.gentoo.org/wiki//etc/portage/make.conf
https://wiki.gentoo.org/wiki//etc/portage/repos.conf
* All overlays were copied into the same target directory. If the
same file name occurred in multiple overlays, the last overlay
would overwrite all previous files with this name. In particular,
only the metadata/layout.conf of the last overlay was retained,
so it was not possible to reference the other overlays e.g. via
the masters entry in the layout.conf or the portage-2 syntax
for specifying a parent profile from another overlay. Also,
this created problems when the overlays contained ebuilds
for the same package, but with differing versions, because
after copying, the target directory contained both versions of the
ebuild but only the manifest file of the last overlay.
With this commit, each overlay is copied into a separate
sub-directory, e.g. /var/gentoo/repos/local/<repo-name>/.
This directory is referenced via the location entry in the
generated /etc/portage/repos.conf/<repo-name>.conf.
---
catalyst/base/stagebase.py | 72 ++++++++++++++++++++++++++++----------
catalyst/defaults.py | 1 +
catalyst/support.py | 18 ++++++++++
3 files changed, 72 insertions(+), 19 deletions(-)
diff --git a/catalyst/base/stagebase.py b/catalyst/base/stagebase.py
index ac0f4f24..3d4f2a76 100644
--- a/catalyst/base/stagebase.py
+++ b/catalyst/base/stagebase.py
@@ -1,4 +1,5 @@
+import configparser
import copy
import os
import platform
@@ -17,7 +18,8 @@ from DeComp.compress import CompressMap
from catalyst import log
from catalyst.defaults import (confdefaults, MOUNT_DEFAULTS, PORT_LOGDIR_CLEAN)
from catalyst.support import (CatalystError, file_locate, normpath,
- cmd, read_makeconf, ismount, file_check)
+ cmd, read_makeconf, get_repo_name, ismount,
+ file_check)
from catalyst.base.targetbase import TargetBase
from catalyst.base.clearbase import ClearBase
from catalyst.base.genbase import GenBase
@@ -821,17 +823,48 @@ class StageBase(TargetBase, ClearBase, GenBase):
env=self.env)
self.resume.enable("setup_confdir")
+ def get_repo_conf_path(self, repo_name):
+ """ Construct repo conf path: /etc/portage/repos.conf/{name}.conf """
+ return normpath(os.path.join(self.settings['repos_conf'], repo_name + ".conf"))
+
+ def get_overlay_location(self, repo_name):
+ """ Construct overlay repo path: /var/gentoo/repos/local/{name} """
+ return normpath(os.path.join(self.settings['local_overlay'], repo_name))
+
+ def write_repo_conf(self, repo_name, config):
+ """ Write ConfigParser to {chroot}/etc/portage/repo.conf/{name}.conf """
+ repo_conf = self.get_repo_conf_path(repo_name)
+ chroot_repo_conf = self.settings['chroot_path'] + repo_conf
+ log.info('Creating repo config %s.', chroot_repo_conf)
+ ensure_dirs(os.path.dirname(chroot_repo_conf))
+
+ try:
+ with open(chroot_repo_conf, 'w') as myf:
+ config.write(myf)
+ except OSError as e:
+ raise CatalystError('Could not write {}: {}'.format(
+ chroot_repo_conf, e)) from e
+
def portage_overlay(self):
- """ We copy the contents of our overlays to /usr/local/portage """
+ """ We copy the contents of our overlays to /var/gentoo/repos/local/{name} """
if "portage_overlay" in self.settings:
for x in self.settings["portage_overlay"]:
if os.path.exists(x):
- log.info('Copying overlay dir %s', x)
- ensure_dirs(
- self.settings['chroot_path'] + self.settings['local_overlay'])
- cmd("cp -a " + x + "/* " + self.settings["chroot_path"] +
- self.settings["local_overlay"],
- env=self.env)
+ name = get_repo_name(x)
+
+ location = self.get_overlay_location(name)
+ config = configparser.ConfigParser()
+ config[name] = {'location': location}
+ self.write_repo_conf(name, config)
+
+ chroot_location = normpath(
+ self.settings['chroot_path'] + location)
+ log.info('Copying overlay dir %s to %s',
+ x, chroot_location)
+ ensure_dirs(chroot_location)
+ cmd('cp -a ' + x + '/* ' + chroot_location, env=self.env)
+ else:
+ log.warning('Skipping missing overlay %s.', x)
def root_overlay(self):
""" Copy over the root_overlay """
@@ -1080,12 +1113,6 @@ class StageBase(TargetBase, ClearBase, GenBase):
varname = x.split('_')[1].upper()
myf.write(f'{varname}="{self.settings[x]}"\n')
- if setup:
- # Setup the portage overlay
- if "portage_overlay" in self.settings:
- myf.write('PORTDIR_OVERLAY="%s"\n' %
- self.settings["local_overlay"])
-
# Set default locale for system responses. #478382
myf.write(
'\n'
@@ -1157,11 +1184,18 @@ class StageBase(TargetBase, ClearBase, GenBase):
log.warning("You've been hacking. Clearing target patches: %s", target)
clear_path(target)
- # Remove our overlay
- overlay = normpath(
- self.settings["chroot_path"] + self.settings["local_overlay"])
- if os.path.exists(overlay):
- clear_path(overlay)
+ # Remove our overlays
+ if "portage_overlay" in self.settings:
+ for repo_path in self.settings["portage_overlay"]:
+ repo_name = get_repo_name(repo_path)
+
+ repo_conf = self.get_repo_conf_path(repo_name)
+ chroot_repo_conf = self.settings["chroot_path"] + repo_conf
+ clear_path(chroot_repo_conf)
+
+ location = self.get_overlay_location(repo_name)
+ chroot_location = self.settings['chroot_path'] + location
+ clear_path(chroot_location)
if "sticky-config" not in self.settings["options"]:
# re-write the make.conf to be sure it is clean
diff --git a/catalyst/defaults.py b/catalyst/defaults.py
index c153fcc4..9660a7f3 100644
--- a/catalyst/defaults.py
+++ b/catalyst/defaults.py
@@ -38,6 +38,7 @@ confdefaults = {
"local_overlay": "/var/db/repos/local",
"port_conf": "/etc/portage",
"make_conf": "%(port_conf)s/make.conf",
+ "repos_conf": "%(port_conf)s/repos.conf",
"options": set(),
"pkgdir": "/var/cache/binpkgs",
"port_tmpdir": "/var/tmp/portage",
diff --git a/catalyst/support.py b/catalyst/support.py
index a6a6854a..b8069c7d 100644
--- a/catalyst/support.py
+++ b/catalyst/support.py
@@ -7,6 +7,8 @@ import shutil
import time
from subprocess import Popen
+from portage.repository.config import RepoConfig
+
from catalyst import log
BASH_BINARY = "/bin/bash"
@@ -179,6 +181,22 @@ def read_makeconf(mymakeconffile):
return makeconf
+def get_repo_name(repo_path):
+ """ Get the name of the repo at the given repo_path.
+
+ References:
+ https://wiki.gentoo.org/wiki/Repository_format/profiles/repo_name
+ https://wiki.gentoo.org/wiki/Repository_format/metadata/layout.conf#repo-name
+ """
+
+ repo_config = RepoConfig(None, {"location": repo_path})
+
+ if repo_config.missing_repo_name:
+ raise CatalystError("Missing name in repository {}".format(repo_path))
+
+ return repo_config.name
+
+
def pathcompare(path1, path2):
# Change double slashes to slash
path1 = re.sub(r"//", r"/", path1)
--
2.28.0
next prev parent reply other threads:[~2020-10-18 15:15 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-17 19:00 [gentoo-catalyst] [PATCH 2/2] Move from PORTDIR_OVERLAY to repos.conf Felix Bier
2020-10-17 20:11 ` Matt Turner
2020-10-18 13:58 ` [Newsletter] " Felix Bier
2020-10-30 16:13 ` Matt Turner
2020-10-18 15:15 ` Felix Bier [this message]
2020-10-30 16:07 ` [gentoo-catalyst] " Matt Turner
2020-10-31 21:24 ` Brian Dolbec
2020-10-31 22:28 ` Matt Turner
2020-11-10 1:03 ` [Newsletter] " Felix Bier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c7763cd2b8f97543c00a39a5b369daf0be4122f3.camel@rohde-schwarz.com \
--to=felix.bier@rohde-schwarz.com \
--cc=gentoo-catalyst@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox