blob: 692e44cd19ea9a40b105ee1ee4df7fc4a2511d04 [file]
#!/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')