Compare commits

..

No commits in common. "a2f33f1be2772d2204cb8c9a17ca7cc16b17346a" and "5f8db2fa47a4dba11fcd4e9ec0c662ecbcdbeebc" have entirely different histories.

1 changed files with 17 additions and 66 deletions

View File

@ -5,7 +5,6 @@ import logging
import functools
import os
import re
import subprocess
import tempfile
import threading
import tomllib
@ -123,10 +122,6 @@ class BaseProject(abc.ABC, pydantic.BaseModel):
def apply_update(self, path: Path, version: str) -> None:
raise NotImplementedError
@abc.abstractmethod
def diff(self, path: Path) -> str:
raise NotImplementedError
class KustomizeProject(BaseProject):
kind: Literal['kustomize']
@ -158,26 +153,6 @@ class KustomizeProject(BaseProject):
with filepath.open('wb') as f:
yaml.dump(kustomization, f)
def diff(self, path: Path) -> str:
try:
p = subprocess.run(
['kubectl', 'diff', '-k', '.'],
cwd=path,
check=False,
capture_output=True,
stdin=subprocess.DEVNULL,
encoding='utf-8',
)
except FileNotFoundError as e:
log.warning('Cannot compute manifest diff: %s', e)
return ''
if not p.stdout and p.returncode != 0:
log.error('Error computing manifest diff: %s', p.stderr)
return ''
else:
assert p.stdout is not None
return p.stdout
class DirectoryProject(BaseProject):
kind: Literal['dir'] | Literal['directory']
@ -191,7 +166,7 @@ Project = Union[
class RepoConfig(pydantic.BaseModel):
url: str
token_file: Optional[Path] = None
token_file: Path
branch: str = 'master'
@functools.cached_property
@ -201,18 +176,16 @@ class RepoConfig(pydantic.BaseModel):
return urllib.parse.urlunsplit(urlparts)
@functools.cached_property
def auth_token(self) -> Optional[str]:
if self.token_file:
def auth_token(self) -> str:
return self.token_file.read_text().strip()
def get_git_url(self) -> str:
session = _get_session()
headers = {}
if token := self.auth_token:
headers['Authorization'] = f'Bearer {token}'
r = session.get(
self.repo_api_url,
headers=headers,
headers={
'Authorization': f'token {self.auth_token}',
},
)
data = r.json()
if ssh_url := data.get('ssh_url'):
@ -220,11 +193,7 @@ class RepoConfig(pydantic.BaseModel):
return data['clone_url']
def create_pr(
self,
title: str,
source_branch: str,
target_branch: str,
body: Optional[str] = None,
self, title: str, source_branch: str, target_branch: str
) -> None:
session = _get_session()
r = session.post(
@ -236,7 +205,6 @@ class RepoConfig(pydantic.BaseModel):
'title': title,
'base': target_branch,
'head': source_branch,
'body': body,
},
)
log.log(TRACE, '%r', r.content)
@ -267,7 +235,7 @@ class Arguments:
def update_project(
repo: git.Repo, name: str, project: Project
) -> tuple[Optional[git.Commit], Optional[str]]:
) -> Optional[git.Commit]:
basedir = Path(repo.working_dir)
log.debug('Checking for latest version of %s', name)
latest = project.source.get_latest_version()
@ -280,12 +248,10 @@ def update_project(
repo.index.add(str(path))
c = repo.index.commit(f'{name}: Update to {latest}')
log.info('Commited %s %s', str(c)[:7], c.summary)
log.debug('Computing manifest diff')
diff = project.diff(path)
return (c, diff)
return c
else:
log.info('No changes to commit')
return (None, None)
return None
def parse_args() -> Arguments:
@ -356,11 +322,8 @@ def main() -> None:
log.debug('Checking out new branch: %s', args.branch_name)
repo.heads[0].checkout(force=True, B=args.branch_name)
title = None
pr_desc = ''
for project in projects:
commit, diff = update_project(
repo, project, config.projects[project]
)
commit = update_project(repo, project, config.projects[project])
if commit and not title:
if not isinstance(commit.summary, str):
title = bytes(commit.summary).decode(
@ -368,29 +331,17 @@ def main() -> None:
)
else:
title = commit.summary
if diff:
pr_desc += diff
if not title:
log.info('No changes made')
return
if not args.dry_run:
repo.head.reference.set_tracking_branch(
git.RemoteReference(
repo, f'refs/remotes/origin/{args.branch_name}'
)
)
if not args.dry_run:
repo.remote().push(force=True)
if pr_desc:
pr_desc = (
'<details>\n<summary>Manifest diff</summary>\n\n'
f'```diff\n{pr_desc}```\n'
'</details>'
)
config.repo.create_pr(
title, args.branch_name, config.repo.branch, pr_desc
)
elif pr_desc:
print(pr_desc)
config.repo.create_pr(title, args.branch_name, config.repo.branch)
if __name__ == '__main__':