crude implementation of show

Michael Muré created

Change summary

Readme.md           |  3 +
bug/comment.go      |  6 +++
bug/snapshot.go     |  3 +
commands/command.go |  1 
commands/show.go    | 74 +++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 87 insertions(+)

Detailed changes

Readme.md 🔗

@@ -73,6 +73,9 @@ git bug pull [<remote>]
 # Push bugs update to a git remote
 git bug push [<remote>]
 
+# Display the details of a bug
+git bug show <id>
+
 # Launch the web UI
 git bug webui 
 ```

bug/comment.go 🔗

@@ -1,5 +1,7 @@
 package bug
 
+import "time"
+
 type Comment struct {
 	Author  Person
 	Message string
@@ -8,3 +10,7 @@ type Comment struct {
 	// Should be used only for human display, never for ordering as we can't rely on it in a distributed system.
 	Time int64
 }
+
+func (c Comment) FormatTime() string {
+	return time.Unix(c.Time, 0).Format(time.RFC822)
+}

bug/snapshot.go 🔗

@@ -33,6 +33,9 @@ func (snap Snapshot) Summary() string {
 }
 
 func (snap Snapshot) LastEdit() time.Time {
+	if len(snap.Comments) == 0 {
+		return time.Unix(0, 0)
+	}
 	lastEditTimestamp := snap.Comments[len(snap.Comments)-1].Time
 	return time.Unix(lastEditTimestamp, 0)
 }

commands/command.go 🔗

@@ -52,6 +52,7 @@ func init() {
 		"open":     openCmd,
 		"pull":     pullCmd,
 		"push":     pushCmd,
+		"show":     showCmd,
 		"webui":    webUICmd,
 	}
 }

commands/show.go 🔗

@@ -0,0 +1,74 @@
+package commands
+
+import (
+	"errors"
+	"fmt"
+	"github.com/MichaelMure/git-bug/bug"
+	"github.com/MichaelMure/git-bug/repository"
+	"github.com/MichaelMure/git-bug/util"
+	"strings"
+)
+
+var line = strings.Repeat("-", 50)
+
+func runShowBug(repo repository.Repo, args []string) error {
+	if len(args) > 1 {
+		return errors.New("Only showing one bug at a time is supported")
+	}
+
+	if len(args) == 0 {
+		return errors.New("You must provide a bug id")
+	}
+
+	prefix := args[0]
+
+	b, err := bug.FindBug(repo, prefix)
+	if err != nil {
+		return err
+	}
+
+	snapshot := b.Compile()
+
+	if len(snapshot.Comments) == 0 {
+		return errors.New("Invalid bug: no comment")
+	}
+
+	firstComment := snapshot.Comments[0]
+
+	// Header
+	fmt.Printf("[%s] %s %s\n\n",
+		util.Yellow(snapshot.Status),
+		util.Cyan(snapshot.HumanId()),
+		snapshot.Title,
+	)
+
+	fmt.Printf("%s opened this issue %s\n\n",
+		util.Magenta(firstComment.Author.Name),
+		firstComment.FormatTime(),
+	)
+
+	// Comments
+	indent := "  "
+
+	for i, comment := range snapshot.Comments {
+		fmt.Printf("%s#%d %s <%s>\n\n",
+			indent,
+			i,
+			comment.Author.Name,
+			comment.Author.Email,
+		)
+
+		fmt.Printf("%s%s\n\n\n",
+			indent,
+			comment.Message,
+		)
+	}
+
+	return nil
+}
+
+var showCmd = &Command{
+	Description: "Display the details of a bug",
+	Usage:       "<id>",
+	RunMethod:   runShowBug,
+}