|
| 1 | +locals { |
| 2 | + owner = var.gitea_organization |
| 3 | + |
| 4 | + clone_url = "${var.gitea_base_url}/${local.owner}/${var.repository_name}.git" |
| 5 | + html_url = "${var.gitea_base_url}/${local.owner}/${var.repository_name}" |
| 6 | + ssh_url = "git@${replace(var.gitea_base_url, "https://", "")}:${local.owner}/${var.repository_name}.git" |
| 7 | + |
| 8 | + template_variables = { |
| 9 | + REPO_NAME = var.template_repo_name != "" ? var.template_repo_name : var.repository_name |
| 10 | + NAMESPACE = var.template_namespace != "" ? var.template_namespace : var.repository_name |
| 11 | + CLONE_URL = local.clone_url |
| 12 | + } |
| 13 | +} |
| 14 | + |
| 15 | +# ── Repository (empty, non-template) ────────────────────────────────────────── |
| 16 | + |
| 17 | +resource "gitea_repository" "repo" { |
| 18 | + count = var.use_template ? 0 : 1 |
| 19 | + |
| 20 | + username = local.owner |
| 21 | + name = var.repository_name |
| 22 | + description = var.repository_description |
| 23 | + private = var.repository_private |
| 24 | + auto_init = var.repository_auto_init |
| 25 | + default_branch = var.default_branch |
| 26 | +} |
| 27 | + |
| 28 | +# ── Repository (from template, via Forgejo API) ─────────────────────────────── |
| 29 | + |
| 30 | +resource "null_resource" "template_repo" { |
| 31 | + count = var.use_template ? 1 : 0 |
| 32 | + |
| 33 | + triggers = { |
| 34 | + repo_name = var.repository_name |
| 35 | + owner = local.owner |
| 36 | + template_owner = var.template_owner |
| 37 | + template_name = var.template_name |
| 38 | + template_vars = jsonencode(local.template_variables) |
| 39 | + } |
| 40 | + |
| 41 | + provisioner "local-exec" { |
| 42 | + command = <<-EOT |
| 43 | + response=$(curl -s -w "\n%\{http_code\}" \ |
| 44 | + -X POST "${var.gitea_base_url}/api/v1/repos/${var.template_owner}/${var.template_name}/generate" \ |
| 45 | + -H "Authorization: token ${var.gitea_token}" \ |
| 46 | + -H "Content-Type: application/json" \ |
| 47 | + -d '{ |
| 48 | + "owner": "${local.owner}", |
| 49 | + "name": "${var.repository_name}", |
| 50 | + "description": "${var.repository_description}", |
| 51 | + "private": ${var.repository_private}, |
| 52 | + "git_content": true, |
| 53 | + "git_hooks": false |
| 54 | + }') |
| 55 | +
|
| 56 | + http_code=$(echo "$response" | tail -n1) |
| 57 | + body=$(echo "$response" | sed '$d') |
| 58 | +
|
| 59 | + if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 300 ]; then |
| 60 | + echo "Repository '${var.repository_name}' created from template '${var.template_owner}/${var.template_name}'" |
| 61 | + else |
| 62 | + echo "Failed to create repository from template. HTTP $http_code" |
| 63 | + echo "$body" |
| 64 | + exit 1 |
| 65 | + fi |
| 66 | + EOT |
| 67 | + } |
| 68 | +} |
| 69 | + |
| 70 | +# ── Webhook ──────────────────────────────────────────────────────────────────── |
| 71 | + |
| 72 | +resource "null_resource" "webhook" { |
| 73 | + count = var.webhook_url != "" ? 1 : 0 |
| 74 | + |
| 75 | + triggers = { |
| 76 | + webhook_url = var.webhook_url |
| 77 | + webhook_secret = sha256(var.webhook_secret) |
| 78 | + webhook_events = join(",", var.webhook_events) |
| 79 | + repo = "${local.owner}/${var.repository_name}" |
| 80 | + } |
| 81 | + |
| 82 | + provisioner "local-exec" { |
| 83 | + command = <<-EOT |
| 84 | + curl -s -X POST "${var.gitea_base_url}/api/v1/repos/${local.owner}/${var.repository_name}/hooks" \ |
| 85 | + -H "Authorization: token ${var.gitea_token}" \ |
| 86 | + -H "Content-Type: application/json" \ |
| 87 | + -d '{ |
| 88 | + "type": "forgejo", |
| 89 | + "config": { |
| 90 | + "url": "${var.webhook_url}", |
| 91 | + "content_type": "json", |
| 92 | + "secret": "${var.webhook_secret}" |
| 93 | + }, |
| 94 | + "events": ${jsonencode(var.webhook_events)}, |
| 95 | + "active": true |
| 96 | + }' |
| 97 | + EOT |
| 98 | + } |
| 99 | + |
| 100 | + depends_on = [gitea_repository.repo, null_resource.template_repo] |
| 101 | +} |
0 commit comments