about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/version-management/gitlab/update.py
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/applications/version-management/gitlab/update.py')
-rwxr-xr-xnixpkgs/pkgs/applications/version-management/gitlab/update.py159
1 files changed, 74 insertions, 85 deletions
diff --git a/nixpkgs/pkgs/applications/version-management/gitlab/update.py b/nixpkgs/pkgs/applications/version-management/gitlab/update.py
index 650bd73aa845..dc2d1e29719d 100755
--- a/nixpkgs/pkgs/applications/version-management/gitlab/update.py
+++ b/nixpkgs/pkgs/applications/version-management/gitlab/update.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env nix-shell
-#! nix-shell -i python3 -p bundix common-updater-scripts nix nix-prefetch-git python3 python3Packages.requests python3Packages.lxml python3Packages.click python3Packages.click-log vgo2nix
+#! nix-shell -i python3 -p bundix common-updater-scripts nix nix-prefetch-git python3 python3Packages.requests python3Packages.lxml python3Packages.click python3Packages.click-log vgo2nix yarn2nix
 
 import click
 import click_log
@@ -20,7 +20,7 @@ logger = logging.getLogger(__name__)
 
 class GitLabRepo:
     version_regex = re.compile(r"^v\d+\.\d+\.\d+(\-rc\d+)?(\-ee)?")
-    def __init__(self, owner: str, repo: str):
+    def __init__(self, owner: str = 'gitlab-org', repo: str = 'gitlab'):
         self.owner = owner
         self.repo = repo
 
@@ -46,24 +46,6 @@ class GitLabRepo:
         j = json.loads(out)
         return j['sha256']
 
-    def get_deb_url(self, flavour: str, version: str, arch: str = 'amd64') -> str:
-        """
-        gitlab builds debian packages, which we currently need as we don't build the frontend on our own
-        this returns the url of a given flavour, version and arch
-        :param flavour: 'ce' or 'ee'
-        :param version: a version, without 'v' prefix and '-ee' suffix
-        :param arch: amd64
-        :return: url of the debian package
-        """
-        if self.owner != "gitlab-org" or self.repo not in ['gitlab-ce', 'gitlab-ee']:
-            raise Exception(f"don't know how to get deb_url for {self.url}")
-        return f"https://packages.gitlab.com/gitlab/gitlab-{flavour}/packages" + \
-               f"/debian/stretch/gitlab-{flavour}_{version}-{flavour}.0_{arch}.deb/download.deb"
-
-    def get_deb_hash(self, flavour: str, version: str) -> str:
-        out = subprocess.check_output(['nix-prefetch-url', self.get_deb_url(flavour, version)])
-        return out.decode('utf-8').strip()
-
     @staticmethod
     def rev2version(tag: str) -> str:
         """
@@ -86,46 +68,19 @@ class GitLabRepo:
         """
         return requests.get(self.url + f"/raw/{rev}/{filepath}").text
 
-    def get_data(self, rev, flavour):
+    def get_data(self, rev):
         version = self.rev2version(rev)
 
         passthru = {v: self.get_file(v, rev).strip() for v in ['GITALY_SERVER_VERSION', 'GITLAB_PAGES_VERSION',
                                                                'GITLAB_SHELL_VERSION', 'GITLAB_WORKHORSE_VERSION']}
         return dict(version=self.rev2version(rev),
                     repo_hash=self.get_git_hash(rev),
-                    deb_hash=self.get_deb_hash(flavour, version),
-                    deb_url=self.get_deb_url(flavour, version),
                     owner=self.owner,
                     repo=self.repo,
                     rev=rev,
                     passthru=passthru)
 
 
-def _flavour2gitlabrepo(flavour: str):
-    if flavour not in ['ce', 'ee']:
-        raise Exception(f"unknown gitlab flavour: {flavour}, needs to be ce or ee")
-
-    owner = 'gitlab-org'
-    repo = 'gitlab-' + flavour
-
-    return GitLabRepo(owner, repo)
-
-
-def _update_data_json(filename: str, repo: GitLabRepo, rev: str, flavour: str):
-    flavour_data = repo.get_data(rev, flavour)
-
-    if not os.path.exists(filename):
-        with open(filename, 'w') as f:
-            json.dump({flavour: flavour_data}, f, indent=2)
-    else:
-        with open(filename, 'r+') as f:
-            data = json.load(f)
-            data[flavour] = flavour_data
-            f.seek(0)
-            f.truncate()
-            json.dump(data, f, indent=2)
-
-
 def _get_data_json():
     data_file_path = pathlib.Path(__file__).parent / 'data.json'
     with open(data_file_path, 'r') as f:
