From 976122914b1eee6f050e2ae25096377efbf0a3da Mon Sep 17 00:00:00 2001 From: Laria Carolin Chabowski Date: Thu, 27 Jun 2019 22:43:01 +0200 Subject: Replace brittle git2go dependency --- git/git.go | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ projects/readme.go | 36 +++++-------------------- 2 files changed, 84 insertions(+), 29 deletions(-) create mode 100644 git/git.go diff --git a/git/git.go b/git/git.go new file mode 100644 index 0000000..c22de51 --- /dev/null +++ b/git/git.go @@ -0,0 +1,77 @@ +package git + +import ( + "bufio" + "bytes" + "errors" + "os/exec" + "regexp" +) + +type TreeEntry struct { + Mode, Type, Object, Name string +} + +var reTreeEntry = regexp.MustCompile("^(\\d+) (\\w+) ([0-9a-f]+)\t(.*)$") + +var ( + ErrUnexpectedLsTreeOutput = errors.New("Unexpected git ls-tree output") +) + +func splitZero(data []byte, atEOF bool) (advance int, token []byte, err error) { + if atEOF && len(data) == 0 { + return 0, nil, nil + } + if i := bytes.IndexByte(data, '\x00'); i >= 0 { + return i + 1, data[0:i], nil + } + if atEOF { + return len(data), data, nil + } + + return 0, nil, nil +} + +func ReadTree(repoPath string, ref string) ([]TreeEntry, error) { + cmd := exec.Command("git", "-C", repoPath, "ls-tree", "--full-tree", "-z", ref) + var out bytes.Buffer + cmd.Stdout = &out + + if err := cmd.Run(); err != nil { + return nil, err + } + + scanner := bufio.NewScanner(&out) + scanner.Split(splitZero) + + entries := []TreeEntry{} + for scanner.Scan() { + line := scanner.Bytes() + m := reTreeEntry.FindSubmatch(line) + if m == nil { + return nil, ErrUnexpectedLsTreeOutput + } + + entries = append(entries, TreeEntry{ + Mode: string(m[1]), + Type: string(m[2]), + Object: string(m[3]), + Name: string(m[4]), + }) + } + + return entries, nil +} + +func ReadBlob(repoPath string, ref string) ([]byte, error) { + var buf bytes.Buffer + + cmd := exec.Command("git", "-C", repoPath, "cat-file", "blob", ref) + cmd.Stdout = &buf + + if err := cmd.Run(); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} diff --git a/projects/readme.go b/projects/readme.go index c57b831..85fa71f 100644 --- a/projects/readme.go +++ b/projects/readme.go @@ -2,7 +2,7 @@ package projects import ( "bytes" - "github.com/libgit2/git2go" + "code.laria.me/code.laria.me/git" "html" "html/template" "io" @@ -46,39 +46,17 @@ func formatMarkdown(raw []byte) template.HTML { } func gitReadme(gitpath string) (raw []byte, name string, err error) { - repo, err := git.OpenRepository(gitpath) + ents, err := git.ReadTree(gitpath, "master") if err != nil { return raw, name, err } - master_tree_obj, err := repo.RevparseSingle("master:") // Root tree of commit at top of master - if err != nil { - return raw, name, err - } - - master_tree, err := master_tree_obj.AsTree() - if err != nil { - return raw, name, err - } - - var inner_err error = nil - err = master_tree.Walk(func(_ string, entry *git.TreeEntry) int { - if !(strings.HasPrefix(strings.ToLower(entry.Name), "readme") && entry.Type == git.ObjectBlob) { - return 1 - } - - name = entry.Name - blob, err := repo.LookupBlob(entry.Id) - if err == nil { - raw = blob.Contents() - } else { - inner_err = err + for _, ent := range ents { + if ent.Type == "blob" && strings.HasPrefix(strings.ToLower(ent.Name), "readme") { + name = ent.Name + raw, err = git.ReadBlob(gitpath, ent.Object) + return } - return 1 - }) - - if err == nil && inner_err != nil { - err = inner_err } return -- cgit v1.2.3-54-g00ecf