summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-08-01 01:14:51 -0700
committerZac Medico <zmedico@gentoo.org>2010-08-01 01:14:51 -0700
commit7f59dca5ca8a7a8fd5cda5912174698b93dc0dac (patch)
treec20be4baa92d0abcf77ffd38e8e11c4cb16d81eb
parent3282ac5c7b9ec7102a8ac6683c1647366cee0ba8 (diff)
downloadportage-7f59dca5ca8a7a8fd5cda5912174698b93dc0dac.tar.gz
portage-7f59dca5ca8a7a8fd5cda5912174698b93dc0dac.tar.bz2
portage-7f59dca5ca8a7a8fd5cda5912174698b93dc0dac.zip
Make update_config_files() take a dict of {repo_name: list} since it's more
efficient this way, and this function can't be called separately for each repo if /etc/portage is under CONFIG_PROTECT (because it would produce separate updated files for each repo).
-rw-r--r--pym/portage/_global_updates.py25
-rw-r--r--pym/portage/update.py53
2 files changed, 54 insertions, 24 deletions
diff --git a/pym/portage/_global_updates.py b/pym/portage/_global_updates.py
index 7e6ae3300..e9ec45305 100644
--- a/pym/portage/_global_updates.py
+++ b/pym/portage/_global_updates.py
@@ -142,10 +142,6 @@ def _global_updates(trees, prev_mtimes):
if _world_repo_match(atom, new_atom):
world_list[pos] = new_atom
world_modified = True
- update_config_files(root,
- shlex_split(mysettings.get("CONFIG_PROTECT", "")),
- shlex_split(mysettings.get("CONFIG_PROTECT_MASK", "")),
- myupd, match_callback=_world_repo_match)
for update_cmd in myupd:
if update_cmd[0] == "move":
@@ -167,6 +163,27 @@ def _global_updates(trees, prev_mtimes):
if retupd:
+ def _config_repo_match(repo_name, atoma, atomb):
+ """
+ Check whether to perform a world change from atoma to atomb.
+ If best vardb match for atoma comes from the same repository
+ as the update file, allow that. Additionally, if portdb still
+ can find a match for old atom name, warn about that.
+ """
+ matches = vardb.match(atoma)
+ if not matches:
+ matches = vardb.match(atomb)
+ if not matches:
+ return False
+ repository = vardb.aux_get(best(matches), ['repository'])[0]
+ return repository == repo_name or \
+ (repo_name == master_repo and repository not in repo_map)
+
+ update_config_files(root,
+ shlex_split(mysettings.get("CONFIG_PROTECT", "")),
+ shlex_split(mysettings.get("CONFIG_PROTECT_MASK", "")),
+ repo_map, match_callback=_config_repo_match)
+
# The above global updates proceed quickly, so they
# are considered a single mtimedb transaction.
if timestamps:
diff --git a/pym/portage/update.py b/pym/portage/update.py
index b24c9cb0c..7892f537d 100644
--- a/pym/portage/update.py
+++ b/pym/portage/update.py
@@ -187,10 +187,18 @@ def update_config_files(config_root, protect, protect_mask, update_iter, match_c
config_root - location of files to update
protect - list of paths from CONFIG_PROTECT
protect_mask - list of paths from CONFIG_PROTECT_MASK
- update_iter - list of update commands as returned from parse_updates()
- match_callback - a callback which will be called with old and new atoms
+ update_iter - list of update commands as returned from parse_updates(),
+ or dict of {repo_name: list}
+ match_callback - a callback which will be called with three arguments:
+ match_callback(repo_name, old_atom, new_atom)
and should return boolean value determining whether to perform the update"""
+ repo_dict = None
+ if isinstance(update_iter, dict):
+ repo_dict = update_iter
+ if match_callback is None:
+ def match_callback(repo_name, atoma, atomb):
+ return True
config_root = normalize_path(config_root)
update_files = {}
file_contents = {}
@@ -242,24 +250,29 @@ def update_config_files(config_root, protect, protect_mask, update_iter, match_c
# update /etc/portage/packages.*
ignore_line_re = re.compile(r'^#|^\s*$')
- for update_cmd in update_iter:
- for x, contents in file_contents.items():
- for pos, line in enumerate(contents):
- if ignore_line_re.match(line):
- continue
- atom = line.split()[0]
- if atom.startswith("-"):
- # package.mask supports incrementals
- atom = atom[1:]
- if not isvalidatom(atom):
- continue
- new_atom = update_dbentry(update_cmd, atom)
- if atom != new_atom:
- if match_callback(atom, new_atom):
- contents[pos] = line.replace(atom, new_atom)
- update_files[x] = 1
- sys.stdout.write("p")
- sys.stdout.flush()
+ if repo_dict is None:
+ update_items = [(None, update_iter)]
+ else:
+ update_items = [x for x in repo_dict.items() if x[0] != 'DEFAULT']
+ for repo_name, update_iter in update_items:
+ for update_cmd in update_iter:
+ for x, contents in file_contents.items():
+ for pos, line in enumerate(contents):
+ if ignore_line_re.match(line):
+ continue
+ atom = line.split()[0]
+ if atom[:1] == "-":
+ # package.mask supports incrementals
+ atom = atom[1:]
+ if not isvalidatom(atom):
+ continue
+ new_atom = update_dbentry(update_cmd, atom)
+ if atom != new_atom:
+ if match_callback(repo_name, atom, new_atom):
+ contents[pos] = line.replace(atom, new_atom, 1)
+ update_files[x] = 1
+ sys.stdout.write("p")
+ sys.stdout.flush()
protect_obj = ConfigProtect(
config_root, protect, protect_mask)