From 700a784bc91c0ee24cbe2f1c36589e40b92ac28d Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Fri, 26 Oct 2012 01:59:50 +0200 Subject: [PATCH] Refactor EditFileAction#update and rename it to commit! --- app/controllers/tree_controller.rb | 6 ++--- lib/gitlab/satellite/edit_file_action.rb | 32 ++++++++++++++++-------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/app/controllers/tree_controller.rb b/app/controllers/tree_controller.rb index 7b527041..725f48fa 100644 --- a/app/controllers/tree_controller.rb +++ b/app/controllers/tree_controller.rb @@ -26,14 +26,14 @@ class TreeController < ProjectResourceController end def update - file_editor = Gitlab::Satellite::EditFileAction.new(current_user, @project, @ref, @path) - update_status = file_editor.update( + edit_file_action = Gitlab::Satellite::EditFileAction.new(current_user, @project, @ref, @path) + updated_successfully = edit_file_action.commit!( params[:content], params[:commit_message], params[:last_commit] ) - if update_status + if updated_successfully redirect_to project_tree_path(@project, @id), notice: "Your changes have been successfully commited" else flash[:notice] = "Your changes could not be commited, because the file has been changed" diff --git a/lib/gitlab/satellite/edit_file_action.rb b/lib/gitlab/satellite/edit_file_action.rb index 0a5e753b..1e2a2163 100644 --- a/lib/gitlab/satellite/edit_file_action.rb +++ b/lib/gitlab/satellite/edit_file_action.rb @@ -5,25 +5,35 @@ module Gitlab # It gives you ability to make changes to files # & commit this changes from GitLab UI. class EditFileAction < Action - attr_accessor :path, :ref + attr_accessor :file_path, :ref - def initialize(user, project, ref, path) - super user, project - @path = path + def initialize(user, project, ref, file_path) + super user, project, git_timeout: 10.seconds + @file_path = file_path @ref = ref end - def update(content, commit_message, last_commit) + def commit!(content, commit_message, last_commit) return false unless can_edit?(last_commit) in_locked_and_timed_satellite do |repo| prepare_satellite!(repo) - repo.git.sh "git checkout -b #{ref} origin/#{ref}" - File.open(path, 'w'){|f| f.write(content)} - repo.git.sh "git add ." - repo.git.sh "git commit -am '#{commit_message}'" - output = repo.git.sh "git push origin #{ref}" + # create target branch in satellite at the corresponding commit from Gitolite + repo.git.checkout({raise: true, timeout: true, b: true}, ref, "origin/#{ref}") + + # update the file in the satellite's working dir + 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 true @@ -36,7 +46,7 @@ module Gitlab protected 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 end end