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
 6	"github.com/charmbracelet/soft-serve/git"
 7	"github.com/charmbracelet/soft-serve/pkg/backend"
 8	"github.com/spf13/cobra"
 9)
10
11// blobCommand returns a command that prints the contents of a file.
12func blobCommand() *cobra.Command {
13	var color bool
14	var raw bool
15
16	cmd := &cobra.Command{
17		Use:               "blob REPOSITORY [REFERENCE] [PATH]",
18		Aliases:           []string{"cat", "show"},
19		Short:             "Print out the contents of file at path",
20		Args:              cobra.RangeArgs(1, 3),
21		PersistentPreRunE: checkIfReadable,
22		RunE: func(cmd *cobra.Command, args []string) error {
23			ctx := cmd.Context()
24			be := backend.FromContext(ctx)
25			rn := args[0]
26			ref := ""
27			fp := ""
28			switch len(args) {
29			case 2:
30				fp = args[1]
31			case 3:
32				ref = args[1]
33				fp = args[2]
34			}
35
36			repo, err := be.Repository(ctx, rn)
37			if err != nil {
38				return err
39			}
40
41			r, err := repo.Open()
42			if err != nil {
43				return err
44			}
45
46			if ref == "" {
47				head, err := r.HEAD()
48				if err != nil {
49					return err
50				}
51				ref = head.ID
52			}
53
54			tree, err := r.LsTree(ref)
55			if err != nil {
56				return err
57			}
58
59			te, err := tree.TreeEntry(fp)
60			if err != nil {
61				return err
62			}
63
64			if te.Type() != "blob" {
65				return git.ErrFileNotFound
66			}
67
68			bts, err := te.Contents()
69			if err != nil {
70				return err
71			}
72
73			c := string(bts)
74			isBin, _ := te.File().IsBinary()
75			if isBin {
76				if raw {
77					cmd.Println(c)
78				} else {
79					return fmt.Errorf("binary file: use --raw to print")
80				}
81			} else {
82				cmd.Println(c)
83			}
84			return nil
85		},
86	}
87
88	cmd.Flags().BoolVarP(&raw, "raw", "r", false, "Print raw contents")
89
90	cmd.Flags().BoolVarP(&color, "color", "c", false, "Colorize output")
91
92	return cmd
93}