| #!/usr/bin/awk -f |
| # Copyright 2020 The Verible Authors. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| |
| ############################ |
| ######## DEPRECATED ######## |
| ############################ |
| # |
| # This script has been replaced with the executable target: |
| # .../common/tools:verible-patch-tool |
| # and will no longer be installed. |
| # |
| # usage: |
| # verible-patch-tool changed-lines patchfile |
| # |
| # or pipe through: |
| # |
| # verible-patch-tool changed-lines - |
| # |
| ############################ |
| ############################ |
| |
| |
| # Converts a unified-diff into file names and their modified line ranges. |
| # This supports reading the output of 'git diff', but should handle most |
| # variants of diffs. |
| # Note, however, that git diffs shows files as being prefixed with "a/" and "b/", |
| # so the caller of this script will need to adjust filenames accordingly. |
| # The output style of line ranges is suitable for 'verilog_format --lines=...' |
| # |
| # usage: awk -f (this_script) < file.diff |
| # |
| # Changed lines are those that start with '+' in unified diffs. |
| # Ranges can be compact: N,P-Q |
| # Prints one file per line, e.g.: |
| # abc.sv 5,10-12,18,21-22 |
| # xyz.sv 232-245 |
| # New files (diffed vs. /dev/null) will appear without line ranges: |
| # new_file.sv |
| |
| BEGIN { |
| expect_filename = 0; |
| active_range = 0; |
| seen_file = 0; |
| } |
| |
| # Detect whether this entry is a new file. |
| /^---/ { |
| is_new_file = ($2 == "/dev/null"); |
| } |
| |
| # contains filename at $2 |
| /^+++/ { |
| if (expect_filename) { |
| filename = $2; |
| if (seen_file) print ""; |
| printf(filename " "); |
| expect_filename = 0; |
| seen_range = 0; |
| seen_file = 1; |
| } |
| } |
| |
| # given: |
| # @@ -L,J +R,K |
| # R is the next starting line number in the next chunk |
| /^@@ / { |
| split($3, a, ","); |
| left_current_line = substr(a[1], 2) - 1; |
| right_current_line = left_current_line; |
| active_range = 0; |
| } |
| |
| # seen in 'git diff' |
| # diff before-file after-file |
| /^diff/ { |
| auto_flush_range(); |
| expect_filename = 1; |
| } |
| |
| # seen in 'p4 diff' |
| # ==== //depot/...#N - /local/path/to/file ==== |
| /^==== .* ====$/ { |
| auto_flush_range(); |
| expect_filename = 1; |
| } |
| |
| |
| # + lines are after change only |
| /^+/ { |
| if (!expect_filename) { |
| ++right_current_line; |
| if (!active_range) { |
| modified_from = right_current_line; |
| } |
| active_range = 1; |
| } |
| } |
| |
| # print the most recent completed range |
| function flush_range() { |
| if (!is_new_file) { |
| if (seen_range) printf(","); |
| modified_to = right_current_line; |
| if (modified_from == modified_to) printf(modified_from); |
| else printf(modified_from "-" modified_to); |
| } |
| seen_range = 1; |
| active_range = 0; |
| } |
| |
| function auto_flush_range() { |
| if (active_range) { |
| flush_range(); |
| } |
| } |
| |
| # <space> lines in unified diffs are common to both before/after |
| /^ / { |
| auto_flush_range(); |
| ++left_current_line; |
| ++right_current_line; |
| } |
| |
| # - lines are before change only |
| /^-/ { |
| auto_flush_range(); |
| ++left_current_line; |
| } |
| |
| END { |
| # if diff ends with an active range, print it. |
| auto_flush_range(); |
| print ""; |
| } |