From f20eadcbbeb88e98c2608cbaf23f0d09ca002a98 Mon Sep 17 00:00:00 2001
From: "Z.J. van de Weg" <git@zjvandeweg.nl>
Date: Tue, 8 Nov 2016 11:28:30 +0100
Subject: [PATCH] Fix faulty deployment refs

In the 8.13 RC cycle, so before the release, there was a time in which
references in git where stored by id instead of iid. This could be fixed
by time, if the iid catches up with the id, it overwrites it. But in the
mean time we have wrong refs in the folder.

This commit fixes that. For all projects we have deployments we'll find
the ones where the ref has a higher number than the iid is now and calls
`#create_ref` on the corresponding deployment.
---
 lib/tasks/gitlab/cleanup.rake | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/lib/tasks/gitlab/cleanup.rake b/lib/tasks/gitlab/cleanup.rake
index b7cbdc6cd78f2..4a696a52b4d19 100644
--- a/lib/tasks/gitlab/cleanup.rake
+++ b/lib/tasks/gitlab/cleanup.rake
@@ -91,5 +91,28 @@ namespace :gitlab do
         puts "To block these users run this command with BLOCK=true".color(:yellow)
       end
     end
+
+    # This is a rake task which removes faulty refs. These refs where only
+    # created in the 8.13.RC cycle, and fixed in the stable builds which were
+    # released. So likely this should only be run once on gitlab.com
+    # Faulty refs are moved so they are kept around, else some features break.
+    desc 'GitLab | Cleanup | Remove faulty deployment refs'
+    task move_faulty_deployment_refs: :environment do
+      projects = Project.where(id: Deployment.select(:project_id).distinct)
+
+      projects.find_each do |project|
+        rugged = project.repository.rugged
+
+        max_iid = project.deployments.maximum(:iid)
+
+        rugged.references.each('refs/environments/**/*') do |ref|
+          id = ref.name.split('/').last.to_i
+          next unless id > max_iid
+
+          project.deployments.find(id).create_ref
+          rugged.references.delete(ref)
+        end
+      end
+    end
   end
 end
-- 
GitLab