Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 the V8 project authors. All rights reserved. | 2 # Copyright 2014 the V8 project authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 # This script retrieves the history of all V8 branches and | 6 # This script retrieves the history of all V8 branches and |
| 7 # their corresponding Chromium revisions. | 7 # their corresponding Chromium revisions. |
| 8 | 8 |
| 9 # Requires a chromium checkout with branch heads: | 9 # Requires a chromium checkout with branch heads: |
| 10 # gclient sync --with_branch_heads | 10 # gclient sync --with_branch_heads |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 307 # Retrieve history for a specified branch. | 307 # Retrieve history for a specified branch. |
| 308 assert self._options.branch in (self.vc.GetBranches() + | 308 assert self._options.branch in (self.vc.GetBranches() + |
| 309 [self.vc.CandidateBranch(), self.vc.MasterBranch()]) | 309 [self.vc.CandidateBranch(), self.vc.MasterBranch()]) |
| 310 releases += self.GetReleasesFromBranch(self._options.branch) | 310 releases += self.GetReleasesFromBranch(self._options.branch) |
| 311 | 311 |
| 312 self["releases"] = sorted(releases, | 312 self["releases"] = sorted(releases, |
| 313 key=lambda r: SortingKey(r["version"]), | 313 key=lambda r: SortingKey(r["version"]), |
| 314 reverse=True) | 314 reverse=True) |
| 315 | 315 |
| 316 | 316 |
| 317 class SwitchChromium(Step): | 317 class UpdateChromiumCheckout(Step): |
| 318 MESSAGE = "Switch to Chromium checkout." | 318 MESSAGE = "Update the chromium checkout." |
| 319 | 319 |
| 320 def RunStep(self): | 320 def RunStep(self): |
| 321 cwd = self._options.chromium | 321 cwd = self._options.chromium |
| 322 # Check for a clean workdir. | 322 self.GitFetchOrigin("+refs/heads/*:refs/remotes/origin/*", |
| 323 if not self.GitIsWorkdirClean(cwd=cwd): # pragma: no cover | 323 "+refs/branch-heads/*:refs/remotes/branch-heads/*", |
| 324 self.Die("Workspace is not clean. Please commit or undo your changes.") | 324 cwd=cwd) |
| 325 # Assert that the DEPS file is there. | 325 # Update v8 checkout in chromium. |
| 326 if not os.path.exists(os.path.join(cwd, "DEPS")): # pragma: no cover | 326 self.GitFetchOrigin(cwd=os.path.join(cwd, "v8")) |
| 327 self.Die("DEPS file not present.") | |
| 328 | |
| 329 | |
| 330 class UpdateChromiumCheckout(Step): | |
| 331 MESSAGE = "Update the checkout and create a new branch." | |
| 332 | |
| 333 def RunStep(self): | |
| 334 cwd = self._options.chromium | |
| 335 self.GitCheckout("master", cwd=cwd) | |
| 336 self.GitPull(cwd=cwd) | |
| 337 self.DeleteBranch(self.Config("BRANCHNAME"), cwd=cwd) | |
| 338 self.GitCreateBranch(self.Config("BRANCHNAME"), cwd=cwd) | |
| 339 | 327 |
| 340 | 328 |
| 341 def ConvertToCommitNumber(step, revision): | 329 def ConvertToCommitNumber(step, revision): |
| 342 # Simple check for git hashes. | 330 # Simple check for git hashes. |
| 343 if revision.isdigit() and len(revision) < 8: | 331 if revision.isdigit() and len(revision) < 8: |
| 344 return revision | 332 return revision |
| 345 return step.GetCommitPositionNumber( | 333 return step.GetCommitPositionNumber( |
| 346 revision, cwd=os.path.join(step._options.chromium, "v8")) | 334 revision, cwd=os.path.join(step._options.chromium, "v8")) |
| 347 | 335 |
| 348 | 336 |
| 349 class RetrieveChromiumV8Releases(Step): | 337 class RetrieveChromiumV8Releases(Step): |
| 350 MESSAGE = "Retrieve V8 releases from Chromium DEPS." | 338 MESSAGE = "Retrieve V8 releases from Chromium DEPS." |
| 351 | 339 |
| 352 def RunStep(self): | 340 def RunStep(self): |
| 353 cwd = self._options.chromium | 341 cwd = self._options.chromium |
| 354 | 342 |
| 355 # Update v8 checkout in chromium. | |
| 356 self.GitFetchOrigin(cwd=os.path.join(cwd, "v8")) | |
| 357 | |
| 358 # All v8 revisions we are interested in. | 343 # All v8 revisions we are interested in. |
| 359 releases_dict = dict((r["revision_git"], r) for r in self["releases"]) | 344 releases_dict = dict((r["revision_git"], r) for r in self["releases"]) |
| 360 | 345 |
| 361 cr_releases = [] | 346 cr_releases = [] |
| 362 count_past_last_v8 = 0 | 347 count_past_last_v8 = 0 |
| 363 try: | 348 try: |
| 364 for git_hash in self.GitLog( | 349 for git_hash in self.GitLog( |
| 365 format="%H", grep="V8", cwd=cwd).splitlines(): | 350 format="%H", grep="V8", branch="origin/master", |
| 366 if "DEPS" not in self.GitChangedFiles(git_hash, cwd=cwd): | 351 path="DEPS", cwd=cwd).splitlines(): |
| 367 continue | 352 deps = self.GitShowFile(git_hash, "DEPS", cwd=cwd) |
| 368 if not self.GitCheckoutFileSafe("DEPS", git_hash, cwd=cwd): | |
| 369 break # pragma: no cover | |
| 370 deps = FileToText(os.path.join(cwd, "DEPS")) | |
| 371 match = DEPS_RE.search(deps) | 353 match = DEPS_RE.search(deps) |
| 372 if match: | 354 if match: |
| 373 cr_rev = self.GetCommitPositionNumber(git_hash, cwd=cwd) | 355 cr_rev = self.GetCommitPositionNumber(git_hash, cwd=cwd) |
| 374 if cr_rev: | 356 if cr_rev: |
| 375 v8_hsh = match.group(1) | 357 v8_hsh = match.group(1) |
| 376 cr_releases.append([cr_rev, v8_hsh]) | 358 cr_releases.append([cr_rev, v8_hsh]) |
| 377 | 359 |
| 378 if count_past_last_v8: | 360 if count_past_last_v8: |
| 379 count_past_last_v8 += 1 # pragma: no cover | 361 count_past_last_v8 += 1 # pragma: no cover |
| 380 | 362 |
| 381 if count_past_last_v8 > 10: | 363 if count_past_last_v8 > 20: |
|
Michael Achenbach
2015/04/07 14:21:15
10 was a bit too small... missed exactly one commi
| |
| 382 break # pragma: no cover | 364 break # pragma: no cover |
| 383 | 365 |
| 384 # Stop as soon as we find a v8 revision that we didn't fetch in the | 366 # Stop as soon as we find a v8 revision that we didn't fetch in the |
| 385 # v8-revision-retrieval part above (i.e. a revision that's too old). | 367 # v8-revision-retrieval part above (i.e. a revision that's too old). |
| 386 # Just iterate a few more times in case there were reverts. | 368 # Just iterate a few more times in case there were reverts. |
| 387 if v8_hsh not in releases_dict: | 369 if v8_hsh not in releases_dict: |
| 388 count_past_last_v8 += 1 # pragma: no cover | 370 count_past_last_v8 += 1 # pragma: no cover |
| 389 | 371 |
| 390 # Allow Ctrl-C interrupt. | 372 # Allow Ctrl-C interrupt. |
| 391 except (KeyboardInterrupt, SystemExit): # pragma: no cover | 373 except (KeyboardInterrupt, SystemExit): # pragma: no cover |
| 392 pass | 374 pass |
| 393 | 375 |
| 394 # Clean up. | |
| 395 self.GitCheckoutFileSafe("DEPS", "HEAD", cwd=cwd) | |
| 396 | |
| 397 # Add the chromium ranges to the v8 candidates and master releases. | 376 # Add the chromium ranges to the v8 candidates and master releases. |
| 398 all_ranges = BuildRevisionRanges(cr_releases) | 377 all_ranges = BuildRevisionRanges(cr_releases) |
| 399 | 378 |
| 400 for hsh, ranges in all_ranges.iteritems(): | 379 for hsh, ranges in all_ranges.iteritems(): |
| 401 releases_dict.get(hsh, {})["chromium_revision"] = ranges | 380 releases_dict.get(hsh, {})["chromium_revision"] = ranges |
| 402 | 381 |
| 403 | 382 |
| 404 # TODO(machenbach): Unify common code with method above. | 383 # TODO(machenbach): Unify common code with method above. |
| 405 class RietrieveChromiumBranches(Step): | 384 class RietrieveChromiumBranches(Step): |
| 406 MESSAGE = "Retrieve Chromium branch information." | 385 MESSAGE = "Retrieve Chromium branch information." |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 418 # Transform into pure branch numbers. | 397 # Transform into pure branch numbers. |
| 419 branches = map(lambda r: int(re.match(r"branch-heads/(\d+)", r).group(1)), | 398 branches = map(lambda r: int(re.match(r"branch-heads/(\d+)", r).group(1)), |
| 420 branches) | 399 branches) |
| 421 | 400 |
| 422 branches = sorted(branches, reverse=True) | 401 branches = sorted(branches, reverse=True) |
| 423 | 402 |
| 424 cr_branches = [] | 403 cr_branches = [] |
| 425 count_past_last_v8 = 0 | 404 count_past_last_v8 = 0 |
| 426 try: | 405 try: |
| 427 for branch in branches: | 406 for branch in branches: |
| 428 if not self.GitCheckoutFileSafe("DEPS", | 407 deps = self.GitShowFile( |
| 429 "branch-heads/%d" % branch, | 408 "refs/branch-heads/%d" % branch, "DEPS", cwd=cwd) |
| 430 cwd=cwd): | |
| 431 break # pragma: no cover | |
| 432 deps = FileToText(os.path.join(cwd, "DEPS")) | |
| 433 match = DEPS_RE.search(deps) | 409 match = DEPS_RE.search(deps) |
| 434 if match: | 410 if match: |
| 435 v8_hsh = match.group(1) | 411 v8_hsh = match.group(1) |
| 436 cr_branches.append([str(branch), v8_hsh]) | 412 cr_branches.append([str(branch), v8_hsh]) |
| 437 | 413 |
| 438 if count_past_last_v8: | 414 if count_past_last_v8: |
| 439 count_past_last_v8 += 1 # pragma: no cover | 415 count_past_last_v8 += 1 # pragma: no cover |
| 440 | 416 |
| 441 if count_past_last_v8 > 10: | 417 if count_past_last_v8 > 20: |
| 442 break # pragma: no cover | 418 break # pragma: no cover |
| 443 | 419 |
| 444 # Stop as soon as we find a v8 revision that we didn't fetch in the | 420 # Stop as soon as we find a v8 revision that we didn't fetch in the |
| 445 # v8-revision-retrieval part above (i.e. a revision that's too old). | 421 # v8-revision-retrieval part above (i.e. a revision that's too old). |
| 446 # Just iterate a few more times in case there were reverts. | 422 # Just iterate a few more times in case there were reverts. |
| 447 if v8_hsh not in releases_dict: | 423 if v8_hsh not in releases_dict: |
| 448 count_past_last_v8 += 1 # pragma: no cover | 424 count_past_last_v8 += 1 # pragma: no cover |
| 449 | 425 |
| 450 # Allow Ctrl-C interrupt. | 426 # Allow Ctrl-C interrupt. |
| 451 except (KeyboardInterrupt, SystemExit): # pragma: no cover | 427 except (KeyboardInterrupt, SystemExit): # pragma: no cover |
| 452 pass | 428 pass |
| 453 | 429 |
| 454 # Clean up. | |
| 455 self.GitCheckoutFileSafe("DEPS", "HEAD", cwd=cwd) | |
| 456 | |
| 457 # Add the chromium branches to the v8 candidate releases. | 430 # Add the chromium branches to the v8 candidate releases. |
| 458 all_ranges = BuildRevisionRanges(cr_branches) | 431 all_ranges = BuildRevisionRanges(cr_branches) |
| 459 for revision, ranges in all_ranges.iteritems(): | 432 for revision, ranges in all_ranges.iteritems(): |
| 460 releases_dict.get(revision, {})["chromium_branch"] = ranges | 433 releases_dict.get(revision, {})["chromium_branch"] = ranges |
| 461 | 434 |
| 462 | 435 |
| 463 class CleanUp(Step): | 436 class CleanUp(Step): |
| 464 MESSAGE = "Clean up." | 437 MESSAGE = "Clean up." |
| 465 | 438 |
| 466 def RunStep(self): | 439 def RunStep(self): |
| 467 self.GitCheckout("master", cwd=self._options.chromium) | |
| 468 self.GitDeleteBranch(self.Config("BRANCHNAME"), cwd=self._options.chromium) | |
| 469 self.CommonCleanup() | 440 self.CommonCleanup() |
| 470 | 441 |
| 471 | 442 |
| 472 class WriteOutput(Step): | 443 class WriteOutput(Step): |
| 473 MESSAGE = "Print output." | 444 MESSAGE = "Print output." |
| 474 | 445 |
| 475 def Run(self): | 446 def Run(self): |
| 476 if self._options.csv: | 447 if self._options.csv: |
| 477 with open(self._options.csv, "w") as f: | 448 with open(self._options.csv, "w") as f: |
| 478 writer = csv.DictWriter(f, | 449 writer = csv.DictWriter(f, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 511 def _Config(self): | 482 def _Config(self): |
| 512 return { | 483 return { |
| 513 "BRANCHNAME": "retrieve-v8-releases", | 484 "BRANCHNAME": "retrieve-v8-releases", |
| 514 "PERSISTFILE_BASENAME": "/tmp/v8-releases-tempfile", | 485 "PERSISTFILE_BASENAME": "/tmp/v8-releases-tempfile", |
| 515 } | 486 } |
| 516 | 487 |
| 517 def _Steps(self): | 488 def _Steps(self): |
| 518 return [ | 489 return [ |
| 519 Preparation, | 490 Preparation, |
| 520 RetrieveV8Releases, | 491 RetrieveV8Releases, |
| 521 SwitchChromium, | |
| 522 UpdateChromiumCheckout, | 492 UpdateChromiumCheckout, |
| 523 RetrieveChromiumV8Releases, | 493 RetrieveChromiumV8Releases, |
| 524 RietrieveChromiumBranches, | 494 RietrieveChromiumBranches, |
|
tandrii(chromium)
2015/04/07 15:13:51
unrelated CL nit: /s/RietrieveChromiumBranches/Ret
Michael Achenbach
2015/04/07 19:41:48
Yea - looks like Rietveld :) - but I'll hit the CQ
| |
| 525 CleanUp, | 495 CleanUp, |
| 526 WriteOutput, | 496 WriteOutput, |
| 527 ] | 497 ] |
| 528 | 498 |
| 529 | 499 |
| 530 if __name__ == "__main__": # pragma: no cover | 500 if __name__ == "__main__": # pragma: no cover |
| 531 sys.exit(Releases().Run()) | 501 sys.exit(Releases().Run()) |
| OLD | NEW |