@@ -146,100 +101,134 @@ def cli():
 
 @cli.command('update-data')
 @click.option('--rev', default='latest', help='The rev to use, \'latest\' points to the latest (stable) tag')
-@click.argument('flavour')
-def update_data(rev: str, flavour: str):
-    """Update data.nix for a selected flavour"""
-    r = _flavour2gitlabrepo(flavour)
+def update_data(rev: str):
+    """Update data.nix"""
+    repo = GitLabRepo()
 
     if rev == 'latest':
         # filter out pre and re releases
-        rev = next(filter(lambda x: not ('rc' in x or x.endswith('pre')), r.tags))
+        rev = next(filter(lambda x: not ('rc' in x or x.endswith('pre')), repo.tags))
     logger.debug(f"Using rev {rev}")
 
-    version = r.rev2version(rev)
+    version = repo.rev2version(rev)
     logger.debug(f"Using version {version}")
 
     data_file_path = pathlib.Path(__file__).parent / 'data.json'
 
-    _update_data_json(filename=data_file_path.as_posix(),
-                      repo=r,
-                      rev=rev,
-                      flavour=flavour)
+    data = repo.get_data(rev)
 
+    with open(data_file_path.as_posix(), 'w') as f:
+        json.dump(data, f, indent=2)
 
-@cli.command('update-rubyenv')
-@click.argument('flavour')
-def update_rubyenv(flavour):
-    """Update rubyEnv-${flavour}"""
-    if flavour not in ['ce', 'ee']:
-        raise Exception(f"unknown gitlab flavour: {flavour}, needs to be ce or ee")
 
-    r = _flavour2gitlabrepo(flavour)
-    rubyenv_dir = pathlib.Path(__file__).parent / f"rubyEnv-{flavour}"
+@cli.command('update-rubyenv')
+def update_rubyenv():
+    """Update rubyEnv"""
+    repo = GitLabRepo()
+    rubyenv_dir = pathlib.Path(__file__).parent / f"rubyEnv"
 
     # load rev from data.json
     data = _get_data_json()
-    rev = data[flavour]['rev']
+    rev = data['rev']
 
     for fn in ['Gemfile.lock', 'Gemfile']:
         with open(rubyenv_dir / fn, 'w') as f:
-            f.write(r.get_file(fn, rev))
+            f.write(repo.get_file(fn, rev))
 
     subprocess.check_output(['bundix'], cwd=rubyenv_dir)
 
 
+@cli.command('update-yarnpkgs')
+def update_yarnpkgs():
+    """Update yarnPkgs"""
+
+    repo = GitLabRepo()
+    yarnpkgs_dir = pathlib.Path(__file__).parent
+
+    # load rev from data.json
+    data = _get_data_json()
+    rev = data['rev']
+
+    with open(yarnpkgs_dir / 'yarn.lock', 'w') as f:
+        f.write(repo.get_file('yarn.lock', rev))
+
+    with open(yarnpkgs_dir / 'yarnPkgs.nix', 'w') as f:
+        subprocess.run(['yarn2nix'], cwd=yarnpkgs_dir, check=True, stdout=f)
+
+    os.unlink(yarnpkgs_dir / 'yarn.lock')
+
+
 @cli.command('update-gitaly')
 def update_gitaly():
     """Update gitaly"""
     data = _get_data_json()
-    gitaly_server_version = data['ce']['passthru']['GITALY_SERVER_VERSION']
-    r = GitLabRepo('gitlab-org', 'gitaly')
+    gitaly_server_version = data['passthru']['GITALY_SERVER_VERSION']
+    repo = GitLabRepo(repo='gitaly')
     gitaly_dir = pathlib.Path(__file__).parent / 'gitaly'
 
     for fn in ['Gemfile.lock', 'Gemfile']:
         with open(gitaly_dir / fn, 'w') as f:
