Compare commits
2 commits
main
...
until-dest
Author | SHA1 | Date | |
---|---|---|---|
9cec2e7567 | |||
2337190a1b |
5 changed files with 328 additions and 0 deletions
52
migrate_gt_to_fj.exs
Normal file
52
migrate_gt_to_fj.exs
Normal file
|
@ -0,0 +1,52 @@
|
|||
Mix.install([
|
||||
{:req, "~> 0.5.10"}
|
||||
]);
|
||||
|
||||
forgejo_token = System.get_env("FORGEJO_TOKEN")
|
||||
gitea_token = System.get_env("GITEA_TOKEN")
|
||||
gt_host = System.get_env("GITEA_HOST")
|
||||
fj_host = System.get_env("FORGEJO_HOST")
|
||||
gt_uid = System.get_env("GITEA_UID")
|
||||
|
||||
defmodule Forgejo do
|
||||
require Req
|
||||
|
||||
def migrate_all(uid, gt_host, gt_token, fj_host, fj_token) do
|
||||
url = "#{gt_host}/api/v1/repos/search"
|
||||
params = %{"uid" => uid}
|
||||
|
||||
case Req.get!(url, params: params, headers: %{"Authorization" => "bearer #{gt_token}"} ) do
|
||||
%{status: 200, body: body} ->
|
||||
repos = body["data"]
|
||||
for repo <- repos do
|
||||
migrate(repo, host, gt_token, fj_host, fj_token)
|
||||
end
|
||||
|
||||
{:error, error} ->
|
||||
IO.puts("Error fetching repos: #{inspect(error)}")
|
||||
end
|
||||
end
|
||||
|
||||
def migrate(repo, gt_token, fj_host, fj_token) do
|
||||
clone = repo["clone_url"]
|
||||
name = repo["name"]
|
||||
private? = repo["private"]
|
||||
|
||||
migration = %{
|
||||
"private" => private?,
|
||||
"clone_addr" => clone,
|
||||
"auth_token" => gt_token,
|
||||
"pull_requests" => true,
|
||||
"lfs" => true,
|
||||
"releases" => true,
|
||||
"repo_name" => name,
|
||||
"repo_owner" => "caleb",
|
||||
"service" => "gitea"
|
||||
} |> :json.encode()
|
||||
|
||||
Req.post!("#{fj_host}/api/v1/repos/migrate", body: migration, headers: %{"Authorization" => "bearer #{fj_token}", "Content-Type" => "application/json"} )
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Forgejo.migrate_all(gt_uid, gt_host, gitea_token, fj_host, forgejo_token)
|
175
until-destroyed-migrator/.gitignore
vendored
Normal file
175
until-destroyed-migrator/.gitignore
vendored
Normal file
|
@ -0,0 +1,175 @@
|
|||
# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore
|
||||
|
||||
# Logs
|
||||
|
||||
logs
|
||||
_.log
|
||||
npm-debug.log_
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Caches
|
||||
|
||||
.cache
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
|
||||
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
|
||||
|
||||
# Runtime data
|
||||
|
||||
pids
|
||||
_.pid
|
||||
_.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
|
||||
.temp
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
# IntelliJ based IDEs
|
||||
.idea
|
||||
|
||||
# Finder (MacOS) folder config
|
||||
.DS_Store
|
15
until-destroyed-migrator/README.md
Normal file
15
until-destroyed-migrator/README.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
# until-destroyed-migrator
|
||||
|
||||
To install dependencies:
|
||||
|
||||
```bash
|
||||
bun install
|
||||
```
|
||||
|
||||
To run:
|
||||
|
||||
```bash
|
||||
bun run index.ts
|
||||
```
|
||||
|
||||
This project was created using `bun init` in bun v1.0.23. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
|
BIN
until-destroyed-migrator/bun.lockb
Executable file
BIN
until-destroyed-migrator/bun.lockb
Executable file
Binary file not shown.
86
until-destroyed-migrator/index.ts
Normal file
86
until-destroyed-migrator/index.ts
Normal file
|
@ -0,0 +1,86 @@
|
|||
import { Glob } from "bun";
|
||||
import babelParser from "@babel/parser";
|
||||
|
||||
let dir = "/Users/caleb.webber/git/snag/Web.MarketplaceAdmin/";
|
||||
let glob = new Glob("!{node_modules}/**/*.ts");
|
||||
|
||||
const files = [...glob.scanSync(dir)].filter((f) => !f.includes("e2e"));
|
||||
|
||||
export function parse(text: string) {
|
||||
return babelParser.parse(text, {
|
||||
allowImportExportEverywhere: true,
|
||||
plugins: ["decorators-legacy", "typescript"],
|
||||
});
|
||||
}
|
||||
|
||||
export async function fileContainsNgNeat(file: string) {
|
||||
const text = await Bun.file(`${dir}${file}`).text();
|
||||
return text.includes("ngneat");
|
||||
}
|
||||
|
||||
export function getImportFrom(tree: any, module: string) {
|
||||
return tree.program.body.find(
|
||||
(n: any) => n.type === "ImportDeclaration" && n.source.value === module,
|
||||
);
|
||||
}
|
||||
|
||||
export function ensureAngularCoreImports(tree: any) {
|
||||
const t2 = structuredClone(tree);
|
||||
|
||||
const angularCoreImport = getImportFrom(t2, "@angular/core") ?? {
|
||||
type: "ImportDeclaration",
|
||||
specifiers: [],
|
||||
source: { type: "StringLiteral", value: "@angular/core" },
|
||||
};
|
||||
|
||||
angularCoreImport.specifiers.push({
|
||||
type: "ImportSpecifier",
|
||||
imported: { type: "Identifier", name: "inject" },
|
||||
local: { type: "Identifier", name: "inject" },
|
||||
});
|
||||
|
||||
angularCoreImport.specifiers.push({
|
||||
type: "ImportSpecifier",
|
||||
imported: { type: "Identifier", name: "takeUntilDestroyed" },
|
||||
local: { type: "Identifier", name: "takeUntilDestroyed" },
|
||||
});
|
||||
|
||||
return t2;
|
||||
}
|
||||
|
||||
export function removeNgNeatImports(tree: any) {
|
||||
const t2 = structuredClone(tree);
|
||||
|
||||
t2.program.body = t2.program.body.filter(
|
||||
(n: any) =>
|
||||
n.type !== "ImportDeclaration" || !n.source.value.includes("ngneat"),
|
||||
);
|
||||
|
||||
return t2;
|
||||
}
|
||||
|
||||
const filesToFix = (
|
||||
await Promise.all(files.map(async (f) => [await fileContainsNgNeat(f), f]))
|
||||
)
|
||||
.filter(([shouldFix]) => shouldFix)
|
||||
.map(([, f]) => f);
|
||||
|
||||
export const trees = await Promise.all(
|
||||
filesToFix.map(async (f) => {
|
||||
const text = await Bun.file(`${dir}${f}`).text();
|
||||
return parse(text);
|
||||
}),
|
||||
);
|
||||
|
||||
for (const f of filesToFix) {
|
||||
const text = await Bun.file(`${dir}${f}`).text();
|
||||
try {
|
||||
const parsed = parse(text);
|
||||
console.log(`could parse ${f} - ${parsed.type === "File"}`);
|
||||
} catch (e) {
|
||||
console.error(`could not parse ${f}`);
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`Found ${filesToFix.length} files to fix`);
|
Loading…
Add table
Reference in a new issue