gitmirror.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #!/usr/bin/env python3
  2. import os
  3. import sys
  4. from subprocess import run,Popen, PIPE
  5. source_server="git@git.annax.de"
  6. local_base=f"./repositories"
  7. mirror_base=f"{local_base}/{source_server}"
  8. COM=sys.argv[0]
  9. def main4():
  10. repos = repos_from_lines(git_info(source_server))
  11. from multiprocessing import Pool
  12. pool = Pool(processes=4)
  13. pool.map(pull_repo, repos)
  14. def git_info(source_server):
  15. proc = Popen(
  16. ["ssh",source_server,"info"],
  17. stdout=PIPE,
  18. stderr=PIPE,
  19. encoding="utf-8")
  20. for line in iter(proc.stdout.readline, ""):
  21. yield line
  22. proc.wait()
  23. print("GIT_INFO DONE!!!!!!!!!!!!!!!")
  24. def repos_from_lines(lines):
  25. for line in lines:
  26. if line.find("gitolite") >= 0:
  27. continue
  28. fields = line.split()
  29. if len(fields) < 3:
  30. continue
  31. yield fields[2]
  32. def run_threaded(target, args=[], procs=4, debug=False):
  33. import threading
  34. import queue
  35. inq = queue.Queue()
  36. outq = queue.Queue()
  37. jobs = []
  38. def worker():
  39. import time
  40. while True:
  41. num, arg = inq.get(block=True)
  42. if num == None:
  43. break
  44. print(f"{COM}: threaded task ({num}/{num+inq.qsize()}): {arg}")
  45. result = target(arg)
  46. outq.put(result)
  47. while len(jobs) < procs:
  48. th = threading.Thread(target=worker)
  49. th.start()
  50. jobs.append(th)
  51. def filler():
  52. i = 0
  53. for arg in args:
  54. i += 1
  55. inq.put((i,arg))
  56. for job in jobs:
  57. inq.put((None,None))
  58. fillThread = threading.Thread(target=filler)
  59. fillThread.start()
  60. while fillThread.is_alive():
  61. yield outq.get(block=True)
  62. fillThread.join()
  63. for job in jobs:
  64. job.join()
  65. while not outq.empty():
  66. yield outq.get(block=True)
  67. def print_sleep(args):
  68. import time
  69. print("Job Started: ",args)
  70. time.sleep(3)
  71. print("Job Done!")
  72. return args
  73. def main():
  74. repos = repos_from_lines(git_info(source_server))
  75. for output in run_threaded(pull_repo, repos, debug=True):
  76. pass
  77. def main2():
  78. lines = git_info(source_server)
  79. repos = repos_from_lines(lines)
  80. for repo in repos:
  81. mirror_repo(repo)
  82. def source_repo(repo):
  83. return f"{source_server}:{repo}"
  84. def local_repo(repo):
  85. return f"{mirror_base}/{repo}.git"
  86. def pull_repo(repo):
  87. return mirror_repo(source_repo(repo), local_repo(repo))
  88. def mirror_repo(source_repo,local_repo):
  89. if not os.path.isdir(f"{local_repo}/refs"):
  90. init_repo(source_repo, local_repo)
  91. update_local_repo(local_repo)
  92. return True
  93. def update_local_repo(local_repo):
  94. proc = run(["git","fetch","-p","origin"], cwd=local_repo)
  95. if not proc.returncode == 0:
  96. print(f"Error: {proc}, {local_repo}")
  97. _rm(local_repo)
  98. def init_repo(source_repo, local_repo):
  99. _rm(local_repo)
  100. run(["mkdir","-p",local_repo])
  101. proc1 = run(["git","init","--bare"], cwd=local_repo)
  102. proc2 = run(["git","remote","add","origin",source_repo], cwd=local_repo)
  103. if not proc1.returncode == 0 and proc2.returncode == 0:
  104. print(f"Error: {proc1}, {proc2}, {local_repo}")
  105. _rm(local_repo)
  106. def _rm(di):
  107. run(["rm","-rf", di])
  108. if __name__ == "__main__":
  109. main()