-            f.write(r.get_file(f"ruby/{fn}", f"v{gitaly_server_version}"))
+            f.write(repo.get_file(f"ruby/{fn}", f"v{gitaly_server_version}"))
 
     for fn in ['go.mod', 'go.sum']:
         with open(gitaly_dir / fn, 'w') as f:
-            f.write(r.get_file(fn, f"v{gitaly_server_version}"))
+            f.write(repo.get_file(fn, f"v{gitaly_server_version}"))
 
     subprocess.check_output(['bundix'], cwd=gitaly_dir)
     subprocess.check_output(['vgo2nix'], cwd=gitaly_dir)
 
     for fn in ['go.mod', 'go.sum']:
         os.unlink(gitaly_dir / fn)
-    # currently broken, as `gitaly.meta.position` returns
-    # pkgs/development/go-modules/generic/default.nix
-    # so update-source-version doesn't know where to update hashes
-    # _call_update_source_version('gitaly', gitaly_server_version)
-    gitaly_hash = r.get_git_hash(f"v{gitaly_server_version}")
-    click.echo(f"Please update gitaly/default.nix to version {gitaly_server_version} and hash {gitaly_hash}")
+
+    _call_update_source_version('gitaly', gitaly_server_version)
 
 
 @cli.command('update-gitlab-shell')
 def update_gitlab_shell():
     """Update gitlab-shell"""
     data = _get_data_json()
-    gitlab_shell_version = data['ce']['passthru']['GITLAB_SHELL_VERSION']
+    gitlab_shell_version = data['passthru']['GITLAB_SHELL_VERSION']
     _call_update_source_version('gitlab-shell', gitlab_shell_version)
 
+    repo = GitLabRepo(repo='gitlab-shell')
+    gitlab_shell_dir = pathlib.Path(__file__).parent / 'gitlab-shell'
+
+    for fn in ['go.mod', 'go.sum']:
+        with open(gitlab_shell_dir / fn, 'w') as f:
+            f.write(repo.get_file(fn, f"v{gitlab_shell_version}"))
+
+    subprocess.check_output(['vgo2nix'], cwd=gitlab_shell_dir)
+
+    for fn in ['go.mod', 'go.sum']:
+        os.unlink(gitlab_shell_dir / fn)
+
 
 @cli.command('update-gitlab-workhorse')
 def update_gitlab_workhorse():
-    """Update gitlab-shell"""
+    """Update gitlab-workhorse"""
     data = _get_data_json()
-    gitlab_workhorse_version = data['ce']['passthru']['GITLAB_WORKHORSE_VERSION']
+    gitlab_workhorse_version = data['passthru']['GITLAB_WORKHORSE_VERSION']
     _call_update_source_version('gitlab-workhorse', gitlab_workhorse_version)
 
+    repo = GitLabRepo('gitlab-org', 'gitlab-workhorse')
+    gitlab_workhorse_dir = pathlib.Path(__file__).parent / 'gitlab-workhorse'
+
+    for fn in ['go.mod', 'go.sum']:
+        with open(gitlab_workhorse_dir / fn, 'w') as f:
+            f.write(repo.get_file(fn, f"v{gitlab_workhorse_version}"))
+
+    subprocess.check_output(['vgo2nix'], cwd=gitlab_workhorse_dir)
+
+    for fn in ['go.mod', 'go.sum']:
+        os.unlink(gitlab_workhorse_dir / fn)
 
 @cli.command('update-all')
 @click.pass_context
 def update_all(ctx):
-    """Update gitlab ce and ee data.nix and rubyenvs to the latest stable release"""
-    for flavour in ['ce', 'ee']:
-        ctx.invoke(update_data, rev='latest', flavour=flavour)
-        ctx.invoke(update_rubyenv, flavour=flavour)
+    """Update all gitlab components to the latest stable release"""
+    ctx.invoke(update_data, rev='latest')
+    ctx.invoke(update_rubyenv)
+    ctx.invoke(update_yarnpkgs)
     ctx.invoke(update_gitaly)
     ctx.invoke(update_gitlab_shell)
     ctx.invoke(update_gitlab_workhorse)