From 42bdfd021ba8cc8b634a23e3c5c2ac605f4c602c Mon Sep 17 00:00:00 2001 From: Valeriy Sizov Date: Fri, 12 Oct 2012 17:14:52 +0300 Subject: [PATCH] WebEditor: base implementation --- app/controllers/tree_controller.rb | 10 ++++++++-- app/views/tree/edit.html.haml | 9 +++++++-- lib/gitlab/file_editor.rb | 42 ++++++++++++++++++++++++++++++++++++++---- lib/gitlab/merge.rb | 4 ++-- 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/app/controllers/tree_controller.rb b/app/controllers/tree_controller.rb index 08fd898..8109d1c 100644 --- a/app/controllers/tree_controller.rb +++ b/app/controllers/tree_controller.rb @@ -26,8 +26,14 @@ class TreeController < ProjectResourceController def update file_editor = Gitlab::FileEditor.new(current_user, @project, @ref) - if file_editor.can_edit?(@path, params[:last_commit]) - file_editor.update(@path, params[:content]) + update_status = file_editor.update( + @path, + params[:content], + params[:commit_message], + params[:last_commit] + ) + + if update_status redirect_to project_tree_path(@project, @id), :notice => "File has been successfully changed" else flash[:notice] = "You can't save file because it has been changed" diff --git a/app/views/tree/edit.html.haml b/app/views/tree/edit.html.haml index 170001a..0bba6bc 100644 --- a/app/views/tree/edit.html.haml +++ b/app/views/tree/edit.html.haml @@ -13,10 +13,15 @@ = text_area_tag 'commit_message' .form-actions = hidden_field_tag 'last_commit', @last_commit - = hidden_field_tag 'content' - = submit_tag "Save", class: 'btn save-btn' + = hidden_field_tag 'content', '', :id => :file_content + = button_tag "Save", class: 'btn save-btn' :javascript var editor = ace.edit("editor"); editor.setTheme("ace/theme/twilight"); editor.getSession().setMode("ace/mode/javascript"); + + $(".save-btn").click(function(){ + $("#file_content").val(editor.getValue()); + $(".form_editor form").submit(); + }); diff --git a/lib/gitlab/file_editor.rb b/lib/gitlab/file_editor.rb index 8b39f29..1d52f16 100644 --- a/lib/gitlab/file_editor.rb +++ b/lib/gitlab/file_editor.rb @@ -9,14 +9,48 @@ module Gitlab self.ref = ref end + def update(path, content, commit_message, last_commit) + return false unless can_edit?(path, last_commit) + + Grit::Git.with_timeout(10.seconds) do + lock_file = Rails.root.join("tmp", "#{project.path}.lock") + + File.open(lock_file, "w+") do |f| + f.flock(File::LOCK_EX) + + unless project.satellite.exists? + raise "Satellite doesn't exist" + end + + project.satellite.clear + + Dir.chdir(project.satellite.path) do + r = Grit::Repo.new('.') + r.git.sh "git reset --hard" + r.git.sh "git fetch origin" + r.git.sh "git config user.name \"#{user.name}\"" + r.git.sh "git config user.email \"#{user.email}\"" + r.git.sh "git checkout -b #{ref} origin/#{ref}" + File.open(path, 'w'){|f| f.write(content)} + r.git.sh "git add ." + r.git.sh "git commit -am '#{commit_message}'" + output = r.git.sh "git push origin #{ref}" + if output =~ /reject/ + return false + end + end + end + end + + true + + end + + protected def can_edit?(path, last_commit) current_last_commit = @project.commits(ref, path, 1).first.sha last_commit == current_last_commit end - def update(path, content) - true - end - end end diff --git a/lib/gitlab/merge.rb b/lib/gitlab/merge.rb index de8e737..79f86fa 100644 --- a/lib/gitlab/merge.rb +++ b/lib/gitlab/merge.rb @@ -28,13 +28,13 @@ module Gitlab def process Grit::Git.with_timeout(30.seconds) do - lock_file = Rails.root.join("tmp", "merge_repo_#{project.path}.lock") + lock_file = Rails.root.join("tmp", "#{project.path}.lock") File.open(lock_file, "w+") do |f| f.flock(File::LOCK_EX) unless project.satellite.exists? - raise "You should run: rake gitlab:app:enable_automerge" + raise "Satellite doesn't exist" end project.satellite.clear -- libgit2 0.21.2