Giter Club home page Giter Club logo

git2go's Introduction

git2go

GoDoc Build Status

Go bindings for libgit2.

Which Go version to use

Due to the fact that Go 1.11 module versions have semantic meaning and don't necessarily align with libgit2's release schedule, please consult the following table for a mapping between libgit2 and git2go module versions:

libgit2 git2go
main (will be v35)
1.5 v34
1.3 v33
1.2 v32
1.1 v31
1.0 v30
0.99 v29
0.28 v28
0.27 v27

You can import them in your project with the version's major number as a suffix. For example, if you have libgit2 v1.2 installed, you'd import git2go v34 with:

go get github.com/libgit2/git2go/v34
import "github.com/libgit2/git2go/v34"

which will ensure there are no sudden changes to the API.

The main branch follows the tip of libgit2 itself (with some lag) and as such has no guarantees on the stability of libgit2's API. Thus this only supports statically linking against libgit2.

Which branch to send Pull requests to

If there's something version-specific that you'd want to contribute to, you can send them to the release-${MAJOR}.${MINOR} branches, which follow libgit2's releases.

Installing

This project wraps the functionality provided by libgit2. It thus needs it in order to perform the work.

This project wraps the functionality provided by libgit2. If you're using a versioned branch, install it to your system via your system's package manager and then install git2go.

Versioned branch, dynamic linking

When linking dynamically against a released version of libgit2, install it via your system's package manager. CGo will take care of finding its pkg-config file and set up the linking. Import via Go modules, e.g. to work against libgit2 v1.2

import "github.com/libgit2/git2go/v34"

Versioned branch, static linking

Follow the instructions for Versioned branch, dynamic linking, but pass the -tags static,system_libgit2 flag to all go commands that build any binaries. For instance:

go build -tags static,system_libgit2 github.com/my/project/...
go test -tags static,system_libgit2 github.com/my/project/...
go install -tags static,system_libgit2 github.com/my/project/...

main branch, or vendored static linking

If using main or building a branch with the vendored libgit2 statically, we need to build libgit2 first. In order to build it, you need cmake, pkg-config and a C compiler. You will also need the development packages for OpenSSL (outside of Windows or macOS) and LibSSH2 installed if you want libgit2 to support HTTPS and SSH respectively. Note that even if libgit2 is included in the resulting binary, its dependencies will not be.

Run go get -d github.com/libgit2/git2go to download the code and go to your $GOPATH/src/github.com/libgit2/git2go directory. From there, we need to build the C code and put it into the resulting go binary.

git submodule update --init # get libgit2
make install-static

will compile libgit2, link it into git2go and install it. The main branch is set up to follow the specific libgit2 version that is vendored, so trying dynamic linking may or may not work depending on the exact versions involved.

In order to let Go pass the correct flags to pkg-config, -tags static needs to be passed to all go commands that build any binaries. For instance:

go build -tags static github.com/my/project/...
go test -tags static github.com/my/project/...
go install -tags static github.com/my/project/...

One thing to take into account is that since Go expects the pkg-config file to be within the same directory where make install-static was called, so the go.mod file may need to have a replace directive so that the correct setup is achieved. So if git2go is checked out at $GOPATH/src/github.com/libgit2/git2go and your project at $GOPATH/src/github.com/my/project, the go.mod file of github.com/my/project might need to have a line like

replace github.com/libgit2/git2go/v34 => ../../libgit2/git2go

Parallelism and network operations

libgit2 may use OpenSSL and LibSSH2 for performing encrypted network connections. For now, git2go asks libgit2 to set locking for OpenSSL. This makes HTTPS connections thread-safe, but it is fragile and will likely stop doing it soon. This may also make SSH connections thread-safe if your copy of libssh2 is linked against OpenSSL. Check libgit2's THREADSAFE.md for more information.

Running the tests

For the stable version, go test will work as usual. For the main branch, similarly to installing, running the tests requires building a local libgit2 library, so the Makefile provides a wrapper that makes sure it's built

make test-static

Alternatively, you can build the library manually first and then run the tests

make install-static
go test -v -tags static ./...

License

M to the I to the T. See the LICENSE file if you've never seen an MIT license before.

Authors

  • Carlos Martín (@carlosmn)
  • Vicent Martí (@vmg)

git2go's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

git2go's Issues

Consider making this package go gettable?

Right now, this package requires custom manual steps for its installation:

Run go get -d github.com/libgit2/git2go to download the code and go to your $GOPATH/src/github.com/libgit2/git2go dir. From there, we need to build the C code and put it into the resulting go binary.

git submodule update --init # get libgit2
make install

will compile libgit2 and run go install such that it's statically linked to the git2go package.

This is inconvenient, it makes it harder to get than other Go packages (which are just go get). Worst of all, this means that any other Go package that imports this one, even if the upstream package is completely go gettable, will no longer be 1 command to install.

I think it may be possible for you to change that, and thus improve the experience of anyone using this packages, and make it easy for others to import it and no incur the cost of manual dependency installation steps.

