| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 | #!/usr/bin/env python3import osimport sysfrom subprocess import run,Popen, PIPEsource_server="git@git.annax.de"local_base=f"./repositories"mirror_base=f"{local_base}/{source_server}"COM=sys.argv[0]def git_info(source_server):    proc = Popen(        ["ssh",source_server,"info"],         stdout=PIPE,        stderr=PIPE,        encoding="utf-8")    for line in proc.stdout.readlines():        yield linedef 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]async def run_parallel(target, args=[], procs=4, debug=False):    import asyncio    loop = asyncio.new_event_loop()    jobs = []    lock = asyncio.Lock()    async def addJobs(target, args):        for arg in args:            print("addJobs:", len(jobs))            while len(jobs) >= procs:                lock.release()                await asyncio.sleep(0.5)            await lock.acquire()            print("adding Job with arg:", arg)            jobs.append(loop.create_task(target(arg)))    jobmon = loop.create_task(addJobs(target, args))    while True:        while len(jobs)==0:            await lock.acquire()            if jobmon.done():                break        result = await jobs[0]        print("Job done with result:", result, flush=True)        jobs.pop(0)        lock.release()    print(jobmon)    await jobmondef main2():    import asyncio    lines = git_info(source_server)    repos = repos_from_lines(lines)    asyncio.run(run_parallel(mirror_repo, repos, debug=True))def main():    lines = git_info(source_server)    repos = repos_from_lines(lines)    for repo in repos:        mirror_repo(repo)def mirror_repo(repo):    print(f"{COM}: checking: {repo}")    source_repo = f"{source_server}:{repo}"    local_repo = f"{mirror_base}/{repo}"    if os.path.isdir(f"{local_repo}/refs"):        update_local_repo(local_repo)    else:        clone_repo(source_repo, local_repo)    return Truedef update_local_repo(local_repo):    print(f"{COM}: {local_repo} exists, updating...")    run(["git","fetch","-p","origin"], cwd=local_repo)def clone_repo(source_repo, local_repo):    print(f"{COM}: Cloning {source_repo} => {local_repo}")    run(["rm","-rf",local_repo])    run(["mkdir","-p",local_repo])    run(["git","clone","--bare",source_repo,"."], cwd=local_repo)if __name__ == "__main__":    main()
 |