Skip to content

Commit b10f7af

Browse files
committed
Add diff_line_no to Line.
1 parent eb152c3 commit b10f7af

File tree

3 files changed

+64
-3
lines changed

3 files changed

+64
-3
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# Python
22
*.py[cod]
33
__pycache__
4+
build
5+
dist
6+
unidiff.egg-info
47

58
# Vim
69
*.swp

tests/test_parser.py

+55
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,61 @@ def test_parse_malformed_diff(self):
117117
with open(self.sample_bad_file) as diff_file:
118118
self.assertRaises(UnidiffParseError, PatchSet, diff_file)
119119

120+
def test_diff_lines_linenos(self):
121+
with open(self.sample_file, 'rb') as diff_file:
122+
res = PatchSet(diff_file, encoding='utf-8')
123+
124+
target_line_nos = []
125+
source_line_nos = []
126+
diff_line_nos = []
127+
for diff_file in res:
128+
for hunk in diff_file:
129+
for line in hunk:
130+
target_line_nos.append(line.target_line_no)
131+
source_line_nos.append(line.source_line_no)
132+
diff_line_nos.append(line.diff_line_no)
133+
134+
expected_target_line_nos = [
135+
# File: 1, Hunk: 1
136+
1, 2, 3, 4, 5, 6, 7, 8, 9,
137+
# File: 1, Hunk: 2
138+
11, 12, 13, None, None, None, None, None, None, None, 14, 15, 16, None, 17, 18, 19, 20,
139+
# File: 1, Hunk: 3
140+
22, 23, 24, 25, 26, 27, 28,
141+
# File: 2, Hunk 1
142+
1, 2, 3, 4, 5, 6, 7, 8, 9,
143+
# File: 3, Hunk 1
144+
None, None, None, None, None, None, None, None, None,
145+
]
146+
expected_source_line_nos = [
147+
# File: 1, Hunk: 1
148+
None, None, None, None, None, None, 1, 2, 3,
149+
# File: 1, Hunk: 2
150+
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, None, 15, 16, 17, None, 18, 19, 20,
151+
# File: 1, Hunk: 3
152+
22, 23, 24, None, None, None, None,
153+
# File: 2, Hunk 1
154+
None, None, None, None, None, None, None, None, None,
155+
# File: 3, Hunk 1
156+
1, 2, 3, 4, 5, 6, 7, 8, 9,
157+
]
158+
expected_diff_line_nos = [
159+
# File: 1, Hunk: 1
160+
4, 5, 6, 7, 8, 9, 10, 11, 12,
161+
# File: 1, Hunk: 2
162+
14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
163+
# File: 1, Hunk: 3
164+
33, 34, 35, 36, 37, 38, 39,
165+
# File: 2, Hunk 1
166+
43, 44, 45, 46, 47, 48, 49, 50, 51,
167+
# File: 3, Hunk 1
168+
55, 56, 57, 58, 59, 60, 61, 62, 63,
169+
]
170+
171+
self.assertEqual(target_line_nos, expected_target_line_nos)
172+
self.assertEqual(source_line_nos, expected_source_line_nos)
173+
self.assertEqual(diff_line_nos, expected_diff_line_nos)
174+
120175

121176
class TestVCSSamples(unittest.TestCase):
122177
"""Tests for real examples from VCS."""

unidiff/patch.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,11 @@ class Line(object):
6464
"""A diff line."""
6565

6666
def __init__(self, value, line_type,
67-
source_line_no=None, target_line_no=None):
67+
source_line_no=None, target_line_no=None, diff_line_no=None):
6868
super(Line, self).__init__()
6969
self.source_line_no = source_line_no
7070
self.target_line_no = target_line_no
71+
self.diff_line_no = diff_line_no
7172
self.line_type = line_type
7273
self.value = value
7374

@@ -186,7 +187,7 @@ def _parse_hunk(self, header, diff, encoding):
186187
expected_source_end = source_line_no + hunk.source_length
187188
expected_target_end = target_line_no + hunk.target_length
188189

189-
for line in diff:
190+
for diff_line_no, line in diff:
190191
if encoding is not None:
191192
line = line.decode(encoding)
192193
valid_line = RE_HUNK_BODY_LINE.match(line)
@@ -213,6 +214,7 @@ def _parse_hunk(self, header, diff, encoding):
213214
original_line = None
214215

215216
if original_line:
217+
original_line.diff_line_no = diff_line_no
216218
hunk.append(original_line)
217219

218220
# if hunk source/target lengths are ok, hunk is complete
@@ -286,7 +288,8 @@ def __str__(self):
286288
def _parse(self, diff, encoding):
287289
current_file = None
288290

289-
for line in diff:
291+
diff = enumerate(diff, 1)
292+
for unused_diff_line_no, line in diff:
290293
if encoding is not None:
291294
line = line.decode(encoding)
292295
# check for source file header

0 commit comments

Comments
 (0)