Index: scripts/slave/patch_path_filter.py |
diff --git a/scripts/slave/patch_path_filter.py b/scripts/slave/patch_path_filter.py |
deleted file mode 100755 |
index 60a93a2f58d2a995a9eb528ccc96b7c236459efa..0000000000000000000000000000000000000000 |
--- a/scripts/slave/patch_path_filter.py |
+++ /dev/null |
@@ -1,129 +0,0 @@ |
-#!/usr/bin/python |
-# Copyright 2013 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-"""Script that can be used to filter out files from a patch/diff. |
- |
-Usage: pipe the patch contents to stdin and the filtered output will be written |
-to stdout. |
-The output will be compatible with the patch program, both for Subversion and |
-Git patches as input. |
-""" |
- |
-import optparse |
-import os |
-import re |
-import sys |
- |
-from depot_tools_patch import patch |
- |
-# Subversion patch entries always start with either of the following, according |
-# to depot_tools/third_party/upload.py. |
-_SVN_PREFIXES = ('Index: ', 'Property changes on: ') |
-_GIT_PREFIX = 'diff --git ' |
- |
-_SVN_FILENAME_REGEX = re.compile(r'^.*: ([^\t]+).*\n$') |
- |
-# The Git patches generated from depot_tools/git_cl.py has the a/ and b/ |
-# prefixes for the source filenames stripped out. To support both normal patches |
-# and such patches, theyse prefixes are put in optional non-capturing groups. |
-_GIT_FILENAME_REGEX = re.compile(r'^diff --git (?:a/)?.* (?:b/)?(.*)\n$') |
- |
- |
-def parse_git_patch_set(patch_contents): |
- return _parse_patch_set(_GIT_PREFIX, _GIT_FILENAME_REGEX, patch_contents) |
- |
- |
-def parse_svn_patch_set(patch_contents): |
- return _parse_patch_set(_SVN_PREFIXES, _SVN_FILENAME_REGEX, patch_contents) |
- |
- |
-def _parse_patch_set(prefix, filename_regex, patch_contents): |
- # To support both normal Git patches and ones that has been uploaded with |
- # depot_tools/third_party/upload.py (which adds an Subversion-style Index: |
- # line before each file entry) we strip out the Index: lines if they exist for |
- # Git patches, so we can parse each entry properly. Then they're readded in |
- # the convert_to_patch_compatible_diff funtion. |
- if prefix == _GIT_PREFIX: |
- filtered_lines = filter(lambda line: not line.startswith(_SVN_PREFIXES), |
- patch_contents.splitlines(True)) |
- patch_contents = ''.join(filtered_lines) |
- |
- patch_chunks = [] |
- current_chunk = [] |
- for line in patch_contents.splitlines(True): |
- if line.startswith(prefix) and current_chunk: |
- patch_chunks.insert(0, current_chunk) |
- current_chunk = [] |
- current_chunk.append(line) |
- |
- if current_chunk: |
- patch_chunks.insert(0, current_chunk) |
- |
- # Parse filename for each patch chunk and create FilePatchDiff objects |
- patches = [] |
- for chunk in patch_chunks: |
- match = filename_regex.match(chunk[0]) |
- if not match: |
- raise Exception('Did not find any filename in line "%s"' % chunk[0]) |
- filename = match.group(1).replace('\\', '/') |
- patches.append(patch.FilePatchDiff(filename=filename, diff=''.join(chunk), |
- svn_properties=[])) |
- return patch.PatchSet(patches) |
- |
- |
-def convert_to_patch_compatible_diff(filename, patch_entry): |
- """Convert patch data to be compatible with the standard patch program. |
- |
- This will remove the "a/" and "b/" prefixes added by Git, so the patch becomes |
- compatible with the standard patch program. |
- It will also add an Index: line at the first line if not already present, to |
- make the patch entry compatible a Subversion patch (so it can be used by the |
- standard patch program). |
- """ |
- diff = '' |
- patch_lines = patch_entry.splitlines(True) |
- if not patch_lines[0].startswith(_SVN_PREFIXES): |
- diff += _SVN_PREFIXES[0] + filename + '\n' |
- |
- for line in patch_lines: |
- if line.startswith('---'): |
- line = line.replace('a/' + filename, filename) |
- elif line.startswith('+++'): |
- line = line.replace('b/' + filename, filename) |
- diff += line |
- return diff |
- |
- |
-def main(): |
- usage = '%s -f <path-filter>' % os.path.basename(sys.argv[0]) |
- parser = optparse.OptionParser(usage=usage) |
- parser.add_option('-f', '--path-filter', |
- help=('The path filter (POSIX paths) that all file paths ' |
- 'are required to have to pass this filter (no ' |
- 'regexp).')) |
- options, args = parser.parse_args() |
- if args: |
- parser.error('Unused args: %s' % args) |
- if not options.path_filter: |
- parser.error('A path filter must be be specified.') |
- |
- patch_contents = sys.stdin.read() |
- |
- # Find out if it's a Git or Subversion patch set. |
- is_git = any(l.startswith(_GIT_PREFIX) for l in patch_contents.splitlines()) |
- |
- if is_git: |
- patchset = parse_git_patch_set(patch_contents) |
- else: |
- patchset = parse_svn_patch_set(patch_contents) |
- |
- # Only print the patch entries that passes our path filter. |
- for patch_entry in patchset: |
- if patch_entry.filename.startswith(options.path_filter): |
- print convert_to_patch_compatible_diff(patch_entry.filename, |
- patch_entry.get(for_git=False)), |
- |
-if __name__ == '__main__': |
- sys.exit(main()) |