From dec6b31c2772f7af792f7739b8b3b86a4dbd75db Mon Sep 17 00:00:00 2001
From: Stan Hu <stanhu@gmail.com>
Date: Sat, 14 May 2016 10:47:56 -0500
Subject: [PATCH] Fix Error 500 when attempting to retrieve project license
 when HEAD points to non-existent ref

Closes #17537
---
 CHANGELOG                      |  1 +
 app/models/repository.rb       | 12 ++++++++----
 spec/models/repository_spec.rb | 18 ++++++++++++++++++
 3 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 30d4955c9f3..81dfd1a1eb1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,7 @@ Please view this file on the master branch, on stable branches it's out of date.
 v 8.8.0 (unreleased)
   - Snippets tab under user profile. !4001 (Long Nguyen)
   - Fix error when using link to uploads in global snippets
+  - Fix Error 500 when attempting to retrieve project license when HEAD points to non-existent ref
   - Assign labels and milestone to target project when moving issue. !3934 (Long Nguyen)
   - Use a case-insensitive comparison in sanitizing URI schemes
   - Project#open_branches has been cleaned up and no longer loads entire records into memory.
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 0eff74320f3..f89a1063099 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -475,7 +475,7 @@ class Repository
   end
 
   def license_blob
-    return nil if !exists? || empty?
+    return nil unless head_exists?
 
     cache.fetch(:license_blob) do
       tree(:head).blobs.find do |file|
@@ -485,7 +485,7 @@ class Repository
   end
 
   def license_key
-    return nil if !exists? || empty?
+    return nil unless head_exists?
 
     cache.fetch(:license_key) do
       Licensee.license(path).try(:key)
@@ -493,7 +493,7 @@ class Repository
   end
 
   def gitlab_ci_yml
-    return nil if !exists? || empty?
+    return nil unless head_exists?
 
     @gitlab_ci_yml ||= tree(:head).blobs.find do |file|
       file.name == '.gitlab-ci.yml'
@@ -961,7 +961,7 @@ class Repository
   end
 
   def main_language
-    return if empty? || rugged.head_unborn?
+    return unless head_exists?
 
     Linguist::Repository.new(rugged, rugged.head.target_id).language
   end
@@ -981,4 +981,8 @@ class Repository
   def cache
     @cache ||= RepositoryCache.new(path_with_namespace)
   end
+
+  def head_exists?
+    exists? && !empty? && !rugged.head_unborn?
+  end
 end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 34a13f9b5c9..2d5238b77fe 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -176,6 +176,15 @@ describe Repository, models: true do
       repository.remove_file(user, 'LICENSE', 'Remove LICENSE', 'master')
     end
 
+    it 'handles when HEAD points to non-existent ref' do
+      repository.commit_file(user, 'LICENSE', 'Copyright!', 'Add LICENSE', 'master', false)
+      rugged = double('rugged')
+      expect(rugged).to receive(:head_unborn?).and_return(true)
+      expect(repository).to receive(:rugged).and_return(rugged)
+
+      expect(repository.license_blob).to be_nil
+    end
+
     it 'looks in the root_ref only' do
       repository.remove_file(user, 'LICENSE', 'Remove LICENSE', 'markdown')
       repository.commit_file(user, 'LICENSE', Licensee::License.new('mit').content, 'Add LICENSE', 'markdown', false)
@@ -204,6 +213,15 @@ describe Repository, models: true do
       repository.remove_file(user, 'LICENSE', 'Remove LICENSE', 'master')
     end
 
+    it 'handles when HEAD points to non-existent ref' do
+      repository.commit_file(user, 'LICENSE', 'Copyright!', 'Add LICENSE', 'master', false)
+      rugged = double('rugged')
+      expect(rugged).to receive(:head_unborn?).and_return(true)
+      expect(repository).to receive(:rugged).and_return(rugged)
+
+      expect(repository.license_key).to be_nil
+    end
+
     it 'returns nil when no license is detected' do
       expect(repository.license_key).to be_nil
     end
-- 
GitLab