|
|
@@ -32,53 +32,69 @@ def repos_from_lines(lines):
|
|
|
yield fields[2]
|
|
|
|
|
|
|
|
|
-async def run_parallel(target, args=[], procs=4, debug=False):
|
|
|
- import asyncio
|
|
|
- loop = asyncio.new_event_loop()
|
|
|
+def run_threaded(target, args=[], procs=4, debug=False):
|
|
|
+ import threading
|
|
|
+ import queue
|
|
|
+ inq = queue.Queue()
|
|
|
+ outq = queue.Queue()
|
|
|
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():
|
|
|
+ j = 0
|
|
|
+ i = 0
|
|
|
+ def worker(j):
|
|
|
+ import time
|
|
|
+ while True:
|
|
|
+ arg = inq.get(block=True)
|
|
|
+ if arg == None:
|
|
|
break
|
|
|
- result = await jobs[0]
|
|
|
- print("Job done with result:", result, flush=True)
|
|
|
- jobs.pop(0)
|
|
|
- lock.release()
|
|
|
- print(jobmon)
|
|
|
- await jobmon
|
|
|
+ j += 1
|
|
|
+ print(f"{COM}: mirror task ({j}/{i}): {source_repo(arg)} => {local_repo(arg)}")
|
|
|
+ outq.put(target(source_repo(arg), local_repo(arg)))
|
|
|
+ while len(jobs) < procs:
|
|
|
+ th = threading.Thread(target=worker, args=(j,))
|
|
|
+ th.start()
|
|
|
+ jobs.append(th)
|
|
|
+ i = 0
|
|
|
+ for arg in args:
|
|
|
+ i += 1
|
|
|
+ inq.put(arg)
|
|
|
+ for job in jobs:
|
|
|
+ inq.put(None)
|
|
|
+ for job in jobs:
|
|
|
+ job.join()
|
|
|
|
|
|
|
|
|
+def main():
|
|
|
+ repos = repos_from_lines(git_info(source_server))
|
|
|
+ from multiprocessing import Pool
|
|
|
+ pool = Pool(processes=4)
|
|
|
+ pool.map(pull_repo, repos)
|
|
|
|
|
|
-def main2():
|
|
|
- import asyncio
|
|
|
- lines = git_info(source_server)
|
|
|
- repos = repos_from_lines(lines)
|
|
|
- asyncio.run(run_parallel(mirror_repo, repos, debug=True))
|
|
|
|
|
|
-def main():
|
|
|
+def main3():
|
|
|
+ repos = repos_from_lines(git_info(source_server))
|
|
|
+ run_threaded(mirror_repo, repos, debug=True)
|
|
|
+
|
|
|
+def main2():
|
|
|
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}"
|
|
|
+def source_repo(repo):
|
|
|
+ return f"{source_server}:{repo}"
|
|
|
+
|
|
|
+def local_repo(repo):
|
|
|
+ return f"{mirror_base}/{repo}.git"
|
|
|
+
|
|
|
+processed = 0
|
|
|
+def pull_repo(repo):
|
|
|
+ global processed
|
|
|
+ processed += 1
|
|
|
+ print(f"{COM}: mirror task {processed}: {source_repo(repo)} => {local_repo(repo)}")
|
|
|
+ return mirror_repo(source_repo(repo), local_repo(repo))
|
|
|
+
|
|
|
+def mirror_repo(source_repo,local_repo):
|
|
|
if os.path.isdir(f"{local_repo}/refs"):
|
|
|
update_local_repo(local_repo)
|
|
|
else:
|
|
|
@@ -86,14 +102,21 @@ def mirror_repo(repo):
|
|
|
return True
|
|
|
|
|
|
def update_local_repo(local_repo):
|
|
|
- print(f"{COM}: {local_repo} exists, updating...")
|
|
|
- run(["git","fetch","-p","origin"], cwd=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 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)
|
|
|
+ proc = run(["git","clone","--bare",source_repo,"."], cwd=local_repo)
|
|
|
+ if not proc.returncode == 0:
|
|
|
+ print(f"Error: {proc}, {local_repo}")
|
|
|
+ _rm(local_repo)
|
|
|
+
|
|
|
+def _rm(di):
|
|
|
+ run(["rm","-rf",local_repo])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
main()
|