Explorar o código

initial commit

Tobias Simetsreiter %!s(int64=5) %!d(string=hai) anos
achega
0ea1fc56b4
Modificáronse 2 ficheiros con 101 adicións e 0 borrados
  1. 1 0
      .gitignore
  2. 100 0
      gitmirror.py

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+repositories

+ 100 - 0
gitmirror.py

@@ -0,0 +1,100 @@
+#!/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 git_info(source_server):
+    proc = Popen(
+        ["ssh",source_server,"info"], 
+        stdout=PIPE,
+        stderr=PIPE,
+        encoding="utf-8")
+    for line in proc.stdout.readlines():
+        yield line
+
+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]
+
+
+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 jobmon
+
+
+
+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():
+    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 True
+
+def 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()
+