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