| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium 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 """Unit tests for git_cl.py.""" | 6 """Unit tests for git_cl.py.""" |
| 7 | 7 |
| 8 import os | 8 import os |
| 9 import StringIO | 9 import StringIO |
| 10 import stat | 10 import stat |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 expected_args, result = self.calls.pop(0) | 86 expected_args, result = self.calls.pop(0) |
| 87 self.assertEquals( | 87 self.assertEquals( |
| 88 expected_args, | 88 expected_args, |
| 89 args, | 89 args, |
| 90 '@%d Expected: %r Actual: %r' % ( | 90 '@%d Expected: %r Actual: %r' % ( |
| 91 self._calls_done, expected_args, args)) | 91 self._calls_done, expected_args, args)) |
| 92 self._calls_done += 1 | 92 self._calls_done += 1 |
| 93 return result | 93 return result |
| 94 | 94 |
| 95 @classmethod | 95 @classmethod |
| 96 def _upload_calls(cls): | 96 def _upload_calls(cls, similarity): |
| 97 return cls._git_base_calls() + cls._git_upload_calls() | 97 return cls._git_base_calls(similarity) + cls._git_upload_calls() |
| 98 | 98 |
| 99 @staticmethod | 99 @staticmethod |
| 100 def _git_base_calls(): | 100 def _git_base_calls(similarity): |
| 101 if similarity is None: |
| 102 similarity = '50' |
| 103 similarity_call = ((['git', 'config', '--int', '--get', |
| 104 'branch.master.git-cl-similarity'],), '') |
| 105 else: |
| 106 similarity_call = ((['git', 'config', '--int', |
| 107 'branch.master.git-cl-similarity', similarity],), '') |
| 101 return [ | 108 return [ |
| 102 ((['git', 'config', 'gerrit.host'],), ''), | 109 ((['git', 'config', 'gerrit.host'],), ''), |
| 110 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), |
| 111 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), |
| 112 similarity_call, |
| 103 ((['git', 'update-index', '--refresh', '-q'],), ''), | 113 ((['git', 'update-index', '--refresh', '-q'],), ''), |
| 104 ((['git', 'diff-index', 'HEAD'],), ''), | 114 ((['git', 'diff-index', 'HEAD'],), ''), |
| 105 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), | |
| 106 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), | 115 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), |
| 107 ((['git', 'config', 'branch.master.merge'],), 'master'), | 116 ((['git', 'config', 'branch.master.merge'],), 'master'), |
| 108 ((['git', 'config', 'branch.master.remote'],), 'origin'), | 117 ((['git', 'config', 'branch.master.remote'],), 'origin'), |
| 109 ((['git', 'rev-parse', '--show-cdup'],), ''), | 118 ((['git', 'rev-parse', '--show-cdup'],), ''), |
| 110 ((['git', 'rev-parse', 'HEAD'],), '12345'), | 119 ((['git', 'rev-parse', 'HEAD'],), '12345'), |
| 111 ((['git', 'diff', '--name-status', '-r', 'master...', '.'],), | 120 ((['git', 'diff', '--name-status', '-r', 'master...', '.'],), |
| 112 'M\t.gitignore\n'), | 121 'M\t.gitignore\n'), |
| 113 ((['git', 'config', 'branch.master.rietveldissue'],), ''), | 122 ((['git', 'config', 'branch.master.rietveldissue'],), ''), |
| 114 ((['git', 'config', 'branch.master.rietveldpatchset'],), ''), | 123 ((['git', 'config', 'branch.master.rietveldpatchset'],), ''), |
| 115 ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'), | 124 ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'), |
| 116 ((['git', 'config', 'user.email'],), 'me@example.com'), | 125 ((['git', 'config', 'user.email'],), 'me@example.com'), |
| 117 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', | 126 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', |
| 118 '-l100000', 'master...'],), | 127 '-C'+similarity, '-l100000', 'master...'],), |
| 119 '+dat'), | 128 '+dat'), |
| 120 ((['git', 'log', '--pretty=format:%s\n\n%b', 'master..'],), 'desc\n'), | 129 ((['git', 'log', '--pretty=format:%s\n\n%b', 'master..'],), 'desc\n'), |
| 121 ] | 130 ] |
| 122 | 131 |
| 123 @staticmethod | 132 @staticmethod |
| 124 def _git_upload_calls(): | 133 def _git_upload_calls(): |
| 125 return [ | 134 return [ |
| 126 ((['git', 'config', 'rietveld.cc'],), ''), | 135 ((['git', 'config', 'rietveld.cc'],), ''), |
| 127 ((['git', 'config', 'branch.master.base-url'],), ''), | 136 ((['git', 'config', 'branch.master.base-url'],), ''), |
| 128 ((['git', 'config', '--get-regexp', '^svn-remote\\.'],), | 137 ((['git', 'config', '--get-regexp', '^svn-remote\\.'],), |
| 129 (('', None), 0)), | 138 (('', None), 0)), |
| 130 ((['git', 'rev-parse', '--show-cdup'],), ''), | 139 ((['git', 'rev-parse', '--show-cdup'],), ''), |
| 131 ((['git', 'svn', 'info'],), ''), | 140 ((['git', 'svn', 'info'],), ''), |
| 132 ((['git', 'config', 'branch.master.rietveldissue', '1'],), ''), | 141 ((['git', 'config', 'branch.master.rietveldissue', '1'],), ''), |
| 133 ((['git', 'config', 'branch.master.rietveldserver', | 142 ((['git', 'config', 'branch.master.rietveldserver', |
| 134 'https://codereview.example.com'],), ''), | 143 'https://codereview.example.com'],), ''), |
| 135 ((['git', 'config', 'branch.master.rietveldpatchset', '2'],), ''), | 144 ((['git', 'config', 'branch.master.rietveldpatchset', '2'],), ''), |
| 136 ] | 145 ] |
| 137 | 146 |
| 138 @classmethod | 147 @classmethod |
| 139 def _dcommit_calls_1(cls): | 148 def _dcommit_calls_1(cls): |
| 140 return [ | 149 return [ |
| 141 ((['git', 'config', '--get-regexp', '^svn-remote\\.'],), | 150 ((['git', 'config', '--get-regexp', '^svn-remote\\.'],), |
| 142 ((('svn-remote.svn.url svn://svn.chromium.org/chrome\n' | 151 ((('svn-remote.svn.url svn://svn.chromium.org/chrome\n' |
| 143 'svn-remote.svn.fetch trunk/src:refs/remotes/origin/master'), | 152 'svn-remote.svn.fetch trunk/src:refs/remotes/origin/master'), |
| 144 None), | 153 None), |
| 145 0)), | 154 0)), |
| 146 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), | 155 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), |
| 147 ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'), | 156 ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'), |
| 157 ((['git', 'config', '--int', '--get', |
| 158 'branch.working.git-cl-similarity'],), ''), |
| 159 ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'), |
| 148 ((['git', 'config', 'branch.working.merge'],), 'refs/heads/master'), | 160 ((['git', 'config', 'branch.working.merge'],), 'refs/heads/master'), |
| 149 ((['git', 'config', 'branch.working.remote'],), 'origin'), | 161 ((['git', 'config', 'branch.working.remote'],), 'origin'), |
| 150 ((['git', 'rev-list', '--merges', | 162 ((['git', 'rev-list', '--merges', |
| 151 '--grep=^SVN changes up to revision [0-9]*$', | 163 '--grep=^SVN changes up to revision [0-9]*$', |
| 152 'refs/remotes/origin/master^!'],), ''), | 164 'refs/remotes/origin/master^!'],), ''), |
| 153 ((['git', 'update-index', '--refresh', '-q'],), ''), | 165 ((['git', 'update-index', '--refresh', '-q'],), ''), |
| 154 ((['git', 'diff-index', 'HEAD'],), ''), | 166 ((['git', 'diff-index', 'HEAD'],), ''), |
| 155 ((['git', 'rev-list', '^refs/heads/working', | 167 ((['git', 'rev-list', '^refs/heads/working', |
| 156 'refs/remotes/origin/master'],), | 168 'refs/remotes/origin/master'],), |
| 157 ''), | 169 ''), |
| (...skipping 28 matching lines...) Expand all Loading... |
| 186 'codereview.example.com'), | 198 'codereview.example.com'), |
| 187 (('GitClHooksBypassedCommit', | 199 (('GitClHooksBypassedCommit', |
| 188 'Issue https://codereview.example.com/12345 bypassed hook when ' | 200 'Issue https://codereview.example.com/12345 bypassed hook when ' |
| 189 'committing'), None), | 201 'committing'), None), |
| 190 ] | 202 ] |
| 191 | 203 |
| 192 @classmethod | 204 @classmethod |
| 193 def _dcommit_calls_3(cls): | 205 def _dcommit_calls_3(cls): |
| 194 return [ | 206 return [ |
| 195 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', | 207 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', |
| 196 '-l100000', 'refs/remotes/origin/master', 'refs/heads/working'],), | 208 '-C50', '-l100000', 'refs/remotes/origin/master', |
| 209 'refs/heads/working'],), |
| 197 (' PRESUBMIT.py | 2 +-\n' | 210 (' PRESUBMIT.py | 2 +-\n' |
| 198 ' 1 files changed, 1 insertions(+), 1 deletions(-)\n')), | 211 ' 1 files changed, 1 insertions(+), 1 deletions(-)\n')), |
| 199 (('About to commit; enter to confirm.',), None), | 212 (('About to commit; enter to confirm.',), None), |
| 200 ((['git', 'show-ref', '--quiet', '--verify', | 213 ((['git', 'show-ref', '--quiet', '--verify', |
| 201 'refs/heads/git-cl-commit'],), | 214 'refs/heads/git-cl-commit'],), |
| 202 (('', None), 0)), | 215 (('', None), 0)), |
| 203 ((['git', 'branch', '-D', 'git-cl-commit'],), ''), | 216 ((['git', 'branch', '-D', 'git-cl-commit'],), ''), |
| 204 ((['git', 'show-ref', '--quiet', '--verify', | 217 ((['git', 'show-ref', '--quiet', '--verify', |
| 205 'refs/heads/git-cl-cherry-pick'],), ''), | 218 'refs/heads/git-cl-cherry-pick'],), ''), |
| 206 ((['git', 'rev-parse', '--show-cdup'],), '\n'), | 219 ((['git', 'rev-parse', '--show-cdup'],), '\n'), |
| 207 ((['git', 'checkout', '-q', '-b', 'git-cl-commit'],), ''), | 220 ((['git', 'checkout', '-q', '-b', 'git-cl-commit'],), ''), |
| 208 ((['git', 'reset', '--soft', 'refs/remotes/origin/master'],), ''), | 221 ((['git', 'reset', '--soft', 'refs/remotes/origin/master'],), ''), |
| 209 ((['git', 'commit', '-m', | 222 ((['git', 'commit', '-m', |
| 210 'Issue: 12345\n\nReview URL: https://codereview.example.com/12345'],), | 223 'Issue: 12345\n\nReview URL: https://codereview.example.com/12345'],), |
| 211 ''), | 224 ''), |
| 212 ((['git', 'svn', 'dcommit', '--no-rebase', '--rmdir'],), (('', None), 0)), | 225 ((['git', 'svn', 'dcommit', '-C50', '--no-rebase', '--rmdir'],), |
| 226 (('', None), 0)), |
| 213 ((['git', 'checkout', '-q', 'working'],), ''), | 227 ((['git', 'checkout', '-q', 'working'],), ''), |
| 214 ((['git', 'branch', '-D', 'git-cl-commit'],), ''), | 228 ((['git', 'branch', '-D', 'git-cl-commit'],), ''), |
| 215 ] | 229 ] |
| 216 | 230 |
| 217 @staticmethod | 231 @staticmethod |
| 218 def _cmd_line(description, args): | 232 def _cmd_line(description, args, similarity): |
| 219 """Returns the upload command line passed to upload.RealMain().""" | 233 """Returns the upload command line passed to upload.RealMain().""" |
| 220 return [ | 234 return [ |
| 221 'upload', '--assume_yes', '--server', | 235 'upload', '--assume_yes', '--server', |
| 222 'https://codereview.example.com', | 236 'https://codereview.example.com', |
| 223 '--message', description | 237 '--message', description |
| 224 ] + args + [ | 238 ] + args + [ |
| 225 '--cc', 'joe@example.com', | 239 '--cc', 'joe@example.com', |
| 240 '--git_similarity', similarity or '50', |
| 226 'master...' | 241 'master...' |
| 227 ] | 242 ] |
| 228 | 243 |
| 229 def _run_reviewer_test( | 244 def _run_reviewer_test( |
| 230 self, | 245 self, |
| 231 upload_args, | 246 upload_args, |
| 232 expected_description, | 247 expected_description, |
| 233 returned_description, | 248 returned_description, |
| 234 final_description, | 249 final_description, |
| 235 reviewers): | 250 reviewers): |
| 236 """Generic reviewer test framework.""" | 251 """Generic reviewer test framework.""" |
| 237 self.calls = self._upload_calls() | 252 try: |
| 253 similarity = upload_args[upload_args.index('--similarity')+1] |
| 254 except ValueError: |
| 255 similarity = None |
| 256 self.calls = self._upload_calls(similarity) |
| 238 def RunEditor(desc, _): | 257 def RunEditor(desc, _): |
| 239 self.assertEquals( | 258 self.assertEquals( |
| 240 '# Enter a description of the change.\n' | 259 '# Enter a description of the change.\n' |
| 241 '# This will displayed on the codereview site.\n' | 260 '# This will displayed on the codereview site.\n' |
| 242 '# The first line will also be used as the subject of the review.\n' + | 261 '# The first line will also be used as the subject of the review.\n' + |
| 243 expected_description, | 262 expected_description, |
| 244 desc) | 263 desc) |
| 245 return returned_description | 264 return returned_description |
| 246 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor) | 265 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor) |
| 247 def check_upload(args): | 266 def check_upload(args): |
| 248 self.assertEquals(self._cmd_line(final_description, reviewers), args) | 267 cmd_line = self._cmd_line(final_description, reviewers, similarity) |
| 268 self.assertEquals(cmd_line, args) |
| 249 return 1, 2 | 269 return 1, 2 |
| 250 self.mock(git_cl.upload, 'RealMain', check_upload) | 270 self.mock(git_cl.upload, 'RealMain', check_upload) |
| 251 git_cl.main(['upload'] + upload_args) | 271 git_cl.main(['upload'] + upload_args) |
| 252 | 272 |
| 253 def test_no_reviewer(self): | 273 def test_no_reviewer(self): |
| 254 self._run_reviewer_test( | 274 self._run_reviewer_test( |
| 255 [], | 275 [], |
| 256 'desc\n\nBUG=\n', | 276 'desc\n\nBUG=\n', |
| 257 '# Blah blah comment.\ndesc\n\nBUG=\n', | 277 '# Blah blah comment.\ndesc\n\nBUG=\n', |
| 258 'desc\n\nBUG=\n', | 278 'desc\n\nBUG=\n', |
| 259 []) | 279 []) |
| 260 | 280 |
| 281 def test_keep_similarity(self): |
| 282 self._run_reviewer_test( |
| 283 ['--similarity', '70'], |
| 284 'desc\n\nBUG=\n', |
| 285 '# Blah blah comment.\ndesc\n\nBUG=\n', |
| 286 'desc\n\nBUG=\n', |
| 287 []) |
| 288 |
| 261 def test_reviewers_cmd_line(self): | 289 def test_reviewers_cmd_line(self): |
| 262 # Reviewer is passed as-is | 290 # Reviewer is passed as-is |
| 263 description = 'desc\n\nR=foo@example.com\nBUG=\n' | 291 description = 'desc\n\nR=foo@example.com\nBUG=\n' |
| 264 self._run_reviewer_test( | 292 self._run_reviewer_test( |
| 265 ['-r' 'foo@example.com'], | 293 ['-r' 'foo@example.com'], |
| 266 description, | 294 description, |
| 267 '\n%s\n' % description, | 295 '\n%s\n' % description, |
| 268 description, | 296 description, |
| 269 ['--reviewers', 'foo@example.com']) | 297 ['--reviewers', 'foo@example.com']) |
| 270 | 298 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 | 330 |
| 303 def test_reviewer_send_mail_no_rev(self): | 331 def test_reviewer_send_mail_no_rev(self): |
| 304 # Fails without a reviewer. | 332 # Fails without a reviewer. |
| 305 class FileMock(object): | 333 class FileMock(object): |
| 306 buf = StringIO.StringIO() | 334 buf = StringIO.StringIO() |
| 307 def write(self, content): | 335 def write(self, content): |
| 308 self.buf.write(content) | 336 self.buf.write(content) |
| 309 | 337 |
| 310 mock = FileMock() | 338 mock = FileMock() |
| 311 try: | 339 try: |
| 312 self.calls = self._git_base_calls() | 340 self.calls = self._git_base_calls(None) |
| 313 def RunEditor(desc, _): | 341 def RunEditor(desc, _): |
| 314 return desc | 342 return desc |
| 315 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor) | 343 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor) |
| 316 self.mock(sys, 'stderr', mock) | 344 self.mock(sys, 'stderr', mock) |
| 317 git_cl.main(['upload', '--send-mail']) | 345 git_cl.main(['upload', '--send-mail']) |
| 318 self.fail() | 346 self.fail() |
| 319 except SystemExit: | 347 except SystemExit: |
| 320 self.assertEquals( | 348 self.assertEquals( |
| 321 'Must specify reviewers to send email.\n', mock.buf.getvalue()) | 349 'Must specify reviewers to send email.\n', mock.buf.getvalue()) |
| 322 | 350 |
| 323 def test_dcommit(self): | 351 def test_dcommit(self): |
| 324 self.calls = ( | 352 self.calls = ( |
| 325 self._dcommit_calls_1() + | 353 self._dcommit_calls_1() + |
| 326 self._dcommit_calls_normal() + | 354 self._dcommit_calls_normal() + |
| 327 self._dcommit_calls_3()) | 355 self._dcommit_calls_3()) |
| 328 git_cl.main(['dcommit']) | 356 git_cl.main(['dcommit']) |
| 329 | 357 |
| 330 def test_dcommit_bypass_hooks(self): | 358 def test_dcommit_bypass_hooks(self): |
| 331 self.calls = ( | 359 self.calls = ( |
| 332 self._dcommit_calls_1() + | 360 self._dcommit_calls_1() + |
| 333 self._dcommit_calls_bypassed() + | 361 self._dcommit_calls_bypassed() + |
| 334 self._dcommit_calls_3()) | 362 self._dcommit_calls_3()) |
| 335 git_cl.main(['dcommit', '--bypass-hooks']) | 363 git_cl.main(['dcommit', '--bypass-hooks']) |
| 336 | 364 |
| 337 | 365 |
| 338 @staticmethod | 366 @staticmethod |
| 339 def _gerrit_base_calls(): | 367 def _gerrit_base_calls(): |
| 340 return [ | 368 return [ |
| 341 ((['git', 'config', 'gerrit.host'],), 'gerrit.example.com'), | 369 ((['git', 'config', 'gerrit.host'],), 'gerrit.example.com'), |
| 370 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), |
| 371 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), |
| 372 ((['git', 'config', '--int', '--get', |
| 373 'branch.master.git-cl-similarity'],), ''), |
| 342 ((['git', 'update-index', '--refresh', '-q'],), ''), | 374 ((['git', 'update-index', '--refresh', '-q'],), ''), |
| 343 ((['git', 'diff-index', 'HEAD'],), ''), | 375 ((['git', 'diff-index', 'HEAD'],), ''), |
| 344 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), | |
| 345 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), | 376 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), |
| 346 ((['git', 'config', 'branch.master.merge'],), 'master'), | 377 ((['git', 'config', 'branch.master.merge'],), 'master'), |
| 347 ((['git', 'config', 'branch.master.remote'],), 'origin'), | 378 ((['git', 'config', 'branch.master.remote'],), 'origin'), |
| 348 ((['git', 'rev-parse', '--show-cdup'],), ''), | 379 ((['git', 'rev-parse', '--show-cdup'],), ''), |
| 349 ((['git', 'rev-parse', 'HEAD'],), '12345'), | 380 ((['git', 'rev-parse', 'HEAD'],), '12345'), |
| 350 ((['git', 'diff', '--name-status', '-r', 'master...', '.'],), | 381 ((['git', 'diff', '--name-status', '-r', 'master...', '.'],), |
| 351 'M\t.gitignore\n'), | 382 'M\t.gitignore\n'), |
| 352 ((['git', 'config', 'branch.master.rietveldissue'],), ''), | 383 ((['git', 'config', 'branch.master.rietveldissue'],), ''), |
| 353 ((['git', 'config', 'branch.master.rietveldpatchset'],), ''), | 384 ((['git', 'config', 'branch.master.rietveldpatchset'],), ''), |
| 354 ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'), | 385 ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'), |
| 355 ((['git', 'config', 'user.email'],), 'me@example.com'), | 386 ((['git', 'config', 'user.email'],), 'me@example.com'), |
| 356 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', | 387 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', |
| 357 '-l100000', 'master...'],), | 388 '-C50', '-l100000', 'master...'],), |
| 358 '+dat'), | 389 '+dat'), |
| 359 ] | 390 ] |
| 360 | 391 |
| 361 @staticmethod | 392 @staticmethod |
| 362 def _gerrit_upload_calls(description, reviewers): | 393 def _gerrit_upload_calls(description, reviewers): |
| 363 calls = [ | 394 calls = [ |
| 364 ((['git', 'log', '--pretty=format:%s\n\n%b', 'master..'],), | 395 ((['git', 'log', '--pretty=format:%s\n\n%b', 'master..'],), |
| 365 description), | 396 description), |
| 366 ((['git', 'config', 'rietveld.cc'],), '') | 397 ((['git', 'config', 'rietveld.cc'],), '') |
| 367 ] | 398 ] |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 ((['git', 'config', 'rietveld.viewvc-url'],), ''), | 489 ((['git', 'config', 'rietveld.viewvc-url'],), ''), |
| 459 (('ViewVC URL:',), ''), | 490 (('ViewVC URL:',), ''), |
| 460 # DownloadHooks(True) | 491 # DownloadHooks(True) |
| 461 ((commit_msg_path, os.X_OK,), True), | 492 ((commit_msg_path, os.X_OK,), True), |
| 462 ] | 493 ] |
| 463 git_cl.main(['config']) | 494 git_cl.main(['config']) |
| 464 | 495 |
| 465 | 496 |
| 466 if __name__ == '__main__': | 497 if __name__ == '__main__': |
| 467 unittest.main() | 498 unittest.main() |
| OLD | NEW |