| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #!/usr/bin/env python3
- import os
- import sys
- from subprocess import run,Popen, PIPE
- source_server="git@git.annax.de"
- local_base=f"./repositories"
- mirror_base=f"{local_base}/{source_server}"
- COM=sys.argv[0]
- def parser():
- from argparse import Parser
- def main():
- repos = repos_from_lines(git_info(source_server))
- for output in map_threaded(pull_repo, repos, debug=True):
- pass
- def git_info(source_server):
- proc = Popen(
- ["ssh",source_server,"info"],
- stdout=PIPE,
- stderr=PIPE,
- encoding="utf-8")
- for line in iter(proc.stdout.readline, ""):
- yield line
- proc.wait()
- print("GIT_INFO DONE!!!!!!!!!!!!!!!")
- def repos_from_lines(lines):
- for line in lines:
- if line.find("gitolite") >= 0:
- continue
- fields = line.split()
- if len(fields) < 3:
- continue
- yield fields[2]
- '''
- :param target: A function to be mapped.
- :param args: An Array or Generator to be mapped.
- :return: Generator of function return values, but not in same order.
- '''
- def map_threaded(target, args=[], procs=4, debug=False):
- import threading
- import queue
- inq = queue.Queue()
- outq = queue.Queue()
- jobs = []
- def worker():
- import time
- while True:
- num, arg = inq.get(block=True)
- if num == None:
- break
- print(f"{COM}: threaded task ({num}/{num+inq.qsize()}): {arg}")
- result = target(arg)
- outq.put(result)
- while len(jobs) < procs:
- th = threading.Thread(target=worker)
- th.start()
- jobs.append(th)
- def filler():
- i = 0
- for arg in args:
- i += 1
- inq.put((i,arg))
- for job in jobs:
- inq.put((None,None))
- fillThread = threading.Thread(target=filler)
- fillThread.start()
- while fillThread.is_alive():
- yield outq.get(block=True)
- fillThread.join()
- for job in jobs:
- job.join()
- while not outq.empty():
- yield outq.get(block=True)
- def print_sleep(args):
- import time
- print("Job Started: ",args)
- time.sleep(3)
- print("Job Done!")
- return args
- def main2():
- lines = git_info(source_server)
- repos = repos_from_lines(lines)
- for repo in repos:
- mirror_repo(repo)
- def source_repo(repo):
- return f"{source_server}:{repo}"
- def local_repo(repo):
- return f"{mirror_base}/{repo}.git"
- def pull_repo(repo):
- return mirror_repo(source_repo(repo), local_repo(repo))
- def mirror_repo(source_repo,local_repo):
- if not os.path.isdir(f"{local_repo}/refs"):
- init_repo(source_repo, local_repo)
- update_local_repo(local_repo)
- return True
- def update_local_repo(local_repo):
- proc = run(["git","fetch","-p","origin"], cwd=local_repo)
- if not proc.returncode == 0:
- print(f"Error: {proc}, {local_repo}")
- _rm(local_repo)
- def init_repo(source_repo, local_repo):
- _rm(local_repo)
- run(["mkdir","-p",local_repo])
- proc1 = run(["git","init","--bare"], cwd=local_repo)
- proc2 = run(["git","remote","add","origin",source_repo], cwd=local_repo)
- if not proc1.returncode == 0 and proc2.returncode == 0:
- print(f"Error: {proc1}, {proc2}, {local_repo}")
- _rm(local_repo)
- def _rm(di):
- run(["rm","-rf", di])
- if __name__ == "__main__":
- main()
|