Add fork_from to repository config
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful

Express a fork as an optional fork_from key on the repository yaml, so a
forked repo is declared the same way as any other repo.

- add fork_from "<owner>/<repo>" to the repository module and object type
- create gitea_fork instead of gitea_repository when fork_from is set
- validate the source repo name matches the config file name, since a fork
  inherits the source name
- move gitea_repository.this to index 0 for the count refactor
- index existing repository import targets to match
This commit is contained in:
2026-09-19 15:55:12 +10:00
parent 66823a939a
commit 9ab540719e
6 changed files with 72 additions and 35 deletions
+34 -34
View File
@@ -4,167 +4,167 @@ import {
} }
import { import {
to = module.repository["git.unkin.net/unkin/puppet-prod"].gitea_repository.this to = module.repository["git.unkin.net/unkin/puppet-prod"].gitea_repository.this[0]
id = "2" id = "2"
} }
import { import {
to = module.repository["git.unkin.net/unkin/puppet-r10k"].gitea_repository.this to = module.repository["git.unkin.net/unkin/puppet-r10k"].gitea_repository.this[0]
id = "3" id = "3"
} }
import { import {
to = module.repository["git.unkin.net/unkin/rpmbuild-gonic"].gitea_repository.this to = module.repository["git.unkin.net/unkin/rpmbuild-gonic"].gitea_repository.this[0]
id = "23" id = "23"
} }
import { import {
to = module.repository["git.unkin.net/unkin/docker-almalinux-base"].gitea_repository.this to = module.repository["git.unkin.net/unkin/docker-almalinux-base"].gitea_repository.this[0]
id = "24" id = "24"
} }
import { import {
to = module.repository["git.unkin.net/unkin/rpmbuild-internal-ca-certificates"].gitea_repository.this to = module.repository["git.unkin.net/unkin/rpmbuild-internal-ca-certificates"].gitea_repository.this[0]
id = "27" id = "27"
} }
import { import {
to = module.repository["git.unkin.net/unkin/rpmbuild-template"].gitea_repository.this to = module.repository["git.unkin.net/unkin/rpmbuild-template"].gitea_repository.this[0]
id = "29" id = "29"
} }
import { import {
to = module.repository["git.unkin.net/unkin/rpmbuild-jellyfin-web"].gitea_repository.this to = module.repository["git.unkin.net/unkin/rpmbuild-jellyfin-web"].gitea_repository.this[0]
id = "31" id = "31"
} }
import { import {
to = module.repository["git.unkin.net/unkin/rpmbuild-proxlb"].gitea_repository.this to = module.repository["git.unkin.net/unkin/rpmbuild-proxlb"].gitea_repository.this[0]
id = "33" id = "33"
} }
import { import {
to = module.repository["git.unkin.net/unkin/docker-almalinux-buildrunner"].gitea_repository.this to = module.repository["git.unkin.net/unkin/docker-almalinux-buildrunner"].gitea_repository.this[0]
id = "36" id = "36"
} }
import { import {
to = module.repository["git.unkin.net/unkin/docker-template"].gitea_repository.this to = module.repository["git.unkin.net/unkin/docker-template"].gitea_repository.this[0]
id = "38" id = "38"
} }
import { import {
to = module.repository["git.unkin.net/unkin/terraform-vault"].gitea_repository.this to = module.repository["git.unkin.net/unkin/terraform-vault"].gitea_repository.this[0]
id = "39" id = "39"
} }
import { import {
to = module.repository["git.unkin.net/unkin/docker-almalinux-jupyterinstance"].gitea_repository.this to = module.repository["git.unkin.net/unkin/docker-almalinux-jupyterinstance"].gitea_repository.this[0]
id = "40" id = "40"
} }
import { import {
to = module.repository["git.unkin.net/unkin/rpmbuilder"].gitea_repository.this to = module.repository["git.unkin.net/unkin/rpmbuilder"].gitea_repository.this[0]
id = "41" id = "41"
} }
import { import {
to = module.repository["git.unkin.net/unkin/docker-almalinux-runnerdnd"].gitea_repository.this to = module.repository["git.unkin.net/unkin/docker-almalinux-runnerdnd"].gitea_repository.this[0]
id = "43" id = "43"
} }
import { import {
to = module.repository["git.unkin.net/unkin/initbuilder"].gitea_repository.this to = module.repository["git.unkin.net/unkin/initbuilder"].gitea_repository.this[0]
id = "47" id = "47"
} }
import { import {
to = module.repository["git.unkin.net/unkin/puppetapi"].gitea_repository.this to = module.repository["git.unkin.net/unkin/puppetapi"].gitea_repository.this[0]
id = "50" id = "50"
} }
import { import {
to = module.repository["git.unkin.net/unkin/terraform-nomad"].gitea_repository.this to = module.repository["git.unkin.net/unkin/terraform-nomad"].gitea_repository.this[0]
id = "53" id = "53"
} }
import { import {
to = module.repository["git.unkin.net/unkin/packer-images"].gitea_repository.this to = module.repository["git.unkin.net/unkin/packer-images"].gitea_repository.this[0]
id = "59" id = "59"
} }
import { import {
to = module.repository["git.unkin.net/unkin/app-sudaporn-research-normalised"].gitea_repository.this to = module.repository["git.unkin.net/unkin/app-sudaporn-research-normalised"].gitea_repository.this[0]
id = "60" id = "60"
} }
import { import {
to = module.repository["git.unkin.net/unkin/app-sudaporn-research-individual"].gitea_repository.this to = module.repository["git.unkin.net/unkin/app-sudaporn-research-individual"].gitea_repository.this[0]
id = "63" id = "63"
} }
import { import {
to = module.repository["git.unkin.net/unkin/terraform-incus"].gitea_repository.this to = module.repository["git.unkin.net/unkin/terraform-incus"].gitea_repository.this[0]
id = "66" id = "66"
} }
import { import {
to = module.repository["git.unkin.net/unkin/artifactapi"].gitea_repository.this to = module.repository["git.unkin.net/unkin/artifactapi"].gitea_repository.this[0]
id = "67" id = "67"
} }
import { import {
to = module.repository["git.unkin.net/unkin/argocd-apps"].gitea_repository.this to = module.repository["git.unkin.net/unkin/argocd-apps"].gitea_repository.this[0]
id = "100" id = "100"
} }
import { import {
to = module.repository["git.unkin.net/unkin/certmanager"].gitea_repository.this to = module.repository["git.unkin.net/unkin/certmanager"].gitea_repository.this[0]
id = "101" id = "101"
} }
import { import {
to = module.repository["git.unkin.net/unkin/node-lookup"].gitea_repository.this to = module.repository["git.unkin.net/unkin/node-lookup"].gitea_repository.this[0]
id = "102" id = "102"
} }
import { import {
to = module.repository["git.unkin.net/unkin/container-devcompute"].gitea_repository.this to = module.repository["git.unkin.net/unkin/container-devcompute"].gitea_repository.this[0]
id = "135" id = "135"
} }
import { import {
to = module.repository["git.unkin.net/unkin/streamstack"].gitea_repository.this to = module.repository["git.unkin.net/unkin/streamstack"].gitea_repository.this[0]
id = "136" id = "136"
} }
import { import {
to = module.repository["git.unkin.net/unkin/terraform-provider-artifactapi"].gitea_repository.this to = module.repository["git.unkin.net/unkin/terraform-provider-artifactapi"].gitea_repository.this[0]
id = "137" id = "137"
} }
import { import {
to = module.repository["git.unkin.net/unkin/forgebot"].gitea_repository.this to = module.repository["git.unkin.net/unkin/forgebot"].gitea_repository.this[0]
id = "139" id = "139"
} }
import { import {
to = module.repository["git.unkin.net/unkin/forgebot-skills"].gitea_repository.this to = module.repository["git.unkin.net/unkin/forgebot-skills"].gitea_repository.this[0]
id = "140" id = "140"
} }
import { import {
to = module.repository["git.unkin.net/unkin/container-agent-base"].gitea_repository.this to = module.repository["git.unkin.net/unkin/container-agent-base"].gitea_repository.this[0]
id = "141" id = "141"
} }
import { import {
to = module.repository["git.unkin.net/unkin/container-agent-dev"].gitea_repository.this to = module.repository["git.unkin.net/unkin/container-agent-dev"].gitea_repository.this[0]
id = "142" id = "142"
} }
import { import {
to = module.repository["git.unkin.net/unkin/container-agent-infra"].gitea_repository.this to = module.repository["git.unkin.net/unkin/container-agent-infra"].gitea_repository.this[0]
id = "143" id = "143"
} }
@@ -199,7 +199,7 @@ import {
} }
import { import {
to = module.repository["git.unkin.net/unkin/terraform-git"].gitea_repository.this to = module.repository["git.unkin.net/unkin/terraform-git"].gitea_repository.this[0]
id = "144" id = "144"
} }
+1
View File
@@ -19,6 +19,7 @@ module "repository" {
name = each.value.name name = each.value.name
organisation = each.value.organisation organisation = each.value.organisation
fork_from = each.value.fork_from
description = each.value.description description = each.value.description
private = each.value.private private = each.value.private
default_branch = each.value.default_branch default_branch = each.value.default_branch
@@ -1,4 +1,10 @@
locals {
fork_source = var.fork_from == null ? null : split("/", var.fork_from)
}
resource "gitea_repository" "this" { resource "gitea_repository" "this" {
count = var.fork_from == null ? 1 : 0
username = var.organisation username = var.organisation
name = var.name name = var.name
description = var.description description = var.description
@@ -33,3 +39,16 @@ resource "gitea_repository" "this" {
ignore_changes = [migration_mirror_interval] ignore_changes = [migration_mirror_interval]
} }
} }
moved {
from = gitea_repository.this
to = gitea_repository.this[0]
}
resource "gitea_fork" "this" {
count = var.fork_from == null ? 0 : 1
owner = local.fork_source[0]
repo = local.fork_source[1]
organization = var.organisation
}
@@ -1,3 +1,3 @@
output "id" { output "id" {
value = gitea_repository.this.id value = one(concat(gitea_repository.this[*].id, gitea_fork.this[*].id))
} }
@@ -6,6 +6,22 @@ variable "organisation" {
type = string type = string
} }
variable "fork_from" {
description = "Source repository to fork, as \"<owner>/<repo>\". When set, a fork is created instead of a new repository."
type = string
default = null
validation {
condition = var.fork_from == null || can(regex("^[^/]+/[^/]+$", var.fork_from))
error_message = "fork_from must be \"<owner>/<repo>\"."
}
validation {
condition = var.fork_from == null || try(split("/", var.fork_from)[1], null) == var.name
error_message = "fork_from source repository must be named \"${var.name}\": a fork inherits the source name, so it cannot differ from the config file name."
}
}
variable "description" { variable "description" {
type = string type = string
default = null default = null
+1
View File
@@ -17,6 +17,7 @@ variable "repository" {
type = map(object({ type = map(object({
name = string name = string
organisation = string organisation = string
fork_from = optional(string)
description = optional(string) description = optional(string)
private = optional(bool) private = optional(bool)
default_branch = optional(string) default_branch = optional(string)