<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I think there's a difference between using Go in the Go bindings (that are only going to be used by developers that already have Go installed) and using it for a utility that is of general interest.</div><div class=""><br class=""></div><div class="">-- adrian</div><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 19, 2017, at 10:00 AM, Peter Collingbourne via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">We already use Go in the LLVM project in a few places (llgo, llvm-go and the Go bindings). We even have a section about it in the coding standards:<div class=""><br class=""></div><div class=""><a href="http://llvm.org/docs/CodingStandards.html#other-languages" class="">http://llvm.org/docs/CodingStandards.html#other-languages</a><br class=""></div><div class=""><br class=""></div><div class="">So I don't see a problem with using Go for this tool, especially given that it is relatively isolated.</div><div class=""><br class=""></div><div class="">Peter</div></div><div class="gmail_extra" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br class=""><div class="gmail_quote">On Mon, Jun 19, 2017 at 9:48 AM, David Blaikie<span class="Apple-converted-space"> </span><span dir="ltr" class=""><<a href="mailto:dblaikie@gmail.com" target="_blank" class="">dblaikie@gmail.com</a>></span><span class="Apple-converted-space"> </span>wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><div dir="ltr" class="">I think it's probably best to use a language already used in the LLVM project (Python? Bash?) than branching out into another language (Go) in terms of maintainability by other LLVM developers?</div><div class="HOEnZb"><div class="h5"><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Fri, Jun 16, 2017 at 3:15 PM Peter Collingbourne via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;">Author: pcc<br class="">Date: Fri Jun 16 17:15:18 2017<br class="">New Revision: 305598<br class=""><br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=305598&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project?rev=305598&view=rev</a><br class="">Log:<br class="">utils: Add a git-r utility for mapping svn revisions to git revisions in the monorepo.<br class=""><br class="">Added:<br class="">   <span class="Apple-converted-space"> </span>llvm/trunk/utils/git-svn/git-<wbr class="">r/<br class="">   <span class="Apple-converted-space"> </span>llvm/trunk/utils/git-svn/git-<wbr class="">r/git-r.go<br class=""><br class="">Added: llvm/trunk/utils/git-svn/git-<wbr class="">r/git-r.go<br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/git-svn/git-r/git-r.go?rev=305598&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/utils/git-<wbr class="">svn/git-r/git-r.go?rev=305598&<wbr class="">view=auto</a><br class="">==============================<wbr class="">==============================<wbr class="">==================<br class="">--- llvm/trunk/utils/git-svn/git-<wbr class="">r/git-r.go (added)<br class="">+++ llvm/trunk/utils/git-svn/git-<wbr class="">r/git-r.go Fri Jun 16 17:15:18 2017<br class="">@@ -0,0 +1,169 @@<br class="">+//===- git-r.go - svn revisions to git revisions --------------------------===/<wbr class="">/<br class="">+//<br class="">+//                     The LLVM Compiler Infrastructure<br class="">+//<br class="">+// This file is distributed under the University of Illinois Open Source<br class="">+// License. See LICENSE.TXT for details.<br class="">+//<br class="">+//===------------------------<wbr class="">------------------------------<wbr class="">----------------===//<br class="">+//<br class="">+// This is a small program for mapping svn revisions to git revisions in the<br class="">+// monorepo.<br class="">+//<br class="">+// To set up:<br class="">+// 1)<span class="Apple-converted-space"> </span><a href="http://llvm.org/docs/GettingStarted.html#for-developers-to-work-with-a-git-monorepo" rel="noreferrer" target="_blank" class="">http://llvm.org/docs/<wbr class="">GettingStarted.html#for-<wbr class="">developers-to-work-with-a-git-<wbr class="">monorepo</a><br class="">+//    and make sure to follow the instructions for fetching commit notes.<br class="">+// 2) go build<br class="">+// 3) cp git-r ~/bin<br class="">+//<br class="">+// To use:<br class="">+// $ git r 1<br class="">+// 09c4b68e68c4fcff64b00e1ac077c4<wbr class="">f4a524cbcc<br class="">+//<br class="">+//===------------------------<wbr class="">------------------------------<wbr class="">----------------===//<br class="">+<br class="">+package main<br class="">+<br class="">+import (<br class="">+       "bufio"<br class="">+       "bytes"<br class="">+       "encoding/gob"<br class="">+       "fmt"<br class="">+       "log"<br class="">+       "os"<br class="">+       "os/exec"<br class="">+       "strconv"<br class="">+       "strings"<br class="">+)<br class="">+<br class="">+func git(args ...string) (*bytes.Buffer, error) {<br class="">+       cmd := exec.Command("git", args...)<br class="">+<br class="">+       var b bytes.Buffer<br class="">+       cmd.Stdout = &b<br class="">+       err := cmd.Run()<br class="">+<br class="">+       return &b, err<br class="">+}<br class="">+<br class="">+func mkrevmap() []string {<br class="">+       revs, err := git("grep", "git-svn-rev", "refs/notes/commits")<br class="">+       if err != nil {<br class="">+               panic(err)<br class="">+       }<br class="">+<br class="">+       var revmap []string<br class="">+<br class="">+       scanner := bufio.NewScanner(revs)<br class="">+       for scanner.Scan() {<br class="">+               // refs/notes/commits:00/0b/<wbr class="">d4acb454290301c140a1d9c4f7a45a<wbr class="">a2fa9c:git-svn-rev: 37235<br class="">+<br class="">+               bits := strings.Split(scanner.Text(), ":")<br class="">+               gitrev := strings.Replace(bits[1], "/", "", -1)<br class="">+               svnrev := bits[3][1:]<br class="">+<br class="">+               svnrevn, err := strconv.Atoi(svnrev)<br class="">+               if err != nil {<br class="">+                       panic(err)<br class="">+               }<br class="">+<br class="">+               if svnrevn >= len(revmap) {<br class="">+                       newrevmap := make([]string, svnrevn+1)<br class="">+                       copy(newrevmap, revmap)<br class="">+                       revmap = newrevmap<br class="">+               }<br class="">+               revmap[svnrevn] = gitrev<br class="">+       }<br class="">+<br class="">+       return revmap<br class="">+}<br class="">+<br class="">+type revmap struct {<br class="">+       Noterev string<br class="">+       Revs    []string<br class="">+}<br class="">+<br class="">+func writerevmap(path string, rmap *revmap, svnrev int) {<br class="">+       noterevbuf, err := git("rev-parse", "refs/notes/commits")<br class="">+       if err != nil {<br class="">+               fmt.Fprintf(os.Stderr, "%s: could not find refs/notes/commits, see instructions:\n", os.Args[0])<br class="">+               fmt.Fprintln(os.Stderr, "<a href="http://llvm.org/docs/GettingStarted.html#for-developers-to-work-with-a-git-monorepo" rel="noreferrer" target="_blank" class="">http://llvm.org/docs/<wbr class="">GettingStarted.html#for-<wbr class="">developers-to-work-with-a-git-<wbr class="">monorepo</a>")<br class="">+               os.Exit(1)<br class="">+       }<br class="">+       noterev := noterevbuf.String()<br class="">+       noterev = noterev[:len(noterev)-1]<br class="">+<br class="">+       if rmap == nil || rmap.Noterev != noterev {<br class="">+               var newrmap revmap<br class="">+               newrmap.Revs = mkrevmap()<br class="">+               newrmap.Noterev = noterev<br class="">+<br class="">+               f, err := os.Create(path)<br class="">+               if err != nil {<br class="">+                       panic(err)<br class="">+               }<br class="">+<br class="">+               enc := gob.NewEncoder(f)<br class="">+               err = enc.Encode(newrmap)<br class="">+               if err != nil {<br class="">+                       os.Remove(path)<br class="">+                       panic(err)<br class="">+               }<br class="">+<br class="">+               rmap = &newrmap<br class="">+       }<br class="">+<br class="">+       if svnrev >= len(rmap.Revs) || rmap.Revs[svnrev] == "" {<br class="">+               fmt.Fprintf(os.Stderr, "%s: %d: unknown revision\n", os.Args[0], svnrev)<br class="">+               os.Exit(1)<br class="">+       }<br class="">+<br class="">+       fmt.Println(rmap.Revs[svnrev]<wbr class="">)<br class="">+}<br class="">+<br class="">+func main() {<br class="">+       if len(os.Args) != 2 {<br class="">+               fmt.Fprintf(os.Stderr, "%s: expected a single argument\n", os.Args[0])<br class="">+               os.Exit(1)<br class="">+       }<br class="">+       svnrev, err := strconv.Atoi(os.Args[1])<br class="">+       if err != nil {<br class="">+               fmt.Fprintf(os.Stderr, "%s: %s: expected an integer argument\n", os.Args[0], os.Args[1])<br class="">+               os.Exit(1)<br class="">+       }<br class="">+<br class="">+       gitdirbuf, err := git("rev-parse", "--git-common-dir")<br class="">+       if err != nil {<br class="">+               fmt.Fprintf(os.Stderr, "%s: not in a git repository\n", os.Args[0])<br class="">+               os.Exit(1)<br class="">+       }<br class="">+<br class="">+       gitdir := gitdirbuf.String()<br class="">+       gitdir = gitdir[:len(gitdir)-1]<br class="">+       err = os.Chdir(gitdir)<br class="">+       if err != nil {<br class="">+               panic(err)<br class="">+       }<br class="">+<br class="">+       mappath := "git-svn-revmap-cache"<br class="">+       f, err := os.Open(mappath)<br class="">+       if err != nil {<br class="">+               writerevmap(mappath, nil, svnrev)<br class="">+               return<br class="">+       }<br class="">+<br class="">+       dec := gob.NewDecoder(f)<br class="">+       var rmap revmap<br class="">+       err = dec.Decode(&rmap)<br class="">+       if err != nil {<br class="">+               writerevmap(mappath, nil, svnrev)<br class="">+               return<br class="">+       }<br class="">+<br class="">+       if svnrev < len(rmap.Revs) && rmap.Revs[svnrev] != "" {<br class="">+               fmt.Println(rmap.Revs[svnrev]<wbr class="">)<br class="">+               return<br class="">+       }<br class="">+<br class="">+       writerevmap(mappath, &rmap, svnrev)<br class="">+}<br class=""><br class=""><br class="">______________________________<wbr class="">_________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a><br class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/llvm-commits</a><br class=""></blockquote></div></div></div></blockquote></div><br class=""><br clear="all" class=""><div class=""><br class=""></div>--<span class="Apple-converted-space"> </span><br class=""><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr" class="">-- <div class="">Peter</div></div></div></div><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">llvm-commits mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="mailto:llvm-commits@lists.llvm.org" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">llvm-commits@lists.llvm.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a></div></blockquote></div><br class=""></body></html>