73 lines
2.0 KiB
Python
73 lines
2.0 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
import re, subprocess, sys
|
||
|
|
||
|
|
||
|
DEBUG = False
|
||
|
DRY_RUN = False
|
||
|
NUM_KEEP_PER_BOARD = 4
|
||
|
|
||
|
|
||
|
def main():
|
||
|
ssh_machine = sys.argv[1]
|
||
|
ssh_firmware_dir = sys.argv[2]
|
||
|
|
||
|
# SSH to get list of existing files.
|
||
|
p = subprocess.run(
|
||
|
["ssh", ssh_machine, "find", ssh_firmware_dir, "-name", "\\*-unstable-v\\*"],
|
||
|
capture_output=True,
|
||
|
)
|
||
|
if p.returncode != 0:
|
||
|
print(p.stderr)
|
||
|
return
|
||
|
all_files = p.stdout.split(b"\n")
|
||
|
|
||
|
# Parse all files to organise into boards/date/version.
|
||
|
boards = {}
|
||
|
for file in all_files:
|
||
|
m = re.match(
|
||
|
rb"([a-z/.]+)/([A-Za-z0-9_-]+)-(20[0-9]{6})-unstable-(v[0-9.-]+-g[0-9a-f]+).",
|
||
|
file,
|
||
|
)
|
||
|
if not m:
|
||
|
continue
|
||
|
dir, board, date, version = m.groups()
|
||
|
if board not in boards:
|
||
|
boards[board] = {}
|
||
|
if (date, version) not in boards[board]:
|
||
|
boards[board][(date, version)] = []
|
||
|
boards[board][(date, version)].append(file)
|
||
|
|
||
|
# Collect files to remove based on date and version.
|
||
|
remove = []
|
||
|
for board in boards.values():
|
||
|
filelist = [(date, version, files) for (date, version), files in board.items()]
|
||
|
filelist.sort(reverse=True)
|
||
|
keep = []
|
||
|
for date, version, files in filelist:
|
||
|
if keep and version == keep[-1]:
|
||
|
remove.extend(files)
|
||
|
elif len(keep) >= NUM_KEEP_PER_BOARD:
|
||
|
remove.extend(files)
|
||
|
else:
|
||
|
keep.append(version)
|
||
|
|
||
|
if DEBUG:
|
||
|
all_files.sort(reverse=True)
|
||
|
for file in all_files:
|
||
|
print(file, file in remove)
|
||
|
print(len(remove), "/", len(all_files))
|
||
|
|
||
|
# Do removal of files.
|
||
|
for file in remove:
|
||
|
file = str(file, "ascii")
|
||
|
print("remove:", file)
|
||
|
if not DRY_RUN:
|
||
|
p = subprocess.run(["ssh", ssh_machine, "/bin/rm", file], capture_output=True)
|
||
|
if p.returncode != 0:
|
||
|
print(p.stderr)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|