Started work

This commit is contained in:
Mike 2023-01-17 22:14:46 -08:00
parent 9a4eb19983
commit 4b5e834bc2
5 changed files with 224 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.idea/

12
Pipfile Normal file
View File

@ -0,0 +1,12 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
giteapy = "*"
[dev-packages]
[requires]
python_version = "3.10"

60
Pipfile.lock generated Normal file
View File

@ -0,0 +1,60 @@
{
"_meta": {
"hash": {
"sha256": "824c02127733d501ae21f3e5ccc7ee72fc4b2fe92bbca23c77ebd204d294b0fc"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.10"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"certifi": {
"hashes": [
"sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3",
"sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"
],
"markers": "python_version >= '3.6'",
"version": "==2022.12.7"
},
"giteapy": {
"hashes": [
"sha256:2078c802a4626bf311e911c969c34b7d19fbe9175e2910e1965b24ff69221470"
],
"index": "pypi",
"version": "==1.0.8"
},
"python-dateutil": {
"hashes": [
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
"sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==2.8.2"
},
"six": {
"hashes": [
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==1.16.0"
},
"urllib3": {
"hashes": [
"sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72",
"sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
"version": "==1.26.14"
}
},
"develop": {}
}

67
domain/Migrator.py Normal file
View File

@ -0,0 +1,67 @@
import giteapy
import logging
import sys
class Migrator:
__DEFAULT_API_PATH = "/api/v1"
def __init__(
self,
source_host, source_port, source_token,
destination_host, destination_port, destination_token,
):
# noinspection PyTypeChecker
self.__logger: logging.Logger = None
self._init_logger()
self.__source_host = source_host
self.__source_port = source_port
self.__source_token = source_token
self.__destination_host = destination_host
self.__destination_port = destination_port
self.__destination_token = destination_token
def _init_logger(self):
logger = logging.Logger(name=f"{type(self).__name__}", level=logging.INFO)
stdout_handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(stdout_handler)
self.__logger = logger
def _get_org_apis(self):
conf_source = giteapy.Configuration()
conf_source.api_key['access_token'] = self.__source_token
conf_source.host = self._make_api_base(host=self.__source_host, port=self.__source_port)
api_source = giteapy.OrganizationApi(giteapy.ApiClient(conf_source))
conf_destination = giteapy.Configuration()
conf_destination.api_key['access_token'] = self.__destination_token
conf_destination.host = self._make_api_base(host=self.__destination_host, port=self.__destination_port)
api_destination = giteapy.OrganizationApi(giteapy.ApiClient(conf_destination))
return api_source, api_destination
def _make_api_base(self, host, port):
base = f"https://{host}"
if port is not None:
base += f":{port}"
base += self.__DEFAULT_API_PATH
return base
def migrate_entire_org(self, source_org, destination_org):
api_source, api_destination = self._get_org_apis()
source_repos = api_source.org_list_repos(source_org)
self.__logger.info(f"Found {len(source_repos)} repos on source.")

83
main.py Normal file
View File

@ -0,0 +1,83 @@
from domain.Migrator import Migrator
import argparse
def main():
parser = argparse.ArgumentParser(
prog="Mike's Gitea Repo Migrator - Move repositories from one Gitea instance to another"
)
parser.add_argument(
"--source-hostname", "--source-host",
dest="source_hostname",
required=True,
help="Hostname of the source server"
)
parser.add_argument(
"--source-port",
dest="source_port",
required=False,
default=None,
help="Port of the source server"
)
parser.add_argument(
"--source-token",
dest="source_token",
required=True,
help="Provide an API token for the source Gitea instance's user"
)
parser.add_argument(
"--source-org",
dest="source_org",
required=True,
help="Name of the source organization"
)
parser.add_argument(
"--destination-hostname", "--dest-hostname", "--destination-host", "--dest-host",
dest="destination_hostname",
required=True,
help="Hostname of the destination server"
)
parser.add_argument(
"--destination-port", "--dest-port",
dest="destination_port",
required=False,
default=None,
help="Port of the destination server"
)
parser.add_argument(
"--destination-token", "--dest-token",
dest="destination_token",
required=True,
help="Provide an API token for the destination Gitea instance's user"
)
parser.add_argument(
"--destination-org", "--dest-org",
dest="destination_org",
required=True,
help="Name of the destination organization"
)
args = parser.parse_args()
mig = Migrator(
source_host=args.source_hostname,
source_port=args.source_port,
source_token=args.source_token,
destination_host=args.destination_hostname,
destination_port=args.destination_port,
destination_token=args.destination_token
)
mig.migrate_entire_org(
source_org=args.source_org,
destination_org=args.destination_org
)
if __name__ == "__main__":
main()