[llvm] r305598 - utils: Add a git-r utility for mapping svn revisions to git revisions in the monorepo.
Mehdi AMINI via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 19 12:57:16 PDT 2017
I agree, this shouldn't be in go.
--
Mehdi
2017-06-19 10:59 GMT-07:00 Peter Collingbourne via llvm-commits <
llvm-commits at lists.llvm.org>:
> I don't particularly care which language it is written in. I chose Go
> because I felt most productive in it, and because it seemed entirely
> suitable under the coding guidelines (or so I thought).
>
> If someone wants to rewrite it in python, that's fine with me. But it
> seems more useful to have the tool written in Go than not at all.
>
> Peter
>
> On Mon, Jun 19, 2017 at 10:02 AM, David Blaikie <dblaikie at gmail.com>
> wrote:
>
>>
>>
>> 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/d4acb
>>>>> 454290301c140a1d9c4f7a45aa2fa9c: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/GettingS
>>>>> tarted.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
>>>
>>
>
>
> --
> --
> Peter
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170619/c8ce7d50/attachment.html>
More information about the llvm-commits
mailing list