github.com/grantbow/fit@v0.7.1-0.20220916164603-1f7c88ac81e6/fitapp/Tag.go (about) 1 package fitapp 2 3 import ( 4 "fmt" 5 bugs "github.com/grantbow/fit/issues" 6 "os" 7 "sort" 8 "strconv" 9 "strings" 10 ) 11 12 //var dops = bugs.Directory(os.PathSeparator) 13 //var sops = string(os.PathSeparator) 14 15 // getAllTags returns all the tags 16 func getAllTags(config bugs.Config) map[string]int { 17 bugs := bugs.GetAllIssues(config) 18 //fmt.Printf("%+v\n", bugs) 19 tagMap := make(map[string]int, 0) 20 // Put all the tags in a map, values are count of occurrences 21 for _, bug := range bugs { 22 for _, tag := range bug.Tags() { 23 tagMap[strings.ToLower(string(tag))] += 1 24 } 25 } 26 return tagMap 27 } 28 29 func uniqueTagList(config bugs.Config) []string { 30 get := getAllTags(config) 31 var tags []string 32 // iterate over map keys. results are unique. discard values. 33 for k := range get { 34 tags = append(tags, k) 35 } 36 sort.Strings(tags) 37 return tags 38 } 39 40 func uniqueTagListWithValues(config bugs.Config) []string { 41 get := getAllTags(config) 42 var tags []string 43 // iterate over map keys. results are unique. 44 for k, v := range get { 45 tags = append(tags, k+" "+strconv.Itoa(v)) 46 } 47 sort.Strings(tags) 48 return tags 49 } 50 51 // TagsNone is a subcommand to print issues with no assigned tags. 52 func TagsNone(config bugs.Config) { 53 fitdir := bugs.FitDirer(config) 54 issues := readIssues(string(fitdir)) 55 sort.Sort(byDir(issues)) 56 var wantTags bool = false 57 58 allbugs := bugs.GetAllIssues(config) 59 tagMap := make(map[string]int, 0) 60 for _, bug := range allbugs { 61 if len(bug.Tags()) == 0 { 62 title := bug.Dir.ShortNamer() 63 tagMap[string(title)] += 1 64 } 65 } 66 67 //keys := make([]string, 0, len(tagMap)) 68 /*for k, _ := range tagMap { 69 //fmt.Printf("%v\n", k) 70 name := issueNamer(b, idx) // Issue x: 71 fmt.Printf("%v\n", k) 72 //keys = append(keys, k) // TODO: should just append not tagmap intermediary 73 } */ 74 75 fmt.Printf("No tags assigned:\n") 76 //fmt.Printf("%v\n", len(issues)) 77 for idx, issue := range issues { 78 //fmt.Printf("%v\n", issue) 79 for k := range tagMap { 80 if issue.Name() == k { 81 //fmt.Printf("1in: %v\n2tm: %v\n", issue.Name(), k) 82 var dir bugs.Directory = fitdir + dops + bugs.Directory(issue.Name()) 83 //fmt.Printf("dir %v\n", dir) 84 b := bugs.Issue{Dir: dir, DescriptionFileName: config.DescriptionFileName} 85 name := issueNamer(b, idx) // Issue x: 86 //fmt.Printf("name %v\n", name) 87 if wantTags == false { // always 88 fmt.Printf("%s: %s\n", name, b.Title("")) 89 //keys = append(keys, fmt.Sprintf("%s: %s\n", name, b.Title(""))) 90 } else { 91 fmt.Printf("%s: %s\n", name, b.Title("tags")) 92 //keys = append(keys, fmt.Sprintf("%s: %s\n", name, b.Title("tags"))) 93 } 94 } 95 } 96 } 97 //return keys 98 return 99 } 100 101 // TagsAssigned is a subcommand to print the assigned tags. 102 func TagsAssigned(Args argumentList, config bugs.Config) { 103 outputCount := false 104 if len(Args) == 1 && 105 (Args[0] == "-c" || Args[0] == "--count") { 106 outputCount = true 107 } 108 //fmt.Printf("here\n") 109 get := uniqueTagList(config) 110 if len(get) > 0 { 111 if outputCount { 112 fmt.Printf("Tags used in current tree: <key:value> <count>\n") 113 fmt.Printf("%s\n", strings.Join(uniqueTagListWithValues(config), "\n")) 114 } else { 115 fmt.Printf("Tags used in current tree: <key:value>\n") 116 fmt.Printf("%s\n", strings.Join(get, "\n")) 117 } 118 } else { 119 fmt.Print("<none assigned yet>\n") 120 } 121 } 122 123 // TODO: need a new Tag subcommand with tag_key_value behavior 124 125 // Tag was a subcommand to assign a bool true/false tag to an issue. 126 func Tag(Args argumentList, config bugs.Config) { 127 if len(Args) < 2 { 128 fmt.Printf("Usage: %s tag [--rm] <IssueID> <tagname> [more tagnames]\n", os.Args[0]) 129 fmt.Printf("\nBoth issue number and tagname to set are required.\n") 130 var tags = uniqueTagList(config) 131 fmt.Printf("\nCurrently used tags in entire tree: %s\n", strings.Join(tags, "\n")) 132 return 133 } 134 var removeTags bool = false 135 if Args[0] == "--rm" { 136 removeTags = true 137 Args = Args[1:] 138 } 139 140 b, err := bugs.LoadIssueByHeuristic(Args[0], config) 141 142 if err != nil { 143 fmt.Printf("Could not load issue: %s\n", err.Error()) 144 return 145 } 146 for _, tag := range Args[1:] { 147 if removeTags { 148 b.RemoveTag(bugs.TagBoolTrue(tag), config) 149 } else { 150 b.TagIssue(bugs.TagBoolTrue(tag), config) 151 } 152 } 153 154 } 155