diff --git a/src/cmd/tui/tui_groups.go b/src/cmd/tui/tui_groups.go index 2293219..4fdb07e 100644 --- a/src/cmd/tui/tui_groups.go +++ b/src/cmd/tui/tui_groups.go @@ -125,8 +125,7 @@ func (m mainModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { for k, v := range dupProtect { if _, ok := selected[k]; !ok { for _, user := range users { - split := strings.Split(user.Names, "/") - if split[0] == v || split[1] == v { + if user.Shortname == v || user.Longname == v { selectToggle(item(k)) } } diff --git a/src/cmd/users.go b/src/cmd/users.go index 591558e..012d280 100644 --- a/src/cmd/users.go +++ b/src/cmd/users.go @@ -3,7 +3,6 @@ package cmd import ( "os" "os/exec" - "slices" "sort" "strings" @@ -34,8 +33,8 @@ func UsersCmd() *cobra.Command { seen_users := []utils.User{} user_sb := []string{} for name, usr := range utils.Users { - if !slices.Contains(seen_users, usr) { - user_sb = append(user_sb, utils.Users[name].Names+" ->"+" Username: "+usr.Username+" Email: "+usr.Email+"\n") + if !utils.ContainsUser(seen_users, usr) { + user_sb = append(user_sb, utils.Users[name].Shortname+"/"+utils.Users[name].Longname+" ->"+" Username: "+usr.Username+" Email: "+usr.Email+"\n") seen_users = append(seen_users, usr) } } diff --git a/src/cmd/utils/commit.go b/src/cmd/utils/commit.go index a3ad371..06f5c6b 100644 --- a/src/cmd/utils/commit.go +++ b/src/cmd/utils/commit.go @@ -119,7 +119,7 @@ func add_x_users(excludeMode []string) { // helper function to select groups of users to exclude in the commit message func group_selection(group []User, excludeMode []string) []string { for _, user := range Users { - if !(slices.Contains(group, user)) { + if !(ContainsUser(group, user)) { excludeMode = append(excludeMode, user.Username) } } diff --git a/src/cmd/utils/user_util.go b/src/cmd/utils/user_util.go index 033c189..7a509ea 100644 --- a/src/cmd/utils/user_util.go +++ b/src/cmd/utils/user_util.go @@ -1,84 +1,75 @@ package utils import ( - "bufio" "fmt" "os" - "strings" + "slices" + + "encoding/json" ) // This util file is used to handle users and their information + type User struct { - Username string - Email string - Names string + Shortname string `json:"shortname"` + Longname string `json:"longname"` + Username string `json:"username"` + Email string `json:"email"` + Ex bool `json:"ex"` + Groups []string `json:"groups"` +} + +type Author struct { + Authors map[string]User } var Users = map[string]User{} var DefExclude = []string{} var Groups = map[string][]User{} +func ContainsUser(users []User, user User) bool { + return slices.ContainsFunc(users, func(u User) bool { + return u.Shortname == user.Shortname && + u.Longname == user.Longname && + u.Username == user.Username && + u.Email == user.Email && + u.Ex == user.Ex && + slices.Equal(u.Groups, user.Groups) + }) +} + func Define_users(author_file string) { // wipe the users map Users = map[string]User{} DefExclude = []string{} Groups = map[string][]User{} - file, err := os.Open(author_file) + var auth Author + + data, err := os.ReadFile(author_file) if err != nil { - print("File not found") + fmt.Println("Error reading author file: ", err) + os.Exit(2) + } + err = json.Unmarshal(data, &auth) + if err != nil { + fmt.Println("Error unmarshalling json: ", err) os.Exit(2) } - defer file.Close() - scanner := bufio.NewScanner(file) - - // eat a single input - scanner.Scan() - - // reads the input of authors file and formats accordingly - for scanner.Scan() { - input_str := scanner.Text() - group_info := []string{} - if strings.Contains(input_str, ";;") { - input := strings.Split(input_str, ";;") - input_str = input[0] - group_info = append(group_info, strings.Split(input[1], "|")...) - } - info := strings.Split(input_str, "|") - if len(info) < 4 { - if len(info) > 0 { - if info[0] == "" { - info[0] = "(empty string)" - } - fmt.Println("Error: User", info[0], "is missing information") - } else { - fmt.Println("Error: Some user is missing information") - } - fmt.Println("Please check the author file for proper syntax") - if input_str == "" { - fmt.Println("empty line found in author file") - } else { - fmt.Println("author file input:", input_str) - } - os.Exit(1) - } - usr := User{Username: info[2], Email: info[3], Names: info[0] + "/" + info[1]} - Users[info[0]] = usr - Users[info[1]] = usr - // Adds users with the ex tag to the defExclude list - if len(info) == 5 { - if info[4] == "ex" { - DefExclude = append(DefExclude, info[2]) - } + for _, usr := range auth.Authors { + Users[usr.Shortname] = usr + Users[usr.Longname] = usr + if usr.Ex { + DefExclude = append(DefExclude, usr.Shortname) } + + group_info := usr.Groups if len(group_info) > 0 { - // Group assignment for _, group := range group_info { if Groups[group] == nil { Groups[group] = []User{usr} } else { - //TODO: Try and find a cleaner way of doing this usr_lst := Groups[group] usr_lst = append(usr_lst, usr) Groups[group] = usr_lst @@ -86,17 +77,12 @@ func Define_users(author_file string) { } } } - - if err := scanner.Err(); err != nil { - os.Exit(2) - } } func RemoveUser(short string) { usr := Users[short] - split := strings.Split(usr.Names, "/") - delete(Users, split[0]) - delete(Users, split[1]) + delete(Users, usr.Shortname) + delete(Users, usr.Longname) } func TempAddUser(username, email string) {