blob: 2ebfc561562dca699bbe6eb2bfed6af26d78be07 [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
Evan Hernandezb51f1522019-08-15 11:29:40 -060011import os
Alex Klein87531182019-08-12 15:23:37 -060012
Alex Kleineb77ffa2019-05-28 14:47:44 -060013from chromite.lib import constants
Evan Hernandezb51f1522019-08-15 11:29:40 -060014from chromite.lib import cros_build_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060015from chromite.lib import git
Evan Hernandezb51f1522019-08-15 11:29:40 -060016from chromite.lib import osutils
Alex Kleineb77ffa2019-05-28 14:47:44 -060017from chromite.lib import portage_util
Alex Kleind6195b62019-08-06 16:01:16 -060018from chromite.lib import uprev_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060019
Alex Klein87531182019-08-12 15:23:37 -060020# Registered handlers for uprevving versioned packages.
21_UPREV_FUNCS = {}
22
Alex Kleineb77ffa2019-05-28 14:47:44 -060023
24class Error(Exception):
25 """Module's base error class."""
26
27
28class UprevError(Error):
29 """An error occurred while uprevving packages."""
30
31
Alex Klein87531182019-08-12 15:23:37 -060032class UnknownPackageError(Error):
33 """Uprev attempted for a package without a registered handler."""
34
35
36def uprevs_versioned_package(package):
37 """Decorator to register package uprev handlers."""
38 assert package
39
40 def register(func):
41 """Registers |func| as a handler for |package|."""
42 _UPREV_FUNCS[package] = func
43
44 @functools.wraps(func)
45 def pass_through(*args, **kwargs):
46 return func(*args, **kwargs)
47
48 return pass_through
49
50 return register
51
52
Alex Kleineb77ffa2019-05-28 14:47:44 -060053def uprev_build_targets(build_targets, overlay_type, chroot=None,
54 output_dir=None):
55 """Uprev the set provided build targets, or all if not specified.
56
57 Args:
58 build_targets (list[build_target_util.BuildTarget]|None): The build targets
59 whose overlays should be uprevved, empty or None for all.
60 overlay_type (str): One of the valid overlay types except None (see
61 constants.VALID_OVERLAYS).
62 chroot (chroot_lib.Chroot|None): The chroot to clean, if desired.
63 output_dir (str|None): The path to optionally dump result files.
64 """
65 # Need a valid overlay, but exclude None.
66 assert overlay_type and overlay_type in constants.VALID_OVERLAYS
67
68 if build_targets:
69 overlays = portage_util.FindOverlaysForBoards(
70 overlay_type, boards=[t.name for t in build_targets])
71 else:
72 overlays = portage_util.FindOverlays(overlay_type)
73
74 return uprev_overlays(overlays, build_targets=build_targets, chroot=chroot,
75 output_dir=output_dir)
76
77
78def uprev_overlays(overlays, build_targets=None, chroot=None, output_dir=None):
79 """Uprev the given overlays.
80
81 Args:
82 overlays (list[str]): The list of overlay paths.
83 build_targets (list[build_target_util.BuildTarget]|None): The build targets
84 to clean in |chroot|, if desired. No effect unless |chroot| is provided.
85 chroot (chroot_lib.Chroot|None): The chroot to clean, if desired.
86 output_dir (str|None): The path to optionally dump result files.
87
88 Returns:
89 list[str] - The paths to all of the modified ebuild files. This includes the
90 new files that were added (i.e. the new versions) and all of the removed
91 files (i.e. the old versions).
92 """
93 assert overlays
94
95 manifest = git.ManifestCheckout.Cached(constants.SOURCE_ROOT)
96
Alex Kleind6195b62019-08-06 16:01:16 -060097 uprev_manager = uprev_lib.UprevOverlayManager(overlays, manifest,
98 build_targets=build_targets,
99 chroot=chroot,
100 output_dir=output_dir)
Alex Kleineb77ffa2019-05-28 14:47:44 -0600101 uprev_manager.uprev()
102
103 return uprev_manager.modified_ebuilds
104
105
Alex Klein87531182019-08-12 15:23:37 -0600106def uprev_versioned_package(package, build_targets, refs, chroot):
107 """Call registered uprev handler function for the package.
108
109 Args:
110 package (portage_util.CPV): The package being uprevved.
111 build_targets (list[build_target_util.BuildTarget]): The build targets to
112 clean on a successful uprev.
113 refs (list[uprev_lib.GitRef]):
114 chroot (chroot_lib.Chroot): The chroot to enter for cleaning.
115
116 Returns:
117 list[str]: The list of modified ebuilds.
118 """
119 assert package
120
121 if package.cp not in _UPREV_FUNCS:
122 raise UnknownPackageError(
123 'Package "%s" does not have a registered handler.' % package.cp)
124
125 return _UPREV_FUNCS[package.cp](build_targets, refs, chroot)
126
127
Evan Hernandezb51f1522019-08-15 11:29:40 -0600128# TODO(evanhernandez): Remove this. Only a quick hack for testing.
129@uprevs_versioned_package('sample/sample')
130def uprev_sample(*_args, **_kwargs):
131 """Mimics an uprev by changing files in sandbox repos.
132
133 See: uprev_versioned_package.
134 """
135 paths = [
136 os.path.join(constants.SOURCE_ROOT, 'infra/dummies', repo, 'sample.txt')
137 for repo in ('general-sandbox', 'merge-sandbox')
138 ]
139
140 for path in paths:
141 osutils.WriteFile(path, cros_build_lib.GetRandomString())
142
143 return paths
144
145
Alex Klein87531182019-08-12 15:23:37 -0600146@uprevs_versioned_package(constants.CHROME_CP)
147def uprev_chrome(build_targets, refs, chroot):
148 """Uprev chrome and its related packages.
149
150 See: uprev_versioned_package.
151 """
152 # Determine the version from the refs (tags), i.e. the chrome versions are the
153 # tag names.
154 chrome_version = uprev_lib.get_chrome_version_from_refs(refs)
155
156 uprev_manager = uprev_lib.UprevChromeManager(
157 chrome_version, build_targets=build_targets, chroot=chroot)
158 # Start with chrome itself, as we can't do anything else unless chrome
159 # uprevs successfully.
160 if not uprev_manager.uprev(constants.CHROME_CP):
161 return []
162
163 # With a successful chrome rev, also uprev related packages.
164 for package in constants.OTHER_CHROME_PACKAGES:
165 uprev_manager.uprev(package)
166
167 return uprev_manager.modified_ebuilds
168
169
David Burger1e0fe232019-07-01 14:52:07 -0600170def get_best_visible(atom):
171 """Returns the best visible CPV for the given atom."""
172 assert atom
173 return portage_util.PortageqBestVisible(atom)