first version of repo cleanup script
This commit is contained in:
parent
4c48379707
commit
45b28dd0df
2 changed files with 128 additions and 0 deletions
55
Jenkins/daily-cleanup/Jenkinsfile
vendored
Normal file
55
Jenkins/daily-cleanup/Jenkinsfile
vendored
Normal file
|
@ -0,0 +1,55 @@
|
|||
// Copyright 2019 Google LLC
|
||||
//
|
||||
// Licensed under the the Apache License v2.0 with LLVM Exceptions (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// https://llvm.org/LICENSE.txt
|
||||
//
|
||||
// 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.
|
||||
|
||||
|
||||
/* Pipeline executed daily to do cleanup work */
|
||||
|
||||
def success = true
|
||||
def failure_message = ""
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
triggers {
|
||||
cron('@daily')
|
||||
}
|
||||
environment {
|
||||
SCRIPT_DIR = "${WORKSPACE}/llvm-premerge-checks/scripts"
|
||||
}
|
||||
options {
|
||||
timeout(time:10, unit:'MINUTES')
|
||||
}
|
||||
stages {
|
||||
stage("git checkout"){
|
||||
steps {
|
||||
dir("${LLVM_DIR}"){
|
||||
git url: 'git@github.com:llvm-premerge-tests/llvm-project.git'
|
||||
}
|
||||
dir("llvm-premerge-checks")
|
||||
{
|
||||
git url: 'https://github.com/google/llvm-premerge-checks.git'
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('cleanup repo'){
|
||||
// delete old branches after 30 days
|
||||
steps {
|
||||
dir("${LLVM_DIR}"){
|
||||
sh """
|
||||
python ${SCRIPT_DIR}/cleanup_branches.py --days 30 --pattern "phab-diff-.*"
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
73
scripts/cleanup_branches.py
Normal file
73
scripts/cleanup_branches.py
Normal file
|
@ -0,0 +1,73 @@
|
|||
#!/usr/bin/env python3
|
||||
# Copyright 2020 Google LLC
|
||||
#
|
||||
# Licensed under the the Apache License v2.0 with LLVM Exceptions (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://llvm.org/LICENSE.txt
|
||||
#
|
||||
# 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.
|
||||
|
||||
"""The script will delete old git branches."""
|
||||
|
||||
import argparse
|
||||
import datetime
|
||||
import functools
|
||||
import git
|
||||
import operator
|
||||
import os
|
||||
import re
|
||||
from typing import List
|
||||
|
||||
|
||||
def delete_old_branches(repo_path: str, max_age: datetime.datetime, branch_patterns: List[re.Pattern],
|
||||
*, dry_run: bool = True, remote_name: str = 'origin'):
|
||||
"""Deletes 'old' branches from a git repo.
|
||||
|
||||
This script assumes that $repo_path contains a current checkout of the repository ot be cleaned up.
|
||||
"""
|
||||
repo = git.Repo(repo_path)
|
||||
refs = repo.remotes[remote_name].refs
|
||||
print('Found {} references at {} in total.'.format(len(refs), remote_name))
|
||||
del_count = 0
|
||||
for reference in refs:
|
||||
committed_date = datetime.datetime.fromtimestamp(reference.commit.committed_date)
|
||||
if committed_date < max_age and _has_pattern_match(reference.name, branch_patterns):
|
||||
if dry_run:
|
||||
print('dryrun: would have deleted {}'.format(reference.name))
|
||||
else:
|
||||
print('Deleting {}'.format(reference.name))
|
||||
git.RemoteReference.delete(repo.remotes[remote_name].repo, reference)
|
||||
del_count += 1
|
||||
|
||||
print('Deleted {} references.'.format(del_count))
|
||||
if not dry_run:
|
||||
print('Pushing to remote...')
|
||||
repo.remotes[remote_name].push()
|
||||
print('Done.')
|
||||
|
||||
|
||||
def _has_pattern_match(name: str, patterns) -> bool:
|
||||
"""Check if name matches any of the patterns"""
|
||||
return functools.reduce(
|
||||
operator.or_,
|
||||
map(lambda r: r.search(name) is not None, patterns),
|
||||
False)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description='Clean a git repository')
|
||||
parser.add_argument('repo_path', type=str, nargs='?', default=os.getcwd())
|
||||
parser.add_argument('--days', type=int, default=30)
|
||||
parser.add_argument('--pattern', action='append', type=str)
|
||||
parser.add_argument('--dryrun', action='store_true')
|
||||
args = parser.parse_args()
|
||||
|
||||
max_age = datetime.datetime.now() - datetime.timedelta(days=args.days)
|
||||
branch_pattern = [re.compile(r) for r in args.pattern]
|
||||
delete_old_branches(args.repo_path, max_age, branch_pattern, dry_run=args.dryrun)
|
Loading…
Reference in a new issue