From f9ce9bd628d592b408c04303d73e20419bc94d59 Mon Sep 17 00:00:00 2001 From: lhchavez Date: Thu, 14 Apr 2022 06:49:59 -0700 Subject: [PATCH] libgit2 v1.5.0 #major This commit introduces libgit2 v1.5.0-alpha to git2go, which brings a large number of bugfixes and features. This also marks the start of the v34 release. --- .github/workflows/ci.yml | 2 +- Build_bundled_static.go | 4 ++-- Build_system_dynamic.go | 4 ++-- Build_system_static.go | 4 ++-- README.md | 17 ++++++++-------- go.mod | 2 +- http.go | 6 +++--- remote.go | 43 ++++++++++++++++++++++++++++++++++++++++ transport.go | 13 +++++++----- vendor/libgit2 | 2 +- 10 files changed, 72 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dd0cde24..8050858f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,7 +62,7 @@ jobs: fail-fast: false matrix: libgit2: - - 'v1.3.1' + - '1d88605ca9d51f9e8695030853d5914743fbb091' name: Go (system-wide, dynamic) runs-on: ubuntu-20.04 diff --git a/Build_bundled_static.go b/Build_bundled_static.go index d9b3713c..9af2d954 100644 --- a/Build_bundled_static.go +++ b/Build_bundled_static.go @@ -10,8 +10,8 @@ package git #cgo CFLAGS: -DLIBGIT2_STATIC #include -#if LIBGIT2_VER_MAJOR != 1 || LIBGIT2_VER_MINOR < 3 || LIBGIT2_VER_MINOR > 3 -# error "Invalid libgit2 version; this git2go supports libgit2 between v1.3.0 and v1.3.0" +#if LIBGIT2_VER_MAJOR != 1 || LIBGIT2_VER_MINOR < 5 || LIBGIT2_VER_MINOR > 5 +# error "Invalid libgit2 version; this git2go supports libgit2 between v1.5.0 and v1.5.0" #endif */ import "C" diff --git a/Build_system_dynamic.go b/Build_system_dynamic.go index a8e69425..bc423b59 100644 --- a/Build_system_dynamic.go +++ b/Build_system_dynamic.go @@ -8,8 +8,8 @@ package git #cgo CFLAGS: -DLIBGIT2_DYNAMIC #include -#if LIBGIT2_VER_MAJOR != 1 || LIBGIT2_VER_MINOR < 3 || LIBGIT2_VER_MINOR > 3 -# error "Invalid libgit2 version; this git2go supports libgit2 between v1.3.0 and v1.3.0" +#if LIBGIT2_VER_MAJOR != 1 || LIBGIT2_VER_MINOR < 5 || LIBGIT2_VER_MINOR > 5 +# error "Invalid libgit2 version; this git2go supports libgit2 between v1.5.0 and v1.5.0" #endif */ import "C" diff --git a/Build_system_static.go b/Build_system_static.go index a96894fa..7038e93d 100644 --- a/Build_system_static.go +++ b/Build_system_static.go @@ -8,8 +8,8 @@ package git #cgo CFLAGS: -DLIBGIT2_STATIC #include -#if LIBGIT2_VER_MAJOR != 1 || LIBGIT2_VER_MINOR < 3 || LIBGIT2_VER_MINOR > 3 -# error "Invalid libgit2 version; this git2go supports libgit2 between v1.3.0 and v1.3.0" +#if LIBGIT2_VER_MAJOR != 1 || LIBGIT2_VER_MINOR < 5 || LIBGIT2_VER_MINOR > 5 +# error "Invalid libgit2 version; this git2go supports libgit2 between v1.5.0 and v1.5.0" #endif */ import "C" diff --git a/README.md b/README.md index 94fdab64..84d54cc3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ git2go ====== -[![GoDoc](https://godoc.org/github.com/libgit2/git2go?status.svg)](http://godoc.org/github.com/libgit2/git2go/v33) [![Build Status](https://travis-ci.org/libgit2/git2go.svg?branch=main)](https://travis-ci.org/libgit2/git2go) +[![GoDoc](https://godoc.org/github.com/libgit2/git2go?status.svg)](http://godoc.org/github.com/libgit2/git2go/v34) [![Build Status](https://travis-ci.org/libgit2/git2go.svg?branch=main)](https://travis-ci.org/libgit2/git2go) Go bindings for [libgit2](http://libgit2.github.com/). @@ -10,7 +10,8 @@ Due to the fact that Go 1.11 module versions have semantic meaning and don't nec | libgit2 | git2go | |---------|---------------| -| main | (will be v34) | +| main | (will be v35) | +| 1.4 | v34 | | 1.3 | v33 | | 1.2 | v32 | | 1.1 | v31 | @@ -19,13 +20,13 @@ Due to the fact that Go 1.11 module versions have semantic meaning and don't nec | 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 v33 with: +You can import them in your project with the version's major number as a suffix. For example, if you have libgit2 v1.4 installed, you'd import git2go v34 with: ```sh -go get github.com/libgit2/git2go/v33 +go get github.com/libgit2/git2go/v34 ``` ```go -import "github.com/libgit2/git2go/v33" +import "github.com/libgit2/git2go/v34" ``` which will ensure there are no sudden changes to the API. @@ -46,10 +47,10 @@ This project wraps the functionality provided by libgit2. If you're using a vers ### 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 +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.4 ```go -import "github.com/libgit2/git2go/v33" +import "github.com/libgit2/git2go/v34" ``` ### Versioned branch, static linking @@ -79,7 +80,7 @@ In order to let Go pass the correct flags to `pkg-config`, `-tags static` needs 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](https://github.com/golang/go/wiki/Modules#when-should-i-use-the-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/v33 => ../../libgit2/git2go + replace github.com/libgit2/git2go/v34 => ../../libgit2/git2go Parallelism and network operations ---------------------------------- diff --git a/go.mod b/go.mod index c8028ef3..ed6d20cc 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/libgit2/git2go/v33 +module github.com/libgit2/git2go/v34 go 1.13 diff --git a/http.go b/http.go index 0777c566..d33e8206 100644 --- a/http.go +++ b/http.go @@ -38,17 +38,17 @@ func registerManagedHTTP() error { func httpSmartSubtransportFactory(remote *Remote, transport *Transport) (SmartSubtransport, error) { var proxyFn func(*http.Request) (*url.URL, error) - proxyOpts, err := transport.SmartProxyOptions() + connectOpts, err := transport.SmartRemoteConnectOptions() if err != nil { return nil, err } - switch proxyOpts.Type { + switch connectOpts.ProxyOpts.Type { case ProxyTypeNone: proxyFn = nil case ProxyTypeAuto: proxyFn = http.ProxyFromEnvironment case ProxyTypeSpecified: - parsedUrl, err := url.Parse(proxyOpts.Url) + parsedUrl, err := url.Parse(connectOpts.ProxyOpts.Url) if err != nil { return nil, err } diff --git a/remote.go b/remote.go index cde92b94..e6601739 100644 --- a/remote.go +++ b/remote.go @@ -177,6 +177,49 @@ func proxyOptionsFromC(copts *C.git_proxy_options) *ProxyOptions { } } +// RemoteRedirect are remote redirection settings; whether redirects to another +// host are permitted. By default, git will follow a redirect on the initial +// request (`/info/refs`), but not subsequent requests. +type RemoteRedirect uint32 + +const ( + // RemoteRedirectNone makes remote operations not follow any off-site redirects at any stage of + // the fetch or push. + RemoteRedirectNone RemoteRedirect = C.GIT_REMOTE_REDIRECT_NONE + + // RemoteRedirectInitial allows off-site redirects only upon the initial request. + // This is the default. + RemoteRedirectInitial RemoteRedirect = C.GIT_REMOTE_REDIRECT_INITIAL + + // RemoteRedirectAll allows redirects at any stage in the fetch or push. + RemoteRedirectAll RemoteRedirect = C.GIT_REMOTE_REDIRECT_ALL +) + +// RemoteConnectOptions is the remote creation options structure. +type RemoteConnectOptions struct { + // Callbacks are the callbacks to use for this connection. + Callbacks RemoteCallbacks + + // ProxyOpts are the HTTP proxy settings. + ProxyOpts ProxyOptions + + // FollowRedirects determines whether to allow off-site redirects. If this + // is not specified, the `http.followRedirects` configuration setting will be + // consulted. + FollowRedirects RemoteRedirect + + // CustomHeaders are extra HTTP headers to use in this connection. + CustomHeaders []string +} + +func remoteConnectOptionsFromC(copts *C.git_remote_connect_options) *RemoteConnectOptions { + return &RemoteConnectOptions{ + ProxyOpts: *proxyOptionsFromC(&copts.proxy_opts), + FollowRedirects: RemoteRedirect(copts.follow_redirects), + CustomHeaders: makeStringsFromCStrings(copts.custom_headers.strings, int(copts.custom_headers.count)), + } +} + type Remote struct { doNotCompare ptr *C.git_remote diff --git a/transport.go b/transport.go index 23514b47..61803296 100644 --- a/transport.go +++ b/transport.go @@ -4,6 +4,7 @@ package git #include #include +#include #include typedef struct { @@ -84,17 +85,19 @@ type Transport struct { ptr *C.git_transport } -// SmartProxyOptions gets a copy of the proxy options for this transport. -func (t *Transport) SmartProxyOptions() (*ProxyOptions, error) { +// SmartRemoteConnectOptions gets a copy of the connection options for this transport. +func (t *Transport) SmartRemoteConnectOptions() (*RemoteConnectOptions, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - var cpopts C.git_proxy_options - if ret := C.git_transport_smart_proxy_options(&cpopts, t.ptr); ret < 0 { + var copts C.git_remote_connect_options + if ret := C.git_transport_smart_remote_connect_options(&copts, t.ptr); ret < 0 { return nil, MakeGitError(ret) } + opts := remoteConnectOptionsFromC(&copts) + C.git_remote_connect_options_dispose(&copts) - return proxyOptionsFromC(&cpopts), nil + return opts, nil } // SmartCredentials calls the credentials callback for this transport. diff --git a/vendor/libgit2 b/vendor/libgit2 index 1f5e7f9a..1d88605c 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 1f5e7f9add5c8bbc602b14feaec216c8877c3c84 +Subproject commit 1d88605ca9d51f9e8695030853d5914743fbb091