Support cgit alias sites

This allows creation of new top-level sites and aliasing of
existing repos into those sites (under arbitrary names).

For example, this will let us list only the zuul projects under
git.zuul-ci.org.  This scheme does not extend to the git protocol,
which we will start to deprecate.

Change-Id: I4c759f02d8d7e77439984d8ad1f012bd381fae59
Story: 2001382
Task: 6092
This commit is contained in:
James E. Blair 2018-03-21 14:05:57 -07:00
parent 5b68b2227f
commit 6dfb888f4e
1 changed files with 32 additions and 1 deletions

View File

@ -29,6 +29,7 @@ import jeepyb.utils as u
PROJECTS_YAML = os.environ.get('PROJECTS_YAML', '/home/cgit/projects.yaml')
CGIT_REPOS = os.environ.get('CGIT_REPOS', '/etc/cgitrepos')
REPO_PATH = os.environ.get('REPO_PATH', '/var/lib/git')
ALIAS_PATH = os.environ.get('REPO_PATH', '/var/lib/git-alias')
SCRATCH_SUBPATH = os.environ.get('SCRATCH_SUBPATH')
SCRATCH_OWNER = os.environ.get('SCRATCH_OWNER', 'scratch')
SCRATCH_GROUP = os.environ.get('SCRATCH_GROUP', 'scratch')
@ -40,7 +41,7 @@ DEFAULT_ORG = os.environ.get('DEFAULT_ORG', None)
def clean_string(string):
"""Scrub out characters that with break cgit.
cgit can't handle newlines in many of it's fields, so strip them
cgit can't handle newlines in many of its fields, so strip them
out.
"""
@ -51,6 +52,8 @@ def main():
registry = u.ProjectsRegistry(PROJECTS_YAML)
gitorgs = {}
names = set()
# site -> [(path, project, description)]
alias_sites = {}
for entry in registry.configs_list:
project = entry['project']
if '/' in project:
@ -64,6 +67,11 @@ def main():
assert project not in names
names.add(project)
gitorgs.setdefault(org, []).append((name, description))
if 'cgit-alias' in entry:
alias_site = entry['cgit-alias']['site']
alias_path = entry['cgit-alias']['path']
alias_sites.setdefault(alias_site, []).append(
(alias_path, project, description))
if SCRATCH_SUBPATH:
assert SCRATCH_SUBPATH not in gitorgs
scratch_path = os.path.join(REPO_PATH, SCRATCH_SUBPATH)
@ -100,6 +108,29 @@ def main():
subprocess.call(['git', 'init', '--bare', project_repo])
subprocess.call(['chown', '-R', '%s:%s'
% (CGIT_USER, CGIT_GROUP), project_repo])
for alias_site, aliases in alias_sites.items():
# Create all the symlinks for this alias site first
for (alias_path, project, description) in aliases:
alias_site_root = os.path.join(ALIAS_PATH, alias_site)
if not os.path.exists(alias_site_root):
os.makedirs(alias_site_root)
alias_link_path = os.path.join(alias_site_root, alias_path)
alias_link_path += '.git'
alias_repo_path = os.path.join(REPO_PATH, project)
alias_repo_path += '.git'
if not os.path.exists(alias_link_path):
os.symlink(alias_repo_path, alias_link_path)
# Then create the cgit repo config
cgit_path = CGIT_REPOS + '_' + alias_site
with open(cgit_path, 'w') as cgit_file:
cgit_file.write('# Autogenerated by create_cgitrepos.py\n')
for (alias_path, project, description) in aliases:
project_repo = "%s.git" % os.path.join(REPO_PATH, project)
cgit_file.write('\n')
cgit_file.write('repo.url=%s\n' % (alias_path,))
cgit_file.write('repo.path=%s/\n' % (project_repo,))
cgit_file.write(
'repo.desc=%s\n' % (clean_string(description)))
if __name__ == "__main__":