Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 1 | # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
| 5 | """This module uprevs a given package's ebuild to the next revision.""" |
| 6 | |
Chris McDonald | 59650c3 | 2021-07-20 15:29:28 -0600 | [diff] [blame] | 7 | import logging |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 8 | import os |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 9 | |
Ram Chandrasekar | 60f69f3 | 2022-06-03 22:49:30 +0000 | [diff] [blame] | 10 | from chromite.lib import chromeos_version |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 11 | from chromite.lib import commandline |
Chris McDonald | 59650c3 | 2021-07-20 15:29:28 -0600 | [diff] [blame] | 12 | from chromite.lib import constants |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 13 | from chromite.lib import cros_build_lib |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 14 | from chromite.lib import git |
Mike Frysinger | fddaeb5 | 2012-11-20 11:17:31 -0500 | [diff] [blame] | 15 | from chromite.lib import osutils |
David James | 6450a0a | 2012-12-04 07:59:53 -0800 | [diff] [blame] | 16 | from chromite.lib import parallel |
Alex Deymo | 075c229 | 2014-09-04 18:31:50 -0700 | [diff] [blame] | 17 | from chromite.lib import portage_util |
Lann Martin | b26e129 | 2018-08-09 13:59:19 -0600 | [diff] [blame] | 18 | from chromite.lib import repo_util |
Sergey Frolov | 0161f8b | 2021-07-07 17:41:10 -0600 | [diff] [blame] | 19 | from chromite.lib import retry_util |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 20 | |
Mike Frysinger | 3278140 | 2020-04-19 06:34:17 -0400 | [diff] [blame] | 21 | |
Gabe Black | 71e963e | 2014-10-28 20:19:59 -0700 | [diff] [blame] | 22 | # Commit message subject for uprevving Portage packages. |
| 23 | GIT_COMMIT_SUBJECT = 'Marking set of ebuilds as stable' |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 24 | |
David James | 29e86d5 | 2013-04-19 09:41:29 -0700 | [diff] [blame] | 25 | # Commit message for uprevving Portage packages. |
| 26 | _GIT_COMMIT_MESSAGE = 'Marking 9999 ebuild for %s as stable.' |
| 27 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 28 | # Dictionary of valid commands with usage information. |
| 29 | COMMAND_DICTIONARY = { |
Mike Frysinger | 5cd8c74 | 2013-10-11 14:43:01 -0400 | [diff] [blame] | 30 | 'commit': 'Marks given ebuilds as stable locally', |
| 31 | 'push': 'Pushes previous marking of ebuilds to remote repo', |
| 32 | } |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 33 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 34 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 35 | # ======================= Global Helper Functions ======================== |
| 36 | |
| 37 | |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 38 | def CleanStalePackages(srcroot, boards, package_atoms): |
Chris Sosa | bf15387 | 2011-04-28 14:21:09 -0700 | [diff] [blame] | 39 | """Cleans up stale package info from a previous build. |
Mike Frysinger | 5cd8c74 | 2013-10-11 14:43:01 -0400 | [diff] [blame] | 40 | |
Chris Sosa | bf15387 | 2011-04-28 14:21:09 -0700 | [diff] [blame] | 41 | Args: |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 42 | srcroot: Root directory of the source tree. |
David James | cc09c9b | 2012-01-26 22:10:13 -0800 | [diff] [blame] | 43 | boards: Boards to clean the packages from. |
Mike Frysinger | de5ab0e | 2013-03-21 20:48:36 -0400 | [diff] [blame] | 44 | package_atoms: A list of package atoms to unmerge. |
Chris Sosa | bf15387 | 2011-04-28 14:21:09 -0700 | [diff] [blame] | 45 | """ |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 46 | if package_atoms: |
Lann Martin | ffb9516 | 2018-08-28 12:02:54 -0600 | [diff] [blame] | 47 | logging.info('Cleaning up stale packages %s.', package_atoms) |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 48 | |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 49 | # First unmerge all the packages for a board, then eclean it. |
| 50 | # We need these two steps to run in order (unmerge/eclean), |
| 51 | # but we can let all the boards run in parallel. |
| 52 | def _CleanStalePackages(board): |
| 53 | if board: |
| 54 | suffix = '-' + board |
Mike Frysinger | 45602c7 | 2019-09-22 02:15:11 -0400 | [diff] [blame] | 55 | runcmd = cros_build_lib.run |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 56 | else: |
| 57 | suffix = '' |
Mike Frysinger | 45602c7 | 2019-09-22 02:15:11 -0400 | [diff] [blame] | 58 | runcmd = cros_build_lib.sudo_run |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 59 | |
David James | 59a0a2b | 2013-03-22 14:04:44 -0700 | [diff] [blame] | 60 | emerge, eclean = 'emerge' + suffix, 'eclean' + suffix |
| 61 | if not osutils.FindMissingBinaries([emerge, eclean]): |
David James | 63841a8 | 2014-01-16 14:39:24 -0800 | [diff] [blame] | 62 | if package_atoms: |
| 63 | # If nothing was found to be unmerged, emerge will exit(1). |
Don Garrett | 7100fff | 2018-10-23 11:07:13 -0700 | [diff] [blame] | 64 | result = runcmd([emerge, '-q', '--unmerge'] + list(package_atoms), |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 65 | enter_chroot=True, extra_env={'CLEAN_DELAY': '0'}, |
Mike Frysinger | f5a3b2d | 2019-12-12 14:36:17 -0500 | [diff] [blame] | 66 | check=False, cwd=srcroot) |
Mike Frysinger | 0150411 | 2019-08-24 19:35:24 -0400 | [diff] [blame] | 67 | if result.returncode not in (0, 1): |
David James | 63841a8 | 2014-01-16 14:39:24 -0800 | [diff] [blame] | 68 | raise cros_build_lib.RunCommandError('unexpected error', result) |
David James | 59a0a2b | 2013-03-22 14:04:44 -0700 | [diff] [blame] | 69 | runcmd([eclean, '-d', 'packages'], |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 70 | cwd=srcroot, enter_chroot=True, |
Mike Frysinger | 0282d22 | 2019-12-17 17:15:48 -0500 | [diff] [blame] | 71 | stdout=True, stderr=True) |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 72 | |
| 73 | tasks = [] |
David James | cc09c9b | 2012-01-26 22:10:13 -0800 | [diff] [blame] | 74 | for board in boards: |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 75 | tasks.append([board]) |
| 76 | tasks.append([None]) |
| 77 | |
David James | 6450a0a | 2012-12-04 07:59:53 -0800 | [diff] [blame] | 78 | parallel.RunTasksInProcessPool(_CleanStalePackages, tasks) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 79 | |
| 80 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 81 | # TODO(build): This code needs to be gutted and rebased to cros_build_lib. |
| 82 | def _DoWeHaveLocalCommits(stable_branch, tracking_branch, cwd): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 83 | """Returns true if there are local commits.""" |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 84 | output = git.RunGit( |
Mike Frysinger | 876a8e5 | 2022-06-23 18:07:30 -0400 | [diff] [blame^] | 85 | cwd, ['rev-parse', stable_branch, tracking_branch]).stdout.split() |
Brian Harring | 5b86b5e | 2012-05-25 18:27:40 -0700 | [diff] [blame] | 86 | return output[0] != output[1] |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 87 | |
| 88 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 89 | # ======================= End Global Helper Functions ======================== |
| 90 | |
| 91 | |
Ningning Xia | 5200906 | 2016-05-09 14:33:51 -0700 | [diff] [blame] | 92 | def PushChange(stable_branch, tracking_branch, dryrun, cwd, |
| 93 | staging_branch=None): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 94 | """Pushes commits in the stable_branch to the remote git repository. |
| 95 | |
David James | ee2da62 | 2012-02-23 09:32:16 -0800 | [diff] [blame] | 96 | Pushes local commits from calls to CommitChange to the remote git |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 97 | repository specified by current working directory. If changes are |
| 98 | found to commit, they will be merged to the merge branch and pushed. |
| 99 | In that case, the local repository will be left on the merge branch. |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 100 | |
| 101 | Args: |
| 102 | stable_branch: The local branch with commits we want to push. |
| 103 | tracking_branch: The tracking branch of the local branch. |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 104 | dryrun: Use git push --dryrun to emulate a push. |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 105 | cwd: The directory to run commands in. |
Ningning Xia | 5200906 | 2016-05-09 14:33:51 -0700 | [diff] [blame] | 106 | staging_branch: The staging branch to push for a failed PFQ run |
Mike Frysinger | 1a736a8 | 2013-12-12 01:50:59 -0500 | [diff] [blame] | 107 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 108 | Raises: |
Mike Frysinger | 5cd8c74 | 2013-10-11 14:43:01 -0400 | [diff] [blame] | 109 | OSError: Error occurred while pushing. |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 110 | """ |
David James | 4795963 | 2015-10-23 07:56:01 -0700 | [diff] [blame] | 111 | if not git.DoesCommitExistInRepo(cwd, stable_branch): |
| 112 | logging.debug('No branch created for %s. Exiting', cwd) |
| 113 | return |
| 114 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 115 | if not _DoWeHaveLocalCommits(stable_branch, tracking_branch, cwd): |
David James | 4795963 | 2015-10-23 07:56:01 -0700 | [diff] [blame] | 116 | logging.debug('No work found to push in %s. Exiting', cwd) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 117 | return |
| 118 | |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 119 | # For the commit queue, our local branch may contain commits that were |
| 120 | # just tested and pushed during the CommitQueueCompletion stage. Sync |
| 121 | # and rebase our local branch on top of the remote commits. |
Paul Hobbs | 72d8e39 | 2015-10-21 17:24:23 -0700 | [diff] [blame] | 122 | remote_ref = git.GetTrackingBranch(cwd, |
| 123 | branch=stable_branch, |
| 124 | for_push=True) |
Paul Hobbs | 1e46be8 | 2015-10-30 13:46:02 -0700 | [diff] [blame] | 125 | # SyncPushBranch rebases HEAD onto the updated remote. We need to checkout |
| 126 | # stable_branch here in order to update it. |
| 127 | git.RunGit(cwd, ['checkout', stable_branch]) |
Don Garrett | 9944959 | 2015-03-25 11:01:30 -0700 | [diff] [blame] | 128 | git.SyncPushBranch(cwd, remote_ref.remote, remote_ref.ref) |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 129 | |
| 130 | # Check whether any local changes remain after the sync. |
Don Garrett | 9944959 | 2015-03-25 11:01:30 -0700 | [diff] [blame] | 131 | if not _DoWeHaveLocalCommits(stable_branch, remote_ref.ref, cwd): |
Ralph Nathan | 0304728 | 2015-03-23 11:09:32 -0700 | [diff] [blame] | 132 | logging.info('All changes already pushed for %s. Exiting', cwd) |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 133 | return |
| 134 | |
LaMont Jones | e708e40 | 2021-06-10 08:54:30 -0600 | [diff] [blame] | 135 | # Add a failsafe check here. Only CLs from these users should be here. |
| 136 | # - 'chrome-bot', |
| 137 | # - 'chromeos-ci-prod' |
| 138 | # - 'chromeos-ci-release' |
| 139 | # If any other CLs are found then complain. In dryruns extra CLs are normal, |
| 140 | # though, and can be ignored. |
Andrew Lamb | 7ef2c0b | 2019-07-17 09:43:27 -0600 | [diff] [blame] | 141 | bad_cl_cmd = [ |
| 142 | 'log', '--format=short', '--perl-regexp', '--author', |
LaMont Jones | e708e40 | 2021-06-10 08:54:30 -0600 | [diff] [blame] | 143 | '^(?!chrome-bot|chromeos-ci-prod|chromeos-ci-release)', |
Andrew Lamb | 7ef2c0b | 2019-07-17 09:43:27 -0600 | [diff] [blame] | 144 | '%s..%s' % (remote_ref.ref, stable_branch) |
| 145 | ] |
Mike Frysinger | 876a8e5 | 2022-06-23 18:07:30 -0400 | [diff] [blame^] | 146 | bad_cls = git.RunGit(cwd, bad_cl_cmd).stdout |
Matt Tennant | cb52205 | 2013-11-25 14:23:43 -0800 | [diff] [blame] | 147 | if bad_cls.strip() and not dryrun: |
Andrew Lamb | 7ef2c0b | 2019-07-17 09:43:27 -0600 | [diff] [blame] | 148 | logging.error( |
| 149 | 'The Uprev stage found changes from users other than ' |
LaMont Jones | e708e40 | 2021-06-10 08:54:30 -0600 | [diff] [blame] | 150 | 'chrome-bot or chromeos-ci-prod or chromeos-ci-release:\n\n%s', bad_cls) |
Matt Tennant | cb52205 | 2013-11-25 14:23:43 -0800 | [diff] [blame] | 151 | raise AssertionError('Unexpected CLs found during uprev stage.') |
| 152 | |
Lev Rumyantsev | 25352ba | 2016-09-07 15:53:58 -0700 | [diff] [blame] | 153 | if staging_branch is not None: |
| 154 | logging.info('PFQ FAILED. Pushing uprev change to staging branch %s', |
| 155 | staging_branch) |
| 156 | |
Mike Frysinger | e65f375 | 2014-12-08 00:46:39 -0500 | [diff] [blame] | 157 | description = git.RunGit( |
| 158 | cwd, |
| 159 | ['log', '--format=format:%s%n%n%b', |
Mike Frysinger | 876a8e5 | 2022-06-23 18:07:30 -0400 | [diff] [blame^] | 160 | '%s..%s' % (remote_ref.ref, stable_branch)]).stdout |
Gabe Black | 71e963e | 2014-10-28 20:19:59 -0700 | [diff] [blame] | 161 | description = '%s\n\n%s' % (GIT_COMMIT_SUBJECT, description) |
Ralph Nathan | 0304728 | 2015-03-23 11:09:32 -0700 | [diff] [blame] | 162 | logging.info('For %s, using description %s', cwd, description) |
Paul Hobbs | f52ea8f | 2015-10-21 17:24:23 -0700 | [diff] [blame] | 163 | git.CreatePushBranch(constants.MERGE_BRANCH, cwd, |
| 164 | remote_push_branch=remote_ref) |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 165 | git.RunGit(cwd, ['merge', '--squash', stable_branch]) |
| 166 | git.RunGit(cwd, ['commit', '-m', description]) |
| 167 | git.RunGit(cwd, ['config', 'push.default', 'tracking']) |
Sergey Frolov | 0161f8b | 2021-07-07 17:41:10 -0600 | [diff] [blame] | 168 | |
| 169 | # Run git.PushBranch and retry up to 5 times. |
| 170 | # retry_util.RetryCommand will only retry on RunCommandErrors, |
| 171 | # which would be thrown by git.PushBranch when it gets to |
| 172 | # cros_build_lib.run()'ning the actual git command, |
| 173 | # which may fail with a transient HTTP 429 Too Many Requests error, |
| 174 | # and we need to retry on that. |
| 175 | # Do not retry if it fails to setup before cros_build_lib.run |
| 176 | # or upon other errors, like getting SIGINT. |
| 177 | max_retries = 5 |
| 178 | retry_util.RetryCommand( |
| 179 | git.PushBranch, |
| 180 | max_retries, |
| 181 | constants.MERGE_BRANCH, |
| 182 | cwd, |
| 183 | dryrun=dryrun, |
| 184 | staging_branch=staging_branch, |
| 185 | sleep=15, |
| 186 | log_retries=True, |
| 187 | ) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 188 | |
| 189 | |
| 190 | class GitBranch(object): |
| 191 | """Wrapper class for a git branch.""" |
| 192 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 193 | def __init__(self, branch_name, tracking_branch, cwd): |
David James | c7c4ff5 | 2013-09-18 17:57:13 -0700 | [diff] [blame] | 194 | """Sets up variables but does not create the branch. |
| 195 | |
Mike Frysinger | 5cd8c74 | 2013-10-11 14:43:01 -0400 | [diff] [blame] | 196 | Args: |
David James | c7c4ff5 | 2013-09-18 17:57:13 -0700 | [diff] [blame] | 197 | branch_name: The name of the branch. |
| 198 | tracking_branch: The associated tracking branch. |
| 199 | cwd: The git repository to work in. |
| 200 | """ |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 201 | self.branch_name = branch_name |
| 202 | self.tracking_branch = tracking_branch |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 203 | self.cwd = cwd |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 204 | |
| 205 | def CreateBranch(self): |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 206 | self.Checkout() |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 207 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 208 | def Checkout(self, branch=None): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 209 | """Function used to check out to another GitBranch.""" |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 210 | if not branch: |
| 211 | branch = self.branch_name |
| 212 | if branch == self.tracking_branch or self.Exists(branch): |
Lann Martin | b26e129 | 2018-08-09 13:59:19 -0600 | [diff] [blame] | 213 | git.RunGit(self.cwd, ['checkout', '-f', branch], quiet=True) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 214 | else: |
Lann Martin | b26e129 | 2018-08-09 13:59:19 -0600 | [diff] [blame] | 215 | repo = repo_util.Repository.MustFind(self.cwd) |
| 216 | repo.StartBranch(branch, projects=['.'], cwd=self.cwd) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 217 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 218 | def Exists(self, branch=None): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 219 | """Returns True if the branch exists.""" |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 220 | if not branch: |
| 221 | branch = self.branch_name |
Mike Frysinger | 876a8e5 | 2022-06-23 18:07:30 -0400 | [diff] [blame^] | 222 | branches = git.RunGit(self.cwd, ['branch']).stdout |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 223 | return branch in branches.split() |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 224 | |
| 225 | |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 226 | def GetParser(): |
| 227 | """Creates the argparse parser.""" |
| 228 | parser = commandline.ArgumentParser() |
| 229 | parser.add_argument('--all', action='store_true', |
| 230 | help='Mark all packages as stable.') |
| 231 | parser.add_argument('-b', '--boards', default='', |
| 232 | help='Colon-separated list of boards.') |
Mike Nichols | f7f13a8 | 2019-01-11 17:11:04 +0000 | [diff] [blame] | 233 | parser.add_argument('--drop_file', |
| 234 | help='File to list packages that were revved.') |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 235 | parser.add_argument('--dryrun', action='store_true', |
| 236 | help='Passes dry-run to git push if pushing a change.') |
Bertrand SIMONNET | 6af5430 | 2015-08-05 10:12:49 -0700 | [diff] [blame] | 237 | parser.add_argument('--force', action='store_true', |
Nicolas Boichat | de92a6d | 2021-03-31 16:43:50 +0800 | [diff] [blame] | 238 | help='Force the stabilization of packages marked for ' |
| 239 | 'manual uprev. ' |
Bertrand SIMONNET | 6af5430 | 2015-08-05 10:12:49 -0700 | [diff] [blame] | 240 | '(only compatible with -p)') |
Sam McNally | eb5e205 | 2018-09-05 16:34:55 +1000 | [diff] [blame] | 241 | parser.add_argument('--list_revisions', action='store_true', |
| 242 | help='List all revisions included in the commit message.') |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 243 | parser.add_argument('-o', '--overlays', |
| 244 | help='Colon-separated list of overlays to modify.') |
Don Garrett | f9eff95 | 2018-08-10 16:50:04 -0700 | [diff] [blame] | 245 | parser.add_argument('--overlay-type', |
| 246 | help='Populates --overlays based on "public", "private"' |
| 247 | ', or "both".') |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 248 | parser.add_argument('-p', '--packages', |
| 249 | help='Colon separated list of packages to rev.') |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 250 | parser.add_argument('--buildroot', type='path', |
| 251 | help='Path to buildroot.') |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 252 | parser.add_argument('-r', '--srcroot', type='path', |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 253 | help='Path to root src. Deprecated in favor of ' |
| 254 | '--buildroot') |
Ningning Xia | 5200906 | 2016-05-09 14:33:51 -0700 | [diff] [blame] | 255 | parser.add_argument('--staging_branch', |
| 256 | help='The staging branch to push changes') |
Mike Frysinger | 1f4478c | 2019-10-20 18:33:17 -0400 | [diff] [blame] | 257 | parser.add_argument('command', choices=sorted(COMMAND_DICTIONARY), |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 258 | help='Command to run.') |
| 259 | return parser |
| 260 | |
| 261 | |
| 262 | def main(argv): |
| 263 | parser = GetParser() |
| 264 | options = parser.parse_args(argv) |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 265 | |
| 266 | # TODO: Remove this code in favor of a simple default on buildroot when |
| 267 | # srcroot is removed. |
| 268 | if options.srcroot and not options.buildroot: |
| 269 | # Convert /<repo>/src -> <repo> |
| 270 | options.buildroot = os.path.dirname(options.srcroot) |
| 271 | if not options.buildroot: |
| 272 | options.buildroot = constants.SOURCE_ROOT |
| 273 | options.srcroot = None |
| 274 | |
Bertrand SIMONNET | 6af5430 | 2015-08-05 10:12:49 -0700 | [diff] [blame] | 275 | options.Freeze() |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 276 | |
Bertrand SIMONNET | 6af5430 | 2015-08-05 10:12:49 -0700 | [diff] [blame] | 277 | if options.command == 'commit': |
| 278 | if not options.packages and not options.all: |
| 279 | parser.error('Please specify at least one package (--packages)') |
| 280 | if options.force and options.all: |
| 281 | parser.error('Cannot use --force with --all. You must specify a list of ' |
| 282 | 'packages you want to force uprev.') |
| 283 | |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 284 | if not os.path.isdir(options.buildroot): |
| 285 | parser.error('buildroot is not a valid path: %s' % options.buildroot) |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 286 | |
Don Garrett | f9eff95 | 2018-08-10 16:50:04 -0700 | [diff] [blame] | 287 | if options.overlay_type and options.overlays: |
| 288 | parser.error('Cannot use --overlay-type with --overlays.') |
| 289 | |
Alex Deymo | 075c229 | 2014-09-04 18:31:50 -0700 | [diff] [blame] | 290 | portage_util.EBuild.VERBOSE = options.verbose |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 291 | |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 292 | package_list = None |
| 293 | if options.packages: |
| 294 | package_list = options.packages.split(':') |
| 295 | |
Ningning Xia | db88432 | 2018-01-26 16:27:06 -0800 | [diff] [blame] | 296 | overlays = [] |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 297 | if options.overlays: |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 298 | for path in options.overlays.split(':'): |
Ryan Cui | 05a31ba | 2011-05-31 17:47:37 -0700 | [diff] [blame] | 299 | if not os.path.isdir(path): |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 300 | cros_build_lib.Die('Cannot find overlay: %s' % path) |
Ningning Xia | db88432 | 2018-01-26 16:27:06 -0800 | [diff] [blame] | 301 | overlays.append(os.path.realpath(path)) |
Don Garrett | f9eff95 | 2018-08-10 16:50:04 -0700 | [diff] [blame] | 302 | elif options.overlay_type: |
| 303 | overlays = portage_util.FindOverlays( |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 304 | options.overlay_type, buildroot=options.buildroot) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 305 | else: |
Ralph Nathan | 446aee9 | 2015-03-23 14:44:56 -0700 | [diff] [blame] | 306 | logging.warning('Missing --overlays argument') |
Ningning Xia | db88432 | 2018-01-26 16:27:06 -0800 | [diff] [blame] | 307 | overlays.extend([ |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 308 | '%s/src/private-overlays/chromeos-overlay' % options.buildroot, |
| 309 | '%s/src/third_party/chromiumos-overlay' % options.buildroot]) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 310 | |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 311 | manifest = git.ManifestCheckout.Cached(options.buildroot) |
Ryan Cui | 4656a3c | 2011-05-24 12:30:30 -0700 | [diff] [blame] | 312 | |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 313 | # Dict mapping from each overlay to its tracking branch. |
| 314 | overlay_tracking_branch = {} |
| 315 | # Dict mapping from each git repository (project) to a list of its overlays. |
| 316 | git_project_overlays = {} |
| 317 | |
| 318 | for overlay in overlays: |
| 319 | remote_ref = git.GetTrackingBranchViaManifest(overlay, manifest=manifest) |
| 320 | overlay_tracking_branch[overlay] = remote_ref.ref |
| 321 | git_project_overlays.setdefault(remote_ref.project_name, []).append(overlay) |
| 322 | |
| 323 | if options.command == 'push': |
| 324 | _WorkOnPush(options, overlay_tracking_branch, git_project_overlays) |
| 325 | elif options.command == 'commit': |
| 326 | _WorkOnCommit(options, overlays, overlay_tracking_branch, |
| 327 | git_project_overlays, manifest, package_list) |
| 328 | |
| 329 | |
| 330 | def _WorkOnPush(options, overlay_tracking_branch, git_project_overlays): |
| 331 | """Push uprevs of overlays belonging to differet git projects in parallel. |
| 332 | |
| 333 | Args: |
| 334 | options: The options object returned by the argument parser. |
| 335 | overlay_tracking_branch: A dict mapping from each overlay to its tracking |
| 336 | branch. |
| 337 | git_project_overlays: A dict mapping from each git repository to a list of |
| 338 | its overlays. |
| 339 | """ |
| 340 | inputs = [[options, overlays_per_project, overlay_tracking_branch] |
Mike Frysinger | 0bdbc10 | 2019-06-13 15:27:29 -0400 | [diff] [blame] | 341 | for overlays_per_project in git_project_overlays.values()] |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 342 | parallel.RunTasksInProcessPool(_PushOverlays, inputs) |
| 343 | |
| 344 | |
| 345 | def _PushOverlays(options, overlays, overlay_tracking_branch): |
| 346 | """Push uprevs for overlays in sequence. |
| 347 | |
| 348 | Args: |
| 349 | options: The options object returned by the argument parser. |
| 350 | overlays: A list of overlays to push uprevs in sequence. |
| 351 | overlay_tracking_branch: A dict mapping from each overlay to its tracking |
| 352 | branch. |
| 353 | """ |
| 354 | for overlay in overlays: |
| 355 | if not os.path.isdir(overlay): |
| 356 | logging.warning('Skipping %s, which is not a directory.', overlay) |
| 357 | continue |
| 358 | |
| 359 | tracking_branch = overlay_tracking_branch[overlay] |
| 360 | PushChange(constants.STABLE_EBUILD_BRANCH, tracking_branch, options.dryrun, |
| 361 | cwd=overlay, staging_branch=options.staging_branch) |
| 362 | |
| 363 | |
| 364 | def _WorkOnCommit(options, overlays, overlay_tracking_branch, |
| 365 | git_project_overlays, manifest, package_list): |
| 366 | """Commit uprevs of overlays belonging to different git projects in parallel. |
| 367 | |
| 368 | Args: |
| 369 | options: The options object returned by the argument parser. |
| 370 | overlays: A list of overlays to work on. |
| 371 | overlay_tracking_branch: A dict mapping from each overlay to its tracking |
| 372 | branch. |
| 373 | git_project_overlays: A dict mapping from each git repository to a list of |
| 374 | its overlays. |
| 375 | manifest: The manifest of the given source root. |
| 376 | package_list: A list of packages passed from commandline to work on. |
| 377 | """ |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 378 | # We cleaned up self referential ebuilds by this version, but don't enforce |
| 379 | # the check on older ones to avoid breaking factory/firmware branches. |
Ram Chandrasekar | 60f69f3 | 2022-06-03 22:49:30 +0000 | [diff] [blame] | 380 | root_version = chromeos_version.VersionInfo.from_repo(options.buildroot) |
| 381 | no_self_repos_version = chromeos_version.VersionInfo('13099.0.0') |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 382 | reject_self_repo = root_version >= no_self_repos_version |
| 383 | |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 384 | overlay_ebuilds = _GetOverlayToEbuildsMap(options, overlays, package_list) |
David James | 84e953c | 2013-04-23 18:44:06 -0700 | [diff] [blame] | 385 | |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 386 | with parallel.Manager() as manager: |
| 387 | # Contains the array of packages we actually revved. |
| 388 | revved_packages = manager.list() |
| 389 | new_package_atoms = manager.list() |
David James | a8457b5 | 2011-05-28 00:03:20 -0700 | [diff] [blame] | 390 | |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 391 | inputs = [[options, manifest, overlays_per_project, overlay_tracking_branch, |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 392 | overlay_ebuilds, revved_packages, new_package_atoms, |
| 393 | reject_self_repo] |
Mike Frysinger | 0bdbc10 | 2019-06-13 15:27:29 -0400 | [diff] [blame] | 394 | for overlays_per_project in git_project_overlays.values()] |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 395 | parallel.RunTasksInProcessPool(_CommitOverlays, inputs) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 396 | |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 397 | chroot_path = os.path.join(options.buildroot, constants.DEFAULT_CHROOT_DIR) |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 398 | if os.path.exists(chroot_path): |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 399 | CleanStalePackages(options.buildroot, options.boards.split(':'), |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 400 | new_package_atoms) |
Mike Nichols | f7f13a8 | 2019-01-11 17:11:04 +0000 | [diff] [blame] | 401 | if options.drop_file: |
| 402 | osutils.WriteFile(options.drop_file, ' '.join(revved_packages)) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 403 | |
Brian Harring | 609dc4e | 2012-05-07 02:17:44 -0700 | [diff] [blame] | 404 | |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 405 | def _GetOverlayToEbuildsMap(options, overlays, package_list): |
| 406 | """Get ebuilds for overlays. |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 407 | |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 408 | Args: |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 409 | options: The options object returned by the argument parser. |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 410 | overlays: A list of overlays to work on. |
| 411 | package_list: A list of packages passed from commandline to work on. |
| 412 | |
| 413 | Returns: |
| 414 | A dict mapping each overlay to a list of ebuilds belonging to it. |
| 415 | """ |
Ram Chandrasekar | 60f69f3 | 2022-06-03 22:49:30 +0000 | [diff] [blame] | 416 | root_version = chromeos_version.VersionInfo.from_repo(options.buildroot) |
| 417 | subdir_removal = chromeos_version.VersionInfo('10363.0.0') |
Don Garrett | 3dbb293 | 2018-10-02 14:41:26 -0700 | [diff] [blame] | 418 | require_subdir_support = root_version < subdir_removal |
| 419 | |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 420 | overlay_ebuilds = {} |
Don Garrett | 3dbb293 | 2018-10-02 14:41:26 -0700 | [diff] [blame] | 421 | inputs = [[overlay, options.all, package_list, options.force, |
| 422 | require_subdir_support] |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 423 | for overlay in overlays] |
| 424 | result = parallel.RunTasksInProcessPool( |
| 425 | portage_util.GetOverlayEBuilds, inputs) |
| 426 | for idx, ebuilds in enumerate(result): |
| 427 | overlay_ebuilds[overlays[idx]] = ebuilds |
| 428 | |
| 429 | return overlay_ebuilds |
| 430 | |
| 431 | |
| 432 | def _CommitOverlays(options, manifest, overlays, overlay_tracking_branch, |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 433 | overlay_ebuilds, revved_packages, new_package_atoms, |
| 434 | reject_self_repo=True): |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 435 | """Commit uprevs for overlays in sequence. |
| 436 | |
| 437 | Args: |
| 438 | options: The options object returned by the argument parser. |
| 439 | manifest: The manifest of the given source root. |
| 440 | overlays: A list over overlays to commit. |
| 441 | overlay_tracking_branch: A dict mapping from each overlay to its tracking |
| 442 | branch. |
| 443 | overlay_ebuilds: A dict mapping overlays to their ebuilds. |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 444 | revved_packages: A shared list of revved packages. |
| 445 | new_package_atoms: A shared list of new package atoms. |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 446 | reject_self_repo: Whether to abort if the ebuild lives in the same git |
| 447 | repo as it is tracking for uprevs. |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 448 | """ |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 449 | for overlay in overlays: |
| 450 | if not os.path.isdir(overlay): |
| 451 | logging.warning('Skipping %s, which is not a directory.', overlay) |
| 452 | continue |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 453 | |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 454 | # Note we intentionally work from the non push tracking branch; |
| 455 | # everything built thus far has been against it (meaning, http mirrors), |
| 456 | # thus we should honor that. During the actual push, the code switches |
| 457 | # to the correct urls, and does an appropriate rebasing. |
| 458 | tracking_branch = overlay_tracking_branch[overlay] |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 459 | |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 460 | existing_commit = git.GetGitRepoRevision(overlay) |
Lann Martin | e0ef98c | 2018-06-11 13:12:24 -0600 | [diff] [blame] | 461 | |
| 462 | # Make sure we run in the top-level git directory in case we are |
| 463 | # adding/removing an overlay in existing_commit. |
| 464 | git_root = git.FindGitTopLevel(overlay) |
| 465 | if git_root is None: |
| 466 | cros_build_lib.Die('No git repo at overlay directory %s.', overlay) |
| 467 | |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 468 | work_branch = GitBranch(constants.STABLE_EBUILD_BRANCH, tracking_branch, |
Lann Martin | e0ef98c | 2018-06-11 13:12:24 -0600 | [diff] [blame] | 469 | cwd=git_root) |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 470 | work_branch.CreateBranch() |
| 471 | if not work_branch.Exists(): |
| 472 | cros_build_lib.Die('Unable to create stabilizing branch in %s' % |
| 473 | overlay) |
| 474 | |
| 475 | # In the case of uprevving overlays that have patches applied to them, |
| 476 | # include the patched changes in the stabilizing branch. |
Lann Martin | e0ef98c | 2018-06-11 13:12:24 -0600 | [diff] [blame] | 477 | git.RunGit(git_root, ['rebase', existing_commit]) |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 478 | |
Ningning Xia | db88432 | 2018-01-26 16:27:06 -0800 | [diff] [blame] | 479 | ebuilds = overlay_ebuilds.get(overlay, []) |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 480 | if ebuilds: |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 481 | with parallel.Manager() as manager: |
| 482 | # Contains the array of packages we actually revved. |
| 483 | messages = manager.list() |
| 484 | ebuild_paths_to_add = manager.list() |
| 485 | ebuild_paths_to_remove = manager.list() |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 486 | |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 487 | inputs = [[overlay, ebuild, manifest, options, ebuild_paths_to_add, |
| 488 | ebuild_paths_to_remove, messages, revved_packages, |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 489 | new_package_atoms, reject_self_repo] |
| 490 | for ebuild in ebuilds] |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 491 | parallel.RunTasksInProcessPool(_WorkOnEbuild, inputs) |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 492 | |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 493 | if ebuild_paths_to_add: |
| 494 | logging.info('Adding new stable ebuild paths %s in overlay %s.', |
| 495 | ebuild_paths_to_add, overlay) |
| 496 | git.RunGit(overlay, ['add'] + list(ebuild_paths_to_add)) |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 497 | |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 498 | if ebuild_paths_to_remove: |
| 499 | logging.info('Removing old ebuild paths %s in overlay %s.', |
| 500 | ebuild_paths_to_remove, overlay) |
| 501 | git.RunGit(overlay, ['rm', '-f'] + list(ebuild_paths_to_remove)) |
| 502 | |
| 503 | if messages: |
| 504 | portage_util.EBuild.CommitChange('\n\n'.join(messages), overlay) |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 505 | |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 506 | |
| 507 | def _WorkOnEbuild(overlay, ebuild, manifest, options, ebuild_paths_to_add, |
| 508 | ebuild_paths_to_remove, messages, revved_packages, |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 509 | new_package_atoms, reject_self_repo=True): |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 510 | """Work on a single ebuild. |
| 511 | |
| 512 | Args: |
| 513 | overlay: The overlay where the ebuild belongs to. |
| 514 | ebuild: The ebuild to work on. |
| 515 | manifest: The manifest of the given source root. |
| 516 | options: The options object returned by the argument parser. |
| 517 | ebuild_paths_to_add: New stable ebuild paths to add to git. |
| 518 | ebuild_paths_to_remove: Old ebuild paths to remove from git. |
| 519 | messages: A share list of commit messages. |
| 520 | revved_packages: A shared list of revved packages. |
| 521 | new_package_atoms: A shared list of new package atoms. |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 522 | reject_self_repo: Whether to abort if the ebuild lives in the same git |
| 523 | repo as it is tracking for uprevs. |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 524 | """ |
| 525 | if options.verbose: |
| 526 | logging.info('Working on %s, info %s', ebuild.package, |
| 527 | ebuild.cros_workon_vars) |
Mike Frysinger | 00ba05a | 2020-06-12 02:44:02 -0400 | [diff] [blame] | 528 | if not ebuild.cros_workon_vars: |
| 529 | logging.warning('%s: unable to parse workon settings', ebuild.ebuild_path) |
| 530 | |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 531 | try: |
Don Garrett | 4fef8c3 | 2018-08-10 18:04:01 -0700 | [diff] [blame] | 532 | result = ebuild.RevWorkOnEBuild(os.path.join(options.buildroot, 'src'), |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 533 | manifest, reject_self_repo=reject_self_repo) |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 534 | if result: |
| 535 | new_package, ebuild_path_to_add, ebuild_path_to_remove = result |
| 536 | |
| 537 | if ebuild_path_to_add: |
| 538 | ebuild_paths_to_add.append(ebuild_path_to_add) |
| 539 | if ebuild_path_to_remove: |
| 540 | ebuild_paths_to_remove.append(ebuild_path_to_remove) |
| 541 | |
| 542 | messages.append(_GIT_COMMIT_MESSAGE % ebuild.package) |
Sam McNally | eb5e205 | 2018-09-05 16:34:55 +1000 | [diff] [blame] | 543 | |
| 544 | if options.list_revisions: |
| 545 | info = ebuild.GetSourceInfo(os.path.join(options.buildroot, 'src'), |
Mike Frysinger | 62ff8d7 | 2020-05-19 03:06:51 -0400 | [diff] [blame] | 546 | manifest, reject_self_repo=reject_self_repo) |
Sam McNally | eb5e205 | 2018-09-05 16:34:55 +1000 | [diff] [blame] | 547 | srcdirs = [os.path.join(options.buildroot, 'src', srcdir) |
| 548 | for srcdir in ebuild.cros_workon_vars.localname] |
| 549 | old_commit_ids = dict( |
| 550 | zip(srcdirs, ebuild.cros_workon_vars.commit.split(','))) |
| 551 | git_log = [] |
| 552 | for srcdir in info.srcdirs: |
| 553 | old_commit_id = old_commit_ids.get(srcdir) |
| 554 | new_commit_id = ebuild.GetCommitId(srcdir) |
| 555 | if not old_commit_id or old_commit_id == new_commit_id: |
| 556 | continue |
| 557 | |
| 558 | logs = git.RunGit(srcdir, [ |
| 559 | 'log', '%s..%s' % (old_commit_id[:8], new_commit_id[:8]), |
| 560 | '--pretty=format:%h %<(63,trunc)%s']) |
| 561 | git_log.append('$ ' + logs.cmdstr) |
Mike Frysinger | 876a8e5 | 2022-06-23 18:07:30 -0400 | [diff] [blame^] | 562 | git_log.extend(line.strip() for line in logs.stdout.splitlines()) |
Sam McNally | eb5e205 | 2018-09-05 16:34:55 +1000 | [diff] [blame] | 563 | if git_log: |
| 564 | messages.append('\n'.join(git_log)) |
| 565 | |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 566 | revved_packages.append(ebuild.package) |
| 567 | new_package_atoms.append('=%s' % new_package) |
David Burger | 8cf4a76 | 2020-03-09 10:33:38 -0600 | [diff] [blame] | 568 | except portage_util.InvalidUprevSourceError as e: |
| 569 | logging.error('An error occurred while uprevving %s: %s', |
| 570 | ebuild.package, e) |
| 571 | raise |
Alex Klein | 9992066 | 2019-10-14 15:30:15 -0600 | [diff] [blame] | 572 | except portage_util.EbuildVersionError as e: |
| 573 | logging.warning('Unable to rev %s: %s', ebuild.package, e) |
| 574 | raise |
Mike Frysinger | b32cc47 | 2020-05-15 00:17:54 -0400 | [diff] [blame] | 575 | except OSError: |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 576 | logging.warning( |
| 577 | 'Cannot rev %s\n' |
| 578 | 'Note you will have to go into %s ' |
Ningning Xia | 419e4eb | 2018-02-05 10:30:36 -0800 | [diff] [blame] | 579 | 'and reset the git repo yourself.', ebuild.package, overlay) |
Ningning Xia | 783efc0 | 2018-01-24 13:39:51 -0800 | [diff] [blame] | 580 | raise |