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:
authorJustin Tobler <jtobler@gitlab.com>2023-11-22 00:37:59 +0300
committerJustin Tobler <jtobler@gitlab.com>2023-11-22 00:46:57 +0300
commit939c82aa9f52d3d5c37b6a7d0b67cb3619fb8162 (patch)
tree65bc9a1a1bc76e63632e2cdee9af728ef2168592
parentf8dc4454c638feff57efb9ade3fa8ed1b2552cea (diff)
repository: Add resolved address to `CreateRepositoryFromURL` error
The `CreateRepositoryFromURL` RPC may have a resolved address set in its request to mitigate DNS rebinding. In the event the underlying `git-clone(1)` process returns an error, append the resolved address as structured error metadata for debugging.
-rw-r--r--internal/gitaly/service/repository/create_repository_from_url.go5
-rw-r--r--internal/gitaly/service/repository/create_repository_from_url_test.go21
2 files changed, 20 insertions, 6 deletions
diff --git a/internal/gitaly/service/repository/create_repository_from_url.go b/internal/gitaly/service/repository/create_repository_from_url.go
index 1afb76a0e..8f98618e7 100644
--- a/internal/gitaly/service/repository/create_repository_from_url.go
+++ b/internal/gitaly/service/repository/create_repository_from_url.go
@@ -102,7 +102,10 @@ func (s *server) CreateRepositoryFromURL(ctx context.Context, req *gitalypb.Crea
}
if err := cmd.Wait(); err != nil {
- return fmt.Errorf("cloning repository: %w, stderr: %q", err, stderr.String())
+ return structerr.NewInternal("cloning repository: %w", err).WithMetadataItems(
+ structerr.MetadataItem{Key: "stderr", Value: stderr.String()},
+ structerr.MetadataItem{Key: "resolved_address", Value: req.GetResolvedAddress()},
+ )
}
if err := s.removeOriginInRepo(ctx, repo); err != nil {
diff --git a/internal/gitaly/service/repository/create_repository_from_url_test.go b/internal/gitaly/service/repository/create_repository_from_url_test.go
index 02c71223b..eb5e609ce 100644
--- a/internal/gitaly/service/repository/create_repository_from_url_test.go
+++ b/internal/gitaly/service/repository/create_repository_from_url_test.go
@@ -181,8 +181,14 @@ func TestCreateRepositoryFromURL_redirect(t *testing.T) {
require.True(t, httpServerState.serverVisited, "git command should make the initial HTTP request")
require.False(t, httpServerState.serverVisitedAfterRedirect, "git command should not follow HTTP redirection")
- require.Error(t, err)
- require.Contains(t, err.Error(), "The requested URL returned error: 301")
+ testhelper.RequireStatusWithErrorMetadataRegexp(t,
+ structerr.NewInternal("creating repository: cloning repository: exit status 128"),
+ err,
+ map[string]string{
+ "stderr": "The requested URL returned error: 301",
+ "resolved_address": "",
+ },
+ )
}
func TestCreateRepositoryFromURL_fsck(t *testing.T) {
@@ -214,9 +220,14 @@ func TestCreateRepositoryFromURL_fsck(t *testing.T) {
Repository: targetRepoProto,
Url: "file://" + sourceRepoPath,
})
- require.Error(t, err)
- testhelper.RequireGrpcCode(t, err, codes.Internal)
- require.Contains(t, err.Error(), "duplicateEntries: contains duplicate file entries")
+ testhelper.RequireStatusWithErrorMetadataRegexp(t,
+ structerr.NewInternal("creating repository: cloning repository: exit status 128"),
+ err,
+ map[string]string{
+ "stderr": "duplicateEntries: contains duplicate file entries",
+ "resolved_address": "",
+ },
+ )
}
func TestServer_CloneFromURLCommand(t *testing.T) {