Commit 700a784b authored by Riyad Preukschas's avatar Riyad Preukschas

Refactor EditFileAction#update and rename it to commit!

parent 30801273
...@@ -26,14 +26,14 @@ class TreeController < ProjectResourceController ...@@ -26,14 +26,14 @@ class TreeController < ProjectResourceController
end end
def update def update
file_editor = Gitlab::Satellite::EditFileAction.new(current_user, @project, @ref, @path) edit_file_action = Gitlab::Satellite::EditFileAction.new(current_user, @project, @ref, @path)
update_status = file_editor.update( updated_successfully = edit_file_action.commit!(
params[:content], params[:content],
params[:commit_message], params[:commit_message],
params[:last_commit] params[:last_commit]
) )
if update_status if updated_successfully
redirect_to project_tree_path(@project, @id), notice: "Your changes have been successfully commited" redirect_to project_tree_path(@project, @id), notice: "Your changes have been successfully commited"
else else
flash[:notice] = "Your changes could not be commited, because the file has been changed" flash[:notice] = "Your changes could not be commited, because the file has been changed"
......
...@@ -5,25 +5,35 @@ module Gitlab ...@@ -5,25 +5,35 @@ module Gitlab
# It gives you ability to make changes to files # It gives you ability to make changes to files
# & commit this changes from GitLab UI. # & commit this changes from GitLab UI.
class EditFileAction < Action class EditFileAction < Action
attr_accessor :path, :ref attr_accessor :file_path, :ref
def initialize(user, project, ref, path) def initialize(user, project, ref, file_path)
super user, project super user, project, git_timeout: 10.seconds
@path = path @file_path = file_path
@ref = ref @ref = ref
end end
def update(content, commit_message, last_commit) def commit!(content, commit_message, last_commit)
return false unless can_edit?(last_commit) return false unless can_edit?(last_commit)
in_locked_and_timed_satellite do |repo| in_locked_and_timed_satellite do |repo|
prepare_satellite!(repo) prepare_satellite!(repo)
repo.git.sh "git checkout -b #{ref} origin/#{ref}" # create target branch in satellite at the corresponding commit from Gitolite
File.open(path, 'w'){|f| f.write(content)} repo.git.checkout({raise: true, timeout: true, b: true}, ref, "origin/#{ref}")
repo.git.sh "git add ."
repo.git.sh "git commit -am '#{commit_message}'" # update the file in the satellite's working dir
output = repo.git.sh "git push origin #{ref}" file_path_in_satellite = File.join(repo.working_dir, file_path)
File.open(file_path_in_satellite, 'w') { |f| f.write(content) }
# commit the changes
# will raise CommandFailed when commit fails
repo.git.commit(raise: true, timeout: true, a: true, m: commit_message)
# push commit back to Gitolite
# will raise CommandFailed when push fails
repo.git.push({raise: true, timeout: true}, :origin, ref)
# everything worked # everything worked
true true
...@@ -36,7 +46,7 @@ module Gitlab ...@@ -36,7 +46,7 @@ module Gitlab
protected protected
def can_edit?(last_commit) def can_edit?(last_commit)
current_last_commit = @project.last_commit_for(ref, path).sha current_last_commit = @project.last_commit_for(ref, file_path).sha
last_commit == current_last_commit last_commit == current_last_commit
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment