chiark / gitweb /
Use gitlab pages as mirror
authorthez3ro <io@thezero.org>
Wed, 17 May 2017 18:37:49 +0000 (20:37 +0200)
committerthez3ro <io@thezero.org>
Wed, 17 May 2017 19:08:34 +0000 (21:08 +0200)
fdroidserver/index.py
fdroidserver/server.py

index 643210b208fe923dcbb091e04d44b8d55b9505a1..aae2e1b6588528a7e0b5f93e2f8bd89023a18df7 100644 (file)
@@ -114,7 +114,7 @@ def make(apps, sortedids, apks, repodir, archive):
         else:
             mirrors.append(urllib.parse.urljoin(mirror + '/', urlbasepath))
     for mirror in common.config.get('servergitmirrors', []):
-        mirror = get_raw_mirror(mirror)
+        mirror = get_mirror_service_url(mirror)
         if mirror is not None:
             mirrors.append(mirror + '/')
     if mirrorcheckfailed:
@@ -517,7 +517,7 @@ def extract_pubkey():
     return hexlify(pubkey), repo_pubkey_fingerprint
 
 
-def get_raw_mirror(url):
+def get_mirror_service_url(url):
     '''Get direct URL from git service for use by fdroidclient
 
     Via 'servergitmirrors', fdroidserver can create and push a mirror
@@ -531,23 +531,27 @@ def get_raw_mirror(url):
         url = re.sub(r'^git@(.*):(.*)', r'https://\1/\2', url)
 
     segments = url.split("/")
+
+    if segments[4].endswith('.git'):
+        segments[4] = segments[4][:-4]
+
     hostname = segments[2]
+    user = segments[3]
+    repo = segments[4]
     branch = "master"
     folder = "fdroid"
 
     if hostname == "github.com":
-        # Github like RAW segments "https://raw.githubusercontent.com/user/repo/master/fdroid"
+        # Github-like RAW segments "https://raw.githubusercontent.com/user/repo/master/fdroid"
         segments[2] = "raw.githubusercontent.com"
         segments.extend([branch, folder])
     elif hostname == "gitlab.com":
-        # Gitlab like RAW segments "https://gitlab.com/user/repo/raw/master/fdroid"
-        segments.extend(["raw", branch, folder])
+        # Gitlab-like Pages segments "https://user.gitlab.com/repo/fdroid"
+        gitlab_url = ["https:", "", user + ".gitlab.io", repo, folder]
+        segments = gitlab_url
     else:
         return None
 
-    if segments[4].endswith('.git'):
-        segments[4] = segments[4][:-4]
-
     return '/'.join(segments)
 
 
index fb20148d8192eb80a48fd459cf255539d72a32b3..8f8d578f8e216b45cc7ed18ccac51a0ea0b616d7 100644 (file)
@@ -369,6 +369,36 @@ def update_servergitmirrors(servergitmirrors, repo_section):
             logging.debug('Pushing to ' + remote.url)
             with repo.git.custom_environment(GIT_SSH_COMMAND=ssh_cmd):
                 remote.push('master', force=True, set_upstream=True, progress=progress)
+
+        # push for every remote. This will overwrite the git history
+        for remote in repo.remotes:
+            branch = 'master'
+            if remote.name == 'gitlab':
+                logging.debug('Writing .gitlab-ci.yml to deploy to GitLab Pages')
+                with open(os.path.join(git_mirror_path, ".gitlab-ci.yml"), "wt") as out_file:
+                    out_file.write("""pages:
+  script:
+   - mkdir .public
+   - cp -r * .public/
+   - mv .public public
+  artifacts:
+    paths:
+    - public
+""")
+
+                repo.git.add(all=True)
+                repo.index.commit("fdroidserver git-mirror: Deploy to GitLab Pages")
+
+            logging.debug('Pushing to ' + remote.url)
+            with repo.git.custom_environment(GIT_SSH_COMMAND=ssh_cmd):
+                remote.push(branch, force=True, set_upstream=True, progress=progress)
+
+            # Reset the gitlab specific stuff before the next remote.
+            if remote.name == 'gitlab':
+                logging.debug('Removing .gitlab-ci.yml now that it has successfully deployed')
+                repo.index.reset('HEAD^')
+                repo.index.checkout()
+
         if progress:
             bar.done()