From 2c0f8eb1cc844561c294a3d4fe9388c6c7ed2acf Mon Sep 17 00:00:00 2001
From: tiagonbotelho <tiagonbotelho@hotmail.com>
Date: Wed, 27 Jul 2016 10:51:37 +0100
Subject: [PATCH] Respective cache is now expired when creating a new branch
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Project and branch cache is expired when project is still
empty or new branch is created. develops tests accordingly

Signed-off-by: Rémy Coutable <remy@rymai.me>
---
 CHANGELOG                      |  1 +
 app/models/repository.rb       |  4 ++++
 spec/models/repository_spec.rb | 37 ++++++++++++++++++++++++++++++++++
 3 files changed, 42 insertions(+)

diff --git a/CHANGELOG b/CHANGELOG
index 791b4435ae9..5c6fa8220c1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -26,6 +26,7 @@ v 8.10.2 (unreleased)
   - Fix backup restore. !5459
   - Rescue Rugged::OSError (lock exists) when creating references. !5497
   - Disable MySQL foreign key checks before dropping all tables. !5472
+  - Page is now properlty rendered after commiting the first file and creating the first branch
   - Fix a bug where forking a project from a repository storage to another would fail
   - Show release notes in tags list
   - Use project ID in repository cache to prevent stale data from persisting across projects. !5460
diff --git a/app/models/repository.rb b/app/models/repository.rb
index d8775ecbd6c..9fd8f5ec787 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -988,6 +988,10 @@ class Repository
       if was_empty || !target_branch
         # Create branch
         rugged.references.create(ref, newrev)
+
+        # If repo was empty expire cache
+        after_create if was_empty
+        after_create_branch
       else
         # Update head
         current_head = find_branch(branch).target
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 881ab5ff8dc..5bc1bd9a930 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -446,6 +446,43 @@ describe Repository, models: true do
         end.to raise_error(GitHooksService::PreReceiveError)
       end
     end
+
+    context 'when target branch is different from source branch' do
+      before do
+        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, ''])
+      end
+
+      it 'expires branch cache' do
+        expect(repository).not_to receive(:expire_exists_cache)
+        expect(repository).not_to receive(:expire_root_ref_cache)
+        expect(repository).not_to receive(:expire_emptiness_caches)
+        expect(repository).to     receive(:expire_branches_cache)
+        expect(repository).to     receive(:expire_has_visible_content_cache)
+        expect(repository).to     receive(:expire_branch_count_cache)
+
+        repository.commit_with_hooks(user, 'new-feature') { sample_commit.id }
+      end
+    end
+
+    context 'when repository is empty' do
+      before do
+        allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, ''])
+      end
+
+      it 'expires creation and branch cache' do
+        empty_repository = create(:empty_project, :empty_repo).repository
+
+        expect(empty_repository).to receive(:expire_exists_cache)
+        expect(empty_repository).to receive(:expire_root_ref_cache)
+        expect(empty_repository).to receive(:expire_emptiness_caches)
+        expect(empty_repository).to receive(:expire_branches_cache)
+        expect(empty_repository).to receive(:expire_has_visible_content_cache)
+        expect(empty_repository).to receive(:expire_branch_count_cache)
+
+        empty_repository.commit_file(user, 'CHANGELOG', 'Changelog!',
+                                     'Updates file content', 'master', false)
+      end
+    end
   end
 
   describe '#exists?' do
-- 
GitLab