Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeger-Jan van de Weg <git@zjvandeweg.nl>2018-12-11 12:51:22 +0300
committerZeger-Jan van de Weg <git@zjvandeweg.nl>2018-12-17 10:33:54 +0300
commit486c7fa8b63951e78bd483fc59aac446286bf1ed (patch)
tree3597c22d592c9e5e26d9678347dfa701b3f2d11c
parent0b97f7850b5d2322c1f7d619af4b04009ae96bd9 (diff)
Improve Linking and Unlink object pools RPC
GitLab-Rails performs operations when Linking and Unlinking. This makes sure we perform less RPCs from Rails, and keeps the responsibilities straight. To do so, config options needed to be set. An RPC was available to set it through Ruby, but proved quite cumbersome to use as the rubyserver now needed to go into the `objectpool` package. Fixes: https://gitlab.com/gitlab-org/gitaly/issues/1420 As a matter of applying the boyscout rule, this commit also sets the gc.auto option for object pools to 0. This means that Git will never perform GC without being told to do so. Fixes: https://gitlab.com/gitlab-org/gitaly/issues/1423
-rw-r--r--changelogs/unreleased/zj-link-unlink-improve.yml5
-rw-r--r--internal/git/objectpool/link.go45
-rw-r--r--internal/git/objectpool/link_test.go9
-rw-r--r--internal/git/objectpool/pool.go2
-rw-r--r--internal/git/objectpool/remote.go21
-rw-r--r--internal/git/objectpool/remote_test.go23
-rw-r--r--internal/service/objectpool/create_test.go4
-rw-r--r--internal/service/objectpool/link.go8
-rw-r--r--internal/service/objectpool/link_test.go9
-rw-r--r--internal/testhelper/testhelper.go2
-rw-r--r--vendor/gitlab.com/gitlab-org/gitaly-proto/go/gitalypb/objectpool.pb.go47
-rw-r--r--vendor/vendor.json10
12 files changed, 151 insertions, 34 deletions
diff --git a/changelogs/unreleased/zj-link-unlink-improve.yml b/changelogs/unreleased/zj-link-unlink-improve.yml
new file mode 100644
index 000000000..1867cb829
--- /dev/null
+++ b/changelogs/unreleased/zj-link-unlink-improve.yml
@@ -0,0 +1,5 @@
+---
+title: Improve Linking and Unlink object pools RPC
+merge_request: 1000
+author:
+type: changed
diff --git a/internal/git/objectpool/link.go b/internal/git/objectpool/link.go
index 284556e76..c212593b7 100644
--- a/internal/git/objectpool/link.go
+++ b/internal/git/objectpool/link.go
@@ -2,18 +2,20 @@ package objectpool
import (
"context"
+ "fmt"
"io/ioutil"
"os"
"path/filepath"
- "gitlab.com/gitlab-org/gitaly/internal/git/repository"
+ "gitlab.com/gitlab-org/gitaly-proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitaly/internal/git"
"gitlab.com/gitlab-org/gitaly/internal/helper"
)
// Link will write the relative path to the object pool from the repository that
// is to join the pool. This does not trigger deduplication, which is the
// responsibility of the caller.
-func (o *ObjectPool) Link(ctx context.Context, repo repository.GitRepo) error {
+func (o *ObjectPool) Link(ctx context.Context, repo *gitalypb.Repository) error {
altPath, err := alternatesPath(repo)
if err != nil {
return err
@@ -29,11 +31,36 @@ func (o *ObjectPool) Link(ctx context.Context, repo repository.GitRepo) error {
return err
}
+ remoteName := repo.GetGlRepository()
+ for k, v := range map[string]string{
+ fmt.Sprintf("remote.%s.url", remoteName): relPath,
+ fmt.Sprintf("remote.%s.fetch", remoteName): fmt.Sprintf("+refs/*:refs/remotes/%s/*", remoteName),
+ fmt.Sprintf("remote.%s.tagOpt", remoteName): "--no-tags",
+ } {
+ if err := o.setConfig(ctx, k, v); err != nil {
+ return err
+ }
+ }
+
return ioutil.WriteFile(altPath, []byte(filepath.Join(relPath, "objects")), 0644)
}
// Unlink removes the alternates file, so Git won't look there anymore
-func Unlink(ctx context.Context, repo repository.GitRepo) error {
+// It removes the remote from the object pool too,
+func (o *ObjectPool) Unlink(ctx context.Context, repo *gitalypb.Repository) error {
+ if !o.Exists() {
+ return nil
+ }
+
+ // We need to use removeRemote, and can't leverage `git config --remove-section`
+ // as the latter doesn't clean up refs
+ remoteName := repo.GetGlRepository()
+ if err := o.removeRemote(ctx, remoteName); err != nil {
+ if present, err2 := o.hasRemote(ctx, remoteName); err2 != nil || present {
+ return err
+ }
+ }
+
altPath, err := alternatesPath(repo)
if err != nil {
return err
@@ -41,3 +68,15 @@ func Unlink(ctx context.Context, repo repository.GitRepo) error {
return os.RemoveAll(altPath)
}
+
+// Config options setting will leak the key value pairs in the logs. This makes
+// this function not suitable for general usage, and scoped to this package.
+// To be corrected in: https://gitlab.com/gitlab-org/gitaly/issues/1430
+func (o *ObjectPool) setConfig(ctx context.Context, key, value string) error {
+ cmd, err := git.Command(ctx, o, "config", key, value)
+ if err != nil {
+ return err
+ }
+
+ return cmd.Wait()
+}
diff --git a/internal/git/objectpool/link_test.go b/internal/git/objectpool/link_test.go
index 4402d4b73..a97bc897c 100644
--- a/internal/git/objectpool/link_test.go
+++ b/internal/git/objectpool/link_test.go
@@ -5,6 +5,7 @@ import (
"os"
"testing"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/internal/testhelper"
)
@@ -41,6 +42,10 @@ func TestLink(t *testing.T) {
require.NoError(t, err)
require.Equal(t, content, newContent)
+
+ // Test if the remote is set
+ remotes := testhelper.MustRunCommand(t, nil, "git", "-C", pool.FullPath(), "remote")
+ assert.Equal(t, testRepo.GetGlRepository()+"\n", string(remotes))
}
func TestUnlink(t *testing.T) {
@@ -55,7 +60,7 @@ func TestUnlink(t *testing.T) {
defer pool.Remove(ctx)
// Without a pool on disk, this doesn't return an error
- require.NoError(t, Unlink(ctx, testRepo))
+ require.NoError(t, pool.Unlink(ctx, testRepo))
altPath, err := alternatesPath(testRepo)
require.NoError(t, err)
@@ -65,7 +70,7 @@ func TestUnlink(t *testing.T) {
_, err = os.Stat(altPath)
require.False(t, os.IsNotExist(err))
- require.NoError(t, Unlink(ctx, testRepo))
+ require.NoError(t, pool.Unlink(ctx, testRepo))
_, err = os.Stat(altPath)
require.True(t, os.IsNotExist(err))
}
diff --git a/internal/git/objectpool/pool.go b/internal/git/objectpool/pool.go
index 7da743132..824eb94ae 100644
--- a/internal/git/objectpool/pool.go
+++ b/internal/git/objectpool/pool.go
@@ -85,7 +85,7 @@ func (o *ObjectPool) Create(ctx context.Context, repo *gitalypb.Repository) (err
return err
}
- return nil
+ return o.setConfig(ctx, "gc.auto", "0")
}
// Remove will remove the pool, and all its contents without preparing and/or
diff --git a/internal/git/objectpool/remote.go b/internal/git/objectpool/remote.go
index 589808c9c..bed46c55f 100644
--- a/internal/git/objectpool/remote.go
+++ b/internal/git/objectpool/remote.go
@@ -1,6 +1,7 @@
package objectpool
import (
+ "bufio"
"context"
"gitlab.com/gitlab-org/gitaly/internal/git"
@@ -14,3 +15,23 @@ func (o *ObjectPool) removeRemote(ctx context.Context, name string) error {
return cmd.Wait()
}
+
+// hasRemote will always return a boolean value, but should only be depended on
+// when the error value is nil
+func (o *ObjectPool) hasRemote(ctx context.Context, name string) (bool, error) {
+ cmd, err := git.Command(ctx, o, "remote")
+ if err != nil {
+ return false, err
+ }
+
+ found := false
+ scanner := bufio.NewScanner(cmd)
+ for scanner.Scan() {
+ if scanner.Text() == name {
+ found = true
+ break
+ }
+ }
+
+ return found, cmd.Wait()
+}
diff --git a/internal/git/objectpool/remote_test.go b/internal/git/objectpool/remote_test.go
index ef07e02fd..ce9ec85f6 100644
--- a/internal/git/objectpool/remote_test.go
+++ b/internal/git/objectpool/remote_test.go
@@ -25,3 +25,26 @@ func TestRemoveRemote(t *testing.T) {
out := testhelper.MustRunCommand(t, nil, "git", "-C", pool.FullPath(), "remote")
require.Len(t, out, 0)
}
+
+func TestHasRemote(t *testing.T) {
+ ctx, cancel := testhelper.Context()
+ defer cancel()
+
+ testRepo, _, cleanupFn := testhelper.NewTestRepo(t)
+ defer cleanupFn()
+
+ pool, err := NewObjectPool(testRepo.GetStorageName(), t.Name())
+ require.NoError(t, err)
+
+ // This creates a remote to the repository, "origin"
+ require.NoError(t, pool.clone(ctx, testRepo))
+ defer pool.Remove(ctx)
+
+ found, err := pool.hasRemote(ctx, "origin")
+ require.NoError(t, err)
+ require.True(t, found)
+
+ found, err = pool.hasRemote(ctx, "can-not-be-found")
+ require.NoError(t, err)
+ require.False(t, found)
+}
diff --git a/internal/service/objectpool/create_test.go b/internal/service/objectpool/create_test.go
index 41d069607..e8319284d 100644
--- a/internal/service/objectpool/create_test.go
+++ b/internal/service/objectpool/create_test.go
@@ -58,6 +58,10 @@ func TestCreate(t *testing.T) {
out = testhelper.MustRunCommand(t, nil, "git", "-C", pool.FullPath(), "cat-file", "-s", "55bc176024cfa3baaceb71db584c7e5df900ea65")
assert.Equal(t, "282\n", string(out))
+ // No automatic GC
+ gc := testhelper.MustRunCommand(t, nil, "git", "-C", pool.FullPath(), "config", "--get", "gc.auto")
+ assert.Equal(t, "0\n", string(gc))
+
// Making the same request twice, should result in an error
_, err = client.CreateObjectPool(ctx, poolReq)
require.Error(t, err)
diff --git a/internal/service/objectpool/link.go b/internal/service/objectpool/link.go
index ef3d0c15d..234a33a87 100644
--- a/internal/service/objectpool/link.go
+++ b/internal/service/objectpool/link.go
@@ -4,7 +4,6 @@ import (
"context"
"gitlab.com/gitlab-org/gitaly-proto/go/gitalypb"
- "gitlab.com/gitlab-org/gitaly/internal/git/objectpool"
"gitlab.com/gitlab-org/gitaly/internal/helper"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
@@ -32,7 +31,12 @@ func (s *server) UnlinkRepositoryFromObjectPool(ctx context.Context, req *gitaly
return nil, status.Error(codes.InvalidArgument, "no repository")
}
- if err := objectpool.Unlink(ctx, req.GetRepository()); err != nil {
+ pool, err := poolForRequest(req)
+ if err != nil {
+ return nil, err
+ }
+
+ if err := pool.Unlink(ctx, req.GetRepository()); err != nil {
return nil, err
}
diff --git a/internal/service/objectpool/link_test.go b/internal/service/objectpool/link_test.go
index 17a58e39c..bc8c55cc7 100644
--- a/internal/service/objectpool/link_test.go
+++ b/internal/service/objectpool/link_test.go
@@ -147,6 +147,7 @@ func TestUnlink(t *testing.T) {
desc: "Successful request",
req: &gitalypb.UnlinkRepositoryFromObjectPoolRequest{
Repository: testRepo,
+ ObjectPool: pool.ToProto(),
},
code: codes.OK,
},
@@ -161,6 +162,9 @@ func TestUnlink(t *testing.T) {
commit, err := log.GetCommit(ctx, testRepo, poolCommitID)
require.NoError(t, err)
require.Nil(t, commit)
+
+ remotes := testhelper.MustRunCommand(t, nil, "git", "-C", pool.FullPath(), "remote")
+ require.Len(t, remotes, 0)
}
})
}
@@ -185,7 +189,10 @@ func TestUnlinkIdempotent(t *testing.T) {
require.NoError(t, pool.Create(ctx, testRepo))
require.NoError(t, pool.Link(ctx, testRepo))
- request := &gitalypb.UnlinkRepositoryFromObjectPoolRequest{testRepo}
+ request := &gitalypb.UnlinkRepositoryFromObjectPoolRequest{
+ Repository: testRepo,
+ ObjectPool: pool.ToProto(),
+ }
_, err = client.UnlinkRepositoryFromObjectPool(ctx, request)
require.NoError(t, err)
diff --git a/internal/testhelper/testhelper.go b/internal/testhelper/testhelper.go
index 718b9682d..d7bfbff29 100644
--- a/internal/testhelper/testhelper.go
+++ b/internal/testhelper/testhelper.go
@@ -349,7 +349,7 @@ func createRepo(t *testing.T, storagePath string) (repo *gitalypb.Repository, re
require.NoError(t, err)
relativePath, err = filepath.Rel(storagePath, repoPath)
require.NoError(t, err)
- repo = &gitalypb.Repository{StorageName: "default", RelativePath: relativePath}
+ repo = &gitalypb.Repository{StorageName: "default", RelativePath: relativePath, GlRepository: "project-1"}
return repo, repoPath, relativePath
}
diff --git a/vendor/gitlab.com/gitlab-org/gitaly-proto/go/gitalypb/objectpool.pb.go b/vendor/gitlab.com/gitlab-org/gitaly-proto/go/gitalypb/objectpool.pb.go
index e48d315a6..0731d078c 100644
--- a/vendor/gitlab.com/gitlab-org/gitaly-proto/go/gitalypb/objectpool.pb.go
+++ b/vendor/gitlab.com/gitlab-org/gitaly-proto/go/gitalypb/objectpool.pb.go
@@ -133,6 +133,7 @@ func (*LinkRepositoryToObjectPoolResponse) Descriptor() ([]byte, []int) {
// from the pool participant. The caller is responsible no data loss occurs.
type UnlinkRepositoryFromObjectPoolRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
+ ObjectPool *ObjectPool `protobuf:"bytes,2,opt,name=object_pool,json=objectPool" json:"object_pool,omitempty"`
}
func (m *UnlinkRepositoryFromObjectPoolRequest) Reset() { *m = UnlinkRepositoryFromObjectPoolRequest{} }
@@ -149,6 +150,13 @@ func (m *UnlinkRepositoryFromObjectPoolRequest) GetRepository() *Repository {
return nil
}
+func (m *UnlinkRepositoryFromObjectPoolRequest) GetObjectPool() *ObjectPool {
+ if m != nil {
+ return m.ObjectPool
+ }
+ return nil
+}
+
type UnlinkRepositoryFromObjectPoolResponse struct {
}
@@ -349,26 +357,27 @@ var _ObjectPoolService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("objectpool.proto", fileDescriptor7) }
var fileDescriptor7 = []byte{
- // 331 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0xc1, 0x4e, 0xc2, 0x40,
- 0x18, 0x84, 0x29, 0x26, 0x1c, 0x7e, 0x3c, 0xe0, 0x5e, 0x20, 0x7b, 0x50, 0x6c, 0xd4, 0x20, 0x89,
- 0x3d, 0x94, 0x17, 0x30, 0xd1, 0x78, 0x32, 0x6a, 0xaa, 0xc6, 0x83, 0x07, 0x53, 0xf0, 0x0f, 0xae,
- 0xd6, 0xfe, 0x75, 0xbb, 0x98, 0xe0, 0xcd, 0xbb, 0x0f, 0xe5, 0xa3, 0x99, 0xd2, 0x96, 0x85, 0x36,
- 0x0b, 0x8d, 0xe1, 0xba, 0x9d, 0xce, 0x7c, 0xdd, 0x99, 0x14, 0x5a, 0x34, 0x7c, 0xc5, 0x91, 0x8a,
- 0x88, 0x02, 0x27, 0x92, 0xa4, 0x88, 0x35, 0xc6, 0x42, 0xf9, 0xc1, 0x94, 0x6f, 0xc7, 0x2f, 0xbe,
- 0xc4, 0xe7, 0xf4, 0xd4, 0x3e, 0x05, 0xb8, 0x9e, 0x29, 0x6f, 0x88, 0x02, 0xe6, 0x02, 0x48, 0x8c,
+ // 338 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0x41, 0x4f, 0xc2, 0x40,
+ 0x10, 0x85, 0x29, 0x26, 0x1c, 0x06, 0x0f, 0xb8, 0x17, 0xc8, 0x1e, 0x14, 0x1b, 0x35, 0x48, 0x62,
+ 0x0f, 0xe5, 0x0f, 0x98, 0x68, 0x3c, 0x19, 0x35, 0x55, 0xe3, 0xd1, 0x14, 0x9c, 0xe0, 0x6a, 0xed,
+ 0xd4, 0xed, 0x62, 0x82, 0x37, 0xef, 0x1e, 0xfc, 0x49, 0xfe, 0x34, 0x53, 0xda, 0xb2, 0xd0, 0x66,
+ 0xa1, 0x31, 0x5c, 0xa7, 0xaf, 0xef, 0x7d, 0x9d, 0x79, 0x29, 0xb4, 0x68, 0xf8, 0x82, 0x23, 0x15,
+ 0x11, 0x05, 0x4e, 0x24, 0x49, 0x11, 0x6b, 0x8c, 0x85, 0xf2, 0x83, 0x29, 0xdf, 0x8e, 0x9f, 0x7d,
+ 0x89, 0x4f, 0xe9, 0xd4, 0x3e, 0x05, 0xb8, 0x9e, 0x29, 0x6f, 0x88, 0x02, 0xe6, 0x02, 0x48, 0x8c,
0x28, 0x16, 0x8a, 0xe4, 0xb4, 0x63, 0x75, 0xad, 0x5e, 0xd3, 0x65, 0x4e, 0xfa, 0xa2, 0xe3, 0xcd,
- 0x9f, 0x78, 0x0b, 0x2a, 0xfb, 0x0b, 0xda, 0x67, 0x12, 0x7d, 0x85, 0xda, 0xc7, 0xc3, 0x8f, 0x09,
- 0xc6, 0x8a, 0x0d, 0xa0, 0x99, 0x62, 0x3c, 0x25, 0x1c, 0x45, 0xbf, 0x05, 0x3d, 0x90, 0x66, 0xe8,
+ 0x9f, 0x78, 0x0b, 0x2a, 0xfb, 0x13, 0xda, 0x67, 0x12, 0x7d, 0x85, 0xda, 0xc7, 0xc3, 0xf7, 0x09,
+ 0xc6, 0x8a, 0x0d, 0xa0, 0x99, 0x62, 0x3c, 0x26, 0x1c, 0x45, 0xbf, 0x05, 0x3d, 0x90, 0x66, 0xe8,
0x43, 0x83, 0xa4, 0x18, 0x8b, 0xb0, 0x53, 0x37, 0xe6, 0x67, 0x0a, 0x9b, 0x43, 0xa7, 0x9c, 0x1d,
0x47, 0x14, 0xc6, 0x68, 0x5f, 0x41, 0xfb, 0x1c, 0x03, 0xdc, 0x14, 0x57, 0x92, 0x55, 0xf6, 0xcb,
- 0xb2, 0x7e, 0x2c, 0xd8, 0xbf, 0x14, 0xe1, 0x9b, 0x46, 0xbc, 0xa3, 0x0d, 0x5d, 0xc7, 0x72, 0x25,
- 0xf5, 0x4a, 0x95, 0x1c, 0x80, 0xbd, 0x8a, 0x26, 0x83, 0x7e, 0x84, 0xc3, 0xfb, 0x30, 0x58, 0xd2,
- 0x5d, 0x48, 0x7a, 0x2f, 0x73, 0xff, 0x67, 0x15, 0x3d, 0x38, 0x5a, 0x67, 0x9e, 0x62, 0xb8, 0xbf,
- 0x5b, 0xb0, 0xa3, 0x8f, 0x6f, 0x51, 0x7e, 0x8a, 0x11, 0xb2, 0x07, 0x68, 0x15, 0x9b, 0x65, 0x7b,
- 0x79, 0xa6, 0x61, 0x6f, 0xbc, 0x6b, 0x16, 0x64, 0xdf, 0x5c, 0x4b, 0x8c, 0x8b, 0x35, 0x6a, 0x63,
- 0xc3, 0x60, 0xb4, 0xb1, 0x71, 0x01, 0x35, 0x36, 0x01, 0x6e, 0xbe, 0x74, 0x76, 0x9c, 0x3b, 0xac,
- 0x9d, 0x09, 0xef, 0x57, 0x91, 0xce, 0x63, 0xbf, 0x2d, 0xd8, 0x5d, 0x7d, 0xd3, 0xec, 0x24, 0x37,
- 0xac, 0x54, 0x37, 0x77, 0xaa, 0xca, 0x73, 0x86, 0x61, 0x63, 0xf6, 0x2f, 0x19, 0xfc, 0x05, 0x00,
- 0x00, 0xff, 0xff, 0x17, 0xc1, 0x10, 0xd9, 0x75, 0x04, 0x00, 0x00,
+ 0xb2, 0xbe, 0x2d, 0xd8, 0xbf, 0x14, 0xe1, 0xab, 0x46, 0xbc, 0xa3, 0x0d, 0xad, 0x63, 0xf9, 0x24,
+ 0xf5, 0x4a, 0x27, 0x39, 0x00, 0x7b, 0x15, 0x4d, 0x06, 0xfd, 0x63, 0xc1, 0xe1, 0x7d, 0x18, 0x2c,
+ 0x09, 0x2f, 0x24, 0xbd, 0x95, 0xc1, 0xff, 0x51, 0x8b, 0xe2, 0xc7, 0xd6, 0x2b, 0xed, 0xb8, 0x07,
+ 0x47, 0xeb, 0x88, 0x52, 0x78, 0xf7, 0x77, 0x0b, 0x76, 0xf4, 0xf8, 0x16, 0xe5, 0x87, 0x18, 0x21,
+ 0x7b, 0x80, 0x56, 0xb1, 0x0f, 0x6c, 0x2f, 0xcf, 0x34, 0xb4, 0x94, 0x77, 0xcd, 0x82, 0x6c, 0x53,
+ 0xb5, 0xc4, 0xb8, 0x78, 0x7c, 0x6d, 0x6c, 0xa8, 0x99, 0x36, 0x36, 0xf6, 0xa6, 0xc6, 0x26, 0xc0,
+ 0xcd, 0xa7, 0x62, 0xc7, 0xb9, 0xc3, 0xda, 0x72, 0xf1, 0x7e, 0x15, 0xe9, 0x3c, 0xf6, 0xcb, 0x82,
+ 0xdd, 0xd5, 0x9b, 0x66, 0x27, 0xb9, 0x61, 0xa5, 0x8e, 0x70, 0xa7, 0xaa, 0x3c, 0x67, 0x18, 0x36,
+ 0x66, 0x7f, 0xa0, 0xc1, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x09, 0x9c, 0xf6, 0xab, 0x04,
+ 0x00, 0x00,
}
diff --git a/vendor/vendor.json b/vendor/vendor.json
index f125aef60..47bad3ba1 100644
--- a/vendor/vendor.json
+++ b/vendor/vendor.json
@@ -315,12 +315,12 @@
"versionExact": "v1.2.2"
},
{
- "checksumSHA1": "K8ub2fUgYq2Sb3FbKPzGhv96UNo=",
+ "checksumSHA1": "5t/1h2cvv7Nbho0apE2ghr2K7L0=",
"path": "gitlab.com/gitlab-org/gitaly-proto/go/gitalypb",
- "revision": "ca09ca1e2da6dc957644fa95990e8a3d032d6252",
- "revisionTime": "2018-11-28T10:00:28Z",
- "version": "v1.3.0",
- "versionExact": "v1.3.0"
+ "revision": "8eb6120caacdbe12b0abd0c9125e2e319a7689dc",
+ "revisionTime": "2018-12-10T09:05:58Z",
+ "version": "v1.4.0",
+ "versionExact": "v1.4.0"
},
{
"checksumSHA1": "S9x46Eq79I1EkoXI8woeIU6w/wY=",