The way you can do that would be similar to how we did it with glfw3 package (currently on a branch, to be merged into master once GLFW 3.1 is released), which is a Go binding for a C library. It was discovered by @slimsag and you can see the discussion in the following issue and PR:

go-gl/glfw#82
go-gl/glfw#83

The general idea is that you vendor the C library source in a subfolder (potentially as a git submodule) and use cgo directives to link to it. Basically, everything you're doing now, except without needing the Makefile and scripts.

The main consideration is that you will need to replace the function of CMake with multiple .go files with build tags (which may require some work and maintenance), which is what we've done in glfw3:

Less configurable? Unable to modify CMAKE parameters?

Actually -- We can make build tags for any CMAKE configurable feature that we want (e.g. tell people to compile their application with go install -tags "wayland" my/pkg and a wayland client will be built instead of an X11 one, you can see how I did this here: https://github.com/go-gl/glfw3/blob/devel_glfw3.1/build.go)

But the end result is a go gettable package that is much easier for users. Just imagine:

To install git2go, run go get -u github.com/libgit2/git2go. Done.

What do you think? If this is something you're amendable to, I can assist with questions/answers about the approach and potentially try to make a PR.

Functions that call MakeGitError without locking the OS thread

The following functions (and possibly more) do not perform thread locking despite calling MakeGitError:

  • DefaultDiffOptions
  • DiffTreeToTree
  • DiffTreeToWorkDir
  • Diff.Patch

Thanks to @carlosmn for the pointer at #136 (comment).

For context, it's necessary to lock the OS thread because giterr_last returns the last error object generated for the current thread.

If it'd be helpful, I could throw together a quick lint script using go/ast to add to Travis CI that would warn about funcs that call MakeGitError that don't contain:

runtime.LockOSThread()
defer runtime.UnlockOSThread()

37: error: 'git_branch_iterator' undeclared (first use in this function)

I'am using : bussiere@kusanagi:~/git2go$ go version
go version go1.2.1 linux/amd64

bussiere@kusanagi:/git2go$ ls
blob.go git_test.go patch.go settings.go
branch.go index.go patch_test.go settings_test.go
branch_test.go index_test.go push.go submodule.go
checkout.go LICENSE push_test.go tag.go
clone.go Makefile README.md tag_test.go
clone_test.go merge.go refdb.go tree.go
commit.go merge_test.go reference.go vendor
config.go object.go reference_test.go walk.go
credentials.go object_test.go remote.go wrapper.c
diff.go odb.go remote_test.go
diff_test.go odb_test.go repository.go
git.go packbuilder.go script
bussiere@kusanagi:
/git2go$ go build

_/home/bussiere/git2go

37: error: 'git_branch_iterator' undeclared (first use in this function)
37: error: 'git_branch_next' undeclared (first use in this function)
38: error: 'git_buf_free' undeclared (first use in this function)
38: error: 'git_buf' undeclared (first use in this function)
38: error: 'git_branch_iterator_free' undeclared (first use in this function)
38: error: 'git_branch_iterator_new' undeclared (first use in this function)

Install error with latest libgit2 on Mac OSX and Ubuntu on Travis CI

On Mac OSX, I run the following:

> brew install libgit2 --HEAD
# ... installs successfully from branch development
> go get github.com/libgit2/git2go
# # github.com/libgit2/git2go
# Godeps/_workspace/src/github.com/libgit2/git2go/wrapper.c:34:13: error: no member named 'progress' in 'struct git_remote_callbacks'

Also seems to be affecting my Travis CI builds: example

git clone specific tag

When I try to clone a specific tag, I run something like this:

git clone --branch v1.0.0 https://github.com/ministryofjustice/supervisor-formula.git vendor/supervisor

The above command succeeds without any hiccups.
I figured I could write a go func like below.

func CloneRepo(url string, tag string, path string) error {
    opts := git.CloneOptions{
        CheckoutBranch: tag,
    }

    repo, err := git.Clone(url, path, &opts)
    if err != nil {
        return err
    }

    fmt.Println(repo)
    return nil
}

However, I'm getting the following error:

Failed to clone https://github.com/ministryofjustice/supervisor-formula.git Reference 'refs/remotes/origin/v1.0.0' not found

I'm guessing this is a lack of knowledge on my side, but I'm wondering whether I can accomplish something like this using the git package ?

create releases

Hi,

I have noticed that the API has changed and I needed to update the code. I would be grateful if you create a "release" or folder every time you change the API.
Thanks

compilation errors on archlinux

Tried to go get latest git2go on my archlinux

-> % go get github.com/libgit2/git2go

github.com/libgit2/git2go

1: error: 'git_packbuilder_insert_commit' undeclared (first use in this function)
1: note: each undeclared identifier is reported only once for each function it appears in

But got the errors above. I got libgit2 0.18.0-1, go 1.1.1

Greets.

git2go on Windows

I'm trying to use git2go on Windows 7 x64. I was able to build libgit2 (through mingw) and install git2go package to usual pkg location (pkg\windows_amd64\github.com\libgit2\git2go.a). But when I try to import github.com/libgit2/git2go package and build an app I get the following errors:

github.com/libgit2/git2go(.text): git_blame_file: not defined
github.com/libgit2/git2go(.text): git_blame_free: not defined
github.com/libgit2/git2go(.text): git_blame_get_hunk_byindex: not defined
github.com/libgit2/git2go(.text): git_blame_get_hunk_byline: not defined
github.com/libgit2/git2go(.text): git_blame_get_hunk_count: not defined
github.com/libgit2/git2go(.text): git_blame_init_options: not defined
github.com/libgit2/git2go(.text): git_blob_create_frombuffer: not defined
github.com/libgit2/git2go(.text): git_blob_rawcontent: not defined
github.com/libgit2/git2go(.text): git_blob_rawsize: not defined
github.com/libgit2/git2go(.text): git_branch_create: not defined
github.com/libgit2/git2go(.text): git_branch_delete: not defined
github.com/libgit2/git2go(.text): git_branch_is_head: not defined
github.com/libgit2/git2go(.text): git_branch_iterator_free: not defined
github.com/libgit2/git2go(.text): git_branch_iterator_new: not defined
github.com/libgit2/git2go(.text): git_branch_lookup: not defined
github.com/libgit2/git2go(.text): git_branch_move: not defined
github.com/libgit2/git2go(.text): git_branch_name: not defined
github.com/libgit2/git2go(.text): git_branch_next: not defined
github.com/libgit2/git2go(.text): git_branch_remote_name: not defined
github.com/libgit2/git2go(.text): git_branch_set_upstream: not defined
github.com/libgit2/git2go(.text): git_branch_upstream: not defined

Any ideas on how to make it work on Windows?

Order of build matters with respect to git2go and Go cross compiler building

Thank you for git2go. Very handy.

While building a Docker container image suitable for building Go apps that could leverage git2go, I ran across something interesting.

The container Dockerfile also happens to include building the Go cross compilers for darwin and windows. If I build the container with this ordering of statements with respect to the cross compilers and git2go

 # Environment
 ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin:/go/bin
 ENV GOPATH /go

 # Cross compilers 
 RUN cd /usr/local/go/src && GOOS=darwin GOARCH=amd64 ./make.bash --no-clean
 RUN cd /usr/local/go/src && GOOS=windows GOARCH=amd64 ./make.bash --no-clean

 # libgit2/git2go C binding
 RUN go get -d -u -v github.com/libgit2/git2go && cd /go/src/github.com/libgit2/git2go && git submodule   update --init && make test install

the resulting Go environment can successfully build a sample Go app that uses the git2go library.

However, if I reverse the order of building the cross compilers with the building of git2go, I cannot build the sample app. The sample app build in this case fails with

 root@e98ffd5673af:/go/src/t# go build
 # github.com/libgit2/git2go
 ../github.com/libgit2/git2go/blame.go:4:18: fatal error: git2.h: No such file or directory
  #include <git2.h>
              ^
 compilation terminated.

I don't know the reason for this, but wanted to make the observation here.

garbage collector found invalid heap pointer: Go 1.4

After upgrading from go1.3 to go1.4, I'd get a runtime crash most of the time. It crashes for various reasons (nil tree walker callback, invalid heap pointer...). Here is a scaled down version of the code that demonstrates the problem (runtime crashes most of the time). Run this code with an argument pointing at a git repository like git2go.

package main

import (
    "fmt"
    "github.com/libgit2/git2go"
    "os"
    "strings"
)

type MyRepo struct {
    *git.Repository
}

func (repository *MyRepo) foo(path string, treeEntry *git.TreeEntry) int {
    if git.ObjectBlob != treeEntry.Type {
        return 0 // continue
    }

    if !strings.HasSuffix(treeEntry.Name, ".go") {
        return 0 // continue
    }

    blob, err := repository.Repository.LookupBlob(treeEntry.Id)
    defer blob.Free()
    if err != nil {
        panic(err)
    }

    if blob.Size() > 10000 {
        return 0 // continue
    }

    contents := blob.Contents()
    if contents == nil {
        panic("nil contents")
    }
    fmt.Printf("%q", path, treeEntry.Name, string(contents))
    fmt.Println()

    return 0 // continue
}

func main() {
    filename := os.Args[1]

    repository, err := git.OpenRepository(filename)
    if err != nil {
        panic(err)
    }
    defer repository.Free()

    myRepo := MyRepo{repository}

    revWalk, err := repository.Walk()
    if err != nil {
        panic(err)
    }
    defer revWalk.Free()

    // Start out at the head
    err = revWalk.PushHead()
    if err != nil {
        panic(err)
    }

    err = revWalk.Iterate(func(commit *git.Commit) bool {
        defer commit.Free()

        tree, err := commit.Tree()
        if err != nil {
            panic(err)
        }
        defer tree.Free()

        err = tree.Walk(myRepo.foo)
        if err != nil {
            panic(err)
        }

        return true
    })

    if err != nil {
        panic(err)
    }
}

Some errors that come from the above code:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x40f4299]

