OLD | NEW |
1 # Copyright (c) 2009, 2010, 2011 Google Inc. All rights reserved. | 1 # Copyright (c) 2009, 2010, 2011 Google Inc. All rights reserved. |
2 # Copyright (c) 2009 Apple Inc. All rights reserved. | 2 # Copyright (c) 2009 Apple Inc. All rights reserved. |
3 # | 3 # |
4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are |
6 # met: | 6 # met: |
7 # | 7 # |
8 # * Redistributions of source code must retain the above copyright | 8 # * Redistributions of source code must retain the above copyright |
9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
10 # * Redistributions in binary form must reproduce the above | 10 # * Redistributions in binary form must reproduce the above |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 | 193 |
194 def display_name(self): | 194 def display_name(self): |
195 return "git" | 195 return "git" |
196 | 196 |
197 def most_recent_log_matching(self, grep_str, path): | 197 def most_recent_log_matching(self, grep_str, path): |
198 # We use '--grep=' + foo rather than '--grep', foo because | 198 # We use '--grep=' + foo rather than '--grep', foo because |
199 # git 1.7.0.4 (and earlier) didn't support the separate arg. | 199 # git 1.7.0.4 (and earlier) didn't support the separate arg. |
200 return self._run_git(['log', '-1', '--grep=' + grep_str, '--date=iso', s
elf.find_checkout_root(path)]) | 200 return self._run_git(['log', '-1', '--grep=' + grep_str, '--date=iso', s
elf.find_checkout_root(path)]) |
201 | 201 |
202 def _commit_position_from_git_log(self, git_log): | 202 def _commit_position_from_git_log(self, git_log): |
203 match = re.search("^\s*Cr-Commit-Position:.*@\{#(?P<commit_position>\d+)
\}", git_log, re.MULTILINE) | 203 match = re.search(r"^\s*Cr-Commit-Position:.*@\{#(?P<commit_position>\d+
)\}", git_log, re.MULTILINE) |
204 if not match: | 204 if not match: |
205 return "" | 205 return "" |
206 return int(match.group('commit_position')) | 206 return int(match.group('commit_position')) |
207 | 207 |
208 def commit_position(self, path): | 208 def commit_position(self, path): |
209 git_log = self.most_recent_log_matching('Cr-Commit-Position:', path) | 209 git_log = self.most_recent_log_matching('Cr-Commit-Position:', path) |
210 return self._commit_position_from_git_log(git_log) | 210 return self._commit_position_from_git_log(git_log) |
211 | 211 |
212 def _commit_position_regex_for_timestamp(self): | 212 def _commit_position_regex_for_timestamp(self): |
213 return 'Cr-Commit-Position:.*@{#%s}' | 213 return 'Cr-Commit-Position:.*@{#%s}' |
214 | 214 |
215 def timestamp_of_revision(self, path, revision): | 215 def timestamp_of_revision(self, path, revision): |
216 git_log = self.most_recent_log_matching(self._commit_position_regex_for_
timestamp() % revision, path) | 216 git_log = self.most_recent_log_matching(self._commit_position_regex_for_
timestamp() % revision, path) |
217 match = re.search("^Date:\s*(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{
2}) ([+-])(\d{2})(\d{2})$", git_log, re.MULTILINE) | 217 match = re.search(r"^Date:\s*(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d
{2}) ([+-])(\d{2})(\d{2})$", git_log, re.MULTILINE) |
218 if not match: | 218 if not match: |
219 return "" | 219 return "" |
220 | 220 |
221 # Manually modify the timezone since Git doesn't have an option to show
it in UTC. | 221 # Manually modify the timezone since Git doesn't have an option to show
it in UTC. |
222 # Git also truncates milliseconds but we're going to ignore that for now
. | 222 # Git also truncates milliseconds but we're going to ignore that for now
. |
223 time_with_timezone = datetime.datetime(int(match.group(1)), int(match.gr
oup(2)), int(match.group(3)), | 223 time_with_timezone = datetime.datetime(int(match.group(1)), int(match.gr
oup(2)), int(match.group(3)), |
224 int(match.group(4)), int(match.gr
oup(5)), int(match.group(6)), 0) | 224 int(match.group(4)), int(match.gr
oup(5)), int(match.group(6)), 0) |
225 | 225 |
226 sign = 1 if match.group(7) == '+' else -1 | 226 sign = 1 if match.group(7) == '+' else -1 |
227 time_without_timezone = time_with_timezone - \ | 227 time_without_timezone = time_with_timezone - \ |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 if format: | 301 if format: |
302 args.append('--format=' + format) | 302 args.append('--format=' + format) |
303 return self._run_git(args) | 303 return self._run_git(args) |
304 | 304 |
305 def affected_files(self, commit): | 305 def affected_files(self, commit): |
306 output = self._run_git(['log', '-1', '--format=', '--name-only', commit]
) | 306 output = self._run_git(['log', '-1', '--format=', '--name-only', commit]
) |
307 return output.strip().split('\n') | 307 return output.strip().split('\n') |
308 | 308 |
309 def _branch_tracking_remote_master(self): | 309 def _branch_tracking_remote_master(self): |
310 origin_info = self._run_git(['remote', 'show', 'origin', '-n']) | 310 origin_info = self._run_git(['remote', 'show', 'origin', '-n']) |
311 match = re.search("^\s*(?P<branch_name>\S+)\s+merges with remote master$
", origin_info, re.MULTILINE) | 311 match = re.search(r"^\s*(?P<branch_name>\S+)\s+merges with remote master
$", origin_info, re.MULTILINE) |
312 if not match: | 312 if not match: |
313 raise ScriptError(message="Unable to find local branch tracking orig
in/master.") | 313 raise ScriptError(message="Unable to find local branch tracking orig
in/master.") |
314 branch = str(match.group("branch_name")) | 314 branch = str(match.group("branch_name")) |
315 return self._branch_from_ref(self._run_git(['rev-parse', '--symbolic-ful
l-name', branch]).strip()) | 315 return self._branch_from_ref(self._run_git(['rev-parse', '--symbolic-ful
l-name', branch]).strip()) |
316 | 316 |
317 def is_cleanly_tracking_remote_master(self): | 317 def is_cleanly_tracking_remote_master(self): |
318 if self.has_working_directory_changes(): | 318 if self.has_working_directory_changes(): |
319 return False | 319 return False |
320 if self.current_branch() != self._branch_tracking_remote_master(): | 320 if self.current_branch() != self._branch_tracking_remote_master(): |
321 return False | 321 return False |
322 if len(self._local_commits(self._branch_tracking_remote_master())) > 0: | 322 if len(self._local_commits(self._branch_tracking_remote_master())) > 0: |
323 return False | 323 return False |
324 return True | 324 return True |
325 | 325 |
326 def ensure_cleanly_tracking_remote_master(self): | 326 def ensure_cleanly_tracking_remote_master(self): |
327 self._discard_working_directory_changes() | 327 self._discard_working_directory_changes() |
328 self._run_git(['checkout', '-q', self._branch_tracking_remote_master()]) | 328 self._run_git(['checkout', '-q', self._branch_tracking_remote_master()]) |
329 self._discard_local_commits() | 329 self._discard_local_commits() |
OLD | NEW |