Skip to content

Commit 08287b4

Browse files
committed
Add segments and test
1 parent de3a239 commit 08287b4

File tree

3 files changed

+57
-24
lines changed

3 files changed

+57
-24
lines changed

git-permute

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -56,30 +56,6 @@ git permute a-b+c. Uses commit message of a; or, illegal?
5656
5757
"""
5858

59-
def segments(s: str) -> Iterator[str]:
60-
stack = ""
61-
for i in s:
62-
if i not in "+-" and stack and stack[-1] not in "+-":
63-
yield stack
64-
stack = ""
65-
stack += i
66-
if stack:
67-
yield stack
68-
69-
70-
def segment_to_commits(segment: str) -> str:
71-
"a+b-c+d"
72-
assert len(segment) % 2 == 1, segment
73-
segment += "-"
74-
name, sign = zip(*(segment[i:i + 2] for i in range(0, len(segment), 2)))
75-
return "".join(name), sign.index("-")
76-
77-
78-
def segments_to_commits(s):
79-
for seg in segments(s):
80-
yield segment_to_commits(seg)
81-
82-
8359
def git_permute():
8460
def report(name, items, symbol):
8561
if items:

gitz/git/commit_segments.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from typing import Iterator
2+
3+
4+
def segments(s: str) -> Iterator[str]:
5+
stack = ""
6+
for i in s:
7+
if i not in "+-" and stack and stack[-1] not in "+-":
8+
yield stack
9+
stack = ""
10+
stack += i
11+
if stack:
12+
yield stack
13+
14+
15+
def segment_to_commits(segment: str) -> str:
16+
"a+b-c+d"
17+
assert len(segment) % 2 == 1, segment
18+
segment += "-"
19+
name, sign = zip(*(segment[i:i + 2] for i in range(0, len(segment), 2)))
20+
return "".join(name), sign.index("-")
21+
22+
23+
def segments_to_commits(s):
24+
for seg in segments(s):
25+
yield segment_to_commits(seg)

test/git_segments_test.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from gitz.git.commit_segments import segments_to_commits
2+
import unittest
3+
4+
5+
class GitSegmentsTest(unittest.TestCase):
6+
def test_simple(self):
7+
actual = list(segments_to_commits(""))
8+
expected = []
9+
self.assertEqual(actual, expected)
10+
11+
actual = list(segments_to_commits("a"))
12+
expected = [('a', 0)]
13+
self.assertEqual(actual, expected)
14+
15+
actual = list(segments_to_commits("ab"))
16+
expected = [('a', 0), ('b', 0)]
17+
self.assertEqual(actual, expected)
18+
19+
actual = list(segments_to_commits("a+b"))
20+
expected = [('ab', 1)]
21+
self.assertEqual(actual, expected)
22+
23+
actual = list(segments_to_commits("a-b"))
24+
expected = [('ab', 0)]
25+
self.assertEqual(actual, expected)
26+
27+
def test_complex(self):
28+
actual = list(segments_to_commits("abc+de-fgh+i+j-k"))
29+
expected = [
30+
('a', 0), ('b', 0), ('cd', 1), ('ef', 0), ('g', 0), ('hijk', 2)
31+
]
32+
self.assertEqual(actual, expected)

0 commit comments

Comments
 (0)