goroutine 1 [running]:
github.com/libgit2/git2go.CallbackGitTreeWalk(0x438a520, 0x51008e0, 0xc208071e40, 0x0)
    /Users/maleticm/.gvm/pkgsets/go1.4/jack/src/github.com/libgit2/git2go/tree.go:99 +0x79
github.com/libgit2/git2go._Cfunc__go_git_treewalk(0x5100850, 0x0, 0xc208069e40, 0x0)
    /Users/maleticm/.gvm/pkgsets/go1.4/jack/src/github.com/libgit2/git2go/:402 +0x43
github.com/libgit2/git2go.Tree.Walk(0x5100850, 0xc20802c018, 0x5100850, 0xc208069e80, 0x0, 0x0)
runtime: garbage collector found invalid heap pointer *(0xc208069cd0+0x10)=0xc208083e40 span=0xc20807e000-0xc208083800-0xc208084000 state=0
fatal error: invalid heap pointer

runtime stack:
runtime.throw(0x437df83)
    /Users/maleticm/.gvm/gos/go1.4/src/runtime/panic.go:491 +0xad fp=0x7fff5fbfea18 sp=0x7fff5fbfe9e8
scanblock(0xc208069cd0, 0x20, 0x42c12e4)
    /Users/maleticm/.gvm/gos/go1.4/src/runtime/mgc0.c:378 +0x551 fp=0x7fff5fbfeb58 sp=0x7fff5fbfea18
