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