| #!/usr/bin/env python3 |
| |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| import enum |
| import os |
| import tempfile |
| from pathlib import Path |
| |
| from command import run, find_command, run_pipe |
| |
| |
| class Mode(enum.Enum): |
| y = 'y' |
| n = 'n' |
| auto = 'auto' |
| |
| |
| def _should_push(mode: Mode) -> bool: |
| if mode != Mode.auto: |
| return mode != Mode.n |
| |
| repo = os.getenv('GITHUB_REPOSITORY') |
| event = os.getenv('GITHUB_EVENT_NAME') |
| print(f'repo={repo}, event={event}') |
| |
| result = (repo is not None) and (repo == 'apache/pulsar-site') |
| result = result and (event is not None) and (event != 'pull_request') |
| return result |
| |
| |
| def _do_push(msg: str, site: Path, branch: str, head_sha: str): |
| git = find_command('git', msg="git is required") |
| |
| # Persist the source-repo SHA we just published so the next run can compute |
| # the changed-files set against this point. Written before `git add -A` so |
| # it lands in the same commit as the published content. If `git push` later |
| # fails, this local file is discarded along with the unpushed commit — the |
| # next CI run re-clones asf-site-next and reads the previous .publish-ref. |
| (site / '.publish-ref').write_text(head_sha + '\n') |
| |
| run(git, 'add', '-A', '.', cwd=site) |
| changed = run(git, 'diff-index', '--quiet', 'HEAD', codes={0, 1}, cwd=site).returncode |
| print(f'changed: {changed}') |
| |
| run(git, 'status', cwd=site) |
| run(git, 'remote', '-v', cwd=site) |
| if os.getenv('GITHUB_ACTIONS') is not None: |
| if os.getenv('GITHUB_EVENT_NAME') != 'schedule': |
| name = os.getenv('GITHUB_ACTOR') |
| email = f'{name}@users.noreply.github.com' |
| else: |
| name = 'github-actions[bot]' |
| email = f'41898282+{name}@users.noreply.github.com' |
| print(f'config with name: {name}, email: {email}') |
| run(git, 'config', 'user.name', name, cwd=site) |
| run(git, 'config', 'user.email', email, cwd=site) |
| if changed != 0: |
| run(git, 'commit', '-m', msg, cwd=site) |
| run(git, 'push', 'origin', branch, cwd=site) |
| |
| |
| def execute(mode: Mode, msg: str, site: Path, branch: str, head_sha: str): |
| if _should_push(mode): |
| _do_push(msg, site, branch, head_sha) |
| else: # show changes |
| git = find_command('git', msg="git is required") |
| with tempfile.TemporaryFile('w+') as f: |
| run(git, 'status', '--porcelain', stdout=f, cwd=site) |
| f.seek(0) |
| change_files = f.read().strip() |
| print(f'\nchange files:\n{change_files}\n') |