func (m BugPageHandler) Get(r *http.Request, extras map[string]interface{}) (string, error) { if r.URL.Path == "/issues" || r.URL.Path == "/issues/" { return getBugList() } bugDir := string(bugs.GetRootDir()) + r.URL.Path b := bugs.Bug{} b.LoadBug(bugs.Directory(bugDir)) switch r.URL.Query().Get("format") { case "json": bJSON, _ := json.Marshal(b) return string(bJSON), nil default: page := BugRenderer{Bug: b} page.RootElement = "RBugPage" page.Title = b.Title("") page.JSFiles = []string{ // Bootstrap JS //"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js", // React JS "https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react.js", "https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react-dom.js", "/js/BugPage.js", } page.CSSFiles = []string{ "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css", "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css"} return HTMLPageRenderer.Render(page), nil } }
func List(args ArgumentList, stdout *os.File) { issues, _ := ioutil.ReadDir(string(bugs.GetIssuesDir())) var wantTags bool = false if args.HasArgument("--tags") { wantTags = true } // No parameters, print a list of all bugs if len(args) == 0 || (wantTags && len(args) == 1) { //os.Stdout = stdout for idx, issue := range issues { if issue.IsDir() != true { continue } var dir bugs.Directory = bugs.GetIssuesDir() + bugs.Directory(issue.Name()) b := bugs.Bug{dir} name := getBugName(b, idx) if wantTags == false { fmt.Printf("%s: %s\n", name, b.Title("")) } else { fmt.Printf("%s: %s\n", name, b.Title("tags")) } } return } // getAllTags() is defined in Tag.go // Get a list of tags, so that when we encounter // an error we can check if it's because the user // provided a tagname instead of a BugID. If they // did, then list bugs matching that tag instead // of full descriptions tags := getAllTags() // There were parameters, so show the full description of each // of those issues for i, length := 0, len(args); i < length; i += 1 { b, err := bugs.LoadBugByHeuristic(args[i]) if err != nil { for _, tagname := range tags { if tagname == args[i] { listTags(issues, args) return } } fmt.Printf("%s\n", err.Error()) continue } b.ViewBug() if i < length-1 { fmt.Printf("\n--\n\n") } } fmt.Printf("\n") }
func listTags(files []os.FileInfo, args ArgumentList) { b := bugs.Bug{} for idx, _ := range files { b.LoadBug(bugs.Directory(bugs.GetIssuesDir() + bugs.Directory(files[idx].Name()))) for _, tag := range args { if b.HasTag(bugs.Tag(tag)) { fmt.Printf("%s: %s\n", getBugName(b, idx), b.Title("tags")) } } } }
func (a BugApplication) List(args ArgumentList) { issues, _ := ioutil.ReadDir(string(bugs.GetIssuesDir())) var wantTags bool = false if args.HasArgument("--tags") { wantTags = true } // No parameters, print a list of all bugs if len(args) == 0 || (wantTags && len(args) == 1) { for idx, issue := range issues { if issue.IsDir() != true { continue } var dir bugs.Directory = bugs.GetIssuesDir() + bugs.Directory(issue.Name()) b := bugs.Bug{dir} if wantTags == false { fmt.Printf("Issue %d: %s\n", idx+1, b.Title("")) } else { fmt.Printf("Issue %d: %s\n", idx+1, b.Title("tags")) } } return } // There were parameters, so show the full description of each // of those issues b := bugs.Bug{} for i, length := 0, len(args); i < length; i += 1 { idx, err := strconv.Atoi(args[i]) if err != nil { listTags(issues, args) return } if idx > len(issues) || idx < 1 { fmt.Printf("Invalid issue number %d\n", idx) continue } if err == nil { b.LoadBug(bugs.Directory(bugs.GetIssuesDir() + bugs.Directory(issues[idx-1].Name()))) b.ViewBug() if i < length-1 { fmt.Printf("\n--\n\n") } } } fmt.Printf("\n") }
func (a BugApplication) Create(Args ArgumentList) { if len(Args) < 1 || (len(Args) < 2 && Args[0] == "-n") { fmt.Printf("Usage: %s create [-n] Bug Description\n", os.Args[0]) fmt.Printf("\nNo Bug Description provided.\n") return } var noDesc bool = false if Args.HasArgument("-n") { noDesc = true Args = Args[1:] } var bug bugs.Bug bug = bugs.Bug{ Dir: bugs.GetIssuesDir() + bugs.TitleToDir(strings.Join(Args, " ")), } dir, _ := bug.GetDirectory() fmt.Printf("Created issue: %s\n", bug.Title("")) var mode os.FileMode mode = 0775 os.Mkdir(string(dir), mode) if noDesc { txt := []byte("") ioutil.WriteFile(string(dir)+"/Description", txt, 0644) } else { cmd := exec.Command(getEditor(), string(dir)+"/Description") cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { log.Fatal(err) } } }
func Create(Args ArgumentList) { if len(Args) < 1 || (len(Args) < 2 && Args[0] == "-n") { fmt.Fprintf(os.Stderr, "Usage: %s create [-n] Bug Description\n", os.Args[0]) fmt.Fprintf(os.Stderr, "\nNo Bug Description provided.\n") return } var noDesc bool = false if Args.HasArgument("-n") { noDesc = true Args = Args[1:] } Args, argVals := Args.GetAndRemoveArguments([]string{"--tag", "--status", "--priority", "--milestone", "--identifier"}) tag := argVals[0] status := argVals[1] priority := argVals[2] milestone := argVals[3] identifier := argVals[4] if Args.HasArgument("--generate-id") { for i, token := range Args { if token == "--generate-id" { if i+1 < len(Args) { Args = append(Args[:i], Args[i+1:]...) break } else { Args = Args[:i] break } } } identifier = generateID(strings.Join(Args, " ")) } var bug bugs.Bug bug = bugs.Bug{ Dir: bugs.GetIssuesDir() + bugs.TitleToDir(strings.Join(Args, " ")), } dir := bug.GetDirectory() var mode os.FileMode mode = 0775 os.Mkdir(string(dir), mode) if noDesc { txt := []byte("") ioutil.WriteFile(string(dir)+"/Description", txt, 0644) } else { cmd := exec.Command(getEditor(), string(dir)+"/Description") cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { log.Fatal(err) } } if tag != "" { bug.TagBug(bugs.Tag(tag)) } if status != "" { bug.SetStatus(status) } if priority != "" { bug.SetPriority(priority) } if milestone != "" { bug.SetMilestone(milestone) } if identifier != "" { bug.SetIdentifier(identifier) } fmt.Printf("Created issue: %s\n", bug.Title("")) }