soft-serve

Fork https://github.com/charmbracelet/soft-serve

git clone git://git.lin.moe/go/soft-serve.git

 1package cmd
 2
 3import (
 4	"fmt"
 5	"strings"
 6	"time"
 7
 8	"github.com/charmbracelet/soft-serve/pkg/backend"
 9	"github.com/spf13/cobra"
10)
11
12// commitCommand returns a command that prints the contents of a commit.
13func commitCommand() *cobra.Command {
14	var color bool
15	var patchOnly bool
16
17	cmd := &cobra.Command{
18		Use:               "commit repo SHA",
19		Short:             "Print out the contents of a diff",
20		Args:              cobra.ExactArgs(2),
21		PersistentPreRunE: checkIfReadable,
22		RunE: func(cmd *cobra.Command, args []string) error {
23			ctx := cmd.Context()
24			be := backend.FromContext(ctx)
25			repoName := args[0]
26			commitSHA := args[1]
27
28			rr, err := be.Repository(ctx, repoName)
29			if err != nil {
30				return err
31			}
32
33			r, err := rr.Open()
34			if err != nil {
35				return err
36			}
37
38			commit, err := r.CommitByRevision(commitSHA)
39			if err != nil {
40				return err
41			}
42
43			patch, err := r.Patch(commit)
44			if err != nil {
45				return err
46			}
47
48			diff, err := r.Diff(commit)
49			if err != nil {
50				return err
51			}
52
53			s := strings.Builder{}
54			commitLine := "commit " + commitSHA
55			authorLine := "Author: " + commit.Author.Name
56			dateLine := "Date:   " + commit.Committer.When.UTC().Format(time.UnixDate)
57			msgLine := strings.ReplaceAll(commit.Message, "\r\n", "\n")
58			statsLine := diff.Stats().String()
59			diffLine := patch
60
61			if patchOnly {
62				cmd.Println(
63					diffLine,
64				)
65				return nil
66			}
67
68			s.WriteString(fmt.Sprintf("%s\n%s\n%s\n%s\n",
69				commitLine,
70				authorLine,
71				dateLine,
72				msgLine,
73			))
74
75			s.WriteString(fmt.Sprintf("\n%s\n%s",
76				statsLine,
77				diffLine,
78			))
79
80			cmd.Println(
81				s.String(),
82			)
83
84			return nil
85		},
86	}
87
88	cmd.Flags().BoolVarP(&color, "color", "c", false, "Colorize output")
89	cmd.Flags().BoolVarP(&patchOnly, "patch", "p", false, "Output patch only")
90
91	return cmd
92}