Reflect the current year in all TechnoLibre license headers across script/, test/, and docker/. Generated by Claude Code 2.1.74 model claude-sonnet-4-6 Co-Authored-By: Mathieu Benoit <mathben@technolibre.ca>
148 lines
4.5 KiB
Python
Executable file
148 lines
4.5 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
# © 2021-2026 TechnoLibre (http://www.technolibre.ca)
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
|
|
import argparse
|
|
import logging
|
|
import os
|
|
import sys
|
|
|
|
from git import Repo
|
|
from retrying import retry # pip install retrying
|
|
|
|
new_path = os.path.normpath(
|
|
os.path.join(os.path.dirname(__file__), "..", "..")
|
|
)
|
|
sys.path.append(new_path)
|
|
|
|
from script import fork_github_repo
|
|
from script.git.git_tool import GitTool
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
CST_EL_GITHUB_TOKEN = "EL_GITHUB_TOKEN"
|
|
|
|
|
|
def get_config():
|
|
"""Parse command line arguments, extracting the config file name,
|
|
returning the union of config file and command line arguments
|
|
|
|
:return: dict of config file settings and command line arguments
|
|
"""
|
|
config = GitTool.get_project_config()
|
|
|
|
# TODO update description
|
|
parser = argparse.ArgumentParser(
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
description="""\
|
|
""",
|
|
epilog="""\
|
|
""",
|
|
)
|
|
parser.add_argument(
|
|
"-d",
|
|
"--dir",
|
|
dest="dir",
|
|
default="./",
|
|
help="Path of repo to change remote, including submodule.",
|
|
)
|
|
parser.add_argument(
|
|
"--organization",
|
|
dest="organization",
|
|
default="ERPLibre",
|
|
help="Choose organization to fork and change all repo.",
|
|
)
|
|
parser.add_argument(
|
|
"--github_token",
|
|
dest="github_token",
|
|
default=config.get(CST_EL_GITHUB_TOKEN),
|
|
help="GitHub token generated by user",
|
|
)
|
|
args = parser.parse_args()
|
|
return args
|
|
|
|
|
|
def main():
|
|
config = get_config()
|
|
github_token = config.github_token
|
|
|
|
if not github_token:
|
|
raise ValueError("Missing github_token")
|
|
repo_root = Repo(config.dir)
|
|
lst_repo = GitTool().get_source_repo_addons(repo_path=config.dir)
|
|
i = 0
|
|
total = len(lst_repo)
|
|
for repo in lst_repo:
|
|
i += 1
|
|
print(f"Nb element {i}/{total}")
|
|
url = repo.get("url")
|
|
repo_dir_root = repo.get("path")
|
|
branch_name = None
|
|
upstream_name = "upstream"
|
|
organization_name = config.organization
|
|
|
|
# Exception, if repo existing, create appropriate remote to keep access
|
|
# and remove origin
|
|
# TODO do it
|
|
# Don't overwrite upstream_name if already exist
|
|
# Create origin of organization of upstream if not exist
|
|
# Move actual origin to is organization
|
|
working_repo = Repo(repo.get("relative_path"))
|
|
|
|
dct_remote_name = {a.name: a for a in working_repo.remotes}
|
|
remote_origin = dct_remote_name.get("origin")
|
|
|
|
# for remote in working_repo.remotes:
|
|
if remote_origin:
|
|
repo_origin_info = GitTool.get_transformed_repo_info_from_url(
|
|
remote_origin.url, repo_path=repo.get("relative_path")
|
|
)
|
|
|
|
if repo_origin_info.organization not in dct_remote_name.keys():
|
|
# Add remote
|
|
upstream_remote = retry(
|
|
wait_exponential_multiplier=1000, stop_max_delay=15000
|
|
)(working_repo.create_remote)(
|
|
repo_origin_info.organization, repo_origin_info.url_https
|
|
)
|
|
print(
|
|
'Remote "%s" created for %s'
|
|
% (
|
|
repo_origin_info.organization,
|
|
repo_origin_info.url_https,
|
|
)
|
|
)
|
|
|
|
# Fetch the remote
|
|
retry(wait_exponential_multiplier=1000, stop_max_delay=15000)(
|
|
upstream_remote.fetch
|
|
)()
|
|
print('Remote "%s" fetched' % repo_origin_info.organization)
|
|
# working_repo.git.remote.remove("origin")
|
|
upstream_name = organization_name
|
|
# TODO a la première création, on choisit le URL source en cas de non existance de upstream,
|
|
# sinon on choisit celui de ERPLibre
|
|
# [<git.Remote "origin">, <git.Remote "upstream">, <git.Remote "MathBenTech">]
|
|
|
|
_logger.info(
|
|
f"Fork {url} on dir {repo_dir_root} for organization"
|
|
f" {organization_name}"
|
|
)
|
|
|
|
fork_github_repo.fork_and_clone_repo(
|
|
url,
|
|
github_token,
|
|
repo_dir_root,
|
|
branch_name=branch_name,
|
|
upstream_name=upstream_name,
|
|
organization_name=organization_name,
|
|
# fork_only=True,
|
|
repo_root=repo_root,
|
|
)
|
|
|
|
# Update origin to new repo
|
|
|
|
GitTool().generate_generate_config()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|