dl_cleanup: Utility to delete all but the very last version of the tarballs in the download directory. The tool does currently have a few false positives (probably below 1%), but this is harmless, because buildroot will just redownload them.
SVN-Revision: 19018master
parent
fd6bfeaf65
commit
16d107d5f9
@ -0,0 +1,176 @@ |
||||
#!/usr/bin/env python |
||||
""" |
||||
# OpenWRT download directory cleanup utility. |
||||
# Delete all but the very last version of the program tarballs. |
||||
# |
||||
# Copyright (c) 2010 Michael Buesch <mb@bu3sch.de> |
||||
""" |
||||
|
||||
import sys |
||||
import os |
||||
import re |
||||
|
||||
DEBUG = 0 |
||||
|
||||
|
||||
def parseVer_1234(match): |
||||
progname = match.group(1) |
||||
progversion = (int(match.group(2)) << 64) |\ |
||||
(int(match.group(3)) << 48) |\ |
||||
(int(match.group(4)) << 32) |\ |
||||
(int(match.group(5)) << 16) |
||||
return (progname, progversion) |
||||
|
||||
def parseVer_123(match): |
||||
progname = match.group(1) |
||||
patchlevel = match.group(5) |
||||
if patchlevel: |
||||
patchlevel = ord(patchlevel[0]) |
||||
else: |
||||
patchlevel = 0 |
||||
progversion = (int(match.group(2)) << 64) |\ |
||||
(int(match.group(3)) << 48) |\ |
||||
(int(match.group(4)) << 32) |\ |
||||
patchlevel |
||||
return (progname, progversion) |
||||
|
||||
def parseVer_12(match): |
||||
progname = match.group(1) |
||||
patchlevel = match.group(4) |
||||
if patchlevel: |
||||
patchlevel = ord(patchlevel[0]) |
||||
else: |
||||
patchlevel = 0 |
||||
progversion = (int(match.group(2)) << 64) |\ |
||||
(int(match.group(3)) << 48) |\ |
||||
patchlevel |
||||
return (progname, progversion) |
||||
|
||||
def parseVer_r(match): |
||||
progname = match.group(1) |
||||
progversion = (int(match.group(2)) << 64) |
||||
return (progname, progversion) |
||||
|
||||
def parseVer_ymd(match): |
||||
progname = match.group(1) |
||||
progversion = (int(match.group(2)) << 64) |\ |
||||
(int(match.group(3)) << 48) |\ |
||||
(int(match.group(4)) << 32) |
||||
return (progname, progversion) |
||||
|
||||
extensions = ( |
||||
".tar.gz", |
||||
".tar.bz2", |
||||
".orig.tar.gz", |
||||
".orig.tar.bz2", |
||||
".zip", |
||||
".tgz", |
||||
".tbz", |
||||
) |
||||
|
||||
versionRegex = ( |
||||
(re.compile(r"(.+)[-_](\d+)\.(\d+)\.(\d+)\.(\d+)"), parseVer_1234), # xxx-1.2.3.4 |
||||
(re.compile(r"(.+)[-_](\d\d\d\d)-?(\d\d)-?(\d\d)"), parseVer_ymd), # xxx-YYYY-MM-DD |
||||
(re.compile(r"(.+)[-_](\d+)\.(\d+)\.(\d+)(\w?)"), parseVer_123), # xxx-1.2.3a |
||||
(re.compile(r"(.+)[-_](\d+)\.(\d+)(\w?)"), parseVer_12), # xxx-1.2a |
||||
(re.compile(r"(.+)[-_]r?(\d+)"), parseVer_r), # xxx-r1111 |
||||
) |
||||
|
||||
blacklist = ( |
||||
re.compile(r"wl_apsta.*"), |
||||
re.compile(r"boost.*"), |
||||
re.compile(r".*\.fw"), |
||||
re.compile(r".*\.arm"), |
||||
re.compile(r".*\.bin"), |
||||
re.compile(r"RT\d+_Firmware.*"), |
||||
) |
||||
|
||||
class EntryParseError(Exception): pass |
||||
|
||||
class Entry: |
||||
def __init__(self, directory, filename): |
||||
self.directory = directory |
||||
self.filename = filename |
||||
self.progname = "" |
||||
|
||||
for ext in extensions: |
||||
if filename.endswith(ext): |
||||
filename = filename[0:0-len(ext)] |
||||
break |
||||
else: |
||||
if DEBUG: |
||||
print "Extension did not match on", filename |
||||
raise EntryParseError("ext") |
||||
for (regex, parseVersion) in versionRegex: |
||||
match = regex.match(filename) |
||||
if match: |
||||
(self.progname, self.version) = parseVersion(match) |
||||
break |
||||
else: |
||||
if DEBUG: |
||||
print "Version regex did not match on", filename |
||||
raise EntryParseError("ver") |
||||
|
||||
def deleteFile(self): |
||||
path = (self.directory + "/" + self.filename).replace("//", "/") |
||||
print "Deleting", path |
||||
if not DEBUG: |
||||
os.unlink(path) |
||||
|
||||
def __eq__(self, y): |
||||
return self.filename == y.filename |
||||
|
||||
def __ge__(self, y): |
||||
return self.version >= y.version |
||||
|
||||
def usage(): |
||||
print "OpenWRT download directory cleanup utility" |
||||
print "Usage: " + sys.argv[0] + " path/to/dl" |
||||
|
||||
def main(argv): |
||||
if len(argv) != 2: |
||||
usage() |
||||
return 1 |
||||
directory = argv[1] |
||||
|
||||
# Create a directory listing and parse the file names. |
||||
entries = [] |
||||
for filename in os.listdir(directory): |
||||
if filename == "." or filename == "..": |
||||
continue |
||||
for black in blacklist: |
||||
if black.match(filename): |
||||
if DEBUG: |
||||
print filename, "is blacklisted" |
||||
break |
||||
else: |
||||
try: |
||||
entries.append(Entry(directory, filename)) |
||||
except (EntryParseError), e: pass |
||||
|
||||
# Create a map of programs |
||||
progmap = {} |
||||
for entry in entries: |
||||
if entry.progname in progmap.keys(): |
||||
progmap[entry.progname].append(entry) |
||||
else: |
||||
progmap[entry.progname] = [entry,] |
||||
|
||||
# Traverse the program map and delete everything but the last version |
||||
for prog in progmap: |
||||
lastVersion = None |
||||
versions = progmap[prog] |
||||
for version in versions: |
||||
if lastVersion is None or version >= lastVersion: |
||||
lastVersion = version |
||||
if lastVersion: |
||||
for version in versions: |
||||
if version != lastVersion: |
||||
version.deleteFile() |
||||
if DEBUG: |
||||
print "Keeping", lastVersion.filename |
||||
|
||||
return 0 |
||||
|
||||
if __name__ == "__main__": |
||||
sys.exit(main(sys.argv)) |
Loading…
Reference in new issue