Create Forgejo repositories if needed & push consolidated texts
This commit is contained in:
parent
3e8165ac4c
commit
0aa1feab97
4 changed files with 150 additions and 7 deletions
|
@ -14,4 +14,10 @@ DB_USER="legi"
|
||||||
# Change value of DB_PASSWORD!
|
# Change value of DB_PASSWORD!
|
||||||
DB_PASSWORD="legi"
|
DB_PASSWORD="legi"
|
||||||
|
|
||||||
|
# Forgejo configuration used to store git version of law
|
||||||
|
FORGEJO_SSH_ACCOUNT="git@YOUR.FORGEJO.SERVER.DOMAIN"
|
||||||
|
FORGEJO_SSH_PORT=22
|
||||||
|
FORGEJO_TOKEN="YOUR SECRET FORGEJO TOKEN"
|
||||||
|
FORGEJO_URL="https://YOUR.FORGEJO.SERVER.DOMAIN"
|
||||||
|
|
||||||
TITLE="Tricoteuses (exemple)"
|
TITLE="Tricoteuses (exemple)"
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import {
|
import {
|
||||||
|
auditEmail,
|
||||||
auditEmptyToNull,
|
auditEmptyToNull,
|
||||||
|
auditHttpUrl,
|
||||||
auditInteger,
|
auditInteger,
|
||||||
auditRequire,
|
auditRequire,
|
||||||
auditStringToNumber,
|
auditStringToNumber,
|
||||||
|
@ -42,6 +44,7 @@ export function auditConfig(
|
||||||
auditDb,
|
auditDb,
|
||||||
auditRequire,
|
auditRequire,
|
||||||
)
|
)
|
||||||
|
audit.attribute(data, "forgejo", true, errors, remainingKeys, auditForgejo)
|
||||||
audit.attribute(
|
audit.attribute(
|
||||||
data,
|
data,
|
||||||
"title",
|
"title",
|
||||||
|
@ -102,6 +105,68 @@ export function auditDb(
|
||||||
return audit.reduceRemaining(data, errors, remainingKeys)
|
return audit.reduceRemaining(data, errors, remainingKeys)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function auditForgejo(
|
||||||
|
audit: Audit,
|
||||||
|
dataUnknown: unknown,
|
||||||
|
): [unknown, unknown] {
|
||||||
|
if (dataUnknown == null) {
|
||||||
|
return [dataUnknown, null]
|
||||||
|
}
|
||||||
|
if (typeof dataUnknown !== "object") {
|
||||||
|
return audit.unexpectedType(dataUnknown, "object")
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = { ...dataUnknown }
|
||||||
|
const errors: { [key: string]: unknown } = {}
|
||||||
|
const remainingKeys = new Set(Object.keys(data))
|
||||||
|
|
||||||
|
audit.attribute(
|
||||||
|
data,
|
||||||
|
"sshAccount",
|
||||||
|
true,
|
||||||
|
errors,
|
||||||
|
remainingKeys,
|
||||||
|
auditEmail,
|
||||||
|
auditRequire,
|
||||||
|
)
|
||||||
|
audit.attribute(
|
||||||
|
data,
|
||||||
|
"sshPort",
|
||||||
|
true,
|
||||||
|
errors,
|
||||||
|
remainingKeys,
|
||||||
|
auditTrimString,
|
||||||
|
auditStringToNumber,
|
||||||
|
auditInteger,
|
||||||
|
auditTest(
|
||||||
|
(value) => 0 <= value && value <= 65536,
|
||||||
|
"Must be an integer between 0 and 65536",
|
||||||
|
),
|
||||||
|
auditRequire,
|
||||||
|
)
|
||||||
|
audit.attribute(
|
||||||
|
data,
|
||||||
|
"token",
|
||||||
|
true,
|
||||||
|
errors,
|
||||||
|
remainingKeys,
|
||||||
|
auditTrimString,
|
||||||
|
auditEmptyToNull,
|
||||||
|
auditRequire,
|
||||||
|
)
|
||||||
|
audit.attribute(
|
||||||
|
data,
|
||||||
|
"url",
|
||||||
|
true,
|
||||||
|
errors,
|
||||||
|
remainingKeys,
|
||||||
|
auditHttpUrl,
|
||||||
|
auditRequire,
|
||||||
|
)
|
||||||
|
|
||||||
|
return audit.reduceRemaining(data, errors, remainingKeys)
|
||||||
|
}
|
||||||
|
|
||||||
export function validateConfig(data: unknown): [unknown, unknown] {
|
export function validateConfig(data: unknown): [unknown, unknown] {
|
||||||
return auditConfig(cleanAudit, data)
|
return auditConfig(cleanAudit, data)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,12 @@ export interface Config {
|
||||||
user: string
|
user: string
|
||||||
password: string
|
password: string
|
||||||
}
|
}
|
||||||
|
forgejo?: {
|
||||||
|
sshAccount: string
|
||||||
|
sshPort: number
|
||||||
|
token: string
|
||||||
|
url: string
|
||||||
|
}
|
||||||
title: string
|
title: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +41,15 @@ const [config, error] = validateConfig({
|
||||||
user: process.env.DB_USER,
|
user: process.env.DB_USER,
|
||||||
password: process.env.DB_PASSWORD,
|
password: process.env.DB_PASSWORD,
|
||||||
},
|
},
|
||||||
|
forgejo:
|
||||||
|
process.env.FORGEJO_URL == null
|
||||||
|
? undefined
|
||||||
|
: {
|
||||||
|
sshAccount: process.env.FORGEJO_SSH_ACCOUNT,
|
||||||
|
sshPort: process.env.FORGEJO_SSH_PORT,
|
||||||
|
token: process.env.FORGEJO_TOKEN,
|
||||||
|
url: process.env.FORGEJO_URL,
|
||||||
|
},
|
||||||
title: process.env.TITLE,
|
title: process.env.TITLE,
|
||||||
}) as [Config, unknown]
|
}) as [Config, unknown]
|
||||||
if (error !== null) {
|
if (error !== null) {
|
||||||
|
|
|
@ -1,11 +1,16 @@
|
||||||
|
import assert from "assert"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
import sade from "sade"
|
import sade from "sade"
|
||||||
|
import { $, cd } from "zx"
|
||||||
|
|
||||||
import type { LegiTexteVersion } from "$lib/legal/legi"
|
import type { LegiTexteVersion } from "$lib/legal/legi"
|
||||||
|
import config from "$lib/server/config"
|
||||||
import { db } from "$lib/server/databases"
|
import { db } from "$lib/server/databases"
|
||||||
import { generateConsolidatedTextGit } from "$lib/server/gitify/generators"
|
import { generateConsolidatedTextGit } from "$lib/server/gitify/generators"
|
||||||
import { slugify } from "$lib/strings"
|
import { slugify } from "$lib/strings"
|
||||||
|
|
||||||
|
const { forgejo } = config
|
||||||
|
|
||||||
async function exportCodesToGit(
|
async function exportCodesToGit(
|
||||||
targetDir: string,
|
targetDir: string,
|
||||||
{
|
{
|
||||||
|
@ -20,6 +25,7 @@ async function exportCodesToGit(
|
||||||
silent?: boolean
|
silent?: boolean
|
||||||
} = {},
|
} = {},
|
||||||
): Promise<number> {
|
): Promise<number> {
|
||||||
|
let exitCode = 0
|
||||||
if (only !== undefined && typeof only === "string") {
|
if (only !== undefined && typeof only === "string") {
|
||||||
only = [only]
|
only = [only]
|
||||||
}
|
}
|
||||||
|
@ -41,20 +47,71 @@ async function exportCodesToGit(
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
[
|
||||||
|
"LEGITEXT000006074068", // Code des pensions militaires d'invalidité et des victimes de la guerre
|
||||||
|
"LEGITEXT000006070302", // Code des pensions civiles et militaires de retraite
|
||||||
|
"LEGITEXT000006069565", // Code de la consommation
|
||||||
|
].includes(codeId)
|
||||||
|
) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if (only !== undefined && !only.includes(codeId)) {
|
if (only !== undefined && !only.includes(codeId)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
const codeSlug = slugify(
|
const codeTitle =
|
||||||
codeTexteVersion.META.META_SPEC.META_TEXTE_VERSION.TITREFULL ??
|
codeTexteVersion.META.META_SPEC.META_TEXTE_VERSION.TITREFULL ??
|
||||||
codeTexteVersion.META.META_SPEC.META_TEXTE_VERSION.TITRE ??
|
codeTexteVersion.META.META_SPEC.META_TEXTE_VERSION.TITRE ??
|
||||||
codeId,
|
codeId
|
||||||
"_",
|
const codeSlug = slugify(codeTitle, "_")
|
||||||
)
|
const codeRepositoryDir = path.join(targetDir, codeSlug)
|
||||||
await generateConsolidatedTextGit(codeId, path.join(targetDir, codeSlug))
|
const result = await generateConsolidatedTextGit(codeId, codeRepositoryDir)
|
||||||
|
if (result !== 0) {
|
||||||
|
if (exitCode === 0) {
|
||||||
|
exitCode = result
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (push && forgejo !== undefined) {
|
||||||
|
const response = await fetch(
|
||||||
|
new URL(`/api/v1/repos/textes_consolides/${codeSlug}`, forgejo.url),
|
||||||
|
{ headers: { Accept: "application/json" } },
|
||||||
|
)
|
||||||
|
if (response.status === 404) {
|
||||||
|
// Create respository.
|
||||||
|
const response = await fetch(
|
||||||
|
new URL(`/api/v1/orgs/textes_consolides/repos`, forgejo.url),
|
||||||
|
{
|
||||||
|
body: JSON.stringify(
|
||||||
|
{
|
||||||
|
default_branch: "main",
|
||||||
|
description: codeTitle,
|
||||||
|
name: codeSlug,
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
headers: {
|
||||||
|
Accept: "application/json",
|
||||||
|
Authorization: `token ${forgejo.token}`,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
method: "POST",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
assert(response.ok)
|
||||||
|
} else {
|
||||||
|
assert(response.ok)
|
||||||
|
}
|
||||||
|
cd(codeRepositoryDir)
|
||||||
|
const origin = `[${forgejo.sshAccount}:${forgejo.sshPort}]:textes_consolides/${codeSlug}.git`
|
||||||
|
await $`git remote add origin ${origin}`
|
||||||
|
await $`git push --force --tags --set-upstream origin main`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return exitCode
|
||||||
}
|
}
|
||||||
|
|
||||||
sade("export_codes_to_git <targetDir>", true)
|
sade("export_codes_to_git <targetDir>", true)
|
||||||
|
|
Loading…
Reference in a new issue