Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | |
Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 3 | # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 4 | # Use of this source code is governed by a BSD-style license that can be |
| 5 | # found in the LICENSE file. |
| 6 | |
| 7 | """This module uprevs a given package's ebuild to the next revision.""" |
| 8 | |
Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 9 | import multiprocessing |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 10 | import optparse |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 11 | import os |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 12 | import sys |
| 13 | |
Mike Frysinger | 6cb624a | 2012-05-24 18:17:38 -0400 | [diff] [blame] | 14 | from chromite.buildbot import constants |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 15 | from chromite.buildbot import portage_utilities |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 16 | from chromite.lib import cros_build_lib |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 17 | from chromite.lib import git |
Mike Frysinger | fddaeb5 | 2012-11-20 11:17:31 -0500 | [diff] [blame] | 18 | from chromite.lib import osutils |
David James | 6450a0a | 2012-12-04 07:59:53 -0800 | [diff] [blame] | 19 | from chromite.lib import parallel |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 20 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 21 | |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 22 | # TODO(sosa): Remove during OO refactor. |
| 23 | VERBOSE = False |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 24 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 25 | # Dictionary of valid commands with usage information. |
| 26 | COMMAND_DICTIONARY = { |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 27 | 'commit': |
| 28 | 'Marks given ebuilds as stable locally', |
| 29 | 'push': |
| 30 | 'Pushes previous marking of ebuilds to remote repo', |
| 31 | } |
| 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 | |
| 37 | def _Print(message): |
| 38 | """Verbose print function.""" |
Chris Sosa | c31bd2d | 2011-04-29 17:53:35 -0700 | [diff] [blame] | 39 | if VERBOSE: |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 40 | cros_build_lib.Info(message) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 41 | |
| 42 | |
David James | cc09c9b | 2012-01-26 22:10:13 -0800 | [diff] [blame] | 43 | def CleanStalePackages(boards, package_atoms): |
Chris Sosa | bf15387 | 2011-04-28 14:21:09 -0700 | [diff] [blame] | 44 | """Cleans up stale package info from a previous build. |
| 45 | Args: |
David James | cc09c9b | 2012-01-26 22:10:13 -0800 | [diff] [blame] | 46 | boards: Boards to clean the packages from. |
Chris Sosa | bf15387 | 2011-04-28 14:21:09 -0700 | [diff] [blame] | 47 | package_atoms: The actual package atom to unmerge. |
| 48 | """ |
| 49 | if package_atoms: |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 50 | cros_build_lib.Info('Cleaning up stale packages %s.' % package_atoms) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 51 | |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 52 | # First unmerge all the packages for a board, then eclean it. |
| 53 | # We need these two steps to run in order (unmerge/eclean), |
| 54 | # but we can let all the boards run in parallel. |
| 55 | def _CleanStalePackages(board): |
| 56 | if board: |
| 57 | suffix = '-' + board |
| 58 | runcmd = cros_build_lib.RunCommand |
| 59 | else: |
| 60 | suffix = '' |
| 61 | runcmd = cros_build_lib.SudoRunCommand |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 62 | |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 63 | if package_atoms: |
Mike Frysinger | 0a647fc | 2012-08-06 14:36:05 -0400 | [diff] [blame] | 64 | runcmd(['emerge' + suffix, '-q', '--unmerge'] + package_atoms, |
| 65 | extra_env={'CLEAN_DELAY': '0'}) |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 66 | runcmd(['eclean' + suffix, '-d', 'packages'], |
| 67 | redirect_stdout=True, redirect_stderr=True) |
| 68 | |
| 69 | tasks = [] |
David James | cc09c9b | 2012-01-26 22:10:13 -0800 | [diff] [blame] | 70 | for board in boards: |
Mike Frysinger | b7ab9b8 | 2012-04-04 16:22:43 -0400 | [diff] [blame] | 71 | tasks.append([board]) |
| 72 | tasks.append([None]) |
| 73 | |
David James | 6450a0a | 2012-12-04 07:59:53 -0800 | [diff] [blame] | 74 | parallel.RunTasksInProcessPool(_CleanStalePackages, tasks) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 75 | |
| 76 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 77 | # TODO(build): This code needs to be gutted and rebased to cros_build_lib. |
| 78 | def _DoWeHaveLocalCommits(stable_branch, tracking_branch, cwd): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 79 | """Returns true if there are local commits.""" |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 80 | current_branch = git.GetCurrentBranch(cwd) |
Brian Harring | 609dc4e | 2012-05-07 02:17:44 -0700 | [diff] [blame] | 81 | |
| 82 | if current_branch != stable_branch: |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 83 | return False |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 84 | output = git.RunGit( |
Brian Harring | 609dc4e | 2012-05-07 02:17:44 -0700 | [diff] [blame] | 85 | cwd, ['rev-parse', 'HEAD', tracking_branch]).output.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 | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 89 | def _CheckSaneArguments(package_list, command, options): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 90 | """Checks to make sure the flags are sane. Dies if arguments are not sane.""" |
| 91 | if not command in COMMAND_DICTIONARY.keys(): |
| 92 | _PrintUsageAndDie('%s is not a valid command' % command) |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 93 | if not options.packages and command == 'commit' and not options.all: |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 94 | _PrintUsageAndDie('Please specify at least one package') |
Mike Frysinger | 8fd67dc | 2012-12-03 23:51:18 -0500 | [diff] [blame] | 95 | if options.boards: |
| 96 | cros_build_lib.AssertInsideChroot() |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 97 | if not os.path.isdir(options.srcroot): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 98 | _PrintUsageAndDie('srcroot is not a valid path') |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 99 | options.srcroot = os.path.abspath(options.srcroot) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 100 | |
| 101 | |
| 102 | def _PrintUsageAndDie(error_message=''): |
| 103 | """Prints optional error_message the usage and returns an error exit code.""" |
| 104 | command_usage = 'Commands: \n' |
| 105 | # Add keys and usage information from dictionary. |
| 106 | commands = sorted(COMMAND_DICTIONARY.keys()) |
| 107 | for command in commands: |
| 108 | command_usage += ' %s: %s\n' % (command, COMMAND_DICTIONARY[command]) |
| 109 | commands_str = '|'.join(commands) |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 110 | cros_build_lib.Warning('Usage: %s FLAGS [%s]\n\n%s' % ( |
| 111 | sys.argv[0], commands_str, command_usage)) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 112 | if error_message: |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 113 | cros_build_lib.Die(error_message) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 114 | else: |
| 115 | sys.exit(1) |
| 116 | |
| 117 | |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 118 | # ======================= End Global Helper Functions ======================== |
| 119 | |
| 120 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 121 | def PushChange(stable_branch, tracking_branch, dryrun, cwd): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 122 | """Pushes commits in the stable_branch to the remote git repository. |
| 123 | |
David James | ee2da62 | 2012-02-23 09:32:16 -0800 | [diff] [blame] | 124 | Pushes local commits from calls to CommitChange to the remote git |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 125 | repository specified by current working directory. If changes are |
| 126 | found to commit, they will be merged to the merge branch and pushed. |
| 127 | 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] | 128 | |
| 129 | Args: |
| 130 | stable_branch: The local branch with commits we want to push. |
| 131 | tracking_branch: The tracking branch of the local branch. |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 132 | dryrun: Use git push --dryrun to emulate a push. |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 133 | cwd: The directory to run commands in. |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 134 | Raises: |
| 135 | OSError: Error occurred while pushing. |
| 136 | """ |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 137 | if not _DoWeHaveLocalCommits(stable_branch, tracking_branch, cwd): |
Brian Harring | 609dc4e | 2012-05-07 02:17:44 -0700 | [diff] [blame] | 138 | cros_build_lib.Info('No work found to push in %s. Exiting', cwd) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 139 | return |
| 140 | |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 141 | # For the commit queue, our local branch may contain commits that were |
| 142 | # just tested and pushed during the CommitQueueCompletion stage. Sync |
| 143 | # and rebase our local branch on top of the remote commits. |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 144 | remote, push_branch = git.GetTrackingBranch(cwd, for_push=True) |
| 145 | git.SyncPushBranch(cwd, remote, push_branch) |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 146 | |
| 147 | # Check whether any local changes remain after the sync. |
Brian Harring | 609dc4e | 2012-05-07 02:17:44 -0700 | [diff] [blame] | 148 | if not _DoWeHaveLocalCommits(stable_branch, push_branch, cwd): |
| 149 | cros_build_lib.Info('All changes already pushed for %s. Exiting', cwd) |
David James | 6600946 | 2012-03-25 10:08:38 -0700 | [diff] [blame] | 150 | return |
| 151 | |
Mike Frysinger | 7dafd0e | 2012-05-08 15:47:16 -0400 | [diff] [blame] | 152 | description = cros_build_lib.RunCommandCaptureOutput( |
Brian Harring | 609dc4e | 2012-05-07 02:17:44 -0700 | [diff] [blame] | 153 | ['git', 'log', '--format=format:%s%n%n%b', '%s..%s' % ( |
| 154 | push_branch, stable_branch)], cwd=cwd).output |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 155 | description = 'Marking set of ebuilds as stable\n\n%s' % description |
Brian Harring | 609dc4e | 2012-05-07 02:17:44 -0700 | [diff] [blame] | 156 | cros_build_lib.Info('For %s, using description %s', cwd, description) |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 157 | git.CreatePushBranch(constants.MERGE_BRANCH, cwd) |
| 158 | git.RunGit(cwd, ['merge', '--squash', stable_branch]) |
| 159 | git.RunGit(cwd, ['commit', '-m', description]) |
| 160 | git.RunGit(cwd, ['config', 'push.default', 'tracking']) |
| 161 | git.PushWithRetry(constants.MERGE_BRANCH, cwd, dryrun=dryrun) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 162 | |
| 163 | |
| 164 | class GitBranch(object): |
| 165 | """Wrapper class for a git branch.""" |
| 166 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 167 | def __init__(self, branch_name, tracking_branch, cwd): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 168 | """Sets up variables but does not create the branch.""" |
| 169 | self.branch_name = branch_name |
| 170 | self.tracking_branch = tracking_branch |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 171 | self.cwd = cwd |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 172 | |
| 173 | def CreateBranch(self): |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 174 | self.Checkout() |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 175 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 176 | def Checkout(self, branch=None): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 177 | """Function used to check out to another GitBranch.""" |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 178 | if not branch: |
| 179 | branch = self.branch_name |
| 180 | if branch == self.tracking_branch or self.Exists(branch): |
| 181 | git_cmd = ['git', 'checkout', '-f', branch] |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 182 | else: |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 183 | git_cmd = ['repo', 'start', branch, '.'] |
| 184 | cros_build_lib.RunCommandCaptureOutput(git_cmd, print_cmd=False, |
| 185 | cwd=self.cwd) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 186 | |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 187 | def Exists(self, branch=None): |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 188 | """Returns True if the branch exists.""" |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 189 | if not branch: |
| 190 | branch = self.branch_name |
Mike Frysinger | 7dafd0e | 2012-05-08 15:47:16 -0400 | [diff] [blame] | 191 | branches = cros_build_lib.RunCommandCaptureOutput(['git', 'branch'], |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 192 | print_cmd=False, |
| 193 | cwd=self.cwd).output |
| 194 | return branch in branches.split() |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 195 | |
| 196 | |
Mike Frysinger | 368bbb7 | 2012-05-23 15:57:10 -0400 | [diff] [blame] | 197 | def main(argv): |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 198 | parser = optparse.OptionParser('cros_mark_as_stable OPTIONS packages') |
| 199 | parser.add_option('--all', action='store_true', |
| 200 | help='Mark all packages as stable.') |
Mike Frysinger | 587bd56 | 2012-11-19 16:41:39 -0500 | [diff] [blame] | 201 | parser.add_option('-b', '--boards', default='', |
David James | cc09c9b | 2012-01-26 22:10:13 -0800 | [diff] [blame] | 202 | help='Colon-separated list of boards') |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 203 | parser.add_option('--drop_file', |
| 204 | help='File to list packages that were revved.') |
| 205 | parser.add_option('--dryrun', action='store_true', |
| 206 | help='Passes dry-run to git push if pushing a change.') |
| 207 | parser.add_option('-o', '--overlays', |
| 208 | help='Colon-separated list of overlays to modify.') |
| 209 | parser.add_option('-p', '--packages', |
| 210 | help='Colon separated list of packages to rev.') |
| 211 | parser.add_option('-r', '--srcroot', |
Mike Frysinger | fddaeb5 | 2012-11-20 11:17:31 -0500 | [diff] [blame] | 212 | default=os.path.join(constants.SOURCE_ROOT, 'src'), |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 213 | help='Path to root src directory.') |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 214 | parser.add_option('--verbose', action='store_true', |
| 215 | help='Prints out debug info.') |
| 216 | (options, args) = parser.parse_args() |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 217 | |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 218 | global VERBOSE |
| 219 | VERBOSE = options.verbose |
J. Richard Barnette | 2fa9fd6 | 2011-12-02 17:10:10 -0800 | [diff] [blame] | 220 | portage_utilities.EBuild.VERBOSE = options.verbose |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 221 | |
| 222 | if len(args) != 1: |
Ryan Cui | 05a31ba | 2011-05-31 17:47:37 -0700 | [diff] [blame] | 223 | _PrintUsageAndDie('Must specify a valid command [commit, push]') |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 224 | |
| 225 | command = args[0] |
| 226 | package_list = None |
| 227 | if options.packages: |
| 228 | package_list = options.packages.split(':') |
| 229 | |
| 230 | _CheckSaneArguments(package_list, command, options) |
| 231 | if options.overlays: |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 232 | overlays = {} |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 233 | for path in options.overlays.split(':'): |
Ryan Cui | 05a31ba | 2011-05-31 17:47:37 -0700 | [diff] [blame] | 234 | if not os.path.isdir(path): |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 235 | cros_build_lib.Die('Cannot find overlay: %s' % path) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 236 | overlays[path] = [] |
| 237 | else: |
Chris Sosa | c13bba5 | 2011-05-24 15:14:09 -0700 | [diff] [blame] | 238 | cros_build_lib.Warning('Missing --overlays argument') |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 239 | overlays = { |
Chris Sosa | 62ad852 | 2011-03-08 17:46:17 -0800 | [diff] [blame] | 240 | '%s/private-overlays/chromeos-overlay' % options.srcroot: [], |
| 241 | '%s/third_party/chromiumos-overlay' % options.srcroot: [] |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 242 | } |
| 243 | |
| 244 | if command == 'commit': |
J. Richard Barnette | f6697cf | 2011-11-18 12:42:08 -0800 | [diff] [blame] | 245 | portage_utilities.BuildEBuildDictionary( |
J. Richard Barnette | d422f62 | 2011-11-17 09:39:46 -0800 | [diff] [blame] | 246 | overlays, options.all, package_list) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 247 | |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 248 | manifest = git.ManifestCheckout.Cached(options.srcroot) |
Ryan Cui | 4656a3c | 2011-05-24 12:30:30 -0700 | [diff] [blame] | 249 | |
David James | a8457b5 | 2011-05-28 00:03:20 -0700 | [diff] [blame] | 250 | # Contains the array of packages we actually revved. |
| 251 | revved_packages = [] |
| 252 | new_package_atoms = [] |
| 253 | |
Mike Frysinger | b9bd2f8 | 2012-05-08 14:55:23 -0400 | [diff] [blame] | 254 | # Slight optimization hack: process the chromiumos overlay before any other |
| 255 | # cros-workon overlay first so we can do background cache generation in it. |
| 256 | # A perfect solution would walk all the overlays, figure out any dependencies |
| 257 | # between them (with layout.conf), and then process them in dependency order. |
| 258 | # However, this operation isn't slow enough to warrant that level of |
| 259 | # complexity, so we'll just special case the main overlay. |
| 260 | # |
| 261 | # Similarly, generate the cache in the portage-stable tree asap. We know |
| 262 | # we won't have any cros-workon packages in there, so generating the cache |
| 263 | # is the only thing it'll be doing. The chromiumos overlay instead might |
| 264 | # have revbumping to do before it can generate the cache. |
Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 265 | keys = overlays.keys() |
Mike Frysinger | b9bd2f8 | 2012-05-08 14:55:23 -0400 | [diff] [blame] | 266 | for overlay in ('/third_party/chromiumos-overlay', |
| 267 | '/third_party/portage-stable'): |
| 268 | for k in keys: |
| 269 | if k.endswith(overlay): |
| 270 | keys.remove(k) |
| 271 | keys.insert(0, k) |
| 272 | break |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 273 | |
Brian Harring | 9fdd23d | 2012-12-07 12:09:08 -0800 | [diff] [blame] | 274 | with parallel.BackgroundTaskRunner(portage_utilities.RegenCache) as queue: |
Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 275 | for overlay in keys: |
| 276 | ebuilds = overlays[overlay] |
| 277 | if not os.path.isdir(overlay): |
| 278 | cros_build_lib.Warning("Skipping %s" % overlay) |
| 279 | continue |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 280 | |
Brian Harring | e08e442 | 2012-05-30 12:40:50 -0700 | [diff] [blame] | 281 | # Note we intentionally work from the non push tracking branch; |
| 282 | # everything built thus far has been against it (meaning, http mirrors), |
| 283 | # thus we should honor that. During the actual push, the code switches |
| 284 | # to the correct urls, and does an appropriate rebasing. |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 285 | tracking_branch = git.GetTrackingBranchViaManifest( |
Brian Harring | e08e442 | 2012-05-30 12:40:50 -0700 | [diff] [blame] | 286 | overlay, manifest=manifest)[1] |
Brian Harring | 609dc4e | 2012-05-07 02:17:44 -0700 | [diff] [blame] | 287 | |
Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 288 | if command == 'push': |
| 289 | PushChange(constants.STABLE_EBUILD_BRANCH, tracking_branch, |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 290 | options.dryrun, cwd=overlay) |
Mike Frysinger | 303083d | 2012-07-16 14:57:24 -0400 | [diff] [blame] | 291 | elif command == 'commit': |
David James | 97d9587 | 2012-11-16 15:09:56 -0800 | [diff] [blame] | 292 | existing_branch = git.GetCurrentBranch(overlay) |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 293 | work_branch = GitBranch(constants.STABLE_EBUILD_BRANCH, tracking_branch, |
| 294 | cwd=overlay) |
Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 295 | work_branch.CreateBranch() |
| 296 | if not work_branch.Exists(): |
| 297 | cros_build_lib.Die('Unable to create stabilizing branch in %s' % |
| 298 | overlay) |
Ryan Cui | f0d57b4 | 2011-07-27 17:43:42 -0700 | [diff] [blame] | 299 | |
Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 300 | # In the case of uprevving overlays that have patches applied to them, |
| 301 | # include the patched changes in the stabilizing branch. |
| 302 | if existing_branch: |
Mike Frysinger | 7dafd0e | 2012-05-08 15:47:16 -0400 | [diff] [blame] | 303 | cros_build_lib.RunCommand(['git', 'rebase', existing_branch], |
Mike Frysinger | 2ebe373 | 2012-05-08 17:04:12 -0400 | [diff] [blame] | 304 | print_cmd=False, cwd=overlay) |
Mike Frysinger | 110750a | 2012-03-26 14:19:20 -0400 | [diff] [blame] | 305 | |
| 306 | for ebuild in ebuilds: |
| 307 | try: |
| 308 | _Print('Working on %s' % ebuild.package) |
| 309 | new_package = ebuild.RevWorkOnEBuild(options.srcroot) |
| 310 | if new_package: |
| 311 | revved_packages.append(ebuild.package) |
| 312 | new_package_atoms.append('=%s' % new_package) |
| 313 | except (OSError, IOError): |
| 314 | cros_build_lib.Warning('Cannot rev %s\n' % ebuild.package + |
| 315 | 'Note you will have to go into %s ' |
| 316 | 'and reset the git repo yourself.' % overlay) |
| 317 | raise |
| 318 | |
Mike Frysinger | fddaeb5 | 2012-11-20 11:17:31 -0500 | [diff] [blame] | 319 | if cros_build_lib.IsInsideChroot(): |
| 320 | # Regenerate caches if need be. We do this all the time to |
| 321 | # catch when users make changes without updating cache files. |
Brian Harring | 9fdd23d | 2012-12-07 12:09:08 -0800 | [diff] [blame] | 322 | queue.put([overlay]) |
Chris Sosa | dad0d32 | 2011-01-31 16:37:33 -0800 | [diff] [blame] | 323 | |
David James | a8457b5 | 2011-05-28 00:03:20 -0700 | [diff] [blame] | 324 | if command == 'commit': |
Mike Frysinger | fddaeb5 | 2012-11-20 11:17:31 -0500 | [diff] [blame] | 325 | if cros_build_lib.IsInsideChroot(): |
| 326 | CleanStalePackages(options.boards.split(':'), new_package_atoms) |
David James | a8457b5 | 2011-05-28 00:03:20 -0700 | [diff] [blame] | 327 | if options.drop_file: |
Mike Frysinger | fddaeb5 | 2012-11-20 11:17:31 -0500 | [diff] [blame] | 328 | osutils.WriteFile(options.drop_file, ' '.join(revved_packages)) |