scanframe(0x7fff5fbfec60, 0x0, 0x1)
    /Users/maleticm/.gvm/gos/go1.4/src/runtime/mgc0.c:740 +0x1c2 fp=0x7fff5fbfebc8 sp=0x7fff5fbfeb58
unexpected fault address 0xb01dfacedebac1e
fatal error: fault
[signal 0xb code=0x1 addr=0xb01dfacedebac1e pc=0x40f4299]

goroutine 1 [running, locked to thread]:
runtime.gothrow(0x426ec90, 0x5)
    /Users/maleticm/.gvm/gos/go1.4/src/runtime/panic.go:503 +0x8e fp=0xc208069c40 sp=0xc208069c28
runtime.sigpanic()
    /Users/maleticm/.gvm/gos/go1.4/src/runtime/sigpanic_unix.go:29 +0x261 fp=0xc208069c90 sp=0xc208069c40
github.com/libgit2/git2go.CallbackGitTreeWalk(0x438a520, 0x5009680, 0xc208073e40, 0x0)

Issue when trying to install

When trying to compile git2go I get the following error:

cannot load DWARF output from $WORK/github.com/libgit2/git2go/_obj//_cgo_.o: decoding dwarf section info at offset 0x0: too short

This can be replicated by building my repo (which uses libgit2) on a mac from homebrew using:

$ brew install jwaldrip/utils/git-get -v --HEAD

The formula can be viewed at:
https://github.com/jwaldrip/homebrew-utils/blob/master/git-get.rb

The Makefile the formula uses at:
https://github.com/jwaldrip/git-get/blob/master/Makefile

symbol lookup error: git2go_play: undefined symbol: git_reference_is_tag

fedora: 20
go:1.1
libgit2: f28e4c97b38c1ec60dc6ce6e5306067ad24aeb8e (Tue Apr 1 2014)
git2go: 9cd1d12

I have a issue with the Reference.IsTag() method which appears to be unimplemented but Reference.IsBranch() works. I have checked the code base in both libgit2 and git2go and they bothe appear to be implemented the same.

git2go_play --repo ~/git/testrepo/
&{0x8ec2d0}
git2go_play: symbol lookup error: git2go_play: undefined symbol: git_reference_is_tag

Sample code

package main

import (
    "github.com/libgit2/git2go"
    "fmt"
    "log"
    "flag"
)

func main(){
    repoPath := flag.String("repo", "~/git/testrepo", "path to the git repository")
    flag.Parse()

    repo, err := git.OpenRepository(*repoPath)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(repo)
    refs, err := repo.NewReferenceIterator()
    if err != nil {
        log.Fatal(err)
    }
    for ref := range refs.Iter() {
        msg := ""
        if ref.IsBranch() {
            msg += "IsBranch"
        }
        if ref.IsTag() {
            msg += "IsTag"
        }
        if ref.IsRemote(){
            msg += "IsRemote"
        }

        fmt.Printf("%s: %s\n", msg, ref.Name())

    }
}

What version of libgit2?

I pulled down libgit2/libgit2. The development branch is on 12f831fa1500bdcd1b9a2ef20c4897904983af8e currently. When I try to run this:

# github.com/libgit2/git2go
blob.go:3:18: error: git2.h: No such file or directory
blob.go:4:25: error: git2/errors.h: No such file or directory

