Index: scm.py |
=================================================================== |
--- scm.py (revision 195256) |
+++ scm.py (working copy) |
@@ -772,90 +772,6 @@ |
return '' |
@staticmethod |
- def DiffItem(filename, cwd, full_move, revision): |
- """Diffs a single file. |
- |
- Should be simple, eh? No it isn't. |
- Be sure to be in the appropriate directory before calling to have the |
- expected relative path. |
- full_move means that move or copy operations should completely recreate the |
- files, usually in the prospect to apply the patch for a try job.""" |
- # If the user specified a custom diff command in their svn config file, |
- # then it'll be used when we do svn diff, which we don't want to happen |
- # since we want the unified diff. Using --diff-cmd=diff doesn't always |
- # work, since they can have another diff executable in their path that |
- # gives different line endings. So we use a bogus temp directory as the |
- # config directory, which gets around these problems. |
- bogus_dir = tempfile.mkdtemp() |
- try: |
- # Use "svn info" output instead of os.path.isdir because the latter fails |
- # when the file is deleted. |
- return SVN._DiffItemInternal( |
- filename, |
- cwd, |
- SVN.CaptureLocalInfo([filename], cwd), |
- bogus_dir, |
- full_move, |
- revision) |
- finally: |
- gclient_utils.RemoveDirectory(bogus_dir) |
- |
- @staticmethod |
- def _DiffItemInternal(filename, cwd, info, bogus_dir, full_move, revision): |
- """Grabs the diff data.""" |
- command = ["diff", "--config-dir", bogus_dir, filename] |
- if revision: |
- command.extend(['--revision', revision]) |
- data = None |
- if SVN.IsMovedInfo(info): |
- if full_move: |
- if info.get("Node Kind") == "directory": |
- # Things become tricky here. It's a directory copy/move. We need to |
- # diff all the files inside it. |
- # This will put a lot of pressure on the heap. This is why StringIO |
- # is used and converted back into a string at the end. The reason to |
- # return a string instead of a StringIO is that StringIO.write() |
- # doesn't accept a StringIO object. *sigh*. |
- for (dirpath, dirnames, filenames) in os.walk(filename): |
- # Cleanup all files starting with a '.'. |
- for d in dirnames: |
- if d.startswith('.'): |
- dirnames.remove(d) |
- for f in filenames: |
- if f.startswith('.'): |
- filenames.remove(f) |
- for f in filenames: |
- if data is None: |
- data = cStringIO.StringIO() |
- data.write(GenFakeDiff(os.path.join(dirpath, f))) |
- if data: |
- tmp = data.getvalue() |
- data.close() |
- data = tmp |
- else: |
- data = GenFakeDiff(filename) |
- else: |
- if info.get("Node Kind") != "directory": |
- # svn diff on a mv/cp'd file outputs nothing if there was no change. |
- data = SVN.Capture(command, cwd) |
- if not data: |
- # We put in an empty Index entry so upload.py knows about them. |
- data = "Index: %s\n" % filename.replace(os.sep, '/') |
- # Otherwise silently ignore directories. |
- else: |
- if info.get("Node Kind") != "directory": |
- # Normal simple case. |
- try: |
- data = SVN.Capture(command, cwd) |
- except subprocess2.CalledProcessError: |
- if revision: |
- data = GenFakeDiff(filename) |
- else: |
- raise |
- # Otherwise silently ignore directories. |
- return data |
- |
- @staticmethod |
def GenerateDiff(filenames, cwd, full_move, revision): |
"""Returns a string containing the diff for the given file list. |
@@ -943,6 +859,61 @@ |
gclient_utils.RemoveDirectory(bogus_dir) |
@staticmethod |
+ def _DiffItemInternal(filename, cwd, info, bogus_dir, full_move, revision): |
+ """Grabs the diff data.""" |
+ command = ["diff", "--config-dir", bogus_dir, filename] |
+ if revision: |
+ command.extend(['--revision', revision]) |
+ data = None |
+ if SVN.IsMovedInfo(info): |
+ if full_move: |
+ if info.get("Node Kind") == "directory": |
+ # Things become tricky here. It's a directory copy/move. We need to |
+ # diff all the files inside it. |
+ # This will put a lot of pressure on the heap. This is why StringIO |
+ # is used and converted back into a string at the end. The reason to |
+ # return a string instead of a StringIO is that StringIO.write() |
+ # doesn't accept a StringIO object. *sigh*. |
+ for (dirpath, dirnames, filenames) in os.walk(filename): |
+ # Cleanup all files starting with a '.'. |
+ for d in dirnames: |
+ if d.startswith('.'): |
+ dirnames.remove(d) |
+ for f in filenames: |
+ if f.startswith('.'): |
+ filenames.remove(f) |
+ for f in filenames: |
+ if data is None: |
+ data = cStringIO.StringIO() |
+ data.write(GenFakeDiff(os.path.join(dirpath, f))) |
+ if data: |
+ tmp = data.getvalue() |
+ data.close() |
+ data = tmp |
+ else: |
+ data = GenFakeDiff(filename) |
+ else: |
+ if info.get("Node Kind") != "directory": |
+ # svn diff on a mv/cp'd file outputs nothing if there was no change. |
+ data = SVN.Capture(command, cwd) |
+ if not data: |
+ # We put in an empty Index entry so upload.py knows about them. |
+ data = "Index: %s\n" % filename.replace(os.sep, '/') |
+ # Otherwise silently ignore directories. |
+ else: |
+ if info.get("Node Kind") != "directory": |
+ # Normal simple case. |
+ try: |
+ data = SVN.Capture(command, cwd) |
+ except subprocess2.CalledProcessError: |
+ if revision: |
+ data = GenFakeDiff(filename) |
+ else: |
+ raise |
+ # Otherwise silently ignore directories. |
+ return data |
+ |
+ @staticmethod |
def GetEmail(cwd): |
"""Retrieves the svn account which we assume is an email address.""" |
try: |