mirror of
ssh://git.janware.com/srv/git/janware/proj/jw-pkg
synced 2026-01-15 12:03:31 +01:00
build.cmds.CmdListRepos: Add module
Add the command list-repos to jw-projects.py. It is meant to do the same thing as "git-srv-adm.sh list-personal-projects", i.e. enumerate remote Git repositories, but also support additional servers and protocols. As of this commit, support for https://github.com and for forgejo installations over HTTPS is implemented. Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
parent
b5ab0a3d26
commit
9b85b3e8a6
1 changed files with 66 additions and 0 deletions
66
src/python/jw/build/cmds/CmdListRepos.py
Normal file
66
src/python/jw/build/cmds/CmdListRepos.py
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import re
|
||||
from argparse import Namespace, ArgumentParser
|
||||
|
||||
from ..Cmd import Cmd
|
||||
from ..lib import SSHClientCmd, get_username, get_password, run_curl
|
||||
|
||||
class CmdListRepos(Cmd): # export
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__('list-repos', help='Query a remote GIT server for repositories')
|
||||
|
||||
def add_arguments(self, parser: ArgumentParser) -> None:
|
||||
super().add_arguments(parser)
|
||||
parser.add_argument('base_url', help='Base URL of all Git repositories')
|
||||
parser.add_argument('--name-only', help='Only list names of repos, not URLs')
|
||||
parser.add_argument('--username', help='Username for SSH or HTTP authentication, don\'t specify for unauthenticated', default=None)
|
||||
parser.add_argument('--askpass', help='Program to echo password for SSH or HTTP authentication, don\'t specify for unauthenticated', default=None)
|
||||
parser.add_argument('--from-user', help='List from-user\'s projects', default='janware')
|
||||
|
||||
def _run(self, args: Namespace) -> None:
|
||||
|
||||
from urllib.parse import urlparse
|
||||
url = urlparse(args.base_url)
|
||||
username = get_username(args=args, url=args.base_url)
|
||||
match url.scheme:
|
||||
case 'ssh':
|
||||
password = get_password(args=args, url=args.base_url, askpass_env=['GIT_ASKPASS', 'SSH_ASKPASS'])
|
||||
if re.match(r'ssh://.*git\.janware\.com/', args.base_url):
|
||||
from jw.build.lib import SSHClientCmd as SSHClient
|
||||
ssh = SSHClient(hostname=url.hostname)
|
||||
if username is not None:
|
||||
ssh.set_username(username)
|
||||
if password is not None:
|
||||
ssh.set_password(password)
|
||||
cmd = f'/opt/jw-build/bin/git-srv-admin.sh -u {args.from_user} -j list-personal-projects'
|
||||
out = ssh.run_cmd(cmd)
|
||||
print(out)
|
||||
return
|
||||
case 'https':
|
||||
if re.match(r'https://github.com', args.base_url):
|
||||
curl_args = [
|
||||
'-H',
|
||||
'Accept: application/vnd.github+json',
|
||||
'-H',
|
||||
'X-GitHub-Api-Version: 2022-11-28',
|
||||
f'https://api.github.com/users/{args.from_user}/repos'
|
||||
]
|
||||
repos = run_curl(curl_args)
|
||||
for repo in repos:
|
||||
print(repo['name'])
|
||||
return
|
||||
if re.match(r'https://', args.base_url):
|
||||
# assume Forgejo Backend
|
||||
curl_args = []
|
||||
if re.match(r'https://janware.test', args.base_url):
|
||||
curl_args.append('--insecure')
|
||||
curl_args.extend([
|
||||
f'https://{url.hostname}/code/api/v1/orgs/{args.from_user}/repos'
|
||||
])
|
||||
repos = run_curl(curl_args)
|
||||
for repo in repos:
|
||||
print(repo['name'])
|
||||
return
|
||||
raise Exception(f'Don\'t know how to enumerate Git repos at base url {args.base_url}')
|
||||
Loading…
Add table
Add a link
Reference in a new issue