blob: 7bf775ac058e2c9ebb2085add1687013887ba511 [file] [log] [blame]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 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 os
import time
import plugins.basetypes
import plugins.session
ADMIN_ADDITIONAL_PROJECTS = ["infrastructure", "members", "board", "foundation"]
""" GitHub/GitBox archival endpoint for Boxer """
async def process(
server: plugins.basetypes.Server, session: plugins.session.SessionObject, indata: dict
) -> dict:
if not session.credentials or not session.credentials.admin:
return {"okay": False, "message": "You need administrative access to archive repositories."}
# Ensure repo exists
repo = indata.get("repository")
if not repo or not any(x.filename == repo for x in server.data.repositories):
return {"okay": False, "message": "Invalid repository specified."}
# Archive on GitHub:
asf_github_org = plugins.github.GitHubOrganisation(
login=server.config.github.org, personal_access_token=server.config.github.token
)
try:
await asf_github_org.get_id() # Must be called in order to elevate access.
await asf_github_org.api_patch(f"https://api.github.com/repos/{server.config.github.org}/{repo}", {"archived": True})
except AssertionError as e:
return {"okay": False, "message": "Could not archive repository on GitHub."}
# Archive on GitBox:
repo_path = None
for repository in server.data.repositories:
if repository.filename == repo:
repo_path = repository.filepath
if not repo_path:
return {"okay": False, "message": "Could not locate repository on GitBox - please contact ASF Infra."}
with open(os.path.join(repo_path, "nocommit"), "w") as f:
now = time.ctime()
f.write(f"Archived at {now} by {session.credentials.uid} ({session.credentials.name})\n")
f.close()
return {"okay": True, "message": "Repository successfully archived."}
def register(server: plugins.basetypes.Server):
return plugins.basetypes.Endpoint(process)