diff --git a/app/controllers/concerns/creates_commit.rb b/app/controllers/concerns/creates_commit.rb index 84b4a30c6d5..036805306f2 100644 --- a/app/controllers/concerns/creates_commit.rb +++ b/app/controllers/concerns/creates_commit.rb @@ -8,7 +8,8 @@ module CreatesCommit source_project: @project, source_branch: @ref, target_branch: @target_branch, - file_path: @path + file_path: @path, + previous_path: @previous_path ) result = service.new(@tree_edit_project, current_user, commit_params).execute diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 2b8e76d4638..fc608399fcb 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -44,7 +44,7 @@ class Projects::BlobController < Projects::ApplicationController "#file-path-#{hexdigest(@path)}" else unless params[:file_name] == @path - previous_path = @path + @previous_path = @path @path = params[:file_name] end namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @path)) diff --git a/app/models/repository.rb b/app/models/repository.rb index 5b670cb4b8f..709b5edd31e 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -731,6 +731,36 @@ class Repository end end + def update_file(user, path, previous_path, content, message, branch, update) + commit_with_hooks(user, branch) do |ref| + committer = user_to_committer(user) + options = {} + options[:committer] = committer + options[:author] = committer + options[:commit] = { + message: message, + branch: ref, + } + + if previous_path + options[:file] = { + path: previous_path + } + + + Gitlab::Git::Blob.remove(raw_repository, options) + end + + options[:file] = { + content: content, + path: path, + update: update + } + + Gitlab::Git::Blob.commit(raw_repository, options) + end + end + def remove_file(user, path, message, branch) commit_with_hooks(user, branch) do |ref| committer = user_to_committer(user) diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb index ac5d7ddde02..c8e66555c82 100644 --- a/app/services/files/base_service.rb +++ b/app/services/files/base_service.rb @@ -9,6 +9,7 @@ module Files @commit_message = params[:commit_message] @file_path = params[:file_path] + @previous_path = params[:previous_path] @file_content = if params[:file_content_encoding] == 'base64' Base64.decode64(params[:file_content]) else diff --git a/app/services/files/update_service.rb b/app/services/files/update_service.rb index 52451d72b57..6d015642b91 100644 --- a/app/services/files/update_service.rb +++ b/app/services/files/update_service.rb @@ -4,7 +4,7 @@ module Files class UpdateService < Files::BaseService def commit # Need to update file_path with the new filename - repository.commit_file(current_user, @file_path, @file_content, @commit_message, @target_branch, true) + repository.update_file(current_user, @file_path, @previous_path, @file_content, @commit_message, @target_branch, true) end end end