diff --git a/build/Dockerfile.dockerignore b/build/Dockerfile.dockerignore index 9cf144e..51fb429 100644 --- a/build/Dockerfile.dockerignore +++ b/build/Dockerfile.dockerignore @@ -1,6 +1,8 @@ -.idea/ .git/ -node_modules/ +.github/ +.idea/ + +third_party/ .secrets.rc .gitignore diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b164eb7..0000000 --- a/package-lock.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "name": "mirror-to-gitea", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@octokit/auth-token": { - "version": "2.4.4", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/auth-token/-/auth-token-2.4.4.tgz", - "integrity": "sha1-7jHGmwHQN4wS/T/+QGAw89lNO1Y=", - "requires": { - "@octokit/types": "^6.0.0" - } - }, - "@octokit/core": { - "version": "3.2.4", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/core/-/core-3.2.4.tgz", - "integrity": "sha1-V5ElYFepYuypcuMYGPAkVIl/0QY=", - "requires": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.4.12", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.1.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.10", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/endpoint/-/endpoint-6.0.10.tgz", - "integrity": "sha1-dBzh+i9Pt3zo6+DG6vXOY/Vl+Og=", - "requires": { - "@octokit/types": "^6.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "4.5.8", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/graphql/-/graphql-4.5.8.tgz", - "integrity": "sha1-1CNzYzwwFdDq/OZKjOGWvhZ/3Zs=", - "requires": { - "@octokit/request": "^5.3.0", - "@octokit/types": "^6.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "2.2.0", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/openapi-types/-/openapi-types-2.2.0.tgz", - "integrity": "sha1-Ej4EOKC8cYzNrDtaLmmz3QDaqFs=" - }, - "@octokit/plugin-paginate-rest": { - "version": "2.7.0", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.7.0.tgz", - "integrity": "sha1-a7ewQ8JG4GVBGabsTnKhcsnix/M=", - "requires": { - "@octokit/types": "^6.0.1" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.2", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz", - "integrity": "sha1-OU1Z7HNM0vEiQx+68FCZhh7OPEQ=" - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "4.4.1", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.4.1.tgz", - "integrity": "sha1-EFz5MlVDIVXeB4ye/DO9ThTRzWM=", - "requires": { - "@octokit/types": "^6.1.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "5.4.12", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/request/-/request-5.4.12.tgz", - "integrity": "sha1-sEgm+pNGcMVrE1qBRHviwXI6L/w=", - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "once": "^1.4.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "2.0.4", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/request-error/-/request-error-2.0.4.tgz", - "integrity": "sha1-B91cBSHS7pdSASdMRyoSeRd0EmI=", - "requires": { - "@octokit/types": "^6.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "18.0.12", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/rest/-/rest-18.0.12.tgz", - "integrity": "sha1-J4vUE1jFbYfCAeeH6K3AysEyUDo=", - "requires": { - "@octokit/core": "^3.2.3", - "@octokit/plugin-paginate-rest": "^2.6.2", - "@octokit/plugin-request-log": "^1.0.2", - "@octokit/plugin-rest-endpoint-methods": "4.4.1" - } - }, - "@octokit/types": { - "version": "6.2.1", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@octokit/types/-/types-6.2.1.tgz", - "integrity": "sha1-f4gf5ER1qxgld2pKWcoa4ILtEEM=", - "requires": { - "@octokit/openapi-types": "^2.2.0", - "@types/node": ">= 8" - } - }, - "@types/node": { - "version": "14.14.20", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/@types/node/-/node-14.14.20.tgz", - "integrity": "sha1-95dIY+3SHR+KSUpz6OKzZYYVw0A=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "before-after-hook": { - "version": "2.1.0", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/before-after-hook/-/before-after-hook-2.1.0.tgz", - "integrity": "sha1-tsA0h/ROJCAN0wyl5qGXnF0vtjU=" - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha1-Y2jL20Cr8zc7UlrIfkomDDpwCRk=" - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==" - }, - "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" - }, - "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", - "requires": { - "mime-db": "~1.38.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "requires": { - "p-finally": "^1.0.0" - } - }, - "qs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", - "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==" - }, - "readable-stream": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", - "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "superagent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-4.1.0.tgz", - "integrity": "sha512-FT3QLMasz0YyCd4uIi5HNe+3t/onxMyEho7C3PSqmti3Twgy2rXT4fmkTz6wRL6bTF4uzPcfkUCa8u4JWHw8Ag==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.0", - "form-data": "^2.3.3", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^2.4.0", - "qs": "^6.6.0", - "readable-stream": "^3.0.6" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha1-M4H4UDslHA2c0hvB3pOeyd9UgO4=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://globaldevtools.bbva.com:443/artifactory/api/npm/npm-repo/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 6f7a4b6..0000000 --- a/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "mirror-to-gitea", - "version": "1.0.0", - "description": "mirror all your public github repositories to your gitea server", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/jaedle/mirror-to-gitea.git" - }, - "keywords": [], - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/jaedle/mirror-to-gitea/issues" - }, - "homepage": "https://github.com/jaedle/mirror-to-gitea#readme", - "dependencies": { - "@octokit/rest": "^18.0.12", - "p-queue": "^6.6.2", - "superagent": "^4.0.0" - } -} diff --git a/src/index.js b/src/index.js deleted file mode 100644 index ae7da2d..0000000 --- a/src/index.js +++ /dev/null @@ -1,104 +0,0 @@ -const {Octokit} = require('@octokit/rest'); -const request = require('superagent'); -const {default: PQueue} = require('p-queue'); - - -async function getGithubRepositories(username, token) { - const octokit = new Octokit({ - auth: token || null, - }); - return octokit.paginate('GET /users/:username/repos', { username: username }) - .then(repositories => toRepositoryList(repositories)); -} - -function toRepositoryList(repositories) { - return repositories.map(repository => { - return { name: repository.name, url: repository.clone_url } - }); -} - -async function getGiteaUser(gitea) { - return request.get(gitea.url - + '/api/v1/user') - .query(`access_token=${gitea.token}`) - .then(response => { - return { id: response.body.id, name: response.body.username } - }); -} - -function isAlreadyMirroredOnGitea(repository, gitea, giteaUser) { - const requestUrl = `${gitea.url}/api/v1/repos/${giteaUser.name}/${repository}`; - return request.get( - requestUrl) - .query(`access_token=${gitea.token}`) - .then(() => true) - .catch(() => false); -} - -function mirrorOnGitea(repository, gitea, giteaUser) { - request.post(`${gitea.url}/api/v1/repos/migrate`) - .query(`access_token=${gitea.token}`) - .send({ - clone_addr: repository.url, - mirror: true, - repo_name: repository.name, - uid: giteaUser.id, - }) - .then(() => { - console.log('Did it!'); - }) - .catch(err => { - console.log('Failed', err); - }); - -} - -async function mirror(repository, gitea, giteaUser) { - if (await isAlreadyMirroredOnGitea(repository.name, - gitea, - giteaUser)) { - console.log('Repository is already mirrored; doing nothing: ', repository.name); - return; - } - console.log('Mirroring repository to gitea: ', repository.name); - await mirrorOnGitea(repository, gitea, giteaUser); -} - -async function main() { - const githubUsername = process.env.GITHUB_USERNAME; - if (!githubUsername) { - console.error('No GITHUB_USERNAME specified, please specify! Exiting..'); - return; - } - const githubToken = process.env.GITHUB_TOKEN; - const giteaUrl = process.env.GITEA_URL; - if (!giteaUrl) { - console.error('No GITEA_URL specified, please specify! Exiting..'); - return; - } - - const giteaToken = process.env.GITEA_TOKEN; - if (!giteaToken) { - console.error('No GITEA_TOKEN specified, please specify! Exiting..'); - return; - } - - - const githubRepositories = await getGithubRepositories(githubUsername, githubToken); - console.log(`Found ${githubRepositories.length} repositories on github`); - - const gitea = { - url: giteaUrl, - token: giteaToken, - }; - const giteaUser = await getGiteaUser(gitea); - - const queue = new PQueue({ concurrency: 4 }); - await queue.addAll(githubRepositories.map(repository => { - return async () => { - await mirror(repository, gitea, giteaUser); - }; - })); -} - -main();