All I'm doing is importing the library:

package main

import (
  _ "github.com/libgit2/git2go"
  "fmt"
)

func Main() {
  fmt.Println("HI")
}

EDIT: I'm running go like so:

$ PKG_CONFIG_PATH=/Users/rick/p/libgit2/build go run main.go

Unable to install under Mac OSX

$ go get github.com/libgit2/git2go
# github.com/libgit2/git2go
Undefined symbols for architecture x86_64:
  "_git_blob_create_frombuffer", referenced from:
      __cgo_bc0973baa668_Cfunc_git_blob_create_frombuffer in blob.cgo2.o
     (maybe you meant: __cgo_bc0973baa668_Cfunc_git_blob_create_frombuffer)
  "_git_blob_create_fromchunks", referenced from:
      __go_git_blob_create_fromchunks in wrapper.o
     (maybe you meant: __cgo_bc0973baa668_Cfunc__go_git_blob_create_fromchunks, __go_git_blob_create_fromchunks )
  "_git_blob_rawcontent", referenced from:
      __cgo_bc0973baa668_Cfunc_git_blob_rawcontent in blob.cgo2.o
     (maybe you meant: __cgo_bc0973baa668_Cfunc_git_blob_rawcontent)
  "_git_blob_rawsize", referenced from:
      __cgo_bc0973baa668_Cfunc_git_blob_rawsize in blob.cgo2.o
     (maybe you meant: __cgo_bc0973baa668_Cfunc_git_blob_rawsize)


.... full output here: https://gist.github.com/mattes/2511e7f3210bc2ec3300 ....


ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
$ go version
go version go1.3 darwin/amd64

$ cmake --version
cmake version 3.0.0

$ pkg-config --version
0.28

Mac osx v. 10.9.4

how to checkout a local branck

Hi,

I am intrested in writting a code that creates a local branch and applies a set of changes in that branch. Hence, I need to apply checkout once I have created a branch. I am pretty lost with this API and I haven't found examples in the test files to do that. I will appreciate any help :-)

This is my code and the call LookupTree crashes with the error message "The requested type does not match the type in ODB".


branch, _ := repo.CreateBranch("mybranch", currentTip, true, sig, message)

checkOutOpts := &git.CheckoutOpts{
        Strategy: git.CheckoutForce,
        FileOpenFlags : os.O_WRONLY,
    }
tree, _ := repo.LookupTree(branch.Target())
if err != nil {
    fmt.Print(err)
}
repo.CheckoutTree(tree, checkOutOpts)

Can't compile

Hi, I am using arch linux and I am trying to go get git2go and I am having the next errors:

➜  build git:(development) go get github.com/libgit2/git2go
# github.com/libgit2/git2go
1: error: 'GIT_CHECKOUT_NONE' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_SAFE_CREATE' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_DONT_UPDATE_INDEX' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED' undeclared (first use in this function)
1: error: 'git_checkout_opts' undeclared (first use in this function)
1: error: 'git_checkout_head' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_FORCE' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_NO_REFRESH' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_SKIP_UNMERGED' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_USE_OURS' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_REMOVE_UNTRACKED' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_UPDATE_ONLY' undeclared (first use in this function)
1: error: 'git_checkout_index' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_SAFE' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_ALLOW_CONFLICTS' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_REMOVE_IGNORED' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_USE_THEIRS' undeclared (first use in this function)
1: error: 'GIT_CHECKOUT_UPDATE_SUBMODULES' undeclared (first use in this function)

I am using the latest libgit2 development branch (according to the day of posting this issue). What should I do?

Why do you apply changes from the development branch of libgit2 ?

For instance this commit, which is a breaking change :

libgit2/libgit2@6affd71

It has been applied in git2go here (9c72700) and here (42fce02).

But on my machine I installed the standard version of libgit2 where the breaking change is not shipped, so I can't use git2go... Or I have to download the libgit2 sources and build them.

In case you missed it, I found this Linus comment about this libgit2 change in the subsurface mailing list :)

Releases

Forgive me if this has already been addressed, but I don't quite understand how to use this binding in a serious project. Without tagged releases, I can't figure out how to use it against a stable version of libgit2. Is it not considered production-ready? Am I missing something?

Repository.CreateBlobFromBuffer panics on empty buffer

Hi, when I call Repository.CreateBlobFromBuffer with an empty buffer as argument, I get the following trace:

panic: runtime error: index out of range [recovered]
    panic: runtime error: index out of range

goroutine 6 [running]:
runtime.panic(0x5e8620, 0x9bc217)
    /usr/local/go/src/pkg/runtime/panic.c:266 +0xb6
testing.func·005()
    /usr/local/go/src/pkg/testing/testing.go:385 +0xe8
runtime.panic(0x5e8620, 0x9bc217)
    /usr/local/go/src/pkg/runtime/panic.c:248 +0x106
github.com/libgit2/git2go.(*Repository).CreateBlobFromBuffer(0xc2100002b0, 0x0, 0x0, 0x0, 0x0, ...)
    /home/dev/go/src/github.com/libgit2/git2go/blob.go:40 +0x132
