Index: tools/findit/common/utils.py |
diff --git a/tools/findit/common/utils.py b/tools/findit/common/utils.py |
index 363048c0796fac54225b6fd8b8c3884166ad9d4b..5011e76e2b128a14abdf7609ce36b137c803fea8 100644 |
--- a/tools/findit/common/utils.py |
+++ b/tools/findit/common/utils.py |
@@ -29,3 +29,40 @@ def IsGitHash(revision): |
def GetHttpClient(): |
# TODO(stgao): return implementation for appengine when running on appengine. |
return HttpClientLocal |
+ |
+ |
+def JoinLineNumbers(line_numbers, accepted_gap=1): |
+ """Join line numbers into line blocks. |
+ |
+ Args: |
+ line_numbers: a list of line number. |
+ accepted_gap: if two line numbers are within the give gap, |
+ they would be combined together into a block. |
+ Eg: for (1, 2, 3, 6, 7, 8, 12), if |accepted_gap| = 1, result |
+ would be 1-3, 6-8, 12; if |accepted_gap| = 3, result would be |
+ 1-8, 12; if |accepted_gap| =4, result would be 1-12. |
+ """ |
+ if not line_numbers: |
+ return '' |
+ |
+ line_numbers = map(int, line_numbers) |
+ line_numbers.sort() |
+ |
+ block = [] |
+ start_line_number = line_numbers[0] |
+ last_line_number = start_line_number |
+ for current_line_number in line_numbers[1:]: |
+ if last_line_number + accepted_gap < current_line_number: |
+ if start_line_number == last_line_number: |
+ block.append('%d' % start_line_number) |
+ else: |
+ block.append('%d-%d' % (start_line_number, last_line_number)) |
+ start_line_number = current_line_number |
+ last_line_number = current_line_number |
+ else: |
+ if start_line_number == last_line_number: |
+ block.append('%d' % start_line_number) |
+ else: |
+ block.append('%d-%d' % (start_line_number, last_line_number)) |
+ |
+ return ', '.join(block) |