[llvm] r305598 - utils: Add a git-r utility for mapping svn revisions to git revisions in the monorepo.

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 19 10:02:49 PDT 2017


On Mon, Jun 19, 2017 at 10:00 AM Peter Collingbourne <peter at pcc.me.uk>
wrote:

> We already use Go in the LLVM project in a few places (llgo, llvm-go and
> the Go bindings).
>

Those somewhat necessarily have to use go - and anyone interested in them
probably has some context in Go.


> We even have a section about it in the coding standards:
>
> http://llvm.org/docs/CodingStandards.html#other-languages
>
> So I don't see a problem with using Go for this tool, especially given
> that it is relatively isolated.
>

Seems like it has broader applicability/usage, though, than the existing go
usage.

- Dave


>
> Peter
>
> On Mon, Jun 19, 2017 at 9:48 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
>> 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?
>>
>> On Fri, Jun 16, 2017 at 3:15 PM Peter Collingbourne via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: pcc
>>> Date: Fri Jun 16 17:15:18 2017
>>> New Revision: 305598
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=305598&view=rev
>>> Log:
>>> utils: Add a git-r utility for mapping svn revisions to git revisions in
>>> the monorepo.
>>>
>>> Added:
>>>     llvm/trunk/utils/git-svn/git-r/
>>>     llvm/trunk/utils/git-svn/git-r/git-r.go
>>>
>>> Added: llvm/trunk/utils/git-svn/git-r/git-r.go
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/git-svn/git-r/git-r.go?rev=305598&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/utils/git-svn/git-r/git-r.go (added)
>>> +++ llvm/trunk/utils/git-svn/git-r/git-r.go Fri Jun 16 17:15:18 2017
>>> @@ -0,0 +1,169 @@
>>> +//===- git-r.go - svn revisions to git revisions
>>> --------------------------===//
>>> +//
>>> +//                     The LLVM Compiler Infrastructure
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>>
>>> +//===----------------------------------------------------------------------===//
>>> +//
>>> +// This is a small program for mapping svn revisions to git revisions
>>> in the
>>> +// monorepo.
>>> +//
>>> +// To set up:
>>> +// 1)
>>> http://llvm.org/docs/GettingStarted.html#for-developers-to-work-with-a-git-monorepo
>>> +//    and make sure to follow the instructions for fetching commit
>>> notes.
>>> +// 2) go build
>>> +// 3) cp git-r ~/bin
>>> +//
>>> +// To use:
>>> +// $ git r 1
>>> +// 09c4b68e68c4fcff64b00e1ac077c4f4a524cbcc
>>> +//
>>>
>>> +//===----------------------------------------------------------------------===//
>>> +
>>> +package main
>>> +
>>> +import (
>>> +       "bufio"
>>> +       "bytes"
>>> +       "encoding/gob"
>>> +       "fmt"
>>> +       "log"
>>> +       "os"
>>> +       "os/exec"
>>> +       "strconv"
>>> +       "strings"
>>> +)
>>> +
>>> +func git(args ...string) (*bytes.Buffer, error) {
>>> +       cmd := exec.Command("git", args...)
>>> +
>>> +       var b bytes.Buffer
>>> +       cmd.Stdout = &b
>>> +       err := cmd.Run()
>>> +
>>> +       return &b, err
>>> +}
>>> +
>>> +func mkrevmap() []string {
>>> +       revs, err := git("grep", "git-svn-rev", "refs/notes/commits")
>>> +       if err != nil {
>>> +               panic(err)
>>> +       }
>>> +
>>> +       var revmap []string
>>> +
>>> +       scanner := bufio.NewScanner(revs)
>>> +       for scanner.Scan() {
>>> +               //
>>> refs/notes/commits:00/0b/d4acb454290301c140a1d9c4f7a45aa2fa9c:git-svn-rev:
>>> 37235
>>> +
>>> +               bits := strings.Split(scanner.Text(), ":")
>>> +               gitrev := strings.Replace(bits[1], "/", "", -1)
>>> +               svnrev := bits[3][1:]
>>> +
>>> +               svnrevn, err := strconv.Atoi(svnrev)
>>> +               if err != nil {
>>> +                       panic(err)
>>> +               }
>>> +
>>> +               if svnrevn >= len(revmap) {
>>> +                       newrevmap := make([]string, svnrevn+1)
>>> +                       copy(newrevmap, revmap)
>>> +                       revmap = newrevmap
>>> +               }
>>> +               revmap[svnrevn] = gitrev
>>> +       }
>>> +
>>> +       return revmap
>>> +}
>>> +
>>> +type revmap struct {
>>> +       Noterev string
>>> +       Revs    []string
>>> +}
>>> +
>>> +func writerevmap(path string, rmap *revmap, svnrev int) {
>>> +       noterevbuf, err := git("rev-parse", "refs/notes/commits")
>>> +       if err != nil {
>>> +               fmt.Fprintf(os.Stderr, "%s: could not find
>>> refs/notes/commits, see instructions:\n", os.Args[0])
>>> +               fmt.Fprintln(os.Stderr, "
>>> http://llvm.org/docs/GettingStarted.html#for-developers-to-work-with-a-git-monorepo
>>> ")
>>> +               os.Exit(1)
>>> +       }
>>> +       noterev := noterevbuf.String()
>>> +       noterev = noterev[:len(noterev)-1]
>>> +
>>> +       if rmap == nil || rmap.Noterev != noterev {
>>> +               var newrmap revmap
>>> +               newrmap.Revs = mkrevmap()
>>> +               newrmap.Noterev = noterev
>>> +
>>> +               f, err := os.Create(path)
>>> +               if err != nil {
>>> +                       panic(err)
>>> +               }
>>> +
>>> +               enc := gob.NewEncoder(f)
>>> +               err = enc.Encode(newrmap)
>>> +               if err != nil {
>>> +                       os.Remove(path)
>>> +                       panic(err)
>>> +               }
>>> +
>>> +               rmap = &newrmap
>>> +       }
>>> +
>>> +       if svnrev >= len(rmap.Revs) || rmap.Revs[svnrev] == "" {
>>> +               fmt.Fprintf(os.Stderr, "%s: %d: unknown revision\n",
>>> os.Args[0], svnrev)
>>> +               os.Exit(1)
>>> +       }
>>> +
>>> +       fmt.Println(rmap.Revs[svnrev])
>>> +}
>>> +
>>> +func main() {
>>> +       if len(os.Args) != 2 {
>>> +               fmt.Fprintf(os.Stderr, "%s: expected a single
>>> argument\n", os.Args[0])
>>> +               os.Exit(1)
>>> +       }
>>> +       svnrev, err := strconv.Atoi(os.Args[1])
>>> +       if err != nil {
>>> +               fmt.Fprintf(os.Stderr, "%s: %s: expected an integer
>>> argument\n", os.Args[0], os.Args[1])
>>> +               os.Exit(1)
>>> +       }
>>> +
>>> +       gitdirbuf, err := git("rev-parse", "--git-common-dir")
>>> +       if err != nil {
>>> +               fmt.Fprintf(os.Stderr, "%s: not in a git repository\n",
>>> os.Args[0])
>>> +               os.Exit(1)
>>> +       }
>>> +
>>> +       gitdir := gitdirbuf.String()
>>> +       gitdir = gitdir[:len(gitdir)-1]
>>> +       err = os.Chdir(gitdir)
>>> +       if err != nil {
>>> +               panic(err)
>>> +       }
>>> +
>>> +       mappath := "git-svn-revmap-cache"
>>> +       f, err := os.Open(mappath)
>>> +       if err != nil {
>>> +               writerevmap(mappath, nil, svnrev)
>>> +               return
>>> +       }
>>> +
>>> +       dec := gob.NewDecoder(f)
>>> +       var rmap revmap
>>> +       err = dec.Decode(&rmap)
>>> +       if err != nil {
>>> +               writerevmap(mappath, nil, svnrev)
>>> +               return
>>> +       }
>>> +
>>> +       if svnrev < len(rmap.Revs) && rmap.Revs[svnrev] != "" {
>>> +               fmt.Println(rmap.Revs[svnrev])
>>> +               return
>>> +       }
>>> +
>>> +       writerevmap(mappath, &rmap, svnrev)
>>> +}
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
>
>
> --
> --
> Peter
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170619/dc78f4e6/attachment.html>


More information about the llvm-commits mailing list