[...]

I'm building from ce7a12d

Issue with homebrew installed libgit2

When I install libgit2 using homebrew and then try to go build git2go I get the following error:

# github.com/libgit2/git2go
37: error: use of undeclared identifier 'git_remote_create_cb'; did you mean 'git_remote_create'?

missing support for tag objects

Hi,

it seems that support for annotated tag objects is missing in git2go. Is this intentional? Shall I try to add it myself?

Regards,
Frank.

Add (*Submodule).Free method

The docs for git_submodule_* funcs say "You must call git_submodule_free when done with the submodule.” However, git2go’s Submodule type doesn’t have a method to free itself. There should be one. I can submit a PR for this soon.

checkout by rev hash

I edit checkout.go and add CheckoutTree method blow, but I don't know why the repo didn't changed after successful execute it.

func (v *Repository) CheckoutTree(treeish string, opts *CheckoutOpts) error {
    var copts C.git_checkout_options
    ptr := populateCheckoutOpts(&copts, opts)

    obj, err := v.RevparseSingle(treeish)
    if err != nil {
        return err
    }
    defer obj.Free()

    commit, err := v.LookupCommit(obj.Id())
    if err != nil {
        return err
    }

    tree, err := commit.Tree()
    if err != nil {
        return err
    }

    runtime.LockOSThread()
    defer runtime.UnlockOSThread()

    ret := C.git_checkout_tree(v.ptr, tree.ptr, ptr)
    if ret < 0 {
        return MakeGitError(ret)
    }

    return nil
}

Implement the missing HEAD functions

Hi,

would be cool to implement

git_repository_set_head
git_repository_set_head_detached

since I haven't really found any other sane way how to perform a checkout or a merge without these. Both Repository.CheckoutHead and Repository.Merge depend on HEAD.

Hope that I am not saying complete bullshit, it's 3am and I am brain-dead.

Regards,
Ondrej Kupka

git-upload-pack ?

Hi all,

Just this question, in the Go binding, is there a way to implement the git-upload-pack ?

Thank you

Pushing to Remote Repo

I've been trying (unsuccessfully so far) to use git2go to push changes from my local repo to a github repo.

Here is the gist containing the code I am using for now.

So while HTTPS works for cloning the remote repo I can't get it working for pushing. None of the error checks report anything but still the push does not go through

I've looked at the documentation of both git2go and libgit2, tests in the git2go repo and related questions on stack overflow and seem to be on the prescribed track but can't figure out exactly what's wrong with my implementation.

As this is the first location to learn about git2go , I'm posting it here as well in case it will help others.

Thanks !

Adding a config file with [include] returns error

When I attempt to add a global config file using conf.AddFile(path, git.ConfigLevelGlobal, false) and that file has an [include] section with a file pointing to ~/.gitconfig.local, I receive the following error: The global file '/.gitconfig.local' doesn't exist: No such file or directory. It seems that maybe it is looking for it in root instead of expanding ~ as $HOME?

Is this a user error, git2go or libgit2?

Unable to install under Mac OS X Lion

I followed the Readme and this is the error I got after running make install.

