From 373d4918cda240dc7b5f620f2c4eea8a0f30dff9 Mon Sep 17 00:00:00 2001
From: Jelle van der Waa <jelle@archlinux.org>
Date: Mon, 5 Jul 2021 22:15:21 +0200
Subject: [PATCH] Add redirects for git.archlinux.org using a map

---
 roles/redirects/defaults/main.yml                  |  6 ++++++
 roles/redirects/files/maps/cgit-migrated-repos.map |  5 +++++
 roles/redirects/tasks/main.yml                     |  3 +++
 roles/redirects/templates/nginx.d.conf.j2          | 14 +++++++++++++-
 tf-stage1/archlinux.tf                             |  1 +
 5 files changed, 28 insertions(+), 1 deletion(-)
 create mode 100644 roles/redirects/files/maps/cgit-migrated-repos.map

diff --git a/roles/redirects/defaults/main.yml b/roles/redirects/defaults/main.yml
index 84e8d2161..2df1f5917 100644
--- a/roles/redirects/defaults/main.yml
+++ b/roles/redirects/defaults/main.yml
@@ -2,6 +2,7 @@
 #   - domain: the domain to listen on
 #   - to: the redirect target as defined by the nginx return statement
 #   - type: HTTP status code to use (302 = temporary redirect, 301 = permanent redirect)
+#   - map: the mapping file
 redirects:
   - mailman:
     domain: mailman.archlinux.org
@@ -15,3 +16,8 @@ redirects:
     domain: coc.archlinux.org
     to: https://gitlab.archlinux.org/archlinux/service-agreements/-/blob/master/code-of-conduct.md
     type: 302
+  - cgit:
+    domain: git.archlinux.org
+    to: https://gitlab.archlinux.org
+    type: 301
+    map: maps/cgit-migrated-repos.map
diff --git a/roles/redirects/files/maps/cgit-migrated-repos.map b/roles/redirects/files/maps/cgit-migrated-repos.map
new file mode 100644
index 000000000..90a26c337
--- /dev/null
+++ b/roles/redirects/files/maps/cgit-migrated-repos.map
@@ -0,0 +1,5 @@
+/pacman.git https://gitlab.archlinux.org/pacman/pacman;
+/pacman-contrib.git https://gitlab.archlinux.org/pacman/pacman-contrib;
+
+/netctl.git https://gitlab.archlinux.org/archlinux/netctl;
+/mkinitcpio.git https://github.com/archlinux/mkinitcpio;
diff --git a/roles/redirects/tasks/main.yml b/roles/redirects/tasks/main.yml
index 9efb268c6..aa0bc60e2 100644
--- a/roles/redirects/tasks/main.yml
+++ b/roles/redirects/tasks/main.yml
@@ -14,3 +14,6 @@
   template: src=nginx.d.conf.j2 dest="/etc/nginx/nginx.d/redirects.conf" owner=root group=root mode=644
   notify: reload nginx
   tags: ['nginx']
+
+- name: copy nginx map files
+  copy: src=maps dest=/etc/nginx/ owner=root group=root mode=0600
diff --git a/roles/redirects/templates/nginx.d.conf.j2 b/roles/redirects/templates/nginx.d.conf.j2
index 28f391a38..dca0cf059 100644
--- a/roles/redirects/templates/nginx.d.conf.j2
+++ b/roles/redirects/templates/nginx.d.conf.j2
@@ -1,4 +1,11 @@
 {% for redirect in redirects %}
+{% if redirect.map is defined %}
+map $uri ${{ redirect.map | hash('md5') }} {
+    default "";
+    include {{ redirect.map }};
+}
+
+{% endif %}
 server {
     listen       80;
     listen       [::]:80;
@@ -17,7 +24,12 @@ server {
     include snippets/letsencrypt.conf;
 
     location / {
-    	return {{ redirect.type }} {{ redirect.to }};
+        {% if redirect.map is defined %}
+        if (${{ redirect.map | hash('md5') }} != "") {
+             return {{ redirect.type }} ${{ redirect.map | hash('md5') }};
+        }
+        {% endif %}
+        return {{ redirect.type }} {{ redirect.to }};
     }
 }
 {% endfor %}
diff --git a/tf-stage1/archlinux.tf b/tf-stage1/archlinux.tf
index e492af1ce..08274ee93 100644
--- a/tf-stage1/archlinux.tf
+++ b/tf-stage1/archlinux.tf
@@ -288,6 +288,7 @@ locals {
     status        = { value = "stats.uptimerobot.com." }
     svn           = { value = "gemini" }
     coc           = { value = "redirect" }
+    git           = { value = "redirect" }
 
     # MTA-STS
     mta-sts               = { value = "mail" }
-- 
GitLab