Mike Frysinger | e58c0e2 | 2017-10-04 15:43:30 -0400 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 2 | # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | |
| 6 | """This module uprevs a given package's ebuild to the next revision.""" |
| 7 | |
Mike Frysinger | 383367e | 2014-09-16 15:06:17 -0400 | [diff] [blame] | 8 | from __future__ import print_function |
| 9 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 10 | import os |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 11 | |
Aviv Keshet | b7519e1 | 2016-10-04 00:50:00 -0700 | [diff] [blame] | 12 | from chromite.lib import constants |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 13 | from chromite.lib import commandline |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 14 | from chromite.lib import cros_build_lib |
Ralph Nathan | 0304728 | 2015-03-23 11:09:32 -0700 | [diff] [blame] | 15 | from chromite.lib import cros_logging as logging |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 16 | from chromite.lib import git |
Mike Frysinger | fddaeb5 | 2012-11-20 11:17:31 -0500 | [diff] [blame] | 17 | from chromite.lib import osutils |
David James | 6450a0a | 2012-12-04 07:59:53 -0800 | [diff] [blame] | 18 | from chromite.lib import parallel |
Alex Deymo | 075c229 | 2014-09-04 18:31:50 -0700 | [diff] [blame] | 19 | from chromite.lib import portage_util |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 20 | |
Gabe Black | 71e963e | 2014-10-28 20:19:59 -0700 | [diff] [blame] | 21 | # Commit message subject for uprevving Portage packages. |
| 22 | GIT_COMMIT_SUBJECT = 'Marking set of ebuilds as stable' |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 23 | |
David James | 29e86d5 | 2013-04-19 09:41:29 -0700 | [diff] [blame] | 24 | # Commit message for uprevving Portage packages. |
| 25 | _GIT_COMMIT_MESSAGE = 'Marking 9999 ebuild for %s as stable.' |
| 26 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 27 | # Dictionary of valid commands with usage information. |
| 28 | COMMAND_DICTIONARY = { |
Mike Frysinger | 5cd8c74 | 2013-10-11 14:43:01 -0400 | [diff] [blame] | 29 | 'commit': 'Marks given ebuilds as stable locally', |
| 30 | 'push': 'Pushes previous marking of ebuilds to remote repo', |
| 31 | } |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 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 | # ======================= Global Helper Functions ======================== |
| 35 | |
| 36 | |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 37 | def CleanStalePackages(srcroot, boards, package_atoms): |
Chris Sosa | bf15387 | 2011-04-28 14:21:09 -0700 | [diff] [blame] | 38 | """Cleans up stale package info from a previous build. |
Mike Frysinger | 5cd8c74 | 2013-10-11 14:43:01 -0400 | [diff] [blame] | 39 | |
Chris Sosa | bf15387 | 2011-04-28 14:21:09 -0700 | [diff] [blame] | 40 | Args: |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 41 | srcroot: Root directory of the source tree. |
David James | cc09c9b | 2012-01-26 22:10:13 -0800 | [diff] [blame] | 42 | boards: Boards to clean the packages from. |
Mike Frysinger | de5ab0e | 2013-03-21 20:48:36 -0400 | [diff] [blame] | 43 | package_atoms: A list of package atoms to unmerge. |
Chris Sosa | bf15387 | 2011-04-28 14:21:09 -0700 | [diff] [blame] | 44 | """ |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 45 | if package_atoms: |
Ralph Nathan | 0304728 | 2015-03-23 11:09:32 -0700 | [diff] [blame] | 46 | logging.info('Cleaning up stale packages %s.' % package_atoms) |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 47 | |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 48 | # First unmerge all the packages for a board, then eclean it. |
| 49 | # We need these two steps to run in order (unmerge/eclean), |
| 50 | # but we can let all the boards run in parallel. |
| 51 | def _CleanStalePackages(board): |
| 52 | if board: |
| 53 | suffix = '-' + board |
| 54 | runcmd = cros_build_lib.RunCommand |
| 55 | else: |
| 56 | suffix = '' |
| 57 | runcmd = cros_build_lib.SudoRunCommand |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 58 | |
David James | 59a0a2b | 2013-03-22 14:04:44 -0700 | [diff] [blame] | 59 | emerge, eclean = 'emerge' + suffix, 'eclean' + suffix |
| 60 | if not osutils.FindMissingBinaries([emerge, eclean]): |
David James | 63841a8 | 2014-01-16 14:39:24 -0800 | [diff] [blame] | 61 | if package_atoms: |
| 62 | # If nothing was found to be unmerged, emerge will exit(1). |
| 63 | result = runcmd([emerge, '-q', '--unmerge'] + package_atoms, |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 64 | enter_chroot=True, extra_env={'CLEAN_DELAY': '0'}, |
| 65 | error_code_ok=True, cwd=srcroot) |
David James | 63841a8 | 2014-01-16 14:39:24 -0800 | [diff] [blame] | 66 | if not result.returncode in (0, 1): |
| 67 | raise cros_build_lib.RunCommandError('unexpected error', result) |
David James | 59a0a2b | 2013-03-22 14:04:44 -0700 | [diff] [blame] | 68 | runcmd([eclean, '-d', 'packages'], |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 69 | cwd=srcroot, enter_chroot=True, |
David James | 59a0a2b | 2013-03-22 14:04:44 -0700 | [diff] [blame] | 70 | redirect_stdout=True, redirect_stderr=True) |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 71 | |
| 72 | tasks = [] |
David James | cc09c9b | 2012-01-26 22:10:13 -0800 | [diff] [blame] | 73 | for board in boards: |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 74 | tasks.append([board]) |
| 75 | tasks.append([None]) |
| 76 | |
David James | 6450a0a | 2012-12-04 07:59:53 -0800 | [diff] [blame] | 77 | parallel.RunTasksInProcessPool(_CleanStalePackages, tasks) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 78 | |
| 79 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 80 | # TODO(build): This code needs to be gutted and rebased to cros_build_lib. |
| 81 | def _DoWeHaveLocalCommits(stable_branch, tracking_branch, cwd): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 82 | """Returns true if there are local commits.""" |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 83 | output = git.RunGit( |
Paul Hobbs | 72d8e39 | 2015-10-21 17:24:23 -0700 | [diff] [blame] | 84 | cwd, ['rev-parse', stable_branch, tracking_branch]).output.split() |
Brian Harring | 5b86b5e | 2012-05-25 18:27:40 -0700 | [diff] [blame] | 85 | return output[0] != output[1] |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 86 | |
| 87 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 88 | # ======================= End Global Helper Functions ======================== |
| 89 | |
| 90 | |
Ningning Xia | 5200906 | 2016-05-09 14:33:51 -0700 | [diff] [blame] | 91 | def PushChange(stable_branch, tracking_branch, dryrun, cwd, |
| 92 | staging_branch=None): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 93 | """Pushes commits in the stable_branch to the remote git repository. |
| 94 | |
David James | ee2da62 | 2012-02-23 09:32:16 -0800 | [diff] [blame] | 95 | Pushes local commits from calls to CommitChange to the remote git |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 96 | repository specified by current working directory. If changes are |
| 97 | found to commit, they will be merged to the merge branch and pushed. |
| 98 | 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] | 99 | |
| 100 | Args: |
| 101 | stable_branch: The local branch with commits we want to push. |
| 102 | tracking_branch: The tracking branch of the local branch. |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 103 | dryrun: Use git push --dryrun to emulate a push. |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 104 | cwd: The directory to run commands in. |
Ningning Xia | 5200906 | 2016-05-09 14:33:51 -0700 | [diff] [blame] | 105 | staging_branch: The staging branch to push for a failed PFQ run |
Mike Frysinger | 1a736a8 | 2013-12-12 01:50:59 -0500 | [diff] [blame] | 106 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 107 | Raises: |
Mike Frysinger | 5cd8c74 | 2013-10-11 14:43:01 -0400 | [diff] [blame] | 108 | OSError: Error occurred while pushing. |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 109 | """ |
David James | 4795963 | 2015-10-23 07:56:01 -0700 | [diff] [blame] | 110 | if not git.DoesCommitExistInRepo(cwd, stable_branch): |
| 111 | logging.debug('No branch created for %s. Exiting', cwd) |
| 112 | return |
| 113 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 114 | if not _DoWeHaveLocalCommits(stable_branch, tracking_branch, cwd): |
David James | 4795963 | 2015-10-23 07:56:01 -0700 | [diff] [blame] | 115 | logging.debug('No work found to push in %s. Exiting', cwd) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 116 | return |
| 117 | |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 118 | # For the commit queue, our local branch may contain commits that were |
| 119 | # just tested and pushed during the CommitQueueCompletion stage. Sync |
| 120 | # and rebase our local branch on top of the remote commits. |
Paul Hobbs | 72d8e39 | 2015-10-21 17:24:23 -0700 | [diff] [blame] | 121 | remote_ref = git.GetTrackingBranch(cwd, |
| 122 | branch=stable_branch, |
| 123 | for_push=True) |
Paul Hobbs | 1e46be8 | 2015-10-30 13:46:02 -0700 | [diff] [blame] | 124 | # SyncPushBranch rebases HEAD onto the updated remote. We need to checkout |
| 125 | # stable_branch here in order to update it. |
| 126 | git.RunGit(cwd, ['checkout', stable_branch]) |
Don Garrett | 9944959 | 2015-03-25 11:01:30 -0700 | [diff] [blame] | 127 | git.SyncPushBranch(cwd, remote_ref.remote, remote_ref.ref) |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 128 | |
| 129 | # Check whether any local changes remain after the sync. |
Don Garrett | 9944959 | 2015-03-25 11:01:30 -0700 | [diff] [blame] | 130 | if not _DoWeHaveLocalCommits(stable_branch, remote_ref.ref, cwd): |
Ralph Nathan | 0304728 | 2015-03-23 11:09:32 -0700 | [diff] [blame] | 131 | logging.info('All changes already pushed for %s. Exiting', cwd) |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 132 | return |
| 133 | |
Matt Tennant | cb52205 | 2013-11-25 14:23:43 -0800 | [diff] [blame] | 134 | # Add a failsafe check here. Only CLs from the 'chrome-bot' user should |
| 135 | # be involved here. If any other CLs are found then complain. |
| 136 | # In dryruns extra CLs are normal, though, and can be ignored. |
| 137 | bad_cl_cmd = ['log', '--format=short', '--perl-regexp', |
| 138 | '--author', '^(?!chrome-bot)', '%s..%s' % ( |
Don Garrett | 9944959 | 2015-03-25 11:01:30 -0700 | [diff] [blame] | 139 | remote_ref.ref, stable_branch)] |
Matt Tennant | cb52205 | 2013-11-25 14:23:43 -0800 | [diff] [blame] | 140 | bad_cls = git.RunGit(cwd, bad_cl_cmd).output |
| 141 | if bad_cls.strip() and not dryrun: |
Ralph Nathan | 5990042 | 2015-03-24 10:41:17 -0700 | [diff] [blame] | 142 | logging.error('The Uprev stage found changes from users other than ' |
| 143 | 'chrome-bot:\n\n%s', bad_cls) |
Matt Tennant | cb52205 | 2013-11-25 14:23:43 -0800 | [diff] [blame] | 144 | raise AssertionError('Unexpected CLs found during uprev stage.') |
| 145 | |
Lev Rumyantsev | 25352ba | 2016-09-07 15:53:58 -0700 | [diff] [blame] | 146 | if staging_branch is not None: |
| 147 | logging.info('PFQ FAILED. Pushing uprev change to staging branch %s', |
| 148 | staging_branch) |
| 149 | |
Mike Frysinger | e65f375 | 2014-12-08 00:46:39 -0500 | [diff] [blame] | 150 | description = git.RunGit( |
| 151 | cwd, |
| 152 | ['log', '--format=format:%s%n%n%b', |
Don Garrett | 9944959 | 2015-03-25 11:01:30 -0700 | [diff] [blame] | 153 | '%s..%s' % (remote_ref.ref, stable_branch)]).output |
Gabe Black | 71e963e | 2014-10-28 20:19:59 -0700 | [diff] [blame] | 154 | description = '%s\n\n%s' % (GIT_COMMIT_SUBJECT, description) |
Ralph Nathan | 0304728 | 2015-03-23 11:09:32 -0700 | [diff] [blame] | 155 | logging.info('For %s, using description %s', cwd, description) |
Paul Hobbs | f52ea8f | 2015-10-21 17:24:23 -0700 | [diff] [blame] | 156 | git.CreatePushBranch(constants.MERGE_BRANCH, cwd, |
| 157 | remote_push_branch=remote_ref) |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 158 | git.RunGit(cwd, ['merge', '--squash', stable_branch]) |
| 159 | git.RunGit(cwd, ['commit', '-m', description]) |
| 160 | git.RunGit(cwd, ['config', 'push.default', 'tracking']) |
Ningning Xia | 5200906 | 2016-05-09 14:33:51 -0700 | [diff] [blame] | 161 | git.PushWithRetry(constants.MERGE_BRANCH, cwd, dryrun=dryrun, |
| 162 | staging_branch=staging_branch) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 163 | |
| 164 | |
| 165 | class GitBranch(object): |
| 166 | """Wrapper class for a git branch.""" |
| 167 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 168 | def __init__(self, branch_name, tracking_branch, cwd): |
David James | c7c4ff5 | 2013-09-18 17:57:13 -0700 | [diff] [blame] | 169 | """Sets up variables but does not create the branch. |
| 170 | |
Mike Frysinger | 5cd8c74 | 2013-10-11 14:43:01 -0400 | [diff] [blame] | 171 | Args: |
David James | c7c4ff5 | 2013-09-18 17:57:13 -0700 | [diff] [blame] | 172 | branch_name: The name of the branch. |
| 173 | tracking_branch: The associated tracking branch. |
| 174 | cwd: The git repository to work in. |
| 175 | """ |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 176 | self.branch_name = branch_name |
| 177 | self.tracking_branch = tracking_branch |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 178 | self.cwd = cwd |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 179 | |
| 180 | def CreateBranch(self): |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 181 | self.Checkout() |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 182 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 183 | def Checkout(self, branch=None): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 184 | """Function used to check out to another GitBranch.""" |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 185 | if not branch: |
| 186 | branch = self.branch_name |
| 187 | if branch == self.tracking_branch or self.Exists(branch): |
| 188 | git_cmd = ['git', 'checkout', '-f', branch] |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 189 | else: |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 190 | git_cmd = ['repo', 'start', branch, '.'] |
Yu-Ju Hong | 3add443 | 2014-01-30 11:46:15 -0800 | [diff] [blame] | 191 | cros_build_lib.RunCommand(git_cmd, print_cmd=False, cwd=self.cwd, |
| 192 | capture_output=True) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 193 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 194 | def Exists(self, branch=None): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 195 | """Returns True if the branch exists.""" |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 196 | if not branch: |
| 197 | branch = self.branch_name |
David James | 67d7325 | 2013-09-19 17:33:12 -0700 | [diff] [blame] | 198 | branches = git.RunGit(self.cwd, ['branch']).output |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 199 | return branch in branches.split() |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 200 | |
| 201 | |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 202 | def GetParser(): |
| 203 | """Creates the argparse parser.""" |
| 204 | parser = commandline.ArgumentParser() |
| 205 | parser.add_argument('--all', action='store_true', |
| 206 | help='Mark all packages as stable.') |
| 207 | parser.add_argument('-b', '--boards', default='', |
| 208 | help='Colon-separated list of boards.') |
| 209 | parser.add_argument('--drop_file', |
| 210 | help='File to list packages that were revved.') |
| 211 | parser.add_argument('--dryrun', action='store_true', |
| 212 | help='Passes dry-run to git push if pushing a change.') |
Bertrand SIMONNET | 6af5430 | 2015-08-05 10:12:49 -0700 | [diff] [blame] | 213 | parser.add_argument('--force', action='store_true', |
| 214 | help='Force the stabilization of blacklisted packages. ' |
| 215 | '(only compatible with -p)') |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 216 | parser.add_argument('-o', '--overlays', |
| 217 | help='Colon-separated list of overlays to modify.') |
| 218 | parser.add_argument('-p', '--packages', |
| 219 | help='Colon separated list of packages to rev.') |
| 220 | parser.add_argument('-r', '--srcroot', type='path', |
| 221 | default=os.path.join(constants.SOURCE_ROOT, 'src'), |
| 222 | help='Path to root src directory.') |
| 223 | parser.add_argument('--verbose', action='store_true', |
| 224 | help='Prints out debug info.') |
Ningning Xia | 5200906 | 2016-05-09 14:33:51 -0700 | [diff] [blame] | 225 | parser.add_argument('--staging_branch', |
| 226 | help='The staging branch to push changes') |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 227 | parser.add_argument('command', choices=COMMAND_DICTIONARY.keys(), |
| 228 | help='Command to run.') |
| 229 | return parser |
| 230 | |
| 231 | |
| 232 | def main(argv): |
| 233 | parser = GetParser() |
| 234 | options = parser.parse_args(argv) |
Bertrand SIMONNET | 6af5430 | 2015-08-05 10:12:49 -0700 | [diff] [blame] | 235 | options.Freeze() |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 236 | |
Bertrand SIMONNET | 6af5430 | 2015-08-05 10:12:49 -0700 | [diff] [blame] | 237 | if options.command == 'commit': |
| 238 | if not options.packages and not options.all: |
| 239 | parser.error('Please specify at least one package (--packages)') |
| 240 | if options.force and options.all: |
| 241 | parser.error('Cannot use --force with --all. You must specify a list of ' |
| 242 | 'packages you want to force uprev.') |
| 243 | |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 244 | if not os.path.isdir(options.srcroot): |
| 245 | parser.error('srcroot is not a valid path: %s' % options.srcroot) |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 246 | |
Alex Deymo | 075c229 | 2014-09-04 18:31:50 -0700 | [diff] [blame] | 247 | portage_util.EBuild.VERBOSE = options.verbose |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 248 | |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 249 | package_list = None |
| 250 | if options.packages: |
| 251 | package_list = options.packages.split(':') |
| 252 | |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 253 | if options.overlays: |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 254 | overlays = {} |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 255 | for path in options.overlays.split(':'): |
Ryan Cui | 05a31ba | 2011-05-31 17:47:37 -0700 | [diff] [blame] | 256 | if not os.path.isdir(path): |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 257 | cros_build_lib.Die('Cannot find overlay: %s' % path) |
Mike Frysinger | 359391c | 2016-11-15 16:13:34 -0500 | [diff] [blame] | 258 | overlays[os.path.realpath(path)] = [] |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 259 | else: |
Ralph Nathan | 446aee9 | 2015-03-23 14:44:56 -0700 | [diff] [blame] | 260 | logging.warning('Missing --overlays argument') |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 261 | overlays = { |
Mike Frysinger | e65f375 | 2014-12-08 00:46:39 -0500 | [diff] [blame] | 262 | '%s/private-overlays/chromeos-overlay' % options.srcroot: [], |
| 263 | '%s/third_party/chromiumos-overlay' % options.srcroot: [], |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 264 | } |
| 265 | |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 266 | manifest = git.ManifestCheckout.Cached(options.srcroot) |
Ryan Cui | 4656a3c | 2011-05-24 12:30:30 -0700 | [diff] [blame] | 267 | |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 268 | if options.command == 'commit': |
Bertrand SIMONNET | 6af5430 | 2015-08-05 10:12:49 -0700 | [diff] [blame] | 269 | portage_util.BuildEBuildDictionary(overlays, options.all, package_list, |
| 270 | allow_blacklisted=options.force) |
David James | 84e953c | 2013-04-23 18:44:06 -0700 | [diff] [blame] | 271 | |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 272 | # Contains the array of packages we actually revved. |
| 273 | revved_packages = [] |
| 274 | new_package_atoms = [] |
David James | a8457b5 | 2011-05-28 00:03:20 -0700 | [diff] [blame] | 275 | |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 276 | for overlay in overlays: |
| 277 | ebuilds = overlays[overlay] |
| 278 | if not os.path.isdir(overlay): |
| 279 | logging.warning('Skipping %s' % overlay) |
| 280 | continue |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 281 | |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 282 | # Note we intentionally work from the non push tracking branch; |
| 283 | # everything built thus far has been against it (meaning, http mirrors), |
| 284 | # thus we should honor that. During the actual push, the code switches |
| 285 | # to the correct urls, and does an appropriate rebasing. |
| 286 | tracking_branch = git.GetTrackingBranchViaManifest( |
| 287 | overlay, manifest=manifest).ref |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 288 | |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 289 | if options.command == 'push': |
| 290 | PushChange(constants.STABLE_EBUILD_BRANCH, tracking_branch, |
Ningning Xia | 5200906 | 2016-05-09 14:33:51 -0700 | [diff] [blame] | 291 | options.dryrun, cwd=overlay, |
| 292 | staging_branch=options.staging_branch) |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 293 | elif options.command == 'commit': |
| 294 | existing_commit = git.GetGitRepoRevision(overlay) |
| 295 | work_branch = GitBranch(constants.STABLE_EBUILD_BRANCH, tracking_branch, |
| 296 | cwd=overlay) |
| 297 | work_branch.CreateBranch() |
| 298 | if not work_branch.Exists(): |
| 299 | cros_build_lib.Die('Unable to create stabilizing branch in %s' % |
| 300 | overlay) |
Brian Harring | 609dc4e | 2012-05-07 02:17:44 -0700 | [diff] [blame] | 301 | |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 302 | # In the case of uprevving overlays that have patches applied to them, |
| 303 | # include the patched changes in the stabilizing branch. |
| 304 | git.RunGit(overlay, ['rebase', existing_commit]) |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 305 | |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 306 | messages = [] |
| 307 | for ebuild in ebuilds: |
| 308 | if options.verbose: |
Aviv Keshet | 845602e | 2016-10-13 23:44:34 -0700 | [diff] [blame] | 309 | logging.info('Working on %s, info %s', ebuild.package, |
| 310 | ebuild.cros_workon_vars) |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 311 | try: |
Jason D. Clinton | 4f88f77 | 2017-12-24 14:51:03 -0700 | [diff] [blame^] | 312 | new_package = ebuild.RevWorkOnEBuild(options.srcroot, manifest) |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 313 | if new_package: |
| 314 | revved_packages.append(ebuild.package) |
| 315 | new_package_atoms.append('=%s' % new_package) |
| 316 | messages.append(_GIT_COMMIT_MESSAGE % ebuild.package) |
| 317 | except (OSError, IOError): |
| 318 | logging.warning( |
| 319 | 'Cannot rev %s\n' |
| 320 | 'Note you will have to go into %s ' |
| 321 | 'and reset the git repo yourself.' % (ebuild.package, overlay)) |
| 322 | raise |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 323 | |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 324 | if messages: |
| 325 | portage_util.EBuild.CommitChange('\n\n'.join(messages), overlay) |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 326 | |
Mike Frysinger | e8dcbfd | 2015-03-08 21:45:52 -0400 | [diff] [blame] | 327 | if options.command == 'commit': |
David James | 41124af | 2015-06-04 21:13:25 -0700 | [diff] [blame] | 328 | chroot_path = os.path.join(options.srcroot, constants.DEFAULT_CHROOT_DIR) |
| 329 | if os.path.exists(chroot_path): |
| 330 | CleanStalePackages(options.srcroot, options.boards.split(':'), |
| 331 | new_package_atoms) |
David James | 15ed130 | 2013-04-25 09:21:19 -0700 | [diff] [blame] | 332 | if options.drop_file: |
| 333 | osutils.WriteFile(options.drop_file, ' '.join(revved_packages)) |