From 7da7002dc133d31b63c4120a96002fd69e1638ff Mon Sep 17 00:00:00 2001
From: "James E. Blair" <jeblair@redhat.com>
Date: Thu, 28 Feb 2019 14:55:44 -0800
Subject: [PATCH] Add gitea to project rename playbook

Change-Id: Idca623ff59f3318c762ffd5c65e3c739fac819af
Story: 2004627
Task: 29706
---
 playbooks/gitea-rename-tasks.yaml | 51 +++++++++++++++++++++++++++++++
 playbooks/rename_repos.yaml       | 22 +++++++++++++
 2 files changed, 73 insertions(+)
 create mode 100644 playbooks/gitea-rename-tasks.yaml

diff --git a/playbooks/gitea-rename-tasks.yaml b/playbooks/gitea-rename-tasks.yaml
new file mode 100644
index 0000000000..f6a8e4751d
--- /dev/null
+++ b/playbooks/gitea-rename-tasks.yaml
@@ -0,0 +1,51 @@
+# Note, if both the org and project names change, this script will
+# perform the org transfer first, followed by the project name change.
+# If there is already a project in the new org with the old name, it
+# will fail.
+- name: "Parse repo names for {{ repo.old }} -> {{ repo.new }}"
+  set_fact:
+    oldorg: "{{ repo.old.split('/')[0] }}"
+    neworg: "{{ repo.new.split('/')[0] }}"
+    oldproj: "{{ repo.old.split('/')[1] }}"
+    newproj: "{{ repo.new.split('/')[1] }}"
+- name: "Get repo {{ oldorg }}/{{ oldproj }}"
+  uri:
+    url: "{{ gitea_url }}/api/v1/repos/{{ oldorg }}/{{ oldproj }}"
+    validate_certs: false
+    user: root
+    password: "{{ gitea_root_password }}"
+    force_basic_auth: true
+  register: gitea_repo
+- name: "Transfer repo ownership from {{ oldorg }}/{{ oldproj }} to {{ neworg }}/{{ oldproj }}"
+  when: "oldorg != neworg"
+  uri:
+    url: "{{ gitea_url }}/{{ oldorg }}/{{ oldproj }}/settings"
+    validate_certs: false
+    user: root
+    password: "{{ gitea_root_password }}"
+    force_basic_auth: true
+    status_code: 302
+    method: POST
+    body_format: form-urlencoded
+    body:
+      _csrf: "{{ gitea_token }}"
+      action: transfer
+      repo_name: "{{ oldproj }}"
+      new_owner_name: "{{ neworg }}"
+- name: "Update repo name from {{ neworg }}/{{ oldproj }} to {{ neworg }}/{{ newproj }}"
+  when: "oldproj != newproj"
+  uri:
+    url: "{{ gitea_url }}/{{ neworg }}/{{ oldproj }}/settings"
+    validate_certs: false
+    user: root
+    password: "{{ gitea_root_password }}"
+    force_basic_auth: true
+    status_code: 302
+    method: POST
+    body_format: form-urlencoded
+    body:
+      _csrf: "{{ gitea_token }}"
+      action: update
+      repo_name: "{{ newproj }}"
+      description: "{{ gitea_repo.json.description }}"
+      website: "{{ gitea_repo.json.website }}"
diff --git a/playbooks/rename_repos.yaml b/playbooks/rename_repos.yaml
index 121374890b..c799f993c2 100644
--- a/playbooks/rename_repos.yaml
+++ b/playbooks/rename_repos.yaml
@@ -34,6 +34,28 @@
         - [ '/var/lib/git/' ]
         - "{{ repos }}"
 
+- hosts: gitea
+  gather_facts: False
+  vars:
+    gitea_url: http://localhost:3000
+  tasks:
+    - name: Get a CSRF token
+      uri:
+        url: "{{ gitea_url }}/"
+        validate_certs: false
+        user: root
+        password: "{{ gitea_root_password }}"
+        force_basic_auth: true
+      register: gitea_token
+    - name: Parse CSRF taken
+      set_fact:
+        gitea_token: "{{ gitea_token.cookies._csrf|regex_replace('%3D','=') }}"
+    - name: Move gitea repo
+      include_tasks: gitea-rename-tasks.yaml
+      loop: "{{ repos }}"
+      loop_control:
+        loop_var: repo
+
 - hosts: storyboard.openstack.org
   gather_facts: False
   remote_user: root