Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(333)

Side by Side Diff: patch.py

Issue 7828017: Improve is_delete detection. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: rebase against HEAD Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tests/patch_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # coding=utf8 1 # coding=utf8
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 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 """Utility functions to handle patches.""" 5 """Utility functions to handle patches."""
6 6
7 import posixpath 7 import posixpath
8 import os 8 import os
9 import re 9 import re
10 10
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 self._fail('Unexpected git diff: %s != %s.' % (old, match.group(1))) 262 self._fail('Unexpected git diff: %s != %s.' % (old, match.group(1)))
263 if not lines or not lines[0].startswith('+++'): 263 if not lines or not lines[0].startswith('+++'):
264 self._fail('Missing git diff output name.') 264 self._fail('Missing git diff output name.')
265 return 265 return
266 266
267 match = re.match(r'^\+\+\+ (.*)$', line) 267 match = re.match(r'^\+\+\+ (.*)$', line)
268 if match: 268 if match:
269 if not last_line.startswith('---'): 269 if not last_line.startswith('---'):
270 self._fail('Unexpected git diff: --- not following +++.') 270 self._fail('Unexpected git diff: --- not following +++.')
271 # TODO(maruel): new == self.filename. 271 # TODO(maruel): new == self.filename.
272 if new != self.mangle(match.group(1)) and '/dev/null' != match.group(1): 272 if '/dev/null' == match.group(1):
273 # TODO(maruel): Can +++ be /dev/null? If so, assert self.is_delete == 273 self.is_delete = True
274 # True. 274 elif new != self.mangle(match.group(1)):
275 self._fail('Unexpected git diff: %s != %s.' % (new, match.group(1))) 275 self._fail('Unexpected git diff: %s != %s.' % (new, match.group(1)))
276 if lines: 276 if lines:
277 self._fail('Crap after +++') 277 self._fail('Crap after +++')
278 # We're done. 278 # We're done.
279 return 279 return
280 280
281 def _verify_svn_header(self): 281 def _verify_svn_header(self):
282 """Sanity checks the header. 282 """Sanity checks the header.
283 283
284 A svn diff can contain only property changes, in that case there will be no 284 A svn diff can contain only property changes, in that case there will be no
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 # match.group(1) != '/dev/null'): 316 # match.group(1) != '/dev/null'):
317 # self.source_file = match.group(1) 317 # self.source_file = match.group(1)
318 if not lines or not lines[0].startswith('+++'): 318 if not lines or not lines[0].startswith('+++'):
319 self._fail('Nothing after header.') 319 self._fail('Nothing after header.')
320 return 320 return
321 321
322 match = re.match(r'^\+\+\+ ([^\t]+).*$', line) 322 match = re.match(r'^\+\+\+ ([^\t]+).*$', line)
323 if match: 323 if match:
324 if not last_line.startswith('---'): 324 if not last_line.startswith('---'):
325 self._fail('Unexpected diff: --- not following +++.') 325 self._fail('Unexpected diff: --- not following +++.')
326 if (self.mangle(match.group(1)) != self.filename and 326 if match.group(1) == '/dev/null':
327 match.group(1) != '/dev/null'): 327 self.is_delete = True
328 # TODO(maruel): Can +++ be /dev/null? If so, assert self.is_delete == 328 elif self.mangle(match.group(1)) != self.filename:
329 # True.
330 self._fail('Unexpected diff: %s.' % match.group(1)) 329 self._fail('Unexpected diff: %s.' % match.group(1))
331 if lines: 330 if lines:
332 self._fail('Crap after +++') 331 self._fail('Crap after +++')
333 # We're done. 332 # We're done.
334 return 333 return
335 334
336 335
337 class PatchSet(object): 336 class PatchSet(object):
338 """A list of FilePatch* objects.""" 337 """A list of FilePatch* objects."""
339 338
340 def __init__(self, patches): 339 def __init__(self, patches):
341 self.patches = patches 340 self.patches = patches
342 for p in self.patches: 341 for p in self.patches:
343 assert isinstance(p, FilePatchBase) 342 assert isinstance(p, FilePatchBase)
344 343
345 def set_relpath(self, relpath): 344 def set_relpath(self, relpath):
346 """Used to offset the patch into a subdirectory.""" 345 """Used to offset the patch into a subdirectory."""
347 for patch in self.patches: 346 for patch in self.patches:
348 patch.set_relpath(relpath) 347 patch.set_relpath(relpath)
349 348
350 def __iter__(self): 349 def __iter__(self):
351 for patch in self.patches: 350 for patch in self.patches:
352 yield patch 351 yield patch
353 352
354 @property 353 @property
355 def filenames(self): 354 def filenames(self):
356 return [p.filename for p in self.patches] 355 return [p.filename for p in self.patches]
OLDNEW
« no previous file with comments | « no previous file | tests/patch_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698