diff options
author | Ahmad Sherif <ahmad.m.sherif@gmail.com> | 2017-09-28 13:20:42 +0300 |
---|---|---|
committer | Ahmad Sherif <ahmad.m.sherif@gmail.com> | 2017-09-28 13:20:42 +0300 |
commit | 4d6180ee9d65e3bed74c27100d9d53a1414f3a20 (patch) | |
tree | cff152be573e69a0ddd916493ffab8475b0b552e | |
parent | 2c3e7ff85739577bbde2c7de8b0a604ee1a81ac1 (diff) | |
parent | f0bcc809a4ae904c0f60656b2ac5e7395d8a0df9 (diff) |
Merge branch 'zj-no-overwrite-namespaces' into 'master'
Don't overwrite namespaces while renaming
See merge request gitlab-org/gitaly!375
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | internal/service/namespace/namespace.go | 9 | ||||
-rw-r--r-- | internal/service/namespace/namespace_test.go | 9 |
3 files changed, 20 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 5592f91d6..b4948e5c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ v0.42.0 https://gitlab.com/gitlab-org/gitaly/merge_requests/374 - Return pre-receive errors in UserDeleteTag response https://gitlab.com/gitlab-org/gitaly/merge_requests/378 +- Check if we don't overwrite a namespace moved to gitaly + https://gitlab.com/gitlab-org/gitaly/merge_requests/375 v0.41.0 diff --git a/internal/service/namespace/namespace.go b/internal/service/namespace/namespace.go index 0f8c6d645..ebd284067 100644 --- a/internal/service/namespace/namespace.go +++ b/internal/service/namespace/namespace.go @@ -66,6 +66,15 @@ func (s *server) RenameNamespace(ctx context.Context, in *pb.RenameNamespaceRequ return nil, grpc.Errorf(codes.InvalidArgument, "from and to cannot be empty") } + // No need to check if the from path exists, if it doesn't, we'd later get an + // os.LinkError + toExistsCheck := &pb.NamespaceExistsRequest{StorageName: in.StorageName, Name: in.GetTo()} + if exists, err := s.NamespaceExists(ctx, toExistsCheck); err != nil { + return nil, err + } else if exists.Exists { + return nil, grpc.Errorf(codes.InvalidArgument, "to directory %s already exists", in.GetTo()) + } + err = os.Rename(namespacePath(storagePath, in.GetFrom()), namespacePath(storagePath, in.GetTo())) if _, ok := err.(*os.LinkError); ok { return nil, grpc.Errorf(codes.InvalidArgument, "from directory not found") diff --git a/internal/service/namespace/namespace_test.go b/internal/service/namespace/namespace_test.go index ca8875ddc..c051289a3 100644 --- a/internal/service/namespace/namespace_test.go +++ b/internal/service/namespace/namespace_test.go @@ -265,6 +265,15 @@ func TestRenameNamespace(t *testing.T) { }, errorCode: codes.InvalidArgument, }, + { + desc: "existing destination namespace", + request: &pb.RenameNamespaceRequest{ + From: "existing", + To: "existing", + StorageName: "default", + }, + errorCode: codes.InvalidArgument, + }, } _, err := client.AddNamespace(ctx, &pb.AddNamespaceRequest{"default", "existing"}) |