Personal Git forge.
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}