commit | 34fb7e03ecfd3fbe7000ecfac4e30ea719d9879e | [log] [tgz] |
---|---|---|
author | Calin Seciu <calinseciu@gmail.com> | Thu Sep 17 17:07:34 2015 +0300 |
committer | Carlos Martín Nieto <cmn@dwim.me> | Fri Sep 18 10:48:26 2015 +0200 |
tree | e4c7f57478ccc86de4a236d26b03249bc6380e94 | |
parent | 6d3a3499f1639a6272e334f9f74b1e0cf6b0bb49 [diff] |
Fix crash when using Pathspec in StatusOptions Using `StatusOptions.Pathspec` results in a fatal error panic with the message 'unexpected signal during runtime execution'. This is because the `&cpathspec` C.git_strarray gets freed in `*StatusOptions.toC()` before being passed to `C.git_status_init_options()` in `*Repository.StatusList()` (see https://github.com/libgit2/git2go/blob/b3e7705c48f038ef335204a2a9e1ee829784c30e/status.go#L138) The relevant panic trace is: ``` fatal error: unexpected signal during runtime execution [signal 0xb code=0x1 addr=0xb01dfacedebac1e pc=0x4062609] runtime stack: runtime.throw(0x469a080, 0x2a) /usr/local/Cellar/go/1.5.1/libexec/src/runtime/panic.go:527 +0x90 runtime.sigpanic() /usr/local/Cellar/go/1.5.1/libexec/src/runtime/sigpanic_unix.go:12 +0x5a goroutine 71 [syscall, locked to thread]: runtime.cgocall(0x400a720, 0xc8204e9998, 0x0) /usr/local/Cellar/go/1.5.1/libexec/src/runtime/cgocall.go:120 +0x11b fp=0xc8204e9968 sp=0xc8204e9938 github.com/libgit2/git2go._Cfunc_git_status_list_new(0xc8204c39c8, 0x5e17780, 0xc820478c40, 0xc800000000) ??:0 +0x39 fp=0xc8204e9998 sp=0xc8204e9968 github.com/libgit2/git2go.(*Repository).StatusList(0xc820013290, 0xc8204e9b58, 0x0, 0x0, 0x0) /Users/calin/go/src/github.com/libgit2/git2go/status.go:168 +0x11d fp=0xc8204e99e8 sp=0xc8204e9998 ```
Go bindings for libgit2. The master
branch follows the latest libgit2 release. The versioned branches indicate which libgit2 version they work against.
This project wraps the functionality provided by libgit2. If you‘re using a stable version, install it to your system via your system’s package manaager and then install git2go as usual.
Otherwise (next
which tracks an unstable version), we need to build libgit2 as well. In order to build it, you need cmake
, pkg-config
and a C compiler. You will also need the development packages for OpenSSL and LibSSH2 installed if you want libgit2 to support HTTPS and SSH respectively.
git2go has master
which tracks the latest release of libgit2, and versioned branches which indicate which version of libgit2 they work against. Install the development package on your system via your favourite package manager or from source and you can use a service like gopkg.in to use the appropriate version. For the libgit2 v0.22 case, you can use
import "gopkg.in/libgit2/git2go.v22"
to use a version of git2go which will work against libgit2 v0.22 and dynamically link to the library. You can use
import "github.com/libgit2/git2go"
to use the version which works against the latest release.
next
The next
branch follows libgit2's master branch, which means there is no stable API or ABI to link against. git2go can statically link against a vendored version of libgit2.
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 checkout next git submodule update --init # get libgit2 make install
will compile libgit2. Run go install
so that it's statically linked to the git2go package.
libgit2 uses 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.
For the stable version, go test
will work as usual. For the next
branch, similarly to installing, running the tests requires linking against the local libgit2 library, so the Makefile provides a wrapper
make test
Alternatively, if you want to pass arguments to go test
, you can use the script that sets it all up
./script/with-static.sh go test -v
which will run the specified arguments with the correct environment variables.
M to the I to the T. See the LICENSE file if you've never seen a MIT license before.