1package cmd23import (4 "fmt"56 "github.com/charmbracelet/soft-serve/git"7 "github.com/charmbracelet/soft-serve/pkg/backend"8 "github.com/spf13/cobra"9)1011// blobCommand returns a command that prints the contents of a file.12func blobCommand() *cobra.Command {13 var color bool14 var raw bool1516 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 }3536 repo, err := be.Repository(ctx, rn)37 if err != nil {38 return err39 }4041 r, err := repo.Open()42 if err != nil {43 return err44 }4546 if ref == "" {47 head, err := r.HEAD()48 if err != nil {49 return err50 }51 ref = head.ID52 }5354 tree, err := r.LsTree(ref)55 if err != nil {56 return err57 }5859 te, err := tree.TreeEntry(fp)60 if err != nil {61 return err62 }6364 if te.Type() != "blob" {65 return git.ErrFileNotFound66 }6768 bts, err := te.Contents()69 if err != nil {70 return err71 }7273 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 nil85 },86 }8788 cmd.Flags().BoolVarP(&raw, "raw", "r", false, "Print raw contents")8990 cmd.Flags().BoolVarP(&color, "color", "c", false, "Colorize output")9192 return cmd93}