| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2009 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2009 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 """Client-side script to send a try job to the try server. It communicates to | 5 """Client-side script to send a try job to the try server. It communicates to |
| 6 the try server by either writting to a svn repository or by directly connecting | 6 the try server by either writting to a svn repository or by directly connecting |
| 7 to the server by HTTP. | 7 to the server by HTTP. |
| 8 """ | 8 """ |
| 9 | 9 |
| 10 import datetime | 10 import datetime |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 self.codereview_settings = {} | 110 self.codereview_settings = {} |
| 111 settings_file = self.ReadRootFile(self.codereview_settings_file) | 111 settings_file = self.ReadRootFile(self.codereview_settings_file) |
| 112 if settings_file: | 112 if settings_file: |
| 113 for line in settings_file.splitlines(): | 113 for line in settings_file.splitlines(): |
| 114 if not line or line.lstrip().startswith('#'): | 114 if not line or line.lstrip().startswith('#'): |
| 115 continue | 115 continue |
| 116 k, v = line.split(":", 1) | 116 k, v = line.split(":", 1) |
| 117 self.codereview_settings[k.strip()] = v.strip() | 117 self.codereview_settings[k.strip()] = v.strip() |
| 118 return self.codereview_settings.get(key, '') | 118 return self.codereview_settings.get(key, '') |
| 119 | 119 |
| 120 def GclStyleSettings(self): | 120 def _GclStyleSettings(self): |
| 121 """Set default settings based on the gcl-style settings from the | 121 """Set default settings based on the gcl-style settings from the |
| 122 repository.""" | 122 repository.""" |
| 123 settings = { | 123 settings = { |
| 124 'port': self.GetCodeReviewSetting('TRYSERVER_HTTP_PORT'), | 124 'port': self.GetCodeReviewSetting('TRYSERVER_HTTP_PORT'), |
| 125 'host': self.GetCodeReviewSetting('TRYSERVER_HTTP_HOST'), | 125 'host': self.GetCodeReviewSetting('TRYSERVER_HTTP_HOST'), |
| 126 'svn_repo': self.GetCodeReviewSetting('TRYSERVER_SVN_URL'), | 126 'svn_repo': self.GetCodeReviewSetting('TRYSERVER_SVN_URL'), |
| 127 'project': self.GetCodeReviewSetting('TRYSERVER_PROJECT'), | 127 'project': self.GetCodeReviewSetting('TRYSERVER_PROJECT'), |
| 128 'root': self.GetCodeReviewSetting('TRYSERVER_ROOT'), | 128 'root': self.GetCodeReviewSetting('TRYSERVER_ROOT'), |
| 129 'patchlevel': self.GetCodeReviewSetting('TRYSERVER_PATCHLEVEL'), | 129 'patchlevel': self.GetCodeReviewSetting('TRYSERVER_PATCHLEVEL'), |
| 130 } | 130 } |
| 131 logging.info('\n'.join(['%s: %s' % (k, v) |
| 132 for (k, v) in settings.iteritems() if v])) |
| 131 for (k, v) in settings.iteritems(): | 133 for (k, v) in settings.iteritems(): |
| 132 if v and getattr(self.options, k) is None: | 134 if v and getattr(self.options, k) is None: |
| 133 setattr(self.options, k, v) | 135 setattr(self.options, k, v) |
| 134 | 136 |
| 135 def GclientStyleSettings(self): | 137 def _GclientStyleSettings(self): |
| 136 """Find the root, assuming a gclient-style checkout.""" | 138 """Find the root, assuming a gclient-style checkout.""" |
| 139 self.gclient_root = None |
| 137 if not self.options.no_gclient and not self.options.root: | 140 if not self.options.no_gclient and not self.options.root: |
| 138 root = self.checkout_root | 141 root = self.checkout_root |
| 139 gclient_root = gclient_utils.FindGclientRoot(root) | 142 self.gclient_root = gclient_utils.FindGclientRoot(root) |
| 140 if gclient_root: | 143 if self.gclient_root: |
| 141 self.options.root = gclient_utils.PathDifference(gclient_root, root) | 144 logging.info('Found .gclient at %s' % self.gclient_root) |
| 145 self.options.root = gclient_utils.PathDifference(self.gclient_root, |
| 146 root) |
| 142 | 147 |
| 143 def AutomagicalSettings(self): | 148 def AutomagicalSettings(self): |
| 144 """Determines settings based on supported code review and checkout tools. | 149 """Determines settings based on supported code review and checkout tools. |
| 145 """ | 150 """ |
| 146 self.GclStyleSettings() | 151 self._GclientStyleSettings() |
| 147 self.GclientStyleSettings() | 152 self._GclStyleSettings() |
| 148 | 153 |
| 149 def ReadRootFile(self, filename): | 154 def ReadRootFile(self, filename): |
| 150 raise NotImplementedError() | 155 if not self.options.root: |
| 156 filepath = os.path.join(self.checkout_root, filename) |
| 157 if os.path.isfile(filepath): |
| 158 logging.info('Found %s at %s' % (filename, self.checkout_root)) |
| 159 return gclient_util.FileRead(filepath) |
| 160 return None |
| 161 root = os.path.abspath(self.gclient_root) |
| 162 cur = os.path.abspath(self.checkout_root) |
| 163 assert cur.startswith(root), (root, cur) |
| 164 while cur.startswith(root): |
| 165 filepath = os.path.join(cur, filename) |
| 166 if os.path.isfile(filepath): |
| 167 logging.info('Found %s at %s' % (filename, cur)) |
| 168 return gclient_utils.FileRead(filepath) |
| 169 cur = os.path.dirname(cur) |
| 170 logging.warning('Didn\'t find %s' % filename) |
| 171 return None |
| 151 | 172 |
| 152 | 173 |
| 153 class SVN(SCM): | 174 class SVN(SCM): |
| 154 """Gathers the options and diff for a subversion checkout.""" | 175 """Gathers the options and diff for a subversion checkout.""" |
| 155 def __init__(self, *args, **kwargs): | 176 def __init__(self, *args, **kwargs): |
| 156 SCM.__init__(self, *args, **kwargs) | 177 SCM.__init__(self, *args, **kwargs) |
| 157 self.checkout_root = scm.SVN.GetCheckoutRoot(self.checkout_root) | 178 self.checkout_root = scm.SVN.GetCheckoutRoot(self.checkout_root) |
| 158 if not self.options.email: | 179 if not self.options.email: |
| 159 # Assumes the svn credential is an email address. | 180 # Assumes the svn credential is an email address. |
| 160 self.options.email = scm.SVN.GetEmail(self.checkout_root) | 181 self.options.email = scm.SVN.GetEmail(self.checkout_root) |
| 161 logging.info("SVN(%s)" % self.checkout_root) | 182 logging.info("SVN(%s)" % self.checkout_root) |
| 162 | 183 |
| 163 def ReadRootFile(self, filename): | 184 def ReadRootFile(self, filename): |
| 185 data = SCM.ReadRootFile(self, filename) |
| 186 if data: |
| 187 return data |
| 188 |
| 189 # Try to search on the subversion repository for the file. |
| 164 try: | 190 try: |
| 165 # Try to search on the subversion repository for the file. | 191 from gcl import GetCachedFile |
| 166 import gcl | |
| 167 data = gcl.GetCachedFile(filename) | |
| 168 logging.debug('%s:\n%s' % (filename, data)) | |
| 169 return data | |
| 170 except ImportError: | 192 except ImportError: |
| 171 try: | 193 return None |
| 172 data = gclient_utils.FileRead(os.path.join(self.checkout_root, | 194 data = GetCachedFile(filename) |
| 173 filename)) | 195 logging.debug('%s:\n%s' % (filename, data)) |
| 174 logging.debug('%s:\n%s' % (filename, data)) | 196 return data |
| 175 return data | |
| 176 except (IOError, OSError): | |
| 177 logging.debug('%s:\nNone' % filename) | |
| 178 return None | |
| 179 | 197 |
| 180 def GenerateDiff(self): | 198 def GenerateDiff(self): |
| 181 """Returns a string containing the diff for the given file list. | 199 """Returns a string containing the diff for the given file list. |
| 182 | 200 |
| 183 The files in the list should either be absolute paths or relative to the | 201 The files in the list should either be absolute paths or relative to the |
| 184 given root. | 202 given root. |
| 185 """ | 203 """ |
| 186 if not self.files: | 204 if not self.files: |
| 187 previous_cwd = os.getcwd() | 205 previous_cwd = os.getcwd() |
| 188 os.chdir(self.checkout_root) | 206 os.chdir(self.checkout_root) |
| (...skipping 26 matching lines...) Expand all Loading... |
| 215 self.options.email = scm.GIT.GetEmail(self.checkout_root) | 233 self.options.email = scm.GIT.GetEmail(self.checkout_root) |
| 216 if not self.diff_against: | 234 if not self.diff_against: |
| 217 self.diff_against = scm.GIT.GetUpstreamBranch(self.checkout_root) | 235 self.diff_against = scm.GIT.GetUpstreamBranch(self.checkout_root) |
| 218 if not self.diff_against: | 236 if not self.diff_against: |
| 219 raise NoTryServerAccess( | 237 raise NoTryServerAccess( |
| 220 "Unable to determine default branch to diff against. " | 238 "Unable to determine default branch to diff against. " |
| 221 "Verify this branch is set up to track another" | 239 "Verify this branch is set up to track another" |
| 222 "(via the --track argument to \"git checkout -b ...\"") | 240 "(via the --track argument to \"git checkout -b ...\"") |
| 223 logging.info("GIT(%s)" % self.checkout_root) | 241 logging.info("GIT(%s)" % self.checkout_root) |
| 224 | 242 |
| 225 def ReadRootFile(self, filename): | |
| 226 try: | |
| 227 # A git checkout is always a full checkout. | |
| 228 data = gclient_utils.FileRead(os.path.join(self.checkout_root, filename)) | |
| 229 logging.debug('%s:\n%s' % (filename, data)) | |
| 230 return data | |
| 231 except (IOError, OSError): | |
| 232 logging.debug('%s:\nNone' % filename) | |
| 233 return None | |
| 234 | |
| 235 def GenerateDiff(self): | 243 def GenerateDiff(self): |
| 236 if not self.files: | 244 if not self.files: |
| 237 self.files = scm.GIT.GetDifferentFiles(self.checkout_root, | 245 self.files = scm.GIT.GetDifferentFiles(self.checkout_root, |
| 238 branch=self.diff_against) | 246 branch=self.diff_against) |
| 239 | 247 |
| 240 def NotExcluded(f): | 248 def NotExcluded(f): |
| 241 for r in self.options.exclude: | 249 for r in self.options.exclude: |
| 242 if re.search(r, f): | 250 if re.search(r, f): |
| 243 logging.info('Ignoring "%s"' % f) | 251 logging.info('Ignoring "%s"' % f) |
| 244 return False | 252 return False |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 help="SVN url to use to write the changes in; --use_svn is " | 584 help="SVN url to use to write the changes in; --use_svn is " |
| 577 "implied when using --svn_repo") | 585 "implied when using --svn_repo") |
| 578 parser.add_option_group(group) | 586 parser.add_option_group(group) |
| 579 | 587 |
| 580 options, args = parser.parse_args(argv) | 588 options, args = parser.parse_args(argv) |
| 581 if len(args) == 1 and args[0] == 'help': | 589 if len(args) == 1 and args[0] == 'help': |
| 582 parser.print_help() | 590 parser.print_help() |
| 583 | 591 |
| 584 if not swallow_exception: | 592 if not swallow_exception: |
| 585 if options.verbose == 0: | 593 if options.verbose == 0: |
| 586 logging.basicConfig(level=logging.ERROR) | 594 logging.basicConfig(level=logging.WARNING) |
| 587 elif options.verbose == 1: | 595 elif options.verbose == 1: |
| 588 logging.basicConfig(level=logging.WARNING) | |
| 589 elif options.verbose == 2: | |
| 590 logging.basicConfig(level=logging.INFO) | 596 logging.basicConfig(level=logging.INFO) |
| 591 elif options.verbose > 2: | 597 elif options.verbose > 1: |
| 592 logging.basicConfig(level=logging.DEBUG) | 598 logging.basicConfig(level=logging.DEBUG) |
| 593 | 599 |
| 594 logging.debug(argv) | 600 logging.debug(argv) |
| 595 | 601 |
| 596 if options.rietveld_url: | 602 if options.rietveld_url: |
| 597 # Try to extract the review number if possible and fix the protocol. | 603 # Try to extract the review number if possible and fix the protocol. |
| 598 if not '://' in options.rietveld_url: | 604 if not '://' in options.rietveld_url: |
| 599 options.rietveld_url = 'http://' + options.rietveld_url | 605 options.rietveld_url = 'http://' + options.rietveld_url |
| 600 match = re.match(r'^(.*)/(\d+)$', options.rietveld_url) | 606 match = re.match(r'^(.*)/(\d+)$', options.rietveld_url) |
| 601 if match: | 607 if match: |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 except (InvalidScript, NoTryServerAccess), e: | 718 except (InvalidScript, NoTryServerAccess), e: |
| 713 if swallow_exception: | 719 if swallow_exception: |
| 714 return 1 | 720 return 1 |
| 715 print e | 721 print e |
| 716 return 1 | 722 return 1 |
| 717 return 0 | 723 return 0 |
| 718 | 724 |
| 719 | 725 |
| 720 if __name__ == "__main__": | 726 if __name__ == "__main__": |
| 721 sys.exit(TryChange(None, [], False)) | 727 sys.exit(TryChange(None, [], False)) |
| OLD | NEW |