| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2013 the V8 project authors. All rights reserved. | 2 # Copyright 2013 the V8 project authors. All rights reserved. |
| 3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
| 4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
| 5 # met: | 5 # met: |
| 6 # | 6 # |
| 7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
| 8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
| 9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
| 10 # copyright notice, this list of conditions and the following | 10 # copyright notice, this list of conditions and the following |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 | 28 |
| 29 import os | 29 import os |
| 30 import tempfile | 30 import tempfile |
| 31 import traceback | 31 import traceback |
| 32 import unittest | 32 import unittest |
| 33 | 33 |
| 34 import common_includes |
| 35 from common_includes import * |
| 36 import push_to_trunk |
| 37 from push_to_trunk import * |
| 34 import auto_roll | 38 import auto_roll |
| 35 from auto_roll import AutoRollOptions | 39 from auto_roll import AutoRollOptions |
| 36 from auto_roll import CheckLastPush | 40 from auto_roll import CheckLastPush |
| 37 from auto_roll import FetchLatestRevision | 41 from auto_roll import FetchLatestRevision |
| 38 from auto_roll import SETTINGS_LOCATION | 42 from auto_roll import SETTINGS_LOCATION |
| 39 import common_includes | |
| 40 from common_includes import * | |
| 41 import merge_to_branch | |
| 42 from merge_to_branch import * | |
| 43 import push_to_trunk | |
| 44 from push_to_trunk import * | |
| 45 | 43 |
| 46 | 44 |
| 47 TEST_CONFIG = { | 45 TEST_CONFIG = { |
| 48 BRANCHNAME: "test-prepare-push", | 46 BRANCHNAME: "test-prepare-push", |
| 49 TRUNKBRANCH: "test-trunk-push", | 47 TRUNKBRANCH: "test-trunk-push", |
| 50 PERSISTFILE_BASENAME: "/tmp/test-v8-push-to-trunk-tempfile", | 48 PERSISTFILE_BASENAME: "/tmp/test-v8-push-to-trunk-tempfile", |
| 51 TEMP_BRANCH: "test-prepare-push-temporary-branch-created-by-script", | 49 TEMP_BRANCH: "test-prepare-push-temporary-branch-created-by-script", |
| 52 DOT_GIT_LOCATION: None, | 50 DOT_GIT_LOCATION: None, |
| 53 VERSION_FILE: None, | 51 VERSION_FILE: None, |
| 54 CHANGELOG_FILE: None, | 52 CHANGELOG_FILE: None, |
| 55 CHANGELOG_ENTRY_FILE: "/tmp/test-v8-push-to-trunk-tempfile-changelog-entry", | 53 CHANGELOG_ENTRY_FILE: "/tmp/test-v8-push-to-trunk-tempfile-changelog-entry", |
| 56 PATCH_FILE: "/tmp/test-v8-push-to-trunk-tempfile-patch", | 54 PATCH_FILE: "/tmp/test-v8-push-to-trunk-tempfile-patch", |
| 57 COMMITMSG_FILE: "/tmp/test-v8-push-to-trunk-tempfile-commitmsg", | 55 COMMITMSG_FILE: "/tmp/test-v8-push-to-trunk-tempfile-commitmsg", |
| 58 CHROMIUM: "/tmp/test-v8-push-to-trunk-tempfile-chromium", | 56 CHROMIUM: "/tmp/test-v8-push-to-trunk-tempfile-chromium", |
| 59 DEPS_FILE: "/tmp/test-v8-push-to-trunk-tempfile-chromium/DEPS", | 57 DEPS_FILE: "/tmp/test-v8-push-to-trunk-tempfile-chromium/DEPS", |
| 60 SETTINGS_LOCATION: None, | 58 SETTINGS_LOCATION: None, |
| 61 ALREADY_MERGING_SENTINEL_FILE: | |
| 62 "/tmp/test-merge-to-branch-tempfile-already-merging", | |
| 63 COMMIT_HASHES_FILE: "/tmp/test-merge-to-branch-tempfile-PATCH_COMMIT_HASHES", | |
| 64 TEMPORARY_PATCH_FILE: "/tmp/test-merge-to-branch-tempfile-temporary-patch", | |
| 65 } | 59 } |
| 66 | 60 |
| 67 AUTO_ROLL_ARGS = [ | |
| 68 "-a", "author@chromium.org", | |
| 69 "-c", TEST_CONFIG[CHROMIUM], | |
| 70 "-r", "reviewer@chromium.org", | |
| 71 ] | |
| 72 | 61 |
| 73 | 62 def MakeOptions(s=0, l=None, f=False, m=True, r=None, c=None, |
| 74 def MakeOptions(s=0, l=None, f=False, m=True, r=None, c=None, a=None, | 63 status_password=None): |
| 75 status_password=None, revert_bleeding_edge=None, p=None): | |
| 76 """Convenience wrapper.""" | 64 """Convenience wrapper.""" |
| 77 class Options(object): | 65 class Options(object): |
| 78 pass | 66 pass |
| 79 options = Options() | 67 options = Options() |
| 80 options.s = s | 68 options.s = s |
| 81 options.l = l | 69 options.l = l |
| 82 options.f = f | 70 options.f = f |
| 83 options.m = m | 71 options.m = m |
| 84 options.reviewer = r | 72 options.r = r |
| 85 options.c = c | 73 options.c = c |
| 86 options.a = a | |
| 87 options.p = p | |
| 88 options.status_password = status_password | 74 options.status_password = status_password |
| 89 options.revert_bleeding_edge = revert_bleeding_edge | |
| 90 return options | 75 return options |
| 91 | 76 |
| 92 | 77 |
| 93 class ToplevelTest(unittest.TestCase): | 78 class ToplevelTest(unittest.TestCase): |
| 94 def testMakeComment(self): | 79 def testMakeComment(self): |
| 95 self.assertEquals("# Line 1\n# Line 2\n#", | 80 self.assertEquals("# Line 1\n# Line 2\n#", |
| 96 MakeComment(" Line 1\n Line 2\n")) | 81 MakeComment(" Line 1\n Line 2\n")) |
| 97 self.assertEquals("#Line 1\n#Line 2", | 82 self.assertEquals("#Line 1\n#Line 2", |
| 98 MakeComment("Line 1\n Line 2")) | 83 MakeComment("Line 1\n Line 2")) |
| 99 | 84 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 self._index = -1 | 220 self._index = -1 |
| 236 | 221 |
| 237 def Expect(self, recipe): | 222 def Expect(self, recipe): |
| 238 self._recipe = recipe | 223 self._recipe = recipe |
| 239 | 224 |
| 240 def Call(self, *args): | 225 def Call(self, *args): |
| 241 self._index += 1 | 226 self._index += 1 |
| 242 try: | 227 try: |
| 243 expected_call = self._recipe[self._index] | 228 expected_call = self._recipe[self._index] |
| 244 except IndexError: | 229 except IndexError: |
| 245 raise NoRetryException("Calling %s %s" % (self._name, " ".join(args))) | 230 raise Exception("Calling %s %s" % (self._name, " ".join(args))) |
| 246 | 231 |
| 247 # Pack expectations without arguments into a list. | 232 # Pack expectations without arguments into a list. |
| 248 if not isinstance(expected_call, list): | 233 if not isinstance(expected_call, list): |
| 249 expected_call = [expected_call] | 234 expected_call = [expected_call] |
| 250 | 235 |
| 251 # The number of arguments in the expectation must match the actual | 236 # The number of arguments in the expectation must match the actual |
| 252 # arguments. | 237 # arguments. |
| 253 if len(args) > len(expected_call): | 238 if len(args) > len(expected_call): |
| 254 raise NoRetryException("When calling %s with arguments, the " | 239 raise NoRetryException("When calling %s with arguments, the " |
| 255 "expectations must consist of at least as many arguments.") | 240 "expectations must consist of at least as many arguments.") |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 f.write("#define MINOR_VERSION 22\n") | 282 f.write("#define MINOR_VERSION 22\n") |
| 298 f.write("#define BUILD_NUMBER 5\n") | 283 f.write("#define BUILD_NUMBER 5\n") |
| 299 f.write("#define PATCH_LEVEL 0\n") | 284 f.write("#define PATCH_LEVEL 0\n") |
| 300 f.write(" // Some line...\n") | 285 f.write(" // Some line...\n") |
| 301 f.write("#define IS_CANDIDATE_VERSION 0\n") | 286 f.write("#define IS_CANDIDATE_VERSION 0\n") |
| 302 return name | 287 return name |
| 303 | 288 |
| 304 def MakeStep(self, step_class=Step, state=None, options=None): | 289 def MakeStep(self, step_class=Step, state=None, options=None): |
| 305 """Convenience wrapper.""" | 290 """Convenience wrapper.""" |
| 306 options = options or CommonOptions(MakeOptions()) | 291 options = options or CommonOptions(MakeOptions()) |
| 307 state = state if state is not None else self._state | |
| 308 return MakeStep(step_class=step_class, number=0, state=state, | 292 return MakeStep(step_class=step_class, number=0, state=state, |
| 309 config=TEST_CONFIG, options=options, | 293 config=TEST_CONFIG, options=options, |
| 310 side_effect_handler=self) | 294 side_effect_handler=self) |
| 311 | 295 |
| 312 def GitMock(self, cmd, args="", pipe=True): | 296 def GitMock(self, cmd, args="", pipe=True): |
| 313 print "%s %s" % (cmd, args) | 297 print "%s %s" % (cmd, args) |
| 314 return self._git_mock.Call(args) | 298 return self._git_mock.Call(args) |
| 315 | 299 |
| 316 def LogMock(self, cmd, args=""): | 300 def LogMock(self, cmd, args=""): |
| 317 print "Log: %s %s" % (cmd, args) | 301 print "Log: %s %s" % (cmd, args) |
| 318 | 302 |
| 319 MOCKS = { | 303 MOCKS = { |
| 320 "git": GitMock, | 304 "git": GitMock, |
| 321 # TODO(machenbach): Little hack to reuse the git mock for the one svn call | |
| 322 # in merge-to-branch. The command should be made explicit in the test | |
| 323 # expectations. | |
| 324 "svn": GitMock, | |
| 325 "vi": LogMock, | 305 "vi": LogMock, |
| 326 } | 306 } |
| 327 | 307 |
| 328 def Call(self, fun, *args, **kwargs): | 308 def Call(self, fun, *args, **kwargs): |
| 329 print "Calling %s with %s and %s" % (str(fun), str(args), str(kwargs)) | 309 print "Calling %s with %s and %s" % (str(fun), str(args), str(kwargs)) |
| 330 | 310 |
| 331 def Command(self, cmd, args="", prefix="", pipe=True): | 311 def Command(self, cmd, args="", prefix="", pipe=True): |
| 332 return ScriptTest.MOCKS[cmd](self, cmd, args) | 312 return ScriptTest.MOCKS[cmd](self, cmd, args) |
| 333 | 313 |
| 334 def ReadLine(self): | 314 def ReadLine(self): |
| (...skipping 21 matching lines...) Expand all Loading... |
| 356 | 336 |
| 357 def ExpectReadURL(self, *args): | 337 def ExpectReadURL(self, *args): |
| 358 """Convenience wrapper.""" | 338 """Convenience wrapper.""" |
| 359 self._url_mock.Expect(*args) | 339 self._url_mock.Expect(*args) |
| 360 | 340 |
| 361 def setUp(self): | 341 def setUp(self): |
| 362 self._git_mock = SimpleMock("git") | 342 self._git_mock = SimpleMock("git") |
| 363 self._rl_mock = SimpleMock("readline") | 343 self._rl_mock = SimpleMock("readline") |
| 364 self._url_mock = SimpleMock("readurl") | 344 self._url_mock = SimpleMock("readurl") |
| 365 self._tmp_files = [] | 345 self._tmp_files = [] |
| 366 self._state = {} | |
| 367 | 346 |
| 368 def tearDown(self): | 347 def tearDown(self): |
| 369 Command("rm", "-rf %s*" % TEST_CONFIG[PERSISTFILE_BASENAME]) | 348 Command("rm", "-rf %s*" % TEST_CONFIG[PERSISTFILE_BASENAME]) |
| 370 | 349 |
| 371 # Clean up temps. Doesn't work automatically. | 350 # Clean up temps. Doesn't work automatically. |
| 372 for name in self._tmp_files: | 351 for name in self._tmp_files: |
| 373 if os.path.exists(name): | 352 if os.path.exists(name): |
| 374 os.remove(name) | 353 os.remove(name) |
| 375 | 354 |
| 376 self._git_mock.AssertFinished() | 355 self._git_mock.AssertFinished() |
| 377 self._rl_mock.AssertFinished() | 356 self._rl_mock.AssertFinished() |
| 378 self._url_mock.AssertFinished() | 357 self._url_mock.AssertFinished() |
| 379 | 358 |
| 359 def testPersistRestore(self): |
| 360 self.MakeStep().Persist("test1", "") |
| 361 self.assertEquals("", self.MakeStep().Restore("test1")) |
| 362 self.MakeStep().Persist("test2", "AB123") |
| 363 self.assertEquals("AB123", self.MakeStep().Restore("test2")) |
| 364 |
| 380 def testGitOrig(self): | 365 def testGitOrig(self): |
| 381 self.assertTrue(Command("git", "--version").startswith("git version")) | 366 self.assertTrue(Command("git", "--version").startswith("git version")) |
| 382 | 367 |
| 383 def testGitMock(self): | 368 def testGitMock(self): |
| 384 self.ExpectGit([["--version", "git version 1.2.3"], ["dummy", ""]]) | 369 self.ExpectGit([["--version", "git version 1.2.3"], ["dummy", ""]]) |
| 385 self.assertEquals("git version 1.2.3", self.MakeStep().Git("--version")) | 370 self.assertEquals("git version 1.2.3", self.MakeStep().Git("--version")) |
| 386 self.assertEquals("", self.MakeStep().Git("dummy")) | 371 self.assertEquals("", self.MakeStep().Git("dummy")) |
| 387 | 372 |
| 388 def testCommonPrepareDefault(self): | 373 def testCommonPrepareDefault(self): |
| 389 self.ExpectGit([ | 374 self.ExpectGit([ |
| 390 ["status -s -uno", ""], | 375 ["status -s -uno", ""], |
| 391 ["status -s -b -uno", "## some_branch"], | 376 ["status -s -b -uno", "## some_branch"], |
| 392 ["svn fetch", ""], | 377 ["svn fetch", ""], |
| 393 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], | 378 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], |
| 394 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""], | 379 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""], |
| 395 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""], | 380 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""], |
| 396 ["branch", ""], | 381 ["branch", ""], |
| 397 ]) | 382 ]) |
| 398 self.ExpectReadline(["Y"]) | 383 self.ExpectReadline(["Y"]) |
| 399 self.MakeStep().CommonPrepare() | 384 self.MakeStep().CommonPrepare() |
| 400 self.MakeStep().PrepareBranch() | 385 self.MakeStep().PrepareBranch() |
| 401 self.assertEquals("some_branch", self._state["current_branch"]) | 386 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch")) |
| 402 | 387 |
| 403 def testCommonPrepareNoConfirm(self): | 388 def testCommonPrepareNoConfirm(self): |
| 404 self.ExpectGit([ | 389 self.ExpectGit([ |
| 405 ["status -s -uno", ""], | 390 ["status -s -uno", ""], |
| 406 ["status -s -b -uno", "## some_branch"], | 391 ["status -s -b -uno", "## some_branch"], |
| 407 ["svn fetch", ""], | 392 ["svn fetch", ""], |
| 408 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], | 393 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], |
| 409 ]) | 394 ]) |
| 410 self.ExpectReadline(["n"]) | 395 self.ExpectReadline(["n"]) |
| 411 self.MakeStep().CommonPrepare() | 396 self.MakeStep().CommonPrepare() |
| 412 self.assertRaises(Exception, self.MakeStep().PrepareBranch) | 397 self.assertRaises(Exception, self.MakeStep().PrepareBranch) |
| 413 self.assertEquals("some_branch", self._state["current_branch"]) | 398 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch")) |
| 414 | 399 |
| 415 def testCommonPrepareDeleteBranchFailure(self): | 400 def testCommonPrepareDeleteBranchFailure(self): |
| 416 self.ExpectGit([ | 401 self.ExpectGit([ |
| 417 ["status -s -uno", ""], | 402 ["status -s -uno", ""], |
| 418 ["status -s -b -uno", "## some_branch"], | 403 ["status -s -b -uno", "## some_branch"], |
| 419 ["svn fetch", ""], | 404 ["svn fetch", ""], |
| 420 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], | 405 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], |
| 421 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], None], | 406 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], None], |
| 422 ]) | 407 ]) |
| 423 self.ExpectReadline(["Y"]) | 408 self.ExpectReadline(["Y"]) |
| 424 self.MakeStep().CommonPrepare() | 409 self.MakeStep().CommonPrepare() |
| 425 self.assertRaises(Exception, self.MakeStep().PrepareBranch) | 410 self.assertRaises(Exception, self.MakeStep().PrepareBranch) |
| 426 self.assertEquals("some_branch", self._state["current_branch"]) | 411 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch")) |
| 427 | 412 |
| 428 def testInitialEnvironmentChecks(self): | 413 def testInitialEnvironmentChecks(self): |
| 429 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() | 414 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() |
| 430 os.environ["EDITOR"] = "vi" | 415 os.environ["EDITOR"] = "vi" |
| 431 self.MakeStep().InitialEnvironmentChecks() | 416 self.MakeStep().InitialEnvironmentChecks() |
| 432 | 417 |
| 433 def testReadAndPersistVersion(self): | 418 def testReadAndPersistVersion(self): |
| 434 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() | 419 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() |
| 435 step = self.MakeStep() | 420 step = self.MakeStep() |
| 436 step.ReadAndPersistVersion() | 421 step.ReadAndPersistVersion() |
| 437 self.assertEquals("3", step["major"]) | 422 self.assertEquals("3", self.MakeStep().Restore("major")) |
| 438 self.assertEquals("22", step["minor"]) | 423 self.assertEquals("22", self.MakeStep().Restore("minor")) |
| 439 self.assertEquals("5", step["build"]) | 424 self.assertEquals("5", self.MakeStep().Restore("build")) |
| 440 self.assertEquals("0", step["patch"]) | 425 self.assertEquals("0", self.MakeStep().Restore("patch")) |
| 426 self.assertEquals("3", step._state["major"]) |
| 427 self.assertEquals("22", step._state["minor"]) |
| 428 self.assertEquals("5", step._state["build"]) |
| 429 self.assertEquals("0", step._state["patch"]) |
| 441 | 430 |
| 442 def testRegex(self): | 431 def testRegex(self): |
| 443 self.assertEqual("(issue 321)", | 432 self.assertEqual("(issue 321)", |
| 444 re.sub(r"BUG=v8:(.*)$", r"(issue \1)", "BUG=v8:321")) | 433 re.sub(r"BUG=v8:(.*)$", r"(issue \1)", "BUG=v8:321")) |
| 445 self.assertEqual("(Chromium issue 321)", | 434 self.assertEqual("(Chromium issue 321)", |
| 446 re.sub(r"BUG=(.*)$", r"(Chromium issue \1)", "BUG=321")) | 435 re.sub(r"BUG=(.*)$", r"(Chromium issue \1)", "BUG=321")) |
| 447 | 436 |
| 448 cl = " too little\n\ttab\ttab\n too much\n trailing " | 437 cl = " too little\n\ttab\ttab\n too much\n trailing " |
| 449 cl = MSub(r"\t", r" ", cl) | 438 cl = MSub(r"\t", r" ", cl) |
| 450 cl = MSub(r"^ {1,7}([^ ])", r" \1", cl) | 439 cl = MSub(r"^ {1,7}([^ ])", r" \1", cl) |
| 451 cl = MSub(r"^ {9,80}([^ ])", r" \1", cl) | 440 cl = MSub(r"^ {9,80}([^ ])", r" \1", cl) |
| 452 cl = MSub(r" +$", r"", cl) | 441 cl = MSub(r" +$", r"", cl) |
| 453 self.assertEqual(" too little\n" | 442 self.assertEqual(" too little\n" |
| 454 " tab tab\n" | 443 " tab tab\n" |
| 455 " too much\n" | 444 " too much\n" |
| 456 " trailing", cl) | 445 " trailing", cl) |
| 457 | 446 |
| 458 self.assertEqual("//\n#define BUILD_NUMBER 3\n", | 447 self.assertEqual("//\n#define BUILD_NUMBER 3\n", |
| 459 MSub(r"(?<=#define BUILD_NUMBER)(?P<space>\s+)\d*$", | 448 MSub(r"(?<=#define BUILD_NUMBER)(?P<space>\s+)\d*$", |
| 460 r"\g<space>3", | 449 r"\g<space>3", |
| 461 "//\n#define BUILD_NUMBER 321\n")) | 450 "//\n#define BUILD_NUMBER 321\n")) |
| 462 | 451 |
| 463 def testPrepareChangeLog(self): | 452 def testPrepareChangeLog(self): |
| 464 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() | 453 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() |
| 465 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() | 454 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() |
| 466 | 455 |
| 467 self.ExpectGit([ | 456 self.ExpectGit([ |
| 468 ["log --format=%H 1234..HEAD", "rev1\nrev2\nrev3\nrev4"], | 457 ["log 1234..HEAD --format=%H", "rev1\nrev2\nrev3\nrev4"], |
| 469 ["log -1 --format=%s rev1", "Title text 1"], | 458 ["log -1 rev1 --format=\"%s\"", "Title text 1"], |
| 470 ["log -1 --format=%B rev1", "Title\n\nBUG=\nLOG=y\n"], | 459 ["log -1 rev1 --format=\"%B\"", "Title\n\nBUG=\nLOG=y\n"], |
| 471 ["log -1 --format=%an rev1", "author1@chromium.org"], | 460 ["log -1 rev1 --format=\"%an\"", "author1@chromium.org"], |
| 472 ["log -1 --format=%s rev2", "Title text 2."], | 461 ["log -1 rev2 --format=\"%s\"", "Title text 2."], |
| 473 ["log -1 --format=%B rev2", "Title\n\nBUG=123\nLOG= \n"], | 462 ["log -1 rev2 --format=\"%B\"", "Title\n\nBUG=123\nLOG= \n"], |
| 474 ["log -1 --format=%an rev2", "author2@chromium.org"], | 463 ["log -1 rev2 --format=\"%an\"", "author2@chromium.org"], |
| 475 ["log -1 --format=%s rev3", "Title text 3"], | 464 ["log -1 rev3 --format=\"%s\"", "Title text 3"], |
| 476 ["log -1 --format=%B rev3", "Title\n\nBUG=321\nLOG=true\n"], | 465 ["log -1 rev3 --format=\"%B\"", "Title\n\nBUG=321\nLOG=true\n"], |
| 477 ["log -1 --format=%an rev3", "author3@chromium.org"], | 466 ["log -1 rev3 --format=\"%an\"", "author3@chromium.org"], |
| 478 ["log -1 --format=%s rev4", "Title text 4"], | 467 ["log -1 rev4 --format=\"%s\"", "Title text 4"], |
| 479 ["log -1 --format=%B rev4", | 468 ["log -1 rev4 --format=\"%B\"", |
| 480 ("Title\n\nBUG=456\nLOG=Y\n\n" | 469 ("Title\n\nBUG=456\nLOG=Y\n\n" |
| 481 "Review URL: https://codereview.chromium.org/9876543210\n")], | 470 "Review URL: https://codereview.chromium.org/9876543210\n")], |
| 482 ["log -1 --format=%an rev4", "author4@chromium.org"], | 471 ["log -1 rev4 --format=\"%an\"", "author4@chromium.org"], |
| 483 ]) | 472 ]) |
| 484 | 473 |
| 485 # The cl for rev4 on rietveld has an updated LOG flag. | 474 # The cl for rev4 on rietveld has an updated LOG flag. |
| 486 self.ExpectReadURL([ | 475 self.ExpectReadURL([ |
| 487 ["https://codereview.chromium.org/9876543210/description", | 476 ["https://codereview.chromium.org/9876543210/description", |
| 488 "Title\n\nBUG=456\nLOG=N\n\n"], | 477 "Title\n\nBUG=456\nLOG=N\n\n"], |
| 489 ]) | 478 ]) |
| 490 | 479 |
| 491 self._state["last_push_bleeding_edge"] = "1234" | 480 self.MakeStep().Persist("last_push", "1234") |
| 492 self.MakeStep(PrepareChangeLog).Run() | 481 self.MakeStep(PrepareChangeLog).Run() |
| 493 | 482 |
| 494 actual_cl = FileToText(TEST_CONFIG[CHANGELOG_ENTRY_FILE]) | 483 actual_cl = FileToText(TEST_CONFIG[CHANGELOG_ENTRY_FILE]) |
| 495 | 484 |
| 496 expected_cl = """1999-07-31: Version 3.22.5 | 485 expected_cl = """1999-07-31: Version 3.22.5 |
| 497 | 486 |
| 498 Title text 1. | 487 Title text 1. |
| 499 | 488 |
| 500 Title text 3 (Chromium issue 321). | 489 Title text 3 (Chromium issue 321). |
| 501 | 490 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 513 # | 502 # |
| 514 # Title text 3 (Chromium issue 321). | 503 # Title text 3 (Chromium issue 321). |
| 515 # (author3@chromium.org) | 504 # (author3@chromium.org) |
| 516 # | 505 # |
| 517 # Title text 4 (Chromium issue 456). | 506 # Title text 4 (Chromium issue 456). |
| 518 # (author4@chromium.org) | 507 # (author4@chromium.org) |
| 519 # | 508 # |
| 520 #""" | 509 #""" |
| 521 | 510 |
| 522 self.assertEquals(expected_cl, actual_cl) | 511 self.assertEquals(expected_cl, actual_cl) |
| 523 self.assertEquals("3", self._state["major"]) | 512 self.assertEquals("3", self.MakeStep().Restore("major")) |
| 524 self.assertEquals("22", self._state["minor"]) | 513 self.assertEquals("22", self.MakeStep().Restore("minor")) |
| 525 self.assertEquals("5", self._state["build"]) | 514 self.assertEquals("5", self.MakeStep().Restore("build")) |
| 526 self.assertEquals("0", self._state["patch"]) | 515 self.assertEquals("0", self.MakeStep().Restore("patch")) |
| 527 | 516 |
| 528 def testEditChangeLog(self): | 517 def testEditChangeLog(self): |
| 529 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() | 518 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() |
| 530 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile() | 519 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile() |
| 531 TextToFile(" Original CL", TEST_CONFIG[CHANGELOG_FILE]) | 520 TextToFile(" Original CL", TEST_CONFIG[CHANGELOG_FILE]) |
| 532 TextToFile(" New \n\tLines \n", TEST_CONFIG[CHANGELOG_ENTRY_FILE]) | 521 TextToFile(" New \n\tLines \n", TEST_CONFIG[CHANGELOG_ENTRY_FILE]) |
| 533 os.environ["EDITOR"] = "vi" | 522 os.environ["EDITOR"] = "vi" |
| 534 | 523 |
| 535 self.ExpectReadline([ | 524 self.ExpectReadline([ |
| 536 "", # Open editor. | 525 "", # Open editor. |
| 537 ]) | 526 ]) |
| 538 | 527 |
| 539 self.MakeStep(EditChangeLog).Run() | 528 self.MakeStep(EditChangeLog).Run() |
| 540 | 529 |
| 541 self.assertEquals("New\n Lines\n\n\n Original CL", | 530 self.assertEquals("New\n Lines\n\n\n Original CL", |
| 542 FileToText(TEST_CONFIG[CHANGELOG_FILE])) | 531 FileToText(TEST_CONFIG[CHANGELOG_FILE])) |
| 543 | 532 |
| 544 def testIncrementVersion(self): | 533 def testIncrementVersion(self): |
| 545 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() | 534 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() |
| 546 self._state["build"] = "5" | 535 self.MakeStep().Persist("build", "5") |
| 547 | 536 |
| 548 self.ExpectReadline([ | 537 self.ExpectReadline([ |
| 549 "Y", # Increment build number. | 538 "Y", # Increment build number. |
| 550 ]) | 539 ]) |
| 551 | 540 |
| 552 self.MakeStep(IncrementVersion).Run() | 541 self.MakeStep(IncrementVersion).Run() |
| 553 | 542 |
| 554 self.assertEquals("3", self._state["new_major"]) | 543 self.assertEquals("3", self.MakeStep().Restore("new_major")) |
| 555 self.assertEquals("22", self._state["new_minor"]) | 544 self.assertEquals("22", self.MakeStep().Restore("new_minor")) |
| 556 self.assertEquals("6", self._state["new_build"]) | 545 self.assertEquals("6", self.MakeStep().Restore("new_build")) |
| 557 self.assertEquals("0", self._state["new_patch"]) | 546 self.assertEquals("0", self.MakeStep().Restore("new_patch")) |
| 558 | 547 |
| 559 def testLastChangeLogEntries(self): | 548 def testLastChangeLogEntries(self): |
| 560 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile() | 549 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile() |
| 561 l = """ | 550 l = """ |
| 562 Fixed something. | 551 Fixed something. |
| 563 (issue 1234)\n""" | 552 (issue 1234)\n""" |
| 564 for _ in xrange(10): l = l + l | 553 for _ in xrange(10): l = l + l |
| 565 | 554 |
| 566 cl_chunk = """2013-11-12: Version 3.23.2\n%s | 555 cl_chunk = """2013-11-12: Version 3.23.2\n%s |
| 567 Performance and stability improvements on all platforms.\n\n\n""" % l | 556 Performance and stability improvements on all platforms.\n\n\n""" % l |
| 568 | 557 |
| 569 cl_chunk_full = cl_chunk + cl_chunk + cl_chunk | 558 cl_chunk_full = cl_chunk + cl_chunk + cl_chunk |
| 570 TextToFile(cl_chunk_full, TEST_CONFIG[CHANGELOG_FILE]) | 559 TextToFile(cl_chunk_full, TEST_CONFIG[CHANGELOG_FILE]) |
| 571 | 560 |
| 572 cl = GetLastChangeLogEntries(TEST_CONFIG[CHANGELOG_FILE]) | 561 cl = GetLastChangeLogEntries(TEST_CONFIG[CHANGELOG_FILE]) |
| 573 self.assertEquals(cl_chunk, cl) | 562 self.assertEquals(cl_chunk, cl) |
| 574 | 563 |
| 575 def _TestSquashCommits(self, change_log, expected_msg): | 564 def _TestSquashCommits(self, change_log, expected_msg): |
| 576 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() | 565 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() |
| 577 with open(TEST_CONFIG[CHANGELOG_ENTRY_FILE], "w") as f: | 566 with open(TEST_CONFIG[CHANGELOG_ENTRY_FILE], "w") as f: |
| 578 f.write(change_log) | 567 f.write(change_log) |
| 579 | 568 |
| 580 self.ExpectGit([ | 569 self.ExpectGit([ |
| 581 ["diff svn/trunk hash1", "patch content"], | 570 ["diff svn/trunk hash1", "patch content"], |
| 582 ["svn find-rev hash1", "123455\n"], | 571 ["svn find-rev hash1", "123455\n"], |
| 583 ]) | 572 ]) |
| 584 | 573 |
| 585 self._state["prepare_commit_hash"] = "hash1" | 574 self.MakeStep().Persist("prepare_commit_hash", "hash1") |
| 586 self._state["date"] = "1999-11-11" | 575 self.MakeStep().Persist("date", "1999-11-11") |
| 587 | 576 |
| 588 self.MakeStep(SquashCommits).Run() | 577 self.MakeStep(SquashCommits).Run() |
| 589 self.assertEquals(FileToText(TEST_CONFIG[COMMITMSG_FILE]), expected_msg) | 578 self.assertEquals(FileToText(TEST_CONFIG[COMMITMSG_FILE]), expected_msg) |
| 590 | 579 |
| 591 patch = FileToText(TEST_CONFIG[ PATCH_FILE]) | 580 patch = FileToText(TEST_CONFIG[ PATCH_FILE]) |
| 592 self.assertTrue(re.search(r"patch content", patch)) | 581 self.assertTrue(re.search(r"patch content", patch)) |
| 593 | 582 |
| 594 def testSquashCommitsUnformatted(self): | 583 def testSquashCommitsUnformatted(self): |
| 595 change_log = """1999-11-11: Version 3.22.5 | 584 change_log = """1999-11-11: Version 3.22.5 |
| 596 | 585 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 review_suffix = "\n\nTBR=reviewer@chromium.org" if not manual else "" | 656 review_suffix = "\n\nTBR=reviewer@chromium.org" if not manual else "" |
| 668 self.ExpectGit([ | 657 self.ExpectGit([ |
| 669 ["status -s -uno", ""], | 658 ["status -s -uno", ""], |
| 670 ["status -s -b -uno", "## some_branch\n"], | 659 ["status -s -b -uno", "## some_branch\n"], |
| 671 ["svn fetch", ""], | 660 ["svn fetch", ""], |
| 672 ["branch", " branch1\n* branch2\n"], | 661 ["branch", " branch1\n* branch2\n"], |
| 673 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""], | 662 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""], |
| 674 ["branch", " branch1\n* branch2\n"], | 663 ["branch", " branch1\n* branch2\n"], |
| 675 ["branch", " branch1\n* branch2\n"], | 664 ["branch", " branch1\n* branch2\n"], |
| 676 ["checkout -b %s svn/bleeding_edge" % TEST_CONFIG[BRANCHNAME], ""], | 665 ["checkout -b %s svn/bleeding_edge" % TEST_CONFIG[BRANCHNAME], ""], |
| 677 [("log -1 --format=%H --grep=" | 666 ["log -1 --format=%H ChangeLog", "1234\n"], |
| 678 "\"^Version [[:digit:]]*\.[[:digit:]]*\.[[:digit:]]* (based\" " | 667 ["log -1 1234", "Last push ouput\n"], |
| 679 "svn/trunk"), "hash2\n"], | 668 ["log 1234..HEAD --format=%H", "rev1\n"], |
| 680 ["log -1 hash2", "Log message\n"], | 669 ["log -1 rev1 --format=\"%s\"", "Log text 1.\n"], |
| 681 ["log -1 --format=%s hash2", | 670 ["log -1 rev1 --format=\"%B\"", "Text\nLOG=YES\nBUG=v8:321\nText\n"], |
| 682 "Version 3.4.5 (based on bleeding_edge revision r1234)\n"], | 671 ["log -1 rev1 --format=\"%an\"", "author1@chromium.org\n"], |
| 683 ["svn find-rev r1234", "hash3\n"], | 672 [("commit -a -m \"Prepare push to trunk. " |
| 684 ["log --format=%H hash3..HEAD", "rev1\n"], | |
| 685 ["log -1 --format=%s rev1", "Log text 1.\n"], | |
| 686 ["log -1 --format=%B rev1", "Text\nLOG=YES\nBUG=v8:321\nText\n"], | |
| 687 ["log -1 --format=%an rev1", "author1@chromium.org\n"], | |
| 688 [("commit -am \"Prepare push to trunk. " | |
| 689 "Now working on version 3.22.6.%s\"" % review_suffix), | 673 "Now working on version 3.22.6.%s\"" % review_suffix), |
| 690 " 2 files changed\n", | 674 " 2 files changed\n", |
| 691 CheckPreparePush], | 675 CheckPreparePush], |
| 692 [("cl upload --send-mail --email \"author@chromium.org\" " | 676 ["cl upload -r \"reviewer@chromium.org\" --send-mail%s" % force_flag, |
| 693 "-r \"reviewer@chromium.org\"%s" % force_flag), | |
| 694 "done\n"], | 677 "done\n"], |
| 695 ["cl presubmit", "Presubmit successfull\n"], | 678 ["cl presubmit", "Presubmit successfull\n"], |
| 696 ["cl dcommit -f --bypass-hooks", "Closing issue\n"], | 679 ["cl dcommit -f --bypass-hooks", "Closing issue\n"], |
| 697 ["svn fetch", "fetch result\n"], | 680 ["svn fetch", "fetch result\n"], |
| 698 ["checkout -f svn/bleeding_edge", ""], | 681 ["checkout svn/bleeding_edge", ""], |
| 699 [("log -1 --format=%H --grep=\"Prepare push to trunk. " | 682 [("log -1 --format=%H --grep=\"Prepare push to trunk. " |
| 700 "Now working on version 3.22.6.\""), | 683 "Now working on version 3.22.6.\""), |
| 701 "hash1\n"], | 684 "hash1\n"], |
| 702 ["diff svn/trunk hash1", "patch content\n"], | 685 ["diff svn/trunk hash1", "patch content\n"], |
| 703 ["svn find-rev hash1", "123455\n"], | 686 ["svn find-rev hash1", "123455\n"], |
| 704 ["checkout -b %s svn/trunk" % TEST_CONFIG[TRUNKBRANCH], ""], | 687 ["checkout -b %s svn/trunk" % TEST_CONFIG[TRUNKBRANCH], ""], |
| 705 ["apply --index --reject \"%s\"" % TEST_CONFIG[PATCH_FILE], ""], | 688 ["apply --index --reject \"%s\"" % TEST_CONFIG[PATCH_FILE], ""], |
| 706 ["add \"%s\"" % TEST_CONFIG[VERSION_FILE], ""], | 689 ["add \"%s\"" % TEST_CONFIG[VERSION_FILE], ""], |
| 707 ["commit -aF \"%s\"" % TEST_CONFIG[COMMITMSG_FILE], "", CheckSVNCommit], | 690 ["commit -F \"%s\"" % TEST_CONFIG[COMMITMSG_FILE], "", CheckSVNCommit], |
| 708 ["svn dcommit 2>&1", "Some output\nCommitted r123456\nSome output\n"], | 691 ["svn dcommit 2>&1", "Some output\nCommitted r123456\nSome output\n"], |
| 709 ["svn tag 3.22.5 -m \"Tagging version 3.22.5\"", ""], | 692 ["svn tag 3.22.5 -m \"Tagging version 3.22.5\"", ""], |
| 710 ["status -s -uno", ""], | 693 ["status -s -uno", ""], |
| 711 ["checkout -f master", ""], | 694 ["checkout master", ""], |
| 712 ["pull", ""], | 695 ["pull", ""], |
| 713 ["checkout -b v8-roll-123456", ""], | 696 ["checkout -b v8-roll-123456", ""], |
| 714 [("commit -am \"Update V8 to version 3.22.5 " | 697 [("commit -am \"Update V8 to version 3.22.5 " |
| 715 "(based on bleeding_edge revision r123455).\n\n" | 698 "(based on bleeding_edge revision r123455).\n\n" |
| 716 "TBR=reviewer@chromium.org\""), | 699 "TBR=reviewer@chromium.org\""), |
| 717 ""], | 700 ""], |
| 718 ["cl upload --send-mail --email \"author@chromium.org\"%s" % force_flag, | 701 ["cl upload --send-mail%s" % force_flag, ""], |
| 719 ""], | |
| 720 ["checkout -f some_branch", ""], | 702 ["checkout -f some_branch", ""], |
| 721 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""], | 703 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""], |
| 722 ["branch -D %s" % TEST_CONFIG[BRANCHNAME], ""], | 704 ["branch -D %s" % TEST_CONFIG[BRANCHNAME], ""], |
| 723 ["branch -D %s" % TEST_CONFIG[TRUNKBRANCH], ""], | 705 ["branch -D %s" % TEST_CONFIG[TRUNKBRANCH], ""], |
| 724 ]) | 706 ]) |
| 725 | 707 |
| 726 # Expected keyboard input in manual mode: | 708 # Expected keyboard input in manual mode: |
| 727 if manual: | 709 if manual: |
| 728 self.ExpectReadline([ | 710 self.ExpectReadline([ |
| 729 "Y", # Confirm last push. | 711 "Y", # Confirm last push. |
| 730 "", # Open editor. | 712 "", # Open editor. |
| 731 "Y", # Increment build number. | 713 "Y", # Increment build number. |
| 732 "reviewer@chromium.org", # V8 reviewer. | 714 "reviewer@chromium.org", # V8 reviewer. |
| 733 "LGTX", # Enter LGTM for V8 CL (wrong). | 715 "LGTX", # Enter LGTM for V8 CL (wrong). |
| 734 "LGTM", # Enter LGTM for V8 CL. | 716 "LGTM", # Enter LGTM for V8 CL. |
| 735 "Y", # Sanity check. | 717 "Y", # Sanity check. |
| 736 "reviewer@chromium.org", # Chromium reviewer. | 718 "reviewer@chromium.org", # Chromium reviewer. |
| 737 ]) | 719 ]) |
| 738 | 720 |
| 739 # Expected keyboard input in semi-automatic mode: | 721 # Expected keyboard input in semi-automatic mode: |
| 740 if not manual and not force: | 722 if not manual and not force: |
| 741 self.ExpectReadline([ | 723 self.ExpectReadline([ |
| 742 "LGTM", # Enter LGTM for V8 CL. | 724 "LGTM", # Enter LGTM for V8 CL. |
| 743 ]) | 725 ]) |
| 744 | 726 |
| 745 # No keyboard input in forced mode: | 727 # No keyboard input in forced mode: |
| 746 if force: | 728 if force: |
| 747 self.ExpectReadline([]) | 729 self.ExpectReadline([]) |
| 748 | 730 |
| 749 args = ["-a", "author@chromium.org", "-c", TEST_CONFIG[CHROMIUM]] | 731 options = MakeOptions(f=force, m=manual, |
| 750 if force: args.append("-f") | 732 r="reviewer@chromium.org" if not manual else None, |
| 751 if manual: args.append("-m") | 733 c = TEST_CONFIG[CHROMIUM]) |
| 752 else: args += ["-r", "reviewer@chromium.org"] | |
| 753 options = push_to_trunk.BuildOptions().parse_args(args) | |
| 754 RunPushToTrunk(TEST_CONFIG, PushToTrunkOptions(options), self) | 734 RunPushToTrunk(TEST_CONFIG, PushToTrunkOptions(options), self) |
| 755 | 735 |
| 756 deps = FileToText(TEST_CONFIG[DEPS_FILE]) | 736 deps = FileToText(TEST_CONFIG[DEPS_FILE]) |
| 757 self.assertTrue(re.search("\"v8_revision\": \"123456\"", deps)) | 737 self.assertTrue(re.search("\"v8_revision\": \"123456\"", deps)) |
| 758 | 738 |
| 759 cl = FileToText(TEST_CONFIG[CHANGELOG_FILE]) | 739 cl = FileToText(TEST_CONFIG[CHANGELOG_FILE]) |
| 760 self.assertTrue(re.search(r"^\d\d\d\d\-\d+\-\d+: Version 3\.22\.5", cl)) | 740 self.assertTrue(re.search(r"^\d\d\d\d\-\d+\-\d+: Version 3\.22\.5", cl)) |
| 761 self.assertTrue(re.search(r" Log text 1 \(issue 321\).", cl)) | 741 self.assertTrue(re.search(r" Log text 1 \(issue 321\).", cl)) |
| 762 self.assertTrue(re.search(r"1999\-04\-05: Version 3\.22\.4", cl)) | 742 self.assertTrue(re.search(r"1999\-04\-05: Version 3\.22\.4", cl)) |
| 763 | 743 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 778 self.ExpectGit([ | 758 self.ExpectGit([ |
| 779 ["svn log -1 --oneline", "r101 | Text"], | 759 ["svn log -1 --oneline", "r101 | Text"], |
| 780 ["svn log -1 --oneline ChangeLog", "r99 | Prepare push to trunk..."], | 760 ["svn log -1 --oneline ChangeLog", "r99 | Prepare push to trunk..."], |
| 781 ]) | 761 ]) |
| 782 | 762 |
| 783 state = {} | 763 state = {} |
| 784 self.MakeStep(FetchLatestRevision, state=state).Run() | 764 self.MakeStep(FetchLatestRevision, state=state).Run() |
| 785 self.assertRaises(Exception, self.MakeStep(CheckLastPush, state=state).Run) | 765 self.assertRaises(Exception, self.MakeStep(CheckLastPush, state=state).Run) |
| 786 | 766 |
| 787 def testAutoRoll(self): | 767 def testAutoRoll(self): |
| 788 password = self.MakeEmptyTempFile() | 768 status_password = self.MakeEmptyTempFile() |
| 789 TextToFile("PW", password) | 769 TextToFile("PW", status_password) |
| 790 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() | 770 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() |
| 791 TEST_CONFIG[SETTINGS_LOCATION] = "~/.doesnotexist" | 771 TEST_CONFIG[SETTINGS_LOCATION] = "~/.doesnotexist" |
| 792 | 772 |
| 793 self.ExpectReadURL([ | 773 self.ExpectReadURL([ |
| 794 ["https://v8-status.appspot.com/current?format=json", | 774 ["https://v8-status.appspot.com/current?format=json", |
| 795 "{\"message\": \"Tree is throttled\"}"], | 775 "{\"message\": \"Tree is throttled\"}"], |
| 796 ["https://v8-status.appspot.com/lkgr", Exception("Network problem")], | 776 ["https://v8-status.appspot.com/lkgr", Exception("Network problem")], |
| 797 ["https://v8-status.appspot.com/lkgr", "100"], | 777 ["https://v8-status.appspot.com/lkgr", "100"], |
| 798 ["https://v8-status.appspot.com/status", | 778 ["https://v8-status.appspot.com/status", |
| 799 ("username=v8-auto-roll%40chromium.org&" | 779 ("username=v8-auto-roll%40chromium.org&" |
| 800 "message=Tree+is+closed+%28preparing+to+push%29&password=PW"), | 780 "message=Tree+is+closed+%28preparing+to+push%29&password=PW"), |
| 801 ""], | 781 ""], |
| 802 ["https://v8-status.appspot.com/status", | 782 ["https://v8-status.appspot.com/status", |
| 803 ("username=v8-auto-roll%40chromium.org&" | 783 ("username=v8-auto-roll%40chromium.org&" |
| 804 "message=Tree+is+throttled&password=PW"), ""], | 784 "message=Tree+is+throttled&password=PW"), ""], |
| 805 ]) | 785 ]) |
| 806 | 786 |
| 807 self.ExpectGit([ | 787 self.ExpectGit([ |
| 808 ["status -s -uno", ""], | 788 ["status -s -uno", ""], |
| 809 ["status -s -b -uno", "## some_branch\n"], | 789 ["status -s -b -uno", "## some_branch\n"], |
| 810 ["svn fetch", ""], | 790 ["svn fetch", ""], |
| 811 ["svn log -1 --oneline", "r100 | Text"], | 791 ["svn log -1 --oneline", "r100 | Text"], |
| 812 [("log -1 --format=%H --grep=\"" | 792 ["svn log -1 --oneline ChangeLog", "r65 | Prepare push to trunk..."], |
| 813 "^Version [[:digit:]]*\.[[:digit:]]*\.[[:digit:]]* (based\"" | |
| 814 " svn/trunk"), "push_hash\n"], | |
| 815 ["svn find-rev push_hash", "65"], | |
| 816 ]) | 793 ]) |
| 817 | 794 |
| 818 options = auto_roll.BuildOptions().parse_args( | 795 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions( |
| 819 AUTO_ROLL_ARGS + ["--status-password", password]) | 796 MakeOptions(status_password=status_password)), self) |
| 820 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(options), self) | |
| 821 | 797 |
| 822 state = json.loads(FileToText("%s-state.json" | 798 self.assertEquals("100", self.MakeStep().Restore("lkgr")) |
| 823 % TEST_CONFIG[PERSISTFILE_BASENAME])) | 799 self.assertEquals("100", self.MakeStep().Restore("latest")) |
| 824 | |
| 825 self.assertEquals("100", state["lkgr"]) | |
| 826 self.assertEquals("100", state["latest"]) | |
| 827 | 800 |
| 828 def testAutoRollStoppedBySettings(self): | 801 def testAutoRollStoppedBySettings(self): |
| 829 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() | 802 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() |
| 830 TEST_CONFIG[SETTINGS_LOCATION] = self.MakeEmptyTempFile() | 803 TEST_CONFIG[SETTINGS_LOCATION] = self.MakeEmptyTempFile() |
| 831 TextToFile("{\"enable_auto_roll\": false}", TEST_CONFIG[SETTINGS_LOCATION]) | 804 TextToFile("{\"enable_auto_roll\": false}", TEST_CONFIG[SETTINGS_LOCATION]) |
| 832 | 805 |
| 833 self.ExpectReadURL([]) | 806 self.ExpectReadURL([]) |
| 834 | 807 |
| 835 self.ExpectGit([ | 808 self.ExpectGit([ |
| 836 ["status -s -uno", ""], | 809 ["status -s -uno", ""], |
| 837 ["status -s -b -uno", "## some_branch\n"], | 810 ["status -s -b -uno", "## some_branch\n"], |
| 838 ["svn fetch", ""], | 811 ["svn fetch", ""], |
| 839 ]) | 812 ]) |
| 840 | 813 |
| 841 options = auto_roll.BuildOptions().parse_args(AUTO_ROLL_ARGS) | |
| 842 def RunAutoRoll(): | 814 def RunAutoRoll(): |
| 843 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(options), self) | 815 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(MakeOptions()), self) |
| 844 self.assertRaises(Exception, RunAutoRoll) | 816 self.assertRaises(Exception, RunAutoRoll) |
| 845 | 817 |
| 846 def testAutoRollStoppedByTreeStatus(self): | 818 def testAutoRollStoppedByTreeStatus(self): |
| 847 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() | 819 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() |
| 848 TEST_CONFIG[SETTINGS_LOCATION] = "~/.doesnotexist" | 820 TEST_CONFIG[SETTINGS_LOCATION] = "~/.doesnotexist" |
| 849 | 821 |
| 850 self.ExpectReadURL([ | 822 self.ExpectReadURL([ |
| 851 ["https://v8-status.appspot.com/current?format=json", | 823 ["https://v8-status.appspot.com/current?format=json", |
| 852 "{\"message\": \"Tree is throttled (no push)\"}"], | 824 "{\"message\": \"Tree is throttled (no push)\"}"], |
| 853 ]) | 825 ]) |
| 854 | 826 |
| 855 self.ExpectGit([ | 827 self.ExpectGit([ |
| 856 ["status -s -uno", ""], | 828 ["status -s -uno", ""], |
| 857 ["status -s -b -uno", "## some_branch\n"], | 829 ["status -s -b -uno", "## some_branch\n"], |
| 858 ["svn fetch", ""], | 830 ["svn fetch", ""], |
| 859 ]) | 831 ]) |
| 860 | 832 |
| 861 options = auto_roll.BuildOptions().parse_args(AUTO_ROLL_ARGS) | |
| 862 def RunAutoRoll(): | 833 def RunAutoRoll(): |
| 863 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(options), self) | 834 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(MakeOptions()), self) |
| 864 self.assertRaises(Exception, RunAutoRoll) | 835 self.assertRaises(Exception, RunAutoRoll) |
| 865 | 836 |
| 866 def testMergeToBranch(self): | |
| 867 TEST_CONFIG[ALREADY_MERGING_SENTINEL_FILE] = self.MakeEmptyTempFile() | |
| 868 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() | |
| 869 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() | |
| 870 os.environ["EDITOR"] = "vi" | |
| 871 extra_patch = self.MakeEmptyTempFile() | |
| 872 | |
| 873 def VerifyPatch(patch): | |
| 874 return lambda: self.assertEquals(patch, | |
| 875 FileToText(TEST_CONFIG[TEMPORARY_PATCH_FILE])) | |
| 876 | |
| 877 msg = """Merged r12345, r23456, r34567, r45678, r56789 into trunk branch. | |
| 878 | |
| 879 Title4 | |
| 880 | |
| 881 Title2 | |
| 882 | |
| 883 Title3 | |
| 884 | |
| 885 Title1 | |
| 886 | |
| 887 Title5 | |
| 888 | |
| 889 BUG=123,234,345,456,567,v8:123 | |
| 890 LOG=N | |
| 891 """ | |
| 892 | |
| 893 def VerifySVNCommit(): | |
| 894 commit = FileToText(TEST_CONFIG[COMMITMSG_FILE]) | |
| 895 self.assertEquals(msg, commit) | |
| 896 version = FileToText(TEST_CONFIG[VERSION_FILE]) | |
| 897 self.assertTrue(re.search(r"#define MINOR_VERSION\s+22", version)) | |
| 898 self.assertTrue(re.search(r"#define BUILD_NUMBER\s+5", version)) | |
| 899 self.assertTrue(re.search(r"#define PATCH_LEVEL\s+1", version)) | |
| 900 self.assertTrue(re.search(r"#define IS_CANDIDATE_VERSION\s+0", version)) | |
| 901 | |
| 902 self.ExpectGit([ | |
| 903 ["status -s -uno", ""], | |
| 904 ["status -s -b -uno", "## some_branch\n"], | |
| 905 ["svn fetch", ""], | |
| 906 ["branch", " branch1\n* branch2\n"], | |
| 907 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""], | |
| 908 ["branch", " branch1\n* branch2\n"], | |
| 909 ["checkout -b %s svn/trunk" % TEST_CONFIG[BRANCHNAME], ""], | |
| 910 ["log --format=%H --grep=\"Port r12345\" --reverse svn/bleeding_edge", | |
| 911 "hash1\nhash2"], | |
| 912 ["svn find-rev hash1 svn/bleeding_edge", "45678"], | |
| 913 ["log -1 --format=%s hash1", "Title1"], | |
| 914 ["svn find-rev hash2 svn/bleeding_edge", "23456"], | |
| 915 ["log -1 --format=%s hash2", "Title2"], | |
| 916 ["log --format=%H --grep=\"Port r23456\" --reverse svn/bleeding_edge", | |
| 917 ""], | |
| 918 ["log --format=%H --grep=\"Port r34567\" --reverse svn/bleeding_edge", | |
| 919 "hash3"], | |
| 920 ["svn find-rev hash3 svn/bleeding_edge", "56789"], | |
| 921 ["log -1 --format=%s hash3", "Title3"], | |
| 922 ["svn find-rev r12345 svn/bleeding_edge", "hash4"], | |
| 923 # Simulate svn being down which stops the script. | |
| 924 ["svn find-rev r23456 svn/bleeding_edge", None], | |
| 925 # Restart script in the failing step. | |
| 926 ["svn find-rev r12345 svn/bleeding_edge", "hash4"], | |
| 927 ["svn find-rev r23456 svn/bleeding_edge", "hash2"], | |
| 928 ["svn find-rev r34567 svn/bleeding_edge", "hash3"], | |
| 929 ["svn find-rev r45678 svn/bleeding_edge", "hash1"], | |
| 930 ["svn find-rev r56789 svn/bleeding_edge", "hash5"], | |
| 931 ["log -1 --format=%s hash4", "Title4"], | |
| 932 ["log -1 --format=%s hash2", "Title2"], | |
| 933 ["log -1 --format=%s hash3", "Title3"], | |
| 934 ["log -1 --format=%s hash1", "Title1"], | |
| 935 ["log -1 --format=%s hash5", "Title5"], | |
| 936 ["log -1 hash4", "Title4\nBUG=123\nBUG=234"], | |
| 937 ["log -1 hash2", "Title2\n BUG = v8:123,345"], | |
| 938 ["log -1 hash3", "Title3\nLOG=n\nBUG=567, 456"], | |
| 939 ["log -1 hash1", "Title1"], | |
| 940 ["log -1 hash5", "Title5"], | |
| 941 ["log -1 -p hash4", "patch4"], | |
| 942 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE], | |
| 943 "", VerifyPatch("patch4")], | |
| 944 ["log -1 -p hash2", "patch2"], | |
| 945 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE], | |
| 946 "", VerifyPatch("patch2")], | |
| 947 ["log -1 -p hash3", "patch3"], | |
| 948 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE], | |
| 949 "", VerifyPatch("patch3")], | |
| 950 ["log -1 -p hash1", "patch1"], | |
| 951 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE], | |
| 952 "", VerifyPatch("patch1")], | |
| 953 ["log -1 -p hash5", "patch5"], | |
| 954 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE], | |
| 955 "", VerifyPatch("patch5")], | |
| 956 ["apply --index --reject \"%s\"" % extra_patch, ""], | |
| 957 ["commit -aF \"%s\"" % TEST_CONFIG[COMMITMSG_FILE], ""], | |
| 958 ["cl upload --send-mail -r \"reviewer@chromium.org\"", ""], | |
| 959 ["checkout -f %s" % TEST_CONFIG[BRANCHNAME], ""], | |
| 960 ["cl presubmit", "Presubmit successfull\n"], | |
| 961 ["cl dcommit -f --bypass-hooks", "Closing issue\n", VerifySVNCommit], | |
| 962 ["svn fetch", ""], | |
| 963 ["log -1 --format=%%H --grep=\"%s\" svn/trunk" % msg, "hash6"], | |
| 964 ["svn find-rev hash6", "1324"], | |
| 965 [("copy -r 1324 https://v8.googlecode.com/svn/trunk " | |
| 966 "https://v8.googlecode.com/svn/tags/3.22.5.1 -m " | |
| 967 "\"Tagging version 3.22.5.1\""), ""], | |
| 968 ["checkout -f some_branch", ""], | |
| 969 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""], | |
| 970 ["branch -D %s" % TEST_CONFIG[BRANCHNAME], ""], | |
| 971 ]) | |
| 972 | |
| 973 self.ExpectReadline([ | |
| 974 "Y", # Automatically add corresponding ports (34567, 56789)? | |
| 975 "Y", # Automatically increment patch level? | |
| 976 "reviewer@chromium.org", # V8 reviewer. | |
| 977 "LGTM", # Enter LGTM for V8 CL. | |
| 978 ]) | |
| 979 | |
| 980 # r12345 and r34567 are patches. r23456 (included) and r45678 are the MIPS | |
| 981 # ports of r12345. r56789 is the MIPS port of r34567. | |
| 982 args = ["-f", "-p", extra_patch, "--branch", "trunk", "12345", "23456", | |
| 983 "34567"] | |
| 984 options = merge_to_branch.BuildOptions().parse_args(args) | |
| 985 self.assertTrue(merge_to_branch.ProcessOptions(options)) | |
| 986 | |
| 987 # The first run of the script stops because of the svn being down. | |
| 988 self.assertRaises(GitFailedException, | |
| 989 lambda: RunMergeToBranch(TEST_CONFIG, | |
| 990 MergeToBranchOptions(options), | |
| 991 self)) | |
| 992 | |
| 993 # Test that state recovery after restarting the script works. | |
| 994 options.s = 3 | |
| 995 RunMergeToBranch(TEST_CONFIG, MergeToBranchOptions(options), self) | |
| 996 | |
| 997 | |
| 998 class SystemTest(unittest.TestCase): | 837 class SystemTest(unittest.TestCase): |
| 999 def testReload(self): | 838 def testReload(self): |
| 1000 step = MakeStep(step_class=PrepareChangeLog, number=0, state={}, config={}, | 839 step = MakeStep(step_class=PrepareChangeLog, number=0, state={}, config={}, |
| 1001 options=CommonOptions(MakeOptions()), | 840 options=CommonOptions(MakeOptions()), |
| 1002 side_effect_handler=DEFAULT_SIDE_EFFECT_HANDLER) | 841 side_effect_handler=DEFAULT_SIDE_EFFECT_HANDLER) |
| 1003 body = step.Reload( | 842 body = step.Reload( |
| 1004 """------------------------------------------------------------------------ | 843 """------------------------------------------------------------------------ |
| 1005 r17997 | machenbach@chromium.org | 2013-11-22 11:04:04 +0100 (...) | 6 lines | 844 r17997 | machenbach@chromium.org | 2013-11-22 11:04:04 +0100 (...) | 6 lines |
| 1006 | 845 |
| 1007 Prepare push to trunk. Now working on version 3.23.11. | 846 Prepare push to trunk. Now working on version 3.23.11. |
| 1008 | 847 |
| 1009 R=danno@chromium.org | 848 R=danno@chromium.org |
| 1010 | 849 |
| 1011 Review URL: https://codereview.chromium.org/83173002 | 850 Review URL: https://codereview.chromium.org/83173002 |
| 1012 | 851 |
| 1013 ------------------------------------------------------------------------""") | 852 ------------------------------------------------------------------------""") |
| 1014 self.assertEquals( | 853 self.assertEquals( |
| 1015 """Prepare push to trunk. Now working on version 3.23.11. | 854 """Prepare push to trunk. Now working on version 3.23.11. |
| 1016 | 855 |
| 1017 R=danno@chromium.org | 856 R=danno@chromium.org |
| 1018 | 857 |
| 1019 Committed: https://code.google.com/p/v8/source/detail?r=17997""", body) | 858 Committed: https://code.google.com/p/v8/source/detail?r=17997""", body) |
| OLD | NEW |