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

Side by Side Diff: patch.py

Issue 9147056: Fix for single line file modification (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Created 8 years, 11 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 | testing_support/patches_data.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) 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 """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 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 # http://codereview.chromium.org/download/issue6250123_3013_6010.diff 212 # http://codereview.chromium.org/download/issue6250123_3013_6010.diff
213 # Rename no change: 213 # Rename no change:
214 # http://codereview.chromium.org/download/issue6287022_3001_4010.diff 214 # http://codereview.chromium.org/download/issue6287022_3001_4010.diff
215 return any(l.startswith('diff --git') for l in diff_header.splitlines()) 215 return any(l.startswith('diff --git') for l in diff_header.splitlines())
216 216
217 def _split_hunks(self): 217 def _split_hunks(self):
218 """Splits the hunks and does verification.""" 218 """Splits the hunks and does verification."""
219 hunks = [] 219 hunks = []
220 for line in self.diff_hunks.splitlines(True): 220 for line in self.diff_hunks.splitlines(True):
221 if line.startswith('@@'): 221 if line.startswith('@@'):
222 match = re.match(r'^@@ -(\d+),(\d+) \+([\d,]+) @@.*$', line) 222 match = re.match(r'^@@ -([\d,]+) \+([\d,]+) @@.*$', line)
223 # File add will result in "-0,0 +1" but file deletion will result in 223 # File add will result in "-0,0 +1" but file deletion will result in
224 # "-1,N +0,0" where N is the number of lines deleted. That's from diff 224 # "-1,N +0,0" where N is the number of lines deleted. That's from diff
225 # and svn diff. git diff doesn't exhibit this behavior. 225 # and svn diff. git diff doesn't exhibit this behavior.
226 # svn diff for a single line file rewrite "@@ -1 +1 @@". Fun.
226 if not match: 227 if not match:
227 self._fail('Hunk header is unparsable') 228 self._fail('Hunk header is unparsable')
228 if ',' in match.group(3): 229 if ',' in match.group(1):
229 start_dst, lines_dst = map(int, match.group(3).split(',', 1)) 230 start_src, lines_src = map(int, match.group(1).split(',', 1))
230 else: 231 else:
231 start_dst = int(match.group(3)) 232 start_src = int(match.group(1))
233 lines_src = 0
234 if ',' in match.group(2):
235 start_dst, lines_dst = map(int, match.group(2).split(',', 1))
236 else:
237 start_dst = int(match.group(2))
232 lines_dst = 0 238 lines_dst = 0
233 new_hunk = Hunk(int(match.group(1)), int(match.group(2)), 239 new_hunk = Hunk(start_src, lines_src, start_dst, lines_dst)
234 start_dst, lines_dst)
235 if hunks: 240 if hunks:
236 if new_hunk.start_src <= hunks[-1].start_src: 241 if new_hunk.start_src <= hunks[-1].start_src:
237 self._fail('Hunks source lines are not ordered') 242 self._fail('Hunks source lines are not ordered')
238 if new_hunk.start_dst <= hunks[-1].start_dst: 243 if new_hunk.start_dst <= hunks[-1].start_dst:
239 self._fail('Hunks destination lines are not ordered') 244 self._fail('Hunks destination lines are not ordered')
240 hunks.append(new_hunk) 245 hunks.append(new_hunk)
241 continue 246 continue
242 hunks[-1].text.append(line) 247 hunks[-1].text.append(line)
243 248
244 if len(hunks) == 1: 249 if len(hunks) == 1:
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 def __iter__(self): 494 def __iter__(self):
490 for patch in self.patches: 495 for patch in self.patches:
491 yield patch 496 yield patch
492 497
493 def __getitem__(self, key): 498 def __getitem__(self, key):
494 return self.patches[key] 499 return self.patches[key]
495 500
496 @property 501 @property
497 def filenames(self): 502 def filenames(self):
498 return [p.filename for p in self.patches] 503 return [p.filename for p in self.patches]
OLDNEW
« no previous file with comments | « no previous file | testing_support/patches_data.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698