New Upstream Release - golang-gitaly-proto

Ready changes

Summary

Merged new upstream version: 1.39.0 (was: 1.37.0+dfsg).

Resulting package

Built on 2022-03-14T16:14 (took 3m27s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases golang-gitaly-proto-devapt install -t fresh-releases ruby-gitaly

Lintian Result

Diff

diff --git a/VERSION b/VERSION
index bf50e91..5edffce 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.37.0
+1.39.0
diff --git a/blob.proto b/blob.proto
index fe50c76..b9e7167 100644
--- a/blob.proto
+++ b/blob.proto
@@ -11,19 +11,34 @@ service BlobService {
   // ID. We use a stream to return a chunked arbitrarily large binary
   // response
   rpc GetBlob(GetBlobRequest) returns (stream GetBlobResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc GetBlobs(GetBlobsRequest) returns (stream GetBlobsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc GetLFSPointers(GetLFSPointersRequest) returns (stream GetLFSPointersResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc GetNewLFSPointers(GetNewLFSPointersRequest) returns (stream GetNewLFSPointersResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc GetAllLFSPointers(GetAllLFSPointersRequest) returns (stream GetAllLFSPointersResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 }
 
diff --git a/commit.proto b/commit.proto
index d4c5bb4..80c4578 100644
--- a/commit.proto
+++ b/commit.proto
@@ -9,76 +9,142 @@ import "google/protobuf/timestamp.proto";
 
 service CommitService {
   rpc CommitIsAncestor(CommitIsAncestorRequest) returns (CommitIsAncestorResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc TreeEntry(TreeEntryRequest) returns (stream TreeEntryResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CommitsBetween(CommitsBetweenRequest) returns (stream CommitsBetweenResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CountCommits(CountCommitsRequest) returns (CountCommitsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CountDivergingCommits(CountDivergingCommitsRequest) returns (CountDivergingCommitsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc GetTreeEntries(GetTreeEntriesRequest) returns (stream GetTreeEntriesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc ListFiles(ListFilesRequest) returns (stream ListFilesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc FindCommit(FindCommitRequest) returns (FindCommitResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CommitStats(CommitStatsRequest) returns (CommitStatsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   // Use a stream to paginate the result set
   rpc FindAllCommits(FindAllCommitsRequest) returns (stream FindAllCommitsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc FindCommits(FindCommitsRequest) returns (stream FindCommitsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CommitLanguages(CommitLanguagesRequest) returns (CommitLanguagesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc RawBlame(RawBlameRequest) returns (stream RawBlameResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc LastCommitForPath(LastCommitForPathRequest) returns (LastCommitForPathResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc ListLastCommitsForTree(ListLastCommitsForTreeRequest) returns (stream ListLastCommitsForTreeResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CommitsByMessage(CommitsByMessageRequest) returns (stream CommitsByMessageResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc ListCommitsByOid(ListCommitsByOidRequest) returns (stream ListCommitsByOidResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc ListCommitsByRefName(ListCommitsByRefNameRequest) returns (stream ListCommitsByRefNameResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc FilterShasWithSignatures(stream FilterShasWithSignaturesRequest) returns (stream FilterShasWithSignaturesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 
   // ExtractCommitSignature returns a stream because the signed text may be
   // arbitrarily large and signature verification is impossible without the
   // full text.
   rpc ExtractCommitSignature(ExtractCommitSignatureRequest) returns (stream ExtractCommitSignatureResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc GetCommitSignatures(GetCommitSignaturesRequest) returns (stream GetCommitSignaturesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 
   rpc GetCommitMessages(GetCommitMessagesRequest) returns (stream GetCommitMessagesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 }
 
diff --git a/conflicts.proto b/conflicts.proto
index 8e93abe..1dc1efd 100644
--- a/conflicts.proto
+++ b/conflicts.proto
@@ -8,7 +8,10 @@ import "shared.proto";
 
 service ConflictsService {
   rpc ListConflictFiles(ListConflictFilesRequest) returns (stream ListConflictFilesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc ResolveConflicts(stream ResolveConflictsRequest) returns (ResolveConflictsResponse) {
     option (op_type) = {
diff --git a/debian/changelog b/debian/changelog
index d7ff204..44435c0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+golang-gitaly-proto (1.39.0-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Mon, 14 Mar 2022 16:11:53 -0000
+
 golang-gitaly-proto (1.37.0+dfsg-1) unstable; urgency=medium
 
   [ Pirate Praveen ]
diff --git a/debian/patches/remove-git-in-gemspec.patch b/debian/patches/remove-git-in-gemspec.patch
index 622723e..e8a0f39 100644
--- a/debian/patches/remove-git-in-gemspec.patch
+++ b/debian/patches/remove-git-in-gemspec.patch
@@ -1,8 +1,10 @@
 Debian build env does not have git
 
---- a/gitaly-proto.gemspec
-+++ b/gitaly-proto.gemspec
-@@ -15,7 +15,7 @@
+Index: golang-gitaly-proto/gitaly-proto.gemspec
+===================================================================
+--- golang-gitaly-proto.orig/gitaly-proto.gemspec
++++ golang-gitaly-proto/gitaly-proto.gemspec
+@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
    spec.homepage      = "https://gitlab.com/gitlab-org/gitaly-proto"
    spec.license       = "MIT"
  
diff --git a/diff.proto b/diff.proto
index b6ba0c1..5a42730 100644
--- a/diff.proto
+++ b/diff.proto
@@ -9,23 +9,41 @@ import "shared.proto";
 service DiffService {
   // Returns stream of CommitDiffResponse with patches chunked over messages
   rpc CommitDiff(CommitDiffRequest) returns (stream CommitDiffResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   // Return a stream so we can divide the response in chunks of deltas
   rpc CommitDelta(CommitDeltaRequest) returns (stream CommitDeltaResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CommitPatch(CommitPatchRequest) returns (stream CommitPatchResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc RawDiff(RawDiffRequest) returns (stream RawDiffResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc RawPatch(RawPatchRequest) returns (stream RawPatchResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc DiffStats(DiffStatsRequest) returns (stream DiffStatsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 }
 
diff --git a/go/VERSION b/go/VERSION
index bf50e91..5edffce 100644
--- a/go/VERSION
+++ b/go/VERSION
@@ -1 +1 @@
-1.37.0
+1.39.0
diff --git a/go/internal/linter/lint_test.go b/go/internal/linter/lint_test.go
index db55907..9a2595d 100644
--- a/go/internal/linter/lint_test.go
+++ b/go/internal/linter/lint_test.go
@@ -26,7 +26,7 @@ func TestLintFile(t *testing.T) {
 			errs: []error{
 				errors.New(`go/internal/linter/testdata/invalid.proto: Method "InvalidMethod0": missing op_type option`),
 				errors.New(`go/internal/linter/testdata/invalid.proto: Method "InvalidMethod1": op set to UNKNOWN`),
-				errors.New(`go/internal/linter/testdata/invalid.proto: Method "InvalidMethod2": accessors cannot specify target repos`),
+				errors.New(`go/internal/linter/testdata/invalid.proto: Method "InvalidMethod2": missing target repository field`),
 				errors.New(`go/internal/linter/testdata/invalid.proto: Method "InvalidMethod3": server level scoped RPC should not specify target repo`),
 				errors.New(`go/internal/linter/testdata/invalid.proto: Method "InvalidMethod4": missing target repository field`),
 				errors.New(`go/internal/linter/testdata/invalid.proto: Method "InvalidMethod5": unable to parse target field OID 🐛: strconv.Atoi: parsing "🐛": invalid syntax`),
diff --git a/go/internal/linter/method.go b/go/internal/linter/method.go
index 3d4b264..1a502f7 100644
--- a/go/internal/linter/method.go
+++ b/go/internal/linter/method.go
@@ -21,9 +21,15 @@ type methodLinter struct {
 // validateAccessor will ensure the accessor method does not specify a target
 // repo
 func (ml methodLinter) validateAccessor() error {
-	if ml.opMsg.GetTargetRepositoryField() != "" {
-		return errors.New("accessors cannot specify target repos")
+	switch ml.opMsg.GetScopeLevel() {
+	case gitalypb.OperationMsg_REPOSITORY:
+		return ml.ensureValidRepoScope()
+		// TODO: replace the following value with gitalypb.OpermationMsg_STORAGE
+		// after this change is merged into master
+	case gitalypb.OperationMsg_Scope(2):
+		return ml.ensureValidStorageScope()
 	}
+
 	return nil
 }
 
@@ -39,12 +45,25 @@ func (ml methodLinter) validateMutator() error {
 	case gitalypb.OperationMsg_SERVER:
 		return ml.ensureValidServerScope()
 
+		// TODO: replace value with gitalypb.OperationMsg_SCOPE after
+		// this change is merged to master
+	case gitalypb.OperationMsg_Scope(2):
+		return ml.ensureValidStorageScope()
+
 	default:
 		return fmt.Errorf("unknown operation scope level %d", scope)
 
 	}
 }
 
+// TODO: add checks for storage location via valid field annotation for Gitaly HA
+func (ml methodLinter) ensureValidStorageScope() error {
+	if ml.opMsg.GetTargetRepositoryField() != "" {
+		return errors.New("storage level scoped RPC should not specify target repo")
+	}
+	return nil
+}
+
 func (ml methodLinter) ensureValidServerScope() error {
 	if ml.opMsg.GetTargetRepositoryField() != "" {
 		return errors.New("server level scoped RPC should not specify target repo")
diff --git a/go/internal/linter/testdata/invalid.proto b/go/internal/linter/testdata/invalid.proto
index c2032d8..d7773ac 100644
--- a/go/internal/linter/testdata/invalid.proto
+++ b/go/internal/linter/testdata/invalid.proto
@@ -19,20 +19,17 @@ message InvalidNestedRequest{
 service InvalidService {
   // should fail if op_type extension is missing
   rpc InvalidMethod0(InvalidMethodRequest) returns (InvalidMethodResponse) {}
-  
+
   // should fail if op type is unknown
   rpc InvalidMethod1(InvalidMethodRequest) returns (InvalidMethodResponse) {
     option (gitaly.op_type).op = UNKNOWN;
   }
-  
-  // should fail if target repo is provided for accessor
+  // should fail if target repo is not provided for accessor
   rpc InvalidMethod2(InvalidMethodRequest) returns (InvalidMethodResponse) {
     option (gitaly.op_type) = {
       op: ACCESSOR
-      target_repository_field: "1"
     };
   }
-  
   // should fail if target repo is provided for server-scoped mutator
   rpc InvalidMethod3(InvalidMethodRequest) returns (InvalidMethodResponse) {
     option (gitaly.op_type) = {
@@ -41,12 +38,10 @@ service InvalidService {
       target_repository_field: "1"
     };
   }
-  
   // should fail if missing either target repo or non-repo-scope for mutator
   rpc InvalidMethod4(InvalidMethodRequest) returns (InvalidMethodResponse) {
     option (gitaly.op_type).op = MUTATOR;
   }
-  
   // should fail if target repo is incorrectly formatted for mutator
   rpc InvalidMethod5(InvalidMethodRequest) returns (InvalidMethodResponse) {
     option (gitaly.op_type) = {
@@ -54,7 +49,6 @@ service InvalidService {
       target_repository_field: "🐛"
     };
   }
-  
   // should fail if target field specified does not exist in request message
   rpc InvalidMethod6(InvalidMethodRequest) returns (InvalidMethodResponse) {
     option (gitaly.op_type) = {
@@ -62,7 +56,6 @@ service InvalidService {
       target_repository_field: "1"
     };
   }
-  
   // should fail if target field type is not of type Repository
   rpc InvalidMethod7(InvalidTargetType) returns (InvalidMethodResponse) {
     option (gitaly.op_type) = {
@@ -70,7 +63,6 @@ service InvalidService {
       target_repository_field: "1"
     };
   }
-  
   // should fail if request message is not deep enough for specified OID
   rpc InvalidMethod8(InvalidTargetType) returns (InvalidMethodResponse) {
     option (gitaly.op_type) = {
@@ -78,7 +70,6 @@ service InvalidService {
       target_repository_field: "1.1"
     };
   }
-  
   // should fail if nested target field type is missing
   rpc InvalidMethod9(InvalidNestedRequest) returns (InvalidMethodResponse) {
     option (gitaly.op_type) = {
@@ -86,7 +77,6 @@ service InvalidService {
       target_repository_field: "1.2"
     };
   }
-  
   // should fail if nested target field type is not of type Repository
   rpc InvalidMethod10(InvalidNestedRequest) returns (InvalidMethodResponse) {
     option (gitaly.op_type) = {
diff --git a/go/internal/linter/testdata/valid.proto b/go/internal/linter/testdata/valid.proto
index d98d570..bdba8c3 100644
--- a/go/internal/linter/testdata/valid.proto
+++ b/go/internal/linter/testdata/valid.proto
@@ -28,7 +28,10 @@ message ValidInnerNestedRequest {
 
 service ValidService {
   rpc TestMethod(ValidRequest) returns (ValidResponse) {
-    option (gitaly.op_type).op = ACCESSOR;
+    option (gitaly.op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   
   rpc TestMethod2(ValidRequest) returns (ValidResponse) {
diff --git a/namespace.proto b/namespace.proto
index e863df0..991af39 100644
--- a/namespace.proto
+++ b/namespace.proto
@@ -10,23 +10,26 @@ service NamespaceService {
   rpc AddNamespace(AddNamespaceRequest) returns (AddNamespaceResponse) {
     option (op_type) = {
       op: MUTATOR
-      scope_level: SERVER,
+      scope_level: STORAGE,
     };
   }
   rpc RemoveNamespace(RemoveNamespaceRequest) returns (RemoveNamespaceResponse) {
     option (op_type) = {
       op: MUTATOR
-      scope_level: SERVER,
+      scope_level: STORAGE,
     };
   }
   rpc RenameNamespace(RenameNamespaceRequest) returns (RenameNamespaceResponse) {
     option (op_type) = {
       op: MUTATOR
-      scope_level: SERVER,
+      scope_level: STORAGE,
     };
   }
   rpc NamespaceExists(NamespaceExistsRequest) returns (NamespaceExistsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      scope_level: STORAGE,
+    };
   }
 }
 
diff --git a/ref.proto b/ref.proto
index bd95a16..df69079 100644
--- a/ref.proto
+++ b/ref.proto
@@ -10,34 +10,61 @@ import "google/protobuf/timestamp.proto";
 
 service RefService {
   rpc FindDefaultBranchName(FindDefaultBranchNameRequest) returns (FindDefaultBranchNameResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc FindAllBranchNames(FindAllBranchNamesRequest) returns (stream FindAllBranchNamesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
 
   }
   rpc FindAllTagNames(FindAllTagNamesRequest) returns (stream FindAllTagNamesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   // Find a Ref matching the given constraints. Response may be empty.
   rpc FindRefName(FindRefNameRequest) returns (FindRefNameResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   // Return a stream so we can divide the response in chunks of branches
   rpc FindLocalBranches(FindLocalBranchesRequest) returns (stream FindLocalBranchesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc FindAllBranches(FindAllBranchesRequest) returns (stream FindAllBranchesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc FindAllTags(FindAllTagsRequest) returns (stream FindAllTagsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc FindAllRemoteBranches(FindAllRemoteBranchesRequest) returns (stream FindAllRemoteBranchesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc RefExists(RefExistsRequest) returns (RefExistsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CreateBranch(CreateBranchRequest) returns (CreateBranchResponse) {
     option (op_type) = {
@@ -52,7 +79,10 @@ service RefService {
     };
   }
   rpc FindBranch(FindBranchRequest) returns (FindBranchResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc DeleteRefs(DeleteRefsRequest) returns (DeleteRefsResponse) {
     option (op_type) = {
@@ -62,23 +92,38 @@ service RefService {
   }
 
   rpc ListBranchNamesContainingCommit(ListBranchNamesContainingCommitRequest) returns (stream ListBranchNamesContainingCommitResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc ListTagNamesContainingCommit(ListTagNamesContainingCommitRequest) returns (stream ListTagNamesContainingCommitResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 
   rpc GetTagMessages(GetTagMessagesRequest) returns (stream GetTagMessagesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 
   // Returns commits that are only reachable from the ref passed
   rpc ListNewCommits(ListNewCommitsRequest) returns (stream ListNewCommitsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 
   rpc ListNewBlobs(ListNewBlobsRequest) returns (stream ListNewBlobsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc PackRefs(PackRefsRequest) returns (PackRefsResponse) {
     option (op_type) = {
diff --git a/remote.proto b/remote.proto
index 799b014..766abce 100644
--- a/remote.proto
+++ b/remote.proto
@@ -33,13 +33,22 @@ service RemoteService {
       };
     }
     rpc FindRemoteRepository(FindRemoteRepositoryRequest) returns (FindRemoteRepositoryResponse) {
-      option (op_type).op = ACCESSOR;
+      option (op_type) = {
+        op: ACCESSOR
+        scope_level: SERVER
+      };
     }
     rpc FindRemoteRootRef(FindRemoteRootRefRequest) returns (FindRemoteRootRefResponse) {
-      option (op_type).op = ACCESSOR;
+      option (op_type) = {
+        op: ACCESSOR
+        target_repository_field: "1"
+      };
     }
     rpc ListRemotes(ListRemotesRequest) returns (stream ListRemotesResponse) {
-      option (op_type).op = ACCESSOR;
+      option (op_type) = {
+        op: ACCESSOR
+        target_repository_field: "1"
+      };
     }
 }
 
diff --git a/repository-service.proto b/repository-service.proto
index 42a868e..f2dcb73 100644
--- a/repository-service.proto
+++ b/repository-service.proto
@@ -8,7 +8,10 @@ import "shared.proto";
 
 service RepositoryService {
   rpc RepositoryExists(RepositoryExistsRequest) returns (RepositoryExistsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc RepackIncremental(RepackIncrementalRequest) returns (RepackIncrementalResponse) {
     option (op_type) = {
@@ -59,7 +62,10 @@ service RepositoryService {
     };
   }
   rpc HasLocalBranches(HasLocalBranchesRequest) returns (HasLocalBranchesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc FetchSourceBranch(FetchSourceBranchRequest) returns (FetchSourceBranchResponse) {
     option (op_type) = {
@@ -80,7 +86,10 @@ service RepositoryService {
     };
   }
   rpc FindMergeBase(FindMergeBaseRequest) returns (FindMergeBaseResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CreateFork(CreateForkRequest) returns (CreateForkResponse) {
     option (op_type) = {
@@ -89,10 +98,16 @@ service RepositoryService {
     };
   }
   rpc IsRebaseInProgress(IsRebaseInProgressRequest) returns (IsRebaseInProgressResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc IsSquashInProgress(IsSquashInProgressRequest) returns (IsSquashInProgressResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 
   rpc CreateRepositoryFromURL(CreateRepositoryFromURLRequest) returns (CreateRepositoryFromURLResponse) {
@@ -132,13 +147,22 @@ service RepositoryService {
     };
   }
   rpc FindLicense(FindLicenseRequest) returns (FindLicenseResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc GetInfoAttributes(GetInfoAttributesRequest) returns (stream GetInfoAttributesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CalculateChecksum(CalculateChecksumRequest) returns (CalculateChecksumResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc Cleanup(CleanupRequest) returns (CleanupResponse) {
     option (op_type) = {
@@ -147,7 +171,10 @@ service RepositoryService {
     };
   }
   rpc GetSnapshot(GetSnapshotRequest) returns (stream GetSnapshotResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CreateRepositoryFromSnapshot(CreateRepositoryFromSnapshotRequest) returns (CreateRepositoryFromSnapshotResponse) {
     option (op_type) = {
@@ -156,13 +183,22 @@ service RepositoryService {
     };
   }
   rpc GetRawChanges(GetRawChangesRequest) returns (stream GetRawChangesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc SearchFilesByContent(SearchFilesByContentRequest) returns (stream SearchFilesByContentResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc SearchFilesByName(SearchFilesByNameRequest) returns (stream SearchFilesByNameResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc RestoreCustomHooks(stream RestoreCustomHooksRequest) returns (RestoreCustomHooksResponse) {
     option (op_type) = {
@@ -171,7 +207,10 @@ service RepositoryService {
     };
   }
   rpc BackupCustomHooks(BackupCustomHooksRequest) returns (stream BackupCustomHooksResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc PreFetch(PreFetchRequest) returns (PreFetchResponse) {
     option (op_type) = {
@@ -186,7 +225,10 @@ service RepositoryService {
     };
   }
   rpc GetObjectDirectorySize(GetObjectDirectorySizeRequest) returns (GetObjectDirectorySizeResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc CloneFromPool(CloneFromPoolRequest) returns (CloneFromPoolResponse) {
     option (op_type) = {
diff --git a/ruby/lib/gitaly/version.rb b/ruby/lib/gitaly/version.rb
index 4691f7b..530ea76 100644
--- a/ruby/lib/gitaly/version.rb
+++ b/ruby/lib/gitaly/version.rb
@@ -1,4 +1,4 @@
-# This file was auto-generated by ./_support/release
+# This file was auto-generated by _support/release
 module Gitaly
-  VERSION = "1.37.0"
+  VERSION = "1.39.0"
 end
diff --git a/server.proto b/server.proto
index 9d383c7..257382b 100644
--- a/server.proto
+++ b/server.proto
@@ -8,7 +8,10 @@ import "shared.proto";
 
 service ServerService {
   rpc ServerInfo(ServerInfoRequest) returns (ServerInfoResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      scope_level: SERVER
+    };
   }
 }
 
diff --git a/shared.proto b/shared.proto
index 619b0dd..9ba38b8 100644
--- a/shared.proto
+++ b/shared.proto
@@ -19,11 +19,13 @@ message OperationMsg {
   enum Scope {
     REPOSITORY = 0;
     SERVER = 1;
+    STORAGE = 2;
   }
   
-  // Scope level indicates how a mutating RPC affects Gitaly:
-  //   - REPOSITORY: mutation is scoped to only a single repo
-  //   - SERVER: mutation affects the entire server and potentially all repos
+  // Scope level indicates what level an RPC interacts with a server:
+  //   - REPOSITORY: scoped to only a single repo
+  //   - SERVER: affects the entire server and potentially all repos
+  //   - STORAGE: scoped to a specific storage location and all repos within
   Scope scope_level = 2;
   
   // If this operation modifies a repository, this field will
diff --git a/smarthttp.proto b/smarthttp.proto
index 094692e..8138496 100644
--- a/smarthttp.proto
+++ b/smarthttp.proto
@@ -11,7 +11,10 @@ service SmartHTTPService {
   // Will be invoked when the user executes a `git fetch`, meaning the server
   // will upload the packs to that user. The user doesn't upload new objects.
   rpc InfoRefsUploadPack(InfoRefsRequest) returns (stream InfoRefsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 
   // The response body for GET /info/refs?service=git-receive-pack
@@ -26,7 +29,10 @@ service SmartHTTPService {
 
   // Request and response body for POST /upload-pack
   rpc PostUploadPack(stream PostUploadPackRequest) returns (stream PostUploadPackResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 
   // Request and response body for POST /receive-pack
diff --git a/ssh.proto b/ssh.proto
index 63c538e..ab5af76 100644
--- a/ssh.proto
+++ b/ssh.proto
@@ -9,7 +9,10 @@ import "shared.proto";
 service SSHService {
   // To forward 'git upload-pack' to Gitaly for SSH sessions
   rpc SSHUploadPack(stream SSHUploadPackRequest) returns (stream SSHUploadPackResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 
   // To forward 'git receive-pack' to Gitaly for SSH sessions
diff --git a/storage.proto b/storage.proto
index 69385c4..03ad0cb 100644
--- a/storage.proto
+++ b/storage.proto
@@ -9,14 +9,14 @@ import "shared.proto";
 service StorageService {
   rpc ListDirectories(ListDirectoriesRequest) returns (stream ListDirectoriesResponse) {
     option (op_type) = {
-      op: MUTATOR
-      scope_level: SERVER,
+      op: ACCESSOR,
+      scope_level: STORAGE,
     };
   }
   rpc DeleteAllRepositories(DeleteAllRepositoriesRequest) returns (DeleteAllRepositoriesResponse) {
     option (op_type) = {
-      op: MUTATOR
-      scope_level: SERVER,
+      op: MUTATOR,
+      scope_level: STORAGE,
     };
   }
 }
diff --git a/wiki.proto b/wiki.proto
index 7866241..c183da6 100644
--- a/wiki.proto
+++ b/wiki.proto
@@ -8,7 +8,10 @@ option go_package = "gitlab.com/gitlab-org/gitaly-proto/go/gitalypb";
 
 service WikiService {
   rpc WikiGetPageVersions(WikiGetPageVersionsRequest) returns (stream WikiGetPageVersionsResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc WikiWritePage(stream WikiWritePageRequest) returns (WikiWritePageResponse) {
     option (op_type) = {
@@ -30,19 +33,36 @@ service WikiService {
   }
   // WikiFindPage returns a stream because the page's raw_data field may be arbitrarily large.
   rpc WikiFindPage(WikiFindPageRequest) returns (stream WikiFindPageResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc WikiFindFile(WikiFindFileRequest) returns (stream WikiFindFileResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
   rpc WikiGetAllPages(WikiGetAllPagesRequest) returns (stream WikiGetAllPagesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
+
   }
   rpc WikiListPages(WikiListPagesRequest) returns (stream WikiListPagesResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
+
   }
   rpc WikiGetFormattedData(WikiGetFormattedDataRequest) returns (stream WikiGetFormattedDataResponse) {
-    option (op_type).op = ACCESSOR;
+    option (op_type) = {
+      op: ACCESSOR
+      target_repository_field: "1"
+    };
   }
 }
 

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/blob_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/blob_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/cleanup_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/cleanup_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/commit_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/commit_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/conflicts_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/conflicts_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/diff_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/diff_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/namespace_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/namespace_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/objectpool_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/objectpool_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/operations_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/operations_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/ref_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/ref_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/remote_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/remote_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/repository-service_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/repository-service_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/server_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/server_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/shared_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/smarthttp_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/smarthttp_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/ssh_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/ssh_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/storage_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/storage_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/version.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/wiki_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.39.0/ruby/lib/gitaly/wiki_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/specifications/gitaly-proto-1.39.0.gemspec

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/blob_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/blob_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/cleanup_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/cleanup_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/commit_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/commit_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/conflicts_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/conflicts_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/diff_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/diff_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/namespace_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/namespace_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/objectpool_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/objectpool_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/operations_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/operations_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/ref_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/ref_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/remote_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/remote_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/repository-service_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/repository-service_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/server_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/server_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/shared_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/smarthttp_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/smarthttp_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/ssh_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/ssh_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/storage_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/storage_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/version.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/wiki_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/gems/gitaly-proto-1.37.0/ruby/lib/gitaly/wiki_services_pb.rb
-rw-r--r--  root/root   /usr/share/rubygems-integration/all/specifications/gitaly-proto-1.37.0.gemspec

No differences were encountered between the control files of package golang-gitaly-proto-dev

No differences were encountered between the control files of package ruby-gitaly

More details

Full run details