Clean stale artifacts.
This commit is contained in:
parent
740f70c030
commit
f247a1e895
|
@ -17,6 +17,15 @@ if($env:DEPLOY -eq "true") {
|
||||||
Write-Host "[CI] Done." -ForegroundColor Green;
|
Write-Host "[CI] Done." -ForegroundColor Green;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Write-Host "[CI] Starting cleaning." -ForegroundColor Green;
|
||||||
|
& $env:PYTHON\python.exe "$env:APPVEYOR_BUILD_FOLDER\scripts\deploy.py" clean $env:ACCESS_TOKEN;
|
||||||
|
if ($LastExitCode -ne 0) {
|
||||||
|
Write-Error -Message "[CI] Error cleaning stale artifacts." -Category InvalidResult;
|
||||||
|
exit 1;
|
||||||
|
} else {
|
||||||
|
Write-Host "[CI] Cleaning done." -ForegroundColor Green;
|
||||||
|
}
|
||||||
|
|
||||||
Write-Host "[CI] Uploading." -ForegroundColor Green;
|
Write-Host "[CI] Uploading." -ForegroundColor Green;
|
||||||
& $env:PYTHON\python.exe "$env:APPVEYOR_BUILD_FOLDER\scripts\deploy.py" upload $env:ACCESS_TOKEN "$env:INSTALL_ROOT\$file_name" "/0.7.x/Windows/$file_name";
|
& $env:PYTHON\python.exe "$env:APPVEYOR_BUILD_FOLDER\scripts\deploy.py" upload $env:ACCESS_TOKEN "$env:INSTALL_ROOT\$file_name" "/0.7.x/Windows/$file_name";
|
||||||
if ($LastExitCode -ne 0) {
|
if ($LastExitCode -ne 0) {
|
||||||
|
|
|
@ -32,6 +32,10 @@ if [[ "$DEPLOY" == "true" ]]; then
|
||||||
check_failure "Unable to create an archive for Puzzle bundle.";
|
check_failure "Unable to create an archive for Puzzle bundle.";
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
print_info "Start cleaning.";
|
||||||
|
python3 $CIRRUS_WORKING_DIR/scripts/deploy.py clean $ACCESS_TOKEN;
|
||||||
|
check_failure "Unable to clean stale artifacts.";
|
||||||
|
|
||||||
print_info "Start uploading.";
|
print_info "Start uploading.";
|
||||||
if [[ "$MULTI_BUNDLE" == "false" ]]; then
|
if [[ "$MULTI_BUNDLE" == "false" ]]; then
|
||||||
python3 $CIRRUS_WORKING_DIR/scripts/deploy.py upload $ACCESS_TOKEN $CIRRUS_WORKING_DIR/valentina-${PLATFORM}-${QT_VERSION}-${ARCH}-${CIRRUS_BRANCH}-${CIRRUS_CHANGE_IN_REPO}.tar.xz "/0.7.x/Mac OS X/valentina-${PLATFORM}-${QT_VERSION}-${ARCH}-${CIRRUS_CHANGE_IN_REPO}.tar.xz";
|
python3 $CIRRUS_WORKING_DIR/scripts/deploy.py upload $ACCESS_TOKEN $CIRRUS_WORKING_DIR/valentina-${PLATFORM}-${QT_VERSION}-${ARCH}-${CIRRUS_BRANCH}-${CIRRUS_CHANGE_IN_REPO}.tar.xz "/0.7.x/Mac OS X/valentina-${PLATFORM}-${QT_VERSION}-${ARCH}-${CIRRUS_CHANGE_IN_REPO}.tar.xz";
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import argparse
|
import argparse
|
||||||
|
import datetime
|
||||||
import os
|
import os
|
||||||
import pathlib
|
import pathlib
|
||||||
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
@ -83,6 +85,95 @@ def run_upload(refresh_token, file, path):
|
||||||
sys.exit()
|
sys.exit()
|
||||||
print("Successfully uploaded")
|
print("Successfully uploaded")
|
||||||
|
|
||||||
|
def folder_mod_time(dbx, folder):
|
||||||
|
folder_mod_times = []
|
||||||
|
entries = dbx.files_list_folder(folder.path_display)
|
||||||
|
# Loop through each item in the folder list
|
||||||
|
for result in entries.entries:
|
||||||
|
# Check if the item is a file
|
||||||
|
if isinstance(result, dropbox.files.FileMetadata):
|
||||||
|
# Get the parent folder path of the file
|
||||||
|
parent_folder_path = result.path_display.rsplit('/', 1)[0]
|
||||||
|
# Get the modification time of the file
|
||||||
|
file_mod_time = result.client_modified
|
||||||
|
# Add the file modification time to the dictionary for the parent folder
|
||||||
|
folder_mod_times.append(file_mod_time)
|
||||||
|
|
||||||
|
folder_mod_times.append(datetime.datetime(1900, 1, 1, 0, 0, 0))
|
||||||
|
# Compute the maximum modification time across all files in each folder
|
||||||
|
max_mod_time = max(folder_mod_times)
|
||||||
|
return max_mod_time
|
||||||
|
|
||||||
|
# Define a function to delete a file or folder recursively
|
||||||
|
def delete_file_or_folder(dbx, item):
|
||||||
|
try:
|
||||||
|
# Check if the path is a file
|
||||||
|
if isinstance(item, dropbox.files.FileMetadata):
|
||||||
|
dbx.files_delete_v2(item.path_display)
|
||||||
|
print(f"Deleted file: {item.path_display}")
|
||||||
|
# Check if the path is a folder
|
||||||
|
elif isinstance(item, dropbox.files.FolderMetadata):
|
||||||
|
# Recursively delete all files and subfolders inside the folder
|
||||||
|
for entry in dbx.files_list_folder(item.path_display).entries:
|
||||||
|
delete_file_or_folder(dbx, entry)
|
||||||
|
# Delete the folder itself
|
||||||
|
dbx.files_delete_v2(item.path_display)
|
||||||
|
print(f"Deleted folder: {item.path_display}")
|
||||||
|
except dropbox.exceptions.ApiError as e:
|
||||||
|
print(f"Error deleting {item.path_display}: {e}")
|
||||||
|
|
||||||
|
def run_clean(refresh_token):
|
||||||
|
with dropbox.Dropbox(oauth2_refresh_token=refresh_token, app_key=APP_KEY) as dbx:
|
||||||
|
# Check that the access token is valid
|
||||||
|
try:
|
||||||
|
dbx.users_get_current_account()
|
||||||
|
except AuthError:
|
||||||
|
sys.exit("ERROR: Invalid access token; try re-generating an "
|
||||||
|
"access token from the app console on the web.")
|
||||||
|
|
||||||
|
clean_folders = ["/0.7.x/Mac OS X", "/0.7.x/Windows"]
|
||||||
|
arhive_types = [r'^valentina-Windows7\+-mingw-x86-Qt5_15-develop-[a-f0-9]{40}\.tar\.xz$',
|
||||||
|
r'^valentina-Windows10\+-mingw-x64-Qt6_4-develop-[a-f0-9]{40}\.tar\.xz$',
|
||||||
|
r'^valentina-WindowsXP\+-mingw-x86-Qt5_6-develop-[a-f0-9]{40}\.tar\.xz$',
|
||||||
|
r'^valentina-macOS_11\+-Qt6_4-x64-develop-[a-f0-9]{40}\.tar\.xz$',
|
||||||
|
r'^valentina-macOS_11\+-Qt6-arm64-[a-f0-9]{7,40}\.tar\.xz$',
|
||||||
|
r'^valentina-macOS_11\+-Qt6_4-x64-multibundle-[a-f0-9]{40}$',
|
||||||
|
r'^valentina-macOS_11\+-Qt6-arm64-multibundle-[a-f0-9]{40}$',
|
||||||
|
r'^valentina-macOS10.13\+-Qt5_15-x64-multibundle-[a-f0-9]{40}$',
|
||||||
|
r'^valentina-macOS10.13\+-Qt5_15-x64-develop-[a-f0-9]{40}\.tar\.xz$']
|
||||||
|
|
||||||
|
item_types = {}
|
||||||
|
|
||||||
|
for path in clean_folders:
|
||||||
|
result = dbx.files_list_folder(path)
|
||||||
|
for entry in result.entries:
|
||||||
|
for archive_type in arhive_types:
|
||||||
|
if re.search(archive_type, entry.name):
|
||||||
|
if archive_type not in item_types:
|
||||||
|
item_types[archive_type] = []
|
||||||
|
item_types[archive_type].append(entry)
|
||||||
|
break
|
||||||
|
|
||||||
|
# Keep only the first two files of each type
|
||||||
|
to_delete = []
|
||||||
|
for items in item_types.values():
|
||||||
|
# Separate files and folders
|
||||||
|
files = [item for item in items if isinstance(item, dropbox.files.FileMetadata)]
|
||||||
|
folders = [item for item in items if isinstance(item, dropbox.files.FolderMetadata)]
|
||||||
|
|
||||||
|
# Sort files by modification time
|
||||||
|
files = sorted(files, key=lambda f: f.client_modified)
|
||||||
|
|
||||||
|
# Sort folders by last modified time on server
|
||||||
|
folders = sorted(folders, key=lambda f: folder_mod_time(dbx, f))
|
||||||
|
|
||||||
|
# Keep only the first two items of each type
|
||||||
|
to_delete += files[:-2] + folders[:-2]
|
||||||
|
|
||||||
|
# Delete the remaining items
|
||||||
|
for item in to_delete:
|
||||||
|
delete_file_or_folder(dbx, item)
|
||||||
|
|
||||||
|
|
||||||
def parse_args(args=None):
|
def parse_args(args=None):
|
||||||
parser = argparse.ArgumentParser(prog='app')
|
parser = argparse.ArgumentParser(prog='app')
|
||||||
|
@ -118,6 +209,12 @@ def parse_args(args=None):
|
||||||
run_upload(a.refresh_token, a.file, a.path)
|
run_upload(a.refresh_token, a.file, a.path)
|
||||||
))
|
))
|
||||||
|
|
||||||
|
cmd('clean', help='Clean stale artifacts') \
|
||||||
|
.arg('refresh_token', type=str, help='Refresh token') \
|
||||||
|
.exe(lambda a: (
|
||||||
|
run_clean(a.refresh_token)
|
||||||
|
))
|
||||||
|
|
||||||
args = parser.parse_args(args)
|
args = parser.parse_args(args)
|
||||||
if not hasattr(args, 'exe'):
|
if not hasattr(args, 'exe'):
|
||||||
parser.print_usage()
|
parser.print_usage()
|
||||||
|
@ -127,3 +224,4 @@ def parse_args(args=None):
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
parse_args()
|
parse_args()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user