#!/usr/bin/env python3

import os, glob, time, re
from datetime import datetime

prefix="/var/www/build.openmodelica.org/apt"
# 6*4 weeks ago
oldtime = time.time() - 6 * 4 * 7 * 24 * 60 * 60
print("Old files are older than: ", datetime.fromtimestamp(oldtime))
rm = []
keep_old = []
keep = 0
keepBasedOnTime = 0

if True:
  # Releases + pre-releases
  version = re.compile("(_[0-9]+[.][0-9]+[.][0-9]+(~dev.beta[0-9]+)?)$")
else:
  # Only releases
  version = re.compile("(_[0-9]+[.][0-9]+[.][0-9]+)$")

content=""
words=set()
for f in glob.glob(prefix + "/dists/*/*/*/Packages"):
  for w in open(f).read().split("\n"):
    if w.startswith("Filename: "):
      words.add(prefix+"/"+w[10:])
for w in open(prefix + "/pool/contrib/.keep").read().split("\n"):
  words.add(w.strip())

for w in words:
  if not os.path.exists(w):
    raise(Exception("Missing file (restore from backup or fix the repos files): %s" % w))
print("Words in repos-files: %d" % len(words))
suffixes = re.compile("((-[0-9]_(all|amd64|i386|armhf|arm64)([.]d?deb|[0-9:TZ-]*[.]build(info)?|[.]changes))|-1[.]dsc|[.](orig|debian)[.]tar[.][xg]z)$")
files_nosuffix = set()
for w in words:
  m = suffixes.search(w)
  if m is None:
    raise(Exception("Unknown suffix for file: %s" % w))
  i = m.group(1)
  files_nosuffix.add(os.path.basename(w[:-len(i)]))
print("Files in repos-files: %d" % len(files_nosuffix))
assert(len(files_nosuffix) > 500)

for dirname, subdirList, fileList in os.walk("%s/pool" % prefix):
  assert(dirname.startswith(prefix))
  d=dirname[len(prefix)+1:]
  for f in fileList:
    if f in ["README.txt", ".keep"] or f.startswith("paradiseo"):
      continue
    m = suffixes.search(f)
    if m is None:
      raise(Exception("Unknown suffix for file: %s/%s" % (d,f)))
    i = m.group(1)
    fullpath = "%s/%s/%s" % (prefix,d,f)
    fileprefix = f[:-len(i)]
    if os.stat(fullpath).st_mtime >= oldtime:
      # print("Keep %s/%s%s" % (d,f[:-len(i)],i))
      keep += 1
      keepBasedOnTime += 1
    elif fileprefix not in files_nosuffix:
      m = version.search(fileprefix)
      if m is not None:
        # print("Keep proper release: %s %s" % (fullpath,m.group(1)))
        keep += 1
      else:
        # print("Remove %s/%s%s" % (d,f[:-len(i)],i))
        rm.append(fullpath)
    else:
      # print("Keep %s/%s%s" % (d,f[:-len(i)],i))
      keep += 1
      keep_old.append(fullpath)

print("To keep: %d (of which recent files: %d) (old files: %d)" % (keep,keepBasedOnTime,len(keep_old)))
print("To delete: %d" % len(rm))
assert(keep > 9000)
for w in rm:
  os.remove(w)
print("Kept: %d (old files: %d)" % (keep,len(keep_old)))
print("Deleted: %d" % len(rm))
