From 9951854648a1dc98bbff016c51cd47e67f240267 Mon Sep 17 00:00:00 2001
From: tiagonbotelho <tiagonbotelho@hotmail.com>
Date: Mon, 4 Jul 2016 11:32:57 +0100
Subject: [PATCH] creates the update_file method in repository.rb and applies
 changes accordingly

---
 app/controllers/concerns/creates_commit.rb  |  3 ++-
 app/controllers/projects/blob_controller.rb |  2 +-
 app/models/repository.rb                    | 30 +++++++++++++++++++++
 app/services/files/base_service.rb          |  1 +
 app/services/files/update_service.rb        |  2 +-
 5 files changed, 35 insertions(+), 3 deletions(-)

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
-- 
GitLab