Undefined symbols for architecture x86_64:
  "_deflateEnd", referenced from:
      _git_filebuf_cleanup in libgit2.a(filebuf.c.o)
      _git_zstream_free in libgit2.a(zstream.c.o)
      _git_zstream_deflatebuf in libgit2.a(zstream.c.o)
  "_deflate", referenced from:
      _write_deflate in libgit2.a(filebuf.c.o)
      _git_zstream_get_output in libgit2.a(zstream.c.o)
     (maybe you meant: _git_zstream_deflatebuf)
  "_deflateInit_", referenced from:
      _git_filebuf_open in libgit2.a(filebuf.c.o)
      _git_zstream_init in libgit2.a(zstream.c.o)
      _git_zstream_deflatebuf in libgit2.a(zstream.c.o)
  "_SSL_load_error_strings", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_SSL_library_init", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_SSLv23_method", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_SSL_CTX_new", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_SSL_CTX_ctrl", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_SSL_CTX_set_verify", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_SSL_CTX_set_default_verify_paths", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_SSL_CTX_free", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_CRYPTO_num_locks", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_CRYPTO_set_locking_callback", referenced from:
      _init_once in libgit2.a(global.c.o)
  "_crc32", referenced from:
      _crc_object in libgit2.a(indexer.c.o)
      _git_indexer_commit in libgit2.a(indexer.c.o)
  "_SSL_get_error", referenced from:
      _ssl_set_error in libgit2.a(netops.c.o)
      _gitno__recv_ssl in libgit2.a(netops.c.o)
  "_ERR_get_error", referenced from:
      _ssl_set_error in libgit2.a(netops.c.o)
  "_ERR_error_string", referenced from:
      _ssl_set_error in libgit2.a(netops.c.o)
  "_SSL_shutdown", referenced from:
      _gitno_close in libgit2.a(netops.c.o)
  "_SSL_free", referenced from:
      _gitno_close in libgit2.a(netops.c.o)
  "_SSL_write", referenced from:
      _gitno_send in libgit2.a(netops.c.o)
  "_SSL_read", referenced from:
      _gitno__recv_ssl in libgit2.a(netops.c.o)
  "_SSL_new", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_SSL_set_fd", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_SSL_connect", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_SSL_get_verify_result", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_SSL_get_peer_certificate", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_X509_get_ext_d2i", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_GENERAL_NAMES_free", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_sk_num", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_sk_value", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_ASN1_STRING_data", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_ASN1_STRING_length", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_X509_get_subject_name", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_X509_NAME_get_index_by_NID", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_X509_NAME_get_entry", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_X509_NAME_ENTRY_get_data", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_ASN1_STRING_type", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_CRYPTO_malloc", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_ASN1_STRING_to_UTF8", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_CRYPTO_free", referenced from:
      _gitno_connect in libgit2.a(netops.c.o)
  "_SHA1_Update", referenced from:
      _git_odb_stream_write in libgit2.a(odb.c.o)
      _git_odb_open_wstream in libgit2.a(odb.c.o)
      _git_odb__hashfd in libgit2.a(odb.c.o)
      _write_one in libgit2.a(pack-objects.c.o)
      _write_pack in libgit2.a(pack-objects.c.o)
      _write_normal in libgit2.a(filebuf.c.o)
      _write_deflate in libgit2.a(filebuf.c.o)
      ...
  "_SHA1_Final", referenced from:
      _git_odb_stream_finalize_write in libgit2.a(odb.c.o)
      _git_odb__hashfd in libgit2.a(odb.c.o)
      _write_pack in libgit2.a(pack-objects.c.o)
      _git_filebuf_hash in libgit2.a(filebuf.c.o)
      _git_hash_buf in libgit2.a(hash.c.o)
      _git_hash_vec in libgit2.a(hash.c.o)
      _git_indexer_commit in libgit2.a(indexer.c.o)
      ...
  "_SHA1_Init", referenced from:
      _git_odb_open_wstream in libgit2.a(odb.c.o)
      _git_odb__hashfd in libgit2.a(odb.c.o)
      _git_packbuilder_new in libgit2.a(pack-objects.c.o)
      _git_filebuf_open in libgit2.a(filebuf.c.o)
      _git_hash_buf in libgit2.a(hash.c.o)
      _git_hash_vec in libgit2.a(hash.c.o)
      _git_indexer_commit in libgit2.a(indexer.c.o)
      ...
  "_inflateInit_", referenced from:
      _loose_backend__read_header in libgit2.a(odb_loose.c.o)
      _read_loose in libgit2.a(odb_loose.c.o)
      _packfile_unpack_compressed in libgit2.a(pack.c.o)
      _git_packfile_stream_open in libgit2.a(pack.c.o)
  "_inflate", referenced from:
      _loose_backend__read_header in libgit2.a(odb_loose.c.o)
      _read_loose in libgit2.a(odb_loose.c.o)
      _git_packfile_stream_read in libgit2.a(pack.c.o)
      _packfile_unpack_compressed in libgit2.a(pack.c.o)
  "_inflateEnd", referenced from:
      _loose_backend__read_header in libgit2.a(odb_loose.c.o)
      _read_loose in libgit2.a(odb_loose.c.o)
      _packfile_unpack_compressed in libgit2.a(pack.c.o)
      _git_packfile_stream_free in libgit2.a(pack.c.o)
  "_iconv", referenced from:
      _git_path_iconv in libgit2.a(path.c.o)
     (maybe you meant: _git_path_iconv_init_precompose, _git_path_iconv_clear , _git_path_iconv )
  "_iconv_close", referenced from:
      _git_path_iconv_clear in libgit2.a(path.c.o)
      _git_path_dirload in libgit2.a(path.c.o)
      _git_path_direach in libgit2.a(path.c.o)
  "_iconv_open", referenced from:
      _git_path_iconv_init_precompose in libgit2.a(path.c.o)
      _git_path_dirload in libgit2.a(path.c.o)
      _git_path_direach in libgit2.a(path.c.o)
  "_deflateReset", referenced from:
      _git_zstream_reset in libgit2.a(zstream.c.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [install] Error 2

Build fails

ian@debian: go get github.com/libgit2/git2go
# github.com/libgit2/git2go
git.go:14: imported and not used: "fmt"
packbuilder.go:126: no new variables on left side of :=
packbuilder.go:127: no new variables on left side of :=
packbuilder.go:127: cannot use stop (type chan<- bool) as type <-chan bool in field value
packbuilder.go:128: cannot use &data (type *<-chan []byte) as type *packbuilderCbData in function argument
reference.go:154: cannot use &ptr (type **_Ctype_char) as type **[0]byte in function argument

I've fixed the first three of the errors, but I'm not well versed enough in Go to tackle the last few.

Calling Free() 2x will cause SEGV

Maybe should check set ptr = nil after git free and guard Free logic with ptr != nil to make sure it doesn't try to free invalid pointers?

problems building

I read in another issue that libgit2 via homebrew won't help, but if I don't have it installed with homebrew, then this: go get github.com/libgit2/git2go produces:

# github.com/libgit2/git2go
./blob.go:4:10: fatal error: 'git2.h' file not found
#include <git2.h>
         ^
1 error generated.

but if I install libgit2 with homebrew then this step works but at make step I get make: *** [install] Error 2 but no errors are reported above this line... confusing :( Any tips?

Filemode mismatched type

While trying to use @carlosmn's go.gitfs I ran into the following error:

.../github.com/carlosmn/go.gitfs# go build
# github.com/carlosmn/go.gitfs
./gitfs.go:94: invalid case git.FilemodeBlob in switch on v.entry.Filemode (mismatched types git.Filemode and int)
./gitfs.go:96: invalid case git.FilemodeTree in switch on v.entry.Filemode (mismatched types git.Filemode and int)
./gitfs.go:174: cannot use git.FilemodeTree (type git.Filemode) as type int in field value

It seems this problem was introduced in change 9bec36a

The following patch fixes it, but I'm not sure if this is how you want to do it: https://gist.github.com/ry/21587c5d66e20ab0d123

Push support

I see there is a branch with Remote support. It would be nice to be able to push to them as well.

Git2go fails to build when running make test.

I am following the readme and everything worked fine till make install. However, when running make test I run into the following errors :

# testmain
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): adddynsym: missed symbol git_buf__oom (git_buf__oom)
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
github.com/libgit2/git2go(__TEXT/__text): unexpected GOT reloc for non-dynamic symbol git_buf__oom
too many errors
FAIL    github.com/libgit2/git2go [build failed]

Some of the logs from running make build and make test

-- The C compiler identification is GNU 4.9.1
-- Checking whether C compiler has -isysroot
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag
-- Checking whether C compiler supports OSX deployment target flag - yes
-- Check for working C compiler: /usr/local/bin/cc
-- Check for working C compiler: /usr/local/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Found OpenSSL: /usr/lib/libssl.dylib;/usr/lib/libcrypto.dylib (found version "0.9.8y")
-- Could NOT find HTTP_Parser (missing:  HTTP_PARSER_INCLUDE_DIR HTTP_PARSER_LIBRARY)
-- http-parser was not found or is too old; using bundled 3rd-party sources.
-- Found ZLIB: /usr/lib/libz.dylib (found version "1.2.5")
-- Found Iconv: -L/usr/lib -liconv
-- Performing Test IS_WNO-MISSING-FIELD-INITIALIZERS_SUPPORTED
-- Performing Test IS_WNO-MISSING-FIELD-INITIALIZERS_SUPPORTED - Success
.... 
.... 
-- Performing Test IS_WNO-UNUSED-CONST-VARIABLE_SUPPORTED - Failed
...
...
- Looking for clock_gettime in rt
-- Looking for clock_gettime in rt - not found
-- Configuring done

... 
... 
... 

/usr/bin/ranlib: file: libgit2.a(winhttp.c.o) has no symbols
/usr/bin/ranlib: file: libgit2.a(realpath.c.o) has no symbols
/usr/bin/ranlib: file: libgit2.a(winhttp.c.o) has no symbols
/usr/bin/ranlib: file: libgit2.a(realpath.c.o) has no symbols

... 
... 

Issue when trying to build on OSX

When building on Mac OSX I get the following error:

I am using the built in make install command which uses: script/build-libgit2-static.sh

$ make install
./script/build-libgit2-static.sh
+ VENDORED_PATH=vendor/libgit2
+ cd vendor/libgit2
+ mkdir -p install/lib
+ mkdir -p build
+ cd build
+ cmake -DTHREADSAFE=ON -DBUILD_CLAR=OFF -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_FLAGS=-fPIC -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=../install ..
-- Could NOT find HTTP_Parser (missing:  HTTP_PARSER_INCLUDE_DIR HTTP_PARSER_LIBRARY)
-- http-parser was not found or is too old; using bundled 3rd-party sources.
-- Found Iconv: -L/usr/lib -liconv
CMake Error at /usr/local/Cellar/cmake/3.0.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:136 (message):
  Could NOT find Threads (missing: Threads_FOUND)
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.0.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:343 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/Cellar/cmake/3.0.2/share/cmake/Modules/FindThreads.cmake:178 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:372 (FIND_PACKAGE)


-- Configuring incomplete, errors occurred!
See also "/Users/jwaldrip/dev/src/github.com/libgit2/git2go/vendor/libgit2/build/CMakeFiles/CMakeOutput.log".
See also "/Users/jwaldrip/dev/src/github.com/libgit2/git2go/vendor/libgit2/build/CMakeFiles/CMakeError.log".
make: *** [build-libgit2] Error 1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.