From 902bb1cc2a0a8644e160f303be1a2e0ad354bfd5 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Wed, 15 Nov 2017 15:38:05 -0500 Subject: initial commit --- filter.go | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 filter.go (limited to 'filter.go') diff --git a/filter.go b/filter.go new file mode 100644 index 0000000..0c09963 --- /dev/null +++ b/filter.go @@ -0,0 +1,103 @@ +package main + +import ( + "os" + "os/exec" + "bytes" +) + +var prog [string]string + +func init() { + var err error + for _, p := range []string{"git", "makepkg"} { + prog[p], err = exec.LookPath("git") + if err != nil { + panic(err) + } + } +} + +func pipeline(cmds ...*exec.Cmd) err error { + for i, cmd := range cmds[:len(cmds)-1] { + cmds[i+1].Stdin, err = cmd.StdoutPipe() + if err != nil { + return + } + } + + stderr := make([]bytes.Buffer, len(cmds)) + for i, cmd := range cmds { + cmd.Stderr = &stderr[i] + if err = cmd.Start(); err != nil { + break + } + } + + for i, cmd := range cmds { + if cmd.Process == nil { + continue + } + if _err := cmd.Wait(); _err != nil { + if ee, ok := _err.(*exec.ExitError); ok { + ee.Stderr = stderr[i].Bytes() + } + if err != nil { + err = _err + } + } + } + return +} + +func pkgbuild2srcinfo(pkgbuildId string) (string, error) { + cachefilename := "filter/pkgbuild2srcinfo/"+pkgbuildId + for { + b, err := ioutil.ReadFile(cachefilename) + if err == nil && len(bytes.TrimSpace(b)) == 40 { + return bytes.TrimSpace(b).String(), nil + } + + file, err := os.OpenFile("filter/tmp/PKGBUILD", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + return "", err + } + err = pipeline( + &exec.Cmd{ + Path: prog["git"], Args: ["git", "cat-file", "blob", pkgbuildId], + Stdout: file, + }) + file.Close() + if err != nil { + return "", err + } + + + file, err = os.OpenFile(cachefilename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + err = pipeline( + &exec.Cmd{ + Path: prog["makepkg"], Args: ["makepkg", "--printsrcinfo"], + Dir: "filter/tmp" + }, + &exec.Cmd{ + Path: prog["git"], Args: ["git", "hash-object", "-t", "blob", "-w", "--stdin", "--no-filters"], + Stdout: &buf, + }) + file.Close() + if err != nil { + return "", err + } + } +} + + + +func filter(fromPfix string, toPfix string) { + exec.Cmd{ + Path: prog["git"], Args: ["git", "fast-export", + "--use-done-feature", + "--no-data", + "--", fromPfix + "/master"], + } + +} -- cgit v1.2.3