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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/repository.rb57
1 files changed, 39 insertions, 18 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 7a7236993a8..2e706b770b2 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -738,19 +738,11 @@ class Repository
message:, branch_name:,
author_email: nil, author_name: nil,
source_branch_name: nil, source_project: project)
- if branch_exists?(branch_name)
- # tree_entry is private
- entry = raw_repository.send(:tree_entry, commit(branch_name), path)
-
- if entry
- if entry[:type] == :blob
- raise Gitlab::Git::Repository::InvalidBlobName.new(
- "Directory already exists as a file")
- else
- raise Gitlab::Git::Repository::InvalidBlobName.new(
- "Directory already exists")
- end
- end
+ check_tree_entry_for_dir(branch_name, path)
+
+ if source_branch_name
+ source_project.repository.
+ check_tree_entry_for_dir(source_branch_name, path)
end
commit_file(
@@ -773,11 +765,16 @@ class Repository
message:, branch_name:, update: true,
author_email: nil, author_name: nil,
source_branch_name: nil, source_project: project)
- if branch_exists?(branch_name) && update == false
- # tree_entry is private
- if raw_repository.send(:tree_entry, commit(branch_name), path)
- raise Gitlab::Git::Repository::InvalidBlobName.new(
- "Filename already exists; update not allowed")
+ unless update
+ error_message = "Filename already exists; update not allowed"
+
+ if tree_entry_at(branch_name, path)
+ raise Gitlab::Git::Repository::InvalidBlobName.new(error_message)
+ end
+
+ if source_branch_name &&
+ source_project.repository.tree_entry_at(source_branch_name, path)
+ raise Gitlab::Git::Repository::InvalidBlobName.new(error_message)
end
end
@@ -1140,6 +1137,30 @@ class Repository
end
end
+ protected
+
+ def tree_entry_at(branch_name, path)
+ branch_exists?(branch_name) &&
+ # tree_entry is private
+ raw_repository.send(:tree_entry, commit(branch_name), path)
+ end
+
+ def check_tree_entry_for_dir(branch_name, path)
+ return unless branch_exists?(branch_name)
+
+ entry = tree_entry_at(branch_name, path)
+
+ return unless entry
+
+ if entry[:type] == :blob
+ raise Gitlab::Git::Repository::InvalidBlobName.new(
+ "Directory already exists as a file")
+ else
+ raise Gitlab::Git::Repository::InvalidBlobName.new(
+ "Directory already exists")
+ end
+ end
+
private
def git_action(index, action)