Advertisement
Guest User

Untitled

a guest
Apr 14th, 2017
540
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.95 KB | None | 0 0
  1. import os
  2. import re
  3. import subprocess
  4.  
  5. import requests
  6.  
  7.  
  8. GITLAB_ENDPOINT = os.environ["GITLAB_ENDPOINT"]
  9. GITLAB_TOKEN = os.environ["GITLAB_TOKEN"]
  10.  
  11.  
  12. BITBUCKET_ENDPOINT = os.environ["BITBUCKET_ENDPOINT"]
  13. BITBUCKET_TEAM = os.environ["BITBUCKET_TEAM"]
  14. BITBUCKET_USERNAME = os.environ["BITBUCKET_USERNAME"]
  15. BITBUCKET_PASSWORD = os.environ["BITBUCKET_PASSWORD"]
  16.  
  17.  
  18. bitbucket = requests.Session()
  19. bitbucket.auth = (BITBUCKET_USERNAME, BITBUCKET_PASSWORD)
  20.  
  21.  
  22. def list_gitlab_repositories():
  23. repositories = []
  24. page = 1
  25. while True:
  26. params = {"page": page, "per_page": 100, "private_token": GITLAB_TOKEN}
  27. url = os.path.join(GITLAB_ENDPOINT, "projects")
  28. res = requests.get(url, params=params)
  29. repositories += res.json()
  30. if page >= int(res.headers["x-total-pages"]):
  31. break
  32. page += 1
  33. return repositories
  34.  
  35.  
  36. def list_bitbucket_projects():
  37. url = os.path.join(BITBUCKET_ENDPOINT, "teams", BITBUCKET_TEAM, "projects/")
  38. projects = []
  39. while url:
  40. res = bitbucket.get(url)
  41. payload = res.json()
  42. projects += payload["values"]
  43. url = payload.get("next", None)
  44. return projects
  45.  
  46.  
  47. def list_bitbucket_repositories():
  48. url = os.path.join(BITBUCKET_ENDPOINT, "repositories", BITBUCKET_TEAM)
  49. repositories = []
  50. while url:
  51. res = bitbucket.get(url)
  52. payload = res.json()
  53. repositories += payload["values"]
  54. url = payload.get("next", None)
  55. return repositories
  56.  
  57.  
  58. def generate_key(name):
  59. splitted = re.split("[- _]", name)
  60. chars = 2 if len(splitted) > 1 else 4
  61. return ''.join(n[:chars].upper() for n in splitted)
  62.  
  63.  
  64. def create_bitbucket_project(name):
  65. payload = {
  66. "name": name,
  67. "key": generate_key(name)
  68. }
  69. url = os.path.join(BITBUCKET_ENDPOINT, "teams", BITBUCKET_TEAM, "projects/")
  70. res = bitbucket.post(url, json=payload)
  71. if not 200 <= res.status_code < 300:
  72. raise ValueError("could not create project {0}: {1}".format(name, res.text))
  73.  
  74.  
  75. def create_bitbucket_repository(name, project):
  76. payload = {"scm": "git", "project": {"key": generate_key(project)}}
  77. url = os.path.join(BITBUCKET_ENDPOINT, "repositories", BITBUCKET_TEAM, name)
  78. res = bitbucket.post(url, json=payload)
  79. if not 200 <= res.status_code < 300:
  80. raise ValueError("could not create repository {0}: {1}".format(name, res.text))
  81.  
  82.  
  83. def clone_repository(repository):
  84. project_dir = os.path.join("/tmp", repository["namespace"]["name"], repository["name"])
  85. if os.path.exists(project_dir) and os.listdir(project_dir):
  86. return False
  87. os.makedirs(project_dir, exist_ok=True)
  88. subprocess.run(["git", "clone", repository["ssh_url_to_repo"], project_dir])
  89. return project_dir
  90.  
  91. def upload_repository(name, project):
  92. project_dir = os.path.join("/tmp", project, name)
  93. remote = "git@bitbucket.org:{0}/{1}.git".format(BITBUCKET_TEAM, name)
  94. subprocess.run(["git", "remote", "add", "bitbucket", remote], cwd=project_dir)
  95. subprocess.run(["git", "push", "bitbucket", "master"], cwd=project_dir)
  96.  
  97.  
  98. class Migrator:
  99. def __init__(self):
  100. self.repositories = list_gitlab_repositories()
  101. self.projects = set(project["name"] for project in list_bitbucket_projects())
  102.  
  103. def migrate_repositories(self):
  104. for repository in self.repositories:
  105. self.migrate_repository(repository)
  106.  
  107. def ensure_project_exists(self, project):
  108. if project not in self.projects:
  109. create_bitbucket_project(project)
  110. self.projects.add(project)
  111.  
  112. def migrate_repository(self, repository):
  113. project = repository["namespace"]["name"]
  114. self.ensure_project_exists(project)
  115. project_dir = clone_repository(repository)
  116. if not project_dir:
  117. return
  118. create_bitbucket_repository(repository["name"], project)
  119. upload_repository(repository["name"], project)
  120.  
  121.  
  122. def main():
  123. migrator = Migrator()
  124. migrator.migrate_repositories()
  125.  
  126.  
  127. if __name__ == '__main__':
  128. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement