Skip to content

Commit 1fe62b7

Browse files
author
Thai Son
committed
🐛 fix(parser): handle deduplicate commit messsage
1 parent f8cd7ec commit 1fe62b7

3 files changed

Lines changed: 125 additions & 0 deletions

File tree

cmd/gohome/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ func processCommits(deps *dependencies, cfg *config.AppConfig, w io.Writer) bool
158158
commits = append(commits, deps.parser.Parse(line))
159159
}
160160

161+
// Remove duplicate commit messages
162+
commits = deps.parser.Deduplicate(commits)
163+
161164
if len(commits) > 0 {
162165
foundAny = true
163166
deps.printer.Print(w, filepath.Base(repo), commits)

internal/parser/parser.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,21 @@ func (s *Service) Parse(rawLine string) entity.Commit {
4949
return commit
5050
}
5151

52+
// Deduplicate removes commits with duplicate messages, keeping the first occurrence.
53+
func (s *Service) Deduplicate(commits []entity.Commit) []entity.Commit {
54+
seen := make(map[string]bool)
55+
result := make([]entity.Commit, 0, len(commits))
56+
57+
for _, commit := range commits {
58+
if !seen[commit.Message] {
59+
seen[commit.Message] = true
60+
result = append(result, commit)
61+
}
62+
}
63+
64+
return result
65+
}
66+
5267
func (s *Service) extractEmoji(input string) string {
5368
var emoji strings.Builder
5469

internal/parser/parser_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package parser
2+
3+
import (
4+
"testing"
5+
6+
"github.com/anIcedAntFA/gohome/internal/entity"
7+
)
8+
9+
func TestService_Deduplicate(t *testing.T) {
10+
s := NewService()
11+
12+
tests := []struct {
13+
name string
14+
commits []entity.Commit
15+
expected []entity.Commit
16+
}{
17+
{
18+
name: "empty slice",
19+
commits: []entity.Commit{},
20+
expected: []entity.Commit{},
21+
},
22+
{
23+
name: "no duplicates",
24+
commits: []entity.Commit{
25+
{Message: "feat: add login"},
26+
{Message: "fix: resolve bug"},
27+
{Message: "docs: update readme"},
28+
},
29+
expected: []entity.Commit{
30+
{Message: "feat: add login"},
31+
{Message: "fix: resolve bug"},
32+
{Message: "docs: update readme"},
33+
},
34+
},
35+
{
36+
name: "with duplicates",
37+
commits: []entity.Commit{
38+
{Message: "feat: add login"},
39+
{Message: "fix: resolve bug"},
40+
{Message: "feat: add login"},
41+
{Message: "docs: update readme"},
42+
{Message: "fix: resolve bug"},
43+
},
44+
expected: []entity.Commit{
45+
{Message: "feat: add login"},
46+
{Message: "fix: resolve bug"},
47+
{Message: "docs: update readme"},
48+
},
49+
},
50+
{
51+
name: "all duplicates",
52+
commits: []entity.Commit{
53+
{Message: "feat: add login"},
54+
{Message: "feat: add login"},
55+
{Message: "feat: add login"},
56+
},
57+
expected: []entity.Commit{
58+
{Message: "feat: add login"},
59+
},
60+
},
61+
{
62+
name: "keeps first occurrence with different fields",
63+
commits: []entity.Commit{
64+
{Message: "feat: add login", Type: "feat", Scope: "auth", Icon: "✨"},
65+
{Message: "feat: add login", Type: "feat", Scope: "user", Icon: "🔧"},
66+
},
67+
expected: []entity.Commit{
68+
{Message: "feat: add login", Type: "feat", Scope: "auth", Icon: "✨"},
69+
},
70+
},
71+
{
72+
name: "single commit",
73+
commits: []entity.Commit{
74+
{Message: "feat: add login"},
75+
},
76+
expected: []entity.Commit{
77+
{Message: "feat: add login"},
78+
},
79+
},
80+
}
81+
82+
for _, tt := range tests {
83+
t.Run(tt.name, func(t *testing.T) {
84+
result := s.Deduplicate(tt.commits)
85+
86+
if len(result) != len(tt.expected) {
87+
t.Errorf("Deduplicate() returned %d commits, expected %d", len(result), len(tt.expected))
88+
return
89+
}
90+
91+
for i, commit := range result {
92+
if commit.Message != tt.expected[i].Message {
93+
t.Errorf("Deduplicate()[%d].Message = %q, expected %q", i, commit.Message, tt.expected[i].Message)
94+
}
95+
if commit.Type != tt.expected[i].Type {
96+
t.Errorf("Deduplicate()[%d].Type = %q, expected %q", i, commit.Type, tt.expected[i].Type)
97+
}
98+
if commit.Scope != tt.expected[i].Scope {
99+
t.Errorf("Deduplicate()[%d].Scope = %q, expected %q", i, commit.Scope, tt.expected[i].Scope)
100+
}
101+
if commit.Icon != tt.expected[i].Icon {
102+
t.Errorf("Deduplicate()[%d].Icon = %q, expected %q", i, commit.Icon, tt.expected[i].Icon)
103+
}
104+
}
105+
})
106+
}
107+
}

0 commit comments

Comments
 (0)