From 143fa8e7ca9d4c16f5008d2fe123886578bb0015 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/models/repository.rb                   | 30 ++++++++++++++++++++++
 app/services/files/base_service.rb         |  1 +
 app/services/files/update_service.rb       |  2 +-
 4 files changed, 34 insertions(+), 2 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/models/repository.rb b/app/models/repository.rb
index 078ca8f4e13..a5fb13eb662 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -741,6 +741,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 4bdb68a3698..6e46bcea24c 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