package git import ( "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 } type ReadmeType struct { Name string Content string } // 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 for _, n := range readmePaths { file, _ := tree.File(n) if file != nil { name = n readme, _ = file.Contents() } } return ReadmeType{ Name: name, Content: readme, } } // 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() isDir := !f.Mode.IsFile() if err == io.EOF { break // if there's nothing else, stop. } 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 }