blob: 87f4a3522661fd13de9af6041fdb4d128470eba2 [file] [log] [blame]
Alex Kleineb77ffa2019-05-28 14:47:44 -06001# -*- coding: utf-8 -*-
2# Copyright 2019 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Package utility functionality."""
7
8from __future__ import print_function
9
Alex Klein87531182019-08-12 15:23:37 -060010import functools
11
Alex Kleineb77ffa2019-05-28 14:47:44 -060012from chromite.lib import constants
Alex Kleineb77ffa2019-05-28 14:47:44 -060013from chromite.lib import git
Alex Kleineb77ffa2019-05-28 14:47:44 -060014from chromite.lib import portage_util
Alex Kleind6195b62019-08-06 16:01:16 -060015from chromite.lib import uprev_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060016
Alex Klein87531182019-08-12 15:23:37 -060017# Registered handlers for uprevving versioned packages.
18_UPREV_FUNCS = {}
19
Alex Kleineb77ffa2019-05-28 14:47:44 -060020
21class Error(Exception):
22 """Module's base error class."""
23
24
25class UprevError(Error):
26 """An error occurred while uprevving packages."""
27
28
Alex Klein87531182019-08-12 15:23:37 -060029class UnknownPackageError(Error):
30 """Uprev attempted for a package without a registered handler."""
31
32
33def uprevs_versioned_package(package):
34 """Decorator to register package uprev handlers."""
35 assert package
36
37 def register(func):
38 """Registers |func| as a handler for |package|."""
39 _UPREV_FUNCS[package] = func
40
41 @functools.wraps(func)
42 def pass_through(*args, **kwargs):
43 return func(*args, **kwargs)
44
45 return pass_through
46
47 return register
48
49
Alex Kleineb77ffa2019-05-28 14:47:44 -060050def uprev_build_targets(build_targets, overlay_type, chroot=None,
51 output_dir=None):
52 """Uprev the set provided build targets, or all if not specified.
53
54 Args:
55 build_targets (list[build_target_util.BuildTarget]|None): The build targets
56 whose overlays should be uprevved, empty or None for all.
57 overlay_type (str): One of the valid overlay types except None (see
58 constants.VALID_OVERLAYS).
59 chroot (chroot_lib.Chroot|None): The chroot to clean, if desired.
60 output_dir (str|None): The path to optionally dump result files.
61 """
62 # Need a valid overlay, but exclude None.
63 assert overlay_type and overlay_type in constants.VALID_OVERLAYS
64
65 if build_targets:
66 overlays = portage_util.FindOverlaysForBoards(
67 overlay_type, boards=[t.name for t in build_targets])
68 else:
69 overlays = portage_util.FindOverlays(overlay_type)
70
71 return uprev_overlays(overlays, build_targets=build_targets, chroot=chroot,
72 output_dir=output_dir)
73
74
75def uprev_overlays(overlays, build_targets=None, chroot=None, output_dir=None):
76 """Uprev the given overlays.
77
78 Args:
79 overlays (list[str]): The list of overlay paths.
80 build_targets (list[build_target_util.BuildTarget]|None): The build targets
81 to clean in |chroot|, if desired. No effect unless |chroot| is provided.
82 chroot (chroot_lib.Chroot|None): The chroot to clean, if desired.
83 output_dir (str|None): The path to optionally dump result files.
84
85 Returns:
86 list[str] - The paths to all of the modified ebuild files. This includes the
87 new files that were added (i.e. the new versions) and all of the removed
88 files (i.e. the old versions).
89 """
90 assert overlays
91
92 manifest = git.ManifestCheckout.Cached(constants.SOURCE_ROOT)
93
Alex Kleind6195b62019-08-06 16:01:16 -060094 uprev_manager = uprev_lib.UprevOverlayManager(overlays, manifest,
95 build_targets=build_targets,
96 chroot=chroot,
97 output_dir=output_dir)
Alex Kleineb77ffa2019-05-28 14:47:44 -060098 uprev_manager.uprev()
99
100 return uprev_manager.modified_ebuilds
101
102
Alex Klein87531182019-08-12 15:23:37 -0600103def uprev_versioned_package(package, build_targets, refs, chroot):
104 """Call registered uprev handler function for the package.
105
106 Args:
107 package (portage_util.CPV): The package being uprevved.
108 build_targets (list[build_target_util.BuildTarget]): The build targets to
109 clean on a successful uprev.
110 refs (list[uprev_lib.GitRef]):
111 chroot (chroot_lib.Chroot): The chroot to enter for cleaning.
112
113 Returns:
114 list[str]: The list of modified ebuilds.
115 """
116 assert package
117
118 if package.cp not in _UPREV_FUNCS:
119 raise UnknownPackageError(
120 'Package "%s" does not have a registered handler.' % package.cp)
121
122 return _UPREV_FUNCS[package.cp](build_targets, refs, chroot)
123
124
125@uprevs_versioned_package(constants.CHROME_CP)
126def uprev_chrome(build_targets, refs, chroot):
127 """Uprev chrome and its related packages.
128
129 See: uprev_versioned_package.
130 """
131 # Determine the version from the refs (tags), i.e. the chrome versions are the
132 # tag names.
133 chrome_version = uprev_lib.get_chrome_version_from_refs(refs)
134
135 uprev_manager = uprev_lib.UprevChromeManager(
136 chrome_version, build_targets=build_targets, chroot=chroot)
137 # Start with chrome itself, as we can't do anything else unless chrome
138 # uprevs successfully.
139 if not uprev_manager.uprev(constants.CHROME_CP):
140 return []
141
142 # With a successful chrome rev, also uprev related packages.
143 for package in constants.OTHER_CHROME_PACKAGES:
144 uprev_manager.uprev(package)
145
146 return uprev_manager.modified_ebuilds
147
148
David Burger1e0fe232019-07-01 14:52:07 -0600149def get_best_visible(atom):
150 """Returns the best visible CPV for the given atom."""
151 assert atom
152 return portage_util.PortageqBestVisible(atom)