Merge pull request #5 from Slug-Boi/feat_exclude_and_add_all

Feat: Exclude and add all
This commit is contained in:
Theis
2024-03-04 23:00:18 +01:00
committed by GitHub
2 changed files with 114 additions and 27 deletions
+55 -13
View File
@@ -6,6 +6,7 @@ import (
"os"
"os/exec"
"regexp"
"slices"
"strings"
)
@@ -14,8 +15,12 @@ type user struct {
email string
}
var users = make(map[string]user)
var sb strings.Builder
var all_flag = false
func main() {
users := make(map[string]user)
// Reads a shell env variable :: author_file
authors := os.Getenv("author_file")
@@ -48,21 +53,23 @@ func main() {
NoInput(args, users)
excludeMode := []string{}
// builds the commit message with the selected authors
var sb strings.Builder
sb.WriteString(string(args[0]) + "\n")
reg, _ := regexp.Compile("([^:]+):([^:]+)")
for _, commiter := range args[1:] {
if _, ok := users[commiter]; ok {
sb.WriteString("\nCo-authored-by: ")
sb.WriteString(users[commiter].username)
sb.WriteString(" <")
sb.WriteString(users[commiter].email)
sb.WriteRune('>')
} else if match := reg.MatchString(commiter); match {
str := strings.Split(commiter, ":")
if args[1] == "all" || args[1] == "All" {
all_flag = true
goto skip_loop
}
for _, committer := range args[1:] {
if _, ok := users[committer]; ok {
sb_author(committer)
} else if match := reg.MatchString(committer); match {
str := strings.Split(committer, ":")
sb.WriteString("\nCo-authored-by: ")
sb.WriteString(str[0])
@@ -70,12 +77,26 @@ func main() {
sb.WriteString(str[1])
sb.WriteRune('>')
} else if committer[0] == '^' {
excludeMode = append(excludeMode, users[committer[1:]].username)
} else {
println(commiter, " was unknown. User either not defined or name typed wrong")
println(committer, " was unknown. User either not defined or name typed wrong")
}
}
skip_loop:
if len(excludeMode) > 0 || all_flag {
add_x_users(excludeMode)
}
// commit msg built
commit := sb.String()
commit := sb_build()
//NOTE: Uncomment for testing
//print(commit)
// commit shell command
cmd := exec.Command("git", "commit", "-m", commit)
@@ -92,6 +113,27 @@ func main() {
}
func add_x_users(excludeMode []string) {
for key, user := range users {
if !slices.Contains(excludeMode, user.username) {
sb_author(key)
excludeMode = append(excludeMode, user.username)
}
}
}
func sb_build() string {
return sb.String()
}
func sb_author(committer string) {
sb.WriteString("\nCo-authored-by: ")
sb.WriteString(users[committer].username)
sb.WriteString(" <")
sb.WriteString(users[committer].email)
sb.WriteRune('>')
}
// TODO: move half this into another function and call before building users to improve performance
func NoInput(args []string, users map[string]user) {
if len(args) < 2 {
+45
View File
@@ -3,6 +3,7 @@ package main
import (
"os"
"os/exec"
"strings"
"testing"
)
@@ -37,6 +38,50 @@ func Test_usersInput(t *testing.T) {
}
t.Fatalf("process ran with err %v, want exit status 1", err)
}
//TODO: Turn this into a fuzz test
func Test_commit_message(t *testing.T) {
//authors := make(map[string]user)
users["test"] = user{username: "test", email: "test"}
sb_author("test")
commit := sb_build()
if commit != "\nCo-authored-by: test <test>" {
t.Fatalf("String built incorrectly. Strings did not match: Created -> %s Expected -> Co-authored-by: test <test>",commit)
}
}
//TODO: Turn this into a fuzz test
func Test_add_all(t *testing.T) {
for k := range users {
delete(users, k)
}
sb.Reset()
users["test1"] = user{username: "test1", email: "test1"}
users["test2"] = user{username: "test2", email: "test2"}
users["test3"] = user{username: "test3", email: "test3"}
all_flag = true
add_x_users([]string{})
commit := sb_build()
if !strings.Contains(commit, "\nCo-authored-by: test1 <test1>") ||
!strings.Contains(commit, "\nCo-authored-by: test2 <test2>") ||
!strings.Contains(commit, "\nCo-authored-by: test3 <test3>") {
t.Fatalf("String built incorrectly. Strings did not match: Created -> %s Expected -> Co-authored-by: test <test>",commit)
}
}
func Test_exclude_user(t *testing.T) {
// Reusing users map from last test
excludeMode := []string{"test1"}
sb.Reset()
add_x_users(excludeMode)
commit := sb_build()
if strings.Contains(commit, "\nCo-authored-by: test1 <test1>") {
t.Fatalf("String built incorrectly. Strings did not match: Created -> %s Expected -> Co-authored-by: test <test>",commit)
}
}