Skip to content

Commit 2d4f46c

Browse files
authored
Fix add-copyright year function (#466)
* Fix add-copyright year function * Fixes bug raised in [#414](#414) Signed-off-by: superdyoll <[email protected]>
1 parent 4bd8e5b commit 2d4f46c

File tree

3 files changed

+73
-46
lines changed

3 files changed

+73
-46
lines changed

ament_copyright/ament_copyright/main.py

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -267,14 +267,14 @@ def add_missing_header(file_descriptors, name, license_, verbose):
267267

268268
def add_copyright_year(file_descriptors, new_years, verbose):
269269
if verbose:
270-
print('Adding the current year to existing copyright notices:')
270+
print(f'Adding {",".join(map(str,new_years))} to existing copyright notices:')
271271
print()
272272

273273
for path in sorted(file_descriptors.keys()):
274274
file_descriptor = file_descriptors[path]
275275

276276
# ignore files which do not have a header
277-
if not getattr(file_descriptor, 'copyright_identifier', None):
277+
if not getattr(file_descriptor, 'copyright_identifiers', None):
278278
continue
279279

280280
index = scan_past_coding_and_shebang_lines(file_descriptor.content)
@@ -287,39 +287,32 @@ def add_copyright_year(file_descriptors, new_years, verbose):
287287
else:
288288
block = file_descriptor.content[index:]
289289
block_offset = 0
290-
copyright_span, years_span, name_span = search_copyright_information(block)
291-
if copyright_span is None:
290+
copyrights, years_spans, _, _ = search_copyright_information(block)
291+
if copyrights is None:
292292
assert False, "Could not find copyright information in file '%s'" % \
293293
file_descriptor.path
294294

295-
# skip if all new years are already included
296-
years = get_years_from_string(block[years_span[0]:years_span[1]])
297-
if all((new_year in years) for new_year in new_years):
298-
if verbose:
299-
print(' ', file_descriptor.path)
300-
continue
301-
print('*' if file_descriptor.exists else '+', file_descriptor.path)
302-
303-
for new_year in new_years:
304-
years.add(new_year)
305-
years_string = get_string_from_years(years)
306-
307-
# overwrite previous years with new years
308-
offset = index + block_offset
309-
global_years_span = [offset + years_span[0], offset + years_span[1]]
310-
content = file_descriptor.content[:global_years_span[0]] + years_string + \
311-
file_descriptor.content[global_years_span[1]:]
312-
313-
# output beginning of file for debugging
314-
# index = global_years_span[0]
315-
# for _ in range(3):
316-
# index = get_index_of_next_line(content, index)
317-
# print('<<<')
318-
# print(content[:index - 1])
319-
# print('>>>')
320-
321-
with open(file_descriptor.path, 'w', encoding='utf-8') as h:
322-
h.write(content)
295+
for years_span in years_spans:
296+
# skip if all new years are already included
297+
years = get_years_from_string(block[years_span[0]:years_span[1]])
298+
if all((new_year in years) for new_year in new_years):
299+
if verbose:
300+
print(' ', file_descriptor.path)
301+
continue
302+
print('*' if file_descriptor.exists else '+', file_descriptor.path)
303+
304+
for new_year in new_years:
305+
years.add(new_year)
306+
years_string = get_string_from_years(years)
307+
308+
# overwrite previous years with new years
309+
offset = index + block_offset
310+
global_years_span = [offset + years_span[0], offset + years_span[1]]
311+
content = file_descriptor.content[:global_years_span[0]] + years_string + \
312+
file_descriptor.content[global_years_span[1]:]
313+
314+
with open(file_descriptor.path, 'w', encoding='utf-8') as h:
315+
h.write(content)
323316

324317

325318
def get_years_from_string(content):

ament_copyright/ament_copyright/parser.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,11 @@ def parse(self):
115115

116116
# get first comment block without leading comment tokens
117117
block, _ = get_comment_block(self.content, index)
118-
copyrights, remaining_block = search_copyright_information(block)
118+
copyrights, _, _, remaining_block = search_copyright_information(block)
119119

120120
if len(copyrights) == 0:
121121
block = get_multiline_comment_block(self.content, index)
122-
copyrights, remaining_block = search_copyright_information(block)
122+
copyrights, _, _, remaining_block = search_copyright_information(block)
123123

124124
if len(copyrights) == 0:
125125
return
@@ -193,17 +193,21 @@ def search_copyright_information(content):
193193
regex = re.compile(pattern, re.DOTALL | re.MULTILINE | re.IGNORECASE)
194194

195195
copyrights = []
196+
years_spans = []
197+
name_spans = []
196198
while True:
197199
match = regex.search(content)
198200
if not match:
199201
break
200202
years_span, name_span = match.span(1), match.span(2)
203+
years_spans.append(years_span)
204+
name_spans.append(name_span)
201205
years = content[years_span[0]:years_span[1]]
202206
name = content[name_span[0]:name_span[1]]
203207
copyrights.append(CopyrightDescriptor(name, years))
204208
content = content[name_span[1]:]
205209

206-
return copyrights, content
210+
return copyrights, years_spans, name_spans, content
207211

208212

209213
def scan_past_coding_and_shebang_lines(content):

ament_copyright/test/test_parser.py

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,36 @@
2323

2424
def test_search_copyright_information_incorrect_typo():
2525
"""Test searching for copyright information with a typo in the copyright information."""
26-
copyrights, remaining_block = search_copyright_information(
26+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
2727
'CopyrightTypo 2020 Open Source Robotics Foundation, Inc.'
2828
)
2929
assert len(copyrights) == 0
30+
assert years_span == []
31+
assert name_span == []
32+
assert len(remaining_block) == 56
3033

3134

3235
def test_search_copyright_information_repeated():
3336
"""Test searching with repeated 'copyright' in the copyright information."""
34-
copyrights, remaining_block = search_copyright_information(
37+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
3538
'\\copyright Copyright 2020 Open Source Robotics Foundation, Inc.'
3639
)
3740
assert len(copyrights) == 1
41+
assert years_span == [(21, 25)]
42+
assert name_span == [(26, 63)]
43+
assert len(remaining_block) == 0
3844

3945

4046
def test_search_copyright_information_multiple_holders():
4147
"""Test searching multiple holders."""
42-
copyrights, remaining_block = search_copyright_information(
48+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
4349
"""Copyright 2020 Open Source Robotics Foundation, Inc.
4450
Copyright (c) 2009, Willow Garage, Inc."""
4551
)
4652
assert len(copyrights) == 2
53+
assert years_span == [(10, 14), (26, 30)]
54+
assert name_span == [(15, 52), (32, 51)]
55+
assert len(remaining_block) == 0
4756

4857

4958
def test_search_copyright_information_capitalization1():
@@ -53,10 +62,13 @@ def test_search_copyright_information_capitalization1():
5362
Word 'copyright': capitalized
5463
Abbreviation '(c)': absent
5564
"""
56-
copyrights, remaining_block = search_copyright_information(
65+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
5766
' Copyright 2020 Open Source Robotics Foundation, Inc.')
58-
assert copyrights[0].name == 'Open Source Robotics Foundation, Inc.'
5967
assert len(copyrights) == 1
68+
assert copyrights[0].name == 'Open Source Robotics Foundation, Inc.'
69+
assert years_span == [(12, 16)]
70+
assert name_span == [(17, 54)]
71+
assert len(remaining_block) == 0
6072

6173

6274
def test_search_copyright_information_capitalization2():
@@ -66,9 +78,12 @@ def test_search_copyright_information_capitalization2():
6678
Word 'copyright': capitalized
6779
Abbreviation '(c)': lowercase
6880
"""
69-
copyrights, remaining_block = search_copyright_information(
81+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
7082
'Copyright (c) 2020 Open Source Robotics Foundation, Inc.')
7183
assert len(copyrights) == 1
84+
assert years_span == [(14, 18)]
85+
assert name_span == [(19, 56)]
86+
assert len(remaining_block) == 0
7287

7388

7489
def test_search_copyright_information_capitalization3():
@@ -78,9 +93,12 @@ def test_search_copyright_information_capitalization3():
7893
Word 'copyright': capitalized
7994
Abbreviation '(c)': uppercase
8095
"""
81-
copyrights, remaining_block = search_copyright_information(
96+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
8297
'Copyright (C) 2020 Open Source Robotics Foundation, Inc.')
8398
assert len(copyrights) == 1
99+
assert years_span == [(14, 18)]
100+
assert name_span == [(19, 56)]
101+
assert len(remaining_block) == 0
84102

85103

86104
def test_search_copyright_information_lowercase1():
@@ -90,9 +108,12 @@ def test_search_copyright_information_lowercase1():
90108
Word 'copyright': lowercase
91109
Abbreviation '(c)': absent
92110
"""
93-
copyrights, remaining_block = search_copyright_information(
111+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
94112
'copyright 2020 Open Source Robotics Foundation, Inc.')
95113
assert len(copyrights) == 1
114+
assert years_span == [(10, 14)]
115+
assert name_span == [(15, 52)]
116+
assert len(remaining_block) == 0
96117

97118

98119
def test_search_copyright_information_lowercase2():
@@ -102,9 +123,12 @@ def test_search_copyright_information_lowercase2():
102123
Word 'copyright': lowercase
103124
Abbreviation '(c)': lowercase
104125
"""
105-
copyrights, remaining_block = search_copyright_information(
126+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
106127
'copyright (c) 2020 Open Source Robotics Foundation, Inc.')
107128
assert len(copyrights) == 1
129+
assert years_span == [(14, 18)]
130+
assert name_span == [(19, 56)]
131+
assert len(remaining_block) == 0
108132

109133

110134
def test_search_copyright_information_uppercase1():
@@ -114,9 +138,12 @@ def test_search_copyright_information_uppercase1():
114138
Word 'copyright': uppercase
115139
Abbreviation '(c)': absent
116140
"""
117-
copyrights, remaining_block = search_copyright_information(
141+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
118142
'COPYRIGHT 2020 Open Source Robotics Foundation, Inc.')
119143
assert len(copyrights) == 1
144+
assert years_span == [(10, 14)]
145+
assert name_span == [(15, 52)]
146+
assert len(remaining_block) == 0
120147

121148

122149
def test_search_copyright_information_uppercase2():
@@ -126,9 +153,12 @@ def test_search_copyright_information_uppercase2():
126153
Word 'copyright': uppercase
127154
Abbreviation '(c)': uppercase
128155
"""
129-
copyrights, remaining_block = search_copyright_information(
156+
copyrights, years_span, name_span, remaining_block = search_copyright_information(
130157
'COPYRIGHT (C) 2020 Open Source Robotics Foundation, Inc.')
131158
assert len(copyrights) == 1
159+
assert years_span == [(14, 18)]
160+
assert name_span == [(19, 56)]
161+
assert len(remaining_block) == 0
132162

133163

134164
def test_split_template_no_split():

0 commit comments

Comments
 (0)