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