Personal Git forge.

Code git clone ssh://git.poy.ooo:6969/~poyo/farga ZIP
lib/git/contents.go / 2KiB #d73298cc
Raw
package gitimport (	"farga/lib"	"io"	"path/filepath"	"strings"	"github.com/go-git/go-git/v6/plumbing"	"github.com/go-git/go-git/v6/plumbing/object")type File struct {	Name string // full file name `example.txt`	Path string // full path including file  `/lol/example.txt`	IsDir bool	Hash      plumbing.Hash	ShortHash string	Content   []byte	Mime      string // mime type	Size     uint // size in bytes (git blob)	TooLarge bool // true if it's larger than lib.MaxBlobPreviewBytes}type ReadmeType struct {	Name    string	Content string	Size     uint64	TooLarge bool}// gets a readme inside a given tree. Returns empty if not found.func Readme(tree *object.Tree) ReadmeType {	var readmePaths = []string{"README", "README.md", "README.txt", "readme", "readme.md", "readme.txt"}	var readme string	var name string	var tooLarge = false	var size uint64	for _, n := range readmePaths {		file, _ := tree.File(n)		if file != nil {			name = n			size = uint64(file.Blob.Size)			if size > lib.MaxBlobPreviewBytes {				tooLarge = true				// it's too large and we're not loading it into memory			} else {				// it's small enough to be loaded into memory				readme, _ = file.Contents()			}			break // first candidate in the priority list wins		}	}	return ReadmeType{		Name:     name,		Content:  readme,		Size:     size,		TooLarge: tooLarge,	}}// lists the files in a single directory given a path.func DirFiles(tree *object.Tree, path string) ([]File, error) {	var err error	path = strings.TrimSuffix(path, "/")	// if no path, just use root	// else, try to use that	if path != "" {		tree, err = tree.Tree(path)		if err != nil {			return nil, err		}	}	var files []File	walker := object.NewTreeWalker(tree, false, nil) // non-recursive	for {		name, f, err := walker.Next()		if err == io.EOF {			break // if there's nothing else, stop.		}		isDir := !f.Mode.IsFile()		shortHash, err := ShortenHash(f.Hash.String())		if err != nil {			break		}		file := File{			Name:      name,			Path:      filepath.Join(path, f.Name),			Hash:      f.Hash,			ShortHash: shortHash,			IsDir:     isDir,		}		if isDir {			files = lib.Prepend(files, file)		} else {			files = append(files, file)		}	}	return files, nil}