| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 | 2 |
| 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 """This module uprevs a given package's ebuild to the next revision.""" | 7 """This module uprevs a given package's ebuild to the next revision.""" |
| 8 | 8 |
| 9 | 9 |
| 10 import fileinput | 10 import fileinput |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 # Add stable ebuilds to overlays[overlay]. | 159 # Add stable ebuilds to overlays[overlay]. |
| 160 paths = [os.path.join(package_dir, path) for path in files] | 160 paths = [os.path.join(package_dir, path) for path in files] |
| 161 ebuild = _FindUprevCandidates(paths) | 161 ebuild = _FindUprevCandidates(paths) |
| 162 | 162 |
| 163 # If the --all option isn't used, we only want to update packages that | 163 # If the --all option isn't used, we only want to update packages that |
| 164 # are in packages. | 164 # are in packages. |
| 165 if ebuild and (all or ebuild.package in packages): | 165 if ebuild and (all or ebuild.package in packages): |
| 166 overlays[overlay].append(ebuild) | 166 overlays[overlay].append(ebuild) |
| 167 | 167 |
| 168 | 168 |
| 169 def _DoWeHaveLocalCommits(stable_branch, tracking_branch): | 169 def _CheckOnStabilizingBranch(stable_branch): |
| 170 """Returns true if there are local commits.""" | 170 """Returns true if the git branch is on the stabilizing branch.""" |
| 171 current_branch = _SimpleRunCommand('git branch | grep \*').split()[1] | 171 current_branch = _SimpleRunCommand('git branch | grep \*').split()[1] |
| 172 if current_branch == stable_branch: | 172 return current_branch == stable_branch |
| 173 current_commit_id = _SimpleRunCommand('git rev-parse HEAD') | |
| 174 tracking_commit_id = _SimpleRunCommand('git rev-parse %s' % tracking_branch) | |
| 175 return current_commit_id != tracking_commit_id | |
| 176 else: | |
| 177 return False | |
| 178 | 173 |
| 179 | 174 |
| 180 def _CheckSaneArguments(package_list, command): | 175 def _CheckSaneArguments(package_list, command): |
| 181 """Checks to make sure the flags are sane. Dies if arguments are not sane.""" | 176 """Checks to make sure the flags are sane. Dies if arguments are not sane.""" |
| 182 if not command in COMMAND_DICTIONARY.keys(): | 177 if not command in COMMAND_DICTIONARY.keys(): |
| 183 _PrintUsageAndDie('%s is not a valid command' % command) | 178 _PrintUsageAndDie('%s is not a valid command' % command) |
| 184 if not gflags.FLAGS.packages and command == 'commit' and not gflags.FLAGS.all: | 179 if not gflags.FLAGS.packages and command == 'commit' and not gflags.FLAGS.all: |
| 185 _PrintUsageAndDie('Please specify at least one package') | 180 _PrintUsageAndDie('Please specify at least one package') |
| 186 if not gflags.FLAGS.board and command == 'commit': | 181 if not gflags.FLAGS.board and command == 'commit': |
| 187 _PrintUsageAndDie('Please specify a board') | 182 _PrintUsageAndDie('Please specify a board') |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 # ======================= End Global Helper Functions ======================== | 216 # ======================= End Global Helper Functions ======================== |
| 222 | 217 |
| 223 | 218 |
| 224 def Clean(tracking_branch): | 219 def Clean(tracking_branch): |
| 225 """Cleans up uncommitted changes. | 220 """Cleans up uncommitted changes. |
| 226 | 221 |
| 227 Args: | 222 Args: |
| 228 tracking_branch: The tracking branch we want to return to after the call. | 223 tracking_branch: The tracking branch we want to return to after the call. |
| 229 """ | 224 """ |
| 230 _SimpleRunCommand('git reset HEAD --hard') | 225 _SimpleRunCommand('git reset HEAD --hard') |
| 231 branch = GitBranch(STABLE_BRANCH_NAME, tracking_branch) | 226 _SimpleRunCommand('git checkout %s' % tracking_branch) |
| 232 if branch.Exists(): | |
| 233 GitBranch.Checkout(branch) | |
| 234 branch.Delete() | |
| 235 | 227 |
| 236 | 228 |
| 237 def PushChange(stable_branch, tracking_branch): | 229 def PushChange(stable_branch, tracking_branch): |
| 238 """Pushes commits in the stable_branch to the remote git repository. | 230 """Pushes commits in the stable_branch to the remote git repository. |
| 239 | 231 |
| 240 Pushes locals commits from calls to CommitChange to the remote git | 232 Pushes locals commits from calls to CommitChange to the remote git |
| 241 repository specified by current working directory. | 233 repository specified by current working directory. |
| 242 | 234 |
| 243 Args: | 235 Args: |
| 244 stable_branch: The local branch with commits we want to push. | 236 stable_branch: The local branch with commits we want to push. |
| 245 tracking_branch: The tracking branch of the local branch. | 237 tracking_branch: The tracking branch of the local branch. |
| 246 Raises: | 238 Raises: |
| 247 OSError: Error occurred while pushing. | 239 OSError: Error occurred while pushing. |
| 248 """ | 240 """ |
| 249 num_retries = 5 | 241 num_retries = 5 |
| 250 | 242 |
| 251 # Sanity check to make sure we're on a stabilizing branch before pushing. | 243 # Sanity check to make sure we're on a stabilizing branch before pushing. |
| 252 if not _DoWeHaveLocalCommits(stable_branch, tracking_branch): | 244 if not _CheckOnStabilizingBranch(stable_branch): |
| 253 Info('Not work found to push. Exiting') | 245 Info('Not on branch %s so no work found to push. Exiting' % stable_branch) |
| 254 return | 246 return |
| 255 | 247 |
| 256 description = _SimpleRunCommand('git log --format=format:%s%n%n%b ' + | 248 description = _SimpleRunCommand('git log --format=format:%s%n%n%b ' + |
| 257 tracking_branch + '..') | 249 tracking_branch + '..') |
| 258 description = 'Marking set of ebuilds as stable\n\n%s' % description | 250 description = 'Marking set of ebuilds as stable\n\n%s' % description |
| 259 Info('Using description %s' % description) | 251 Info('Using description %s' % description) |
| 260 merge_branch_name = 'merge_branch' | 252 merge_branch_name = 'merge_branch' |
| 261 for push_try in range(num_retries + 1): | 253 for push_try in range(num_retries + 1): |
| 262 try: | 254 try: |
| 263 _SimpleRunCommand('repo sync .') | 255 _SimpleRunCommand('repo sync .') |
| (...skipping 11 matching lines...) Expand all Loading... |
| 275 | 267 |
| 276 break | 268 break |
| 277 except: | 269 except: |
| 278 if push_try < num_retries: | 270 if push_try < num_retries: |
| 279 Warning('Failed to push change, performing retry (%s/%s)' % ( | 271 Warning('Failed to push change, performing retry (%s/%s)' % ( |
| 280 push_try + 1, num_retries)) | 272 push_try + 1, num_retries)) |
| 281 else: | 273 else: |
| 282 raise | 274 raise |
| 283 | 275 |
| 284 | 276 |
| 285 | |
| 286 class GitBranch(object): | 277 class GitBranch(object): |
| 287 """Wrapper class for a git branch.""" | 278 """Wrapper class for a git branch.""" |
| 288 | 279 |
| 289 def __init__(self, branch_name, tracking_branch): | 280 def __init__(self, branch_name, tracking_branch): |
| 290 """Sets up variables but does not create the branch.""" | 281 """Sets up variables but does not create the branch.""" |
| 291 self.branch_name = branch_name | 282 self.branch_name = branch_name |
| 292 self.tracking_branch = tracking_branch | 283 self.tracking_branch = tracking_branch |
| 293 | 284 |
| 294 def CreateBranch(self): | 285 def CreateBranch(self): |
| 295 GitBranch.Checkout(self) | 286 """Creates a new git branch or replaces an existing one.""" |
| 287 if self.Exists(): |
| 288 self.Delete() |
| 289 self._Checkout(self.branch_name) |
| 296 | 290 |
| 297 @classmethod | 291 def _Checkout(self, target, create=True): |
| 298 def Checkout(cls, target): | 292 """Function used internally to create and move between branches.""" |
| 299 """Function used to check out to another GitBranch.""" | 293 if create: |
| 300 if target.branch_name == target.tracking_branch or target.Exists(): | 294 git_cmd = 'git checkout -b %s %s' % (target, self.tracking_branch) |
| 301 git_cmd = 'git checkout %s' % target.branch_name | |
| 302 else: | 295 else: |
| 303 git_cmd = 'git checkout -b %s %s' % (target.branch_name, | 296 git_cmd = 'git checkout %s' % target |
| 304 target.tracking_branch) | |
| 305 _SimpleRunCommand(git_cmd) | 297 _SimpleRunCommand(git_cmd) |
| 306 | 298 |
| 307 def Exists(self): | 299 def Exists(self): |
| 308 """Returns True if the branch exists.""" | 300 """Returns True if the branch exists.""" |
| 309 branch_cmd = 'git branch' | 301 branch_cmd = 'git branch' |
| 310 branches = _SimpleRunCommand(branch_cmd) | 302 branches = _SimpleRunCommand(branch_cmd) |
| 311 return self.branch_name in branches.split() | 303 return self.branch_name in branches.split() |
| 312 | 304 |
| 313 def Delete(self): | 305 def Delete(self): |
| 314 """Deletes the branch and returns the user to the master branch. | 306 """Deletes the branch and returns the user to the master branch. |
| 315 | 307 |
| 316 Returns True on success. | 308 Returns True on success. |
| 317 """ | 309 """ |
| 318 tracking_branch = GitBranch(self.tracking_branch, self.tracking_branch) | 310 self._Checkout(self.tracking_branch, create=False) |
| 319 GitBranch.Checkout(tracking_branch) | |
| 320 delete_cmd = 'git branch -D %s' % self.branch_name | 311 delete_cmd = 'git branch -D %s' % self.branch_name |
| 321 _SimpleRunCommand(delete_cmd) | 312 _SimpleRunCommand(delete_cmd) |
| 322 | 313 |
| 323 | 314 |
| 324 class EBuild(object): | 315 class EBuild(object): |
| 325 """Wrapper class for information about an ebuild.""" | 316 """Wrapper class for information about an ebuild.""" |
| 326 | 317 |
| 327 def __init__(self, path): | 318 def __init__(self, path): |
| 328 """Sets up data about an ebuild from its path.""" | 319 """Sets up data about an ebuild from its path.""" |
| 329 from portage.versions import pkgsplit | 320 from portage.versions import pkgsplit |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 message = _GIT_COMMIT_MESSAGE % (ebuild.package, commit_id) | 563 message = _GIT_COMMIT_MESSAGE % (ebuild.package, commit_id) |
| 573 worker.CommitChange(message) | 564 worker.CommitChange(message) |
| 574 revved_packages.append(ebuild.package) | 565 revved_packages.append(ebuild.package) |
| 575 new_package_atoms.append('=%s' % new_package) | 566 new_package_atoms.append('=%s' % new_package) |
| 576 except (OSError, IOError): | 567 except (OSError, IOError): |
| 577 Warning('Cannot rev %s\n' % ebuild.package, | 568 Warning('Cannot rev %s\n' % ebuild.package, |
| 578 'Note you will have to go into %s ' | 569 'Note you will have to go into %s ' |
| 579 'and reset the git repo yourself.' % overlay) | 570 'and reset the git repo yourself.' % overlay) |
| 580 raise | 571 raise |
| 581 | 572 |
| 582 _CleanStalePackages(gflags.FLAGS.board, new_package_atoms) | 573 if revved_packages: |
| 583 if gflags.FLAGS.drop_file: | 574 _CleanStalePackages(gflags.FLAGS.board, new_package_atoms) |
| 584 fh = open(gflags.FLAGS.drop_file, 'w') | 575 if gflags.FLAGS.drop_file: |
| 585 fh.write(' '.join(revved_packages)) | 576 fh = open(gflags.FLAGS.drop_file, 'w') |
| 586 fh.close() | 577 fh.write(' '.join(revved_packages)) |
| 578 fh.close() |
| 579 else: |
| 580 work_branch.Delete() |
| 587 | 581 |
| 588 | 582 |
| 589 if __name__ == '__main__': | 583 if __name__ == '__main__': |
| 590 main(sys.argv) | 584 main(sys.argv) |
| OLD | NEW |