| OLD | NEW |
| 1 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """SCM-specific utility classes.""" | 5 """SCM-specific utility classes.""" |
| 6 | 6 |
| 7 import cStringIO | 7 import cStringIO |
| 8 import glob | 8 import glob |
| 9 import os | 9 import os |
| 10 import re | 10 import re |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 # work, since they can have another diff executable in their path that | 793 # work, since they can have another diff executable in their path that |
| 794 # gives different line endings. So we use a bogus temp directory as the | 794 # gives different line endings. So we use a bogus temp directory as the |
| 795 # config directory, which gets around these problems. | 795 # config directory, which gets around these problems. |
| 796 bogus_dir = tempfile.mkdtemp() | 796 bogus_dir = tempfile.mkdtemp() |
| 797 try: | 797 try: |
| 798 os.chdir(root) | 798 os.chdir(root) |
| 799 # Cleanup filenames | 799 # Cleanup filenames |
| 800 filenames = [RelativePath(f, root) for f in filenames] | 800 filenames = [RelativePath(f, root) for f in filenames] |
| 801 # Get information about the modified items (files and directories) | 801 # Get information about the modified items (files and directories) |
| 802 data = dict([(f, SVN.CaptureInfo(f)) for f in filenames]) | 802 data = dict([(f, SVN.CaptureInfo(f)) for f in filenames]) |
| 803 diffs = [] |
| 803 if full_move: | 804 if full_move: |
| 804 # Eliminate modified files inside moved/copied directory. | 805 # Eliminate modified files inside moved/copied directory. |
| 805 for (filename, info) in data.iteritems(): | 806 for (filename, info) in data.iteritems(): |
| 806 if SVN.IsMovedInfo(info) and info.get("Node Kind") == "directory": | 807 if SVN.IsMovedInfo(info) and info.get("Node Kind") == "directory": |
| 807 # Remove files inside the directory. | 808 # Remove files inside the directory. |
| 808 filenames = [f for f in filenames | 809 filenames = [f for f in filenames |
| 809 if not f.startswith(filename + os.path.sep)] | 810 if not f.startswith(filename + os.path.sep)] |
| 810 for filename in data.keys(): | 811 for filename in data.keys(): |
| 811 if not filename in filenames: | 812 if not filename in filenames: |
| 812 # Remove filtered out items. | 813 # Remove filtered out items. |
| 813 del data[filename] | 814 del data[filename] |
| 815 else: |
| 816 metaheaders = [] |
| 817 for (filename, info) in data.iteritems(): |
| 818 if SVN.IsMovedInfo(info): |
| 819 # for now, the most common case is a head copy, |
| 820 # so let's just encode that as a straight up cp. |
| 821 srcurl = info.get('Copied From URL') |
| 822 root = info.get('Repository Root') |
| 823 rev = int(info.get('Copied From Rev')) |
| 824 assert srcurl.startswith(root) |
| 825 src = srcurl[len(root)+1:] |
| 826 srcinfo = SVN.CaptureInfo(srcurl) |
| 827 if (srcinfo.get('Revision') != rev and |
| 828 SVN.Capture(['diff', '-r', '%d:head' % rev, srcurl])): |
| 829 metaheaders.append("#$ svn cp -r %d %s %s " |
| 830 "### WARNING: note non-trunk copy\n" % |
| 831 (rev, src, filename)) |
| 832 else: |
| 833 metaheaders.append("#$ cp %s %s\n" % (src, |
| 834 filename)) |
| 835 |
| 836 if metaheaders: |
| 837 diffs.append("### BEGIN SVN COPY METADATA\n") |
| 838 diffs.extend(metaheaders) |
| 839 diffs.append("### END SVN COPY METADATA\n") |
| 814 # Now ready to do the actual diff. | 840 # Now ready to do the actual diff. |
| 815 diffs = [] | |
| 816 for filename in sorted(data.iterkeys()): | 841 for filename in sorted(data.iterkeys()): |
| 817 diffs.append(SVN._DiffItemInternal(filename, data[filename], bogus_dir, | 842 diffs.append(SVN._DiffItemInternal(filename, data[filename], bogus_dir, |
| 818 full_move=full_move, | 843 full_move=full_move, |
| 819 revision=revision)) | 844 revision=revision)) |
| 820 # Use StringIO since it can be messy when diffing a directory move with | 845 # Use StringIO since it can be messy when diffing a directory move with |
| 821 # full_move=True. | 846 # full_move=True. |
| 822 buf = cStringIO.StringIO() | 847 buf = cStringIO.StringIO() |
| 823 for d in filter(None, diffs): | 848 for d in filter(None, diffs): |
| 824 buf.write(d) | 849 buf.write(d) |
| 825 result = buf.getvalue() | 850 result = buf.getvalue() |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 915 if not SVN.current_version: | 940 if not SVN.current_version: |
| 916 SVN.current_version = SVN.Capture(['--version']).split()[2] | 941 SVN.current_version = SVN.Capture(['--version']).split()[2] |
| 917 current_version_list = map(only_int, SVN.current_version.split('.')) | 942 current_version_list = map(only_int, SVN.current_version.split('.')) |
| 918 for min_ver in map(int, min_version.split('.')): | 943 for min_ver in map(int, min_version.split('.')): |
| 919 ver = current_version_list.pop(0) | 944 ver = current_version_list.pop(0) |
| 920 if ver < min_ver: | 945 if ver < min_ver: |
| 921 return (False, SVN.current_version) | 946 return (False, SVN.current_version) |
| 922 elif ver > min_ver: | 947 elif ver > min_ver: |
| 923 return (True, SVN.current_version) | 948 return (True, SVN.current_version) |
| 924 return (True, SVN.current_version) | 949 return (True, SVN.current_version) |
| OLD | NEW |