Index: src/scripts/binhost_clobber.py |
diff --git a/src/scripts/binhost_clobber.py b/src/scripts/binhost_clobber.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..048429dd9da4b3010aaaba6a5bbbcef8e7d33039 |
--- /dev/null |
+++ b/src/scripts/binhost_clobber.py |
@@ -0,0 +1,92 @@ |
+#!/usr/bin/python |
+# Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Script to grab a list of ebuilds which cannot be safely mirrored. |
+ |
+Some ebuilds do not have the proper versioning magic to be able to be safely |
+mirrored. We would like to phase them out gradually, by updating a list which |
+can be safely cached. |
+""" |
+ |
+import os |
+import re |
+import StringIO |
+import tarfile |
+import urllib |
+ |
+ |
+def main(): |
+ # Get a tarball of chromiumos-overlay. |
+ fh = urllib.urlopen('http://src.chromium.org/cgi-bin/gitweb.cgi?' |
+ 'p=chromiumos-overlay.git;a=snapshot;h=HEAD;sf=tgz') |
+ tgz = fh.read() |
+ fh.close() |
+ |
+ # Prepare a set of files to clobber. |
+ clobber_list = set() |
+ # Prepare a set of files to exempt from clobbering. |
+ exempt_list = set() |
+ |
+ # Walk the tarball looking for SAFE_TO_CACHE lists and ebuilds containing |
+ # CHROMEOS_ROOT. |
+ tgzf = StringIO.StringIO(tgz) |
+ tar = tarfile.open(fileobj=tgzf, mode='r') |
+ for tinfoi in tar: |
+ if not tinfoi.isdir(): |
+ original_name = tinfoi.name |
+ tinfo = tinfoi |
+ while tinfo.islnk() or tinfo.issym(): |
+ path = os.path.normpath(os.path.join(os.path.dirname(tinfo.name), |
+ tinfo.linkname)) |
+ tinfo = tar.getmember(path) |
+ if tinfo.name.endswith('.ebuild'): |
+ # Load each ebuild. |
+ fh = tar.extractfile(tinfo) |
+ ebuild_data = fh.read() |
+ fh.close() |
+ # Add to the clobber list if it contains CHROMEOS_ROOT. |
+ if 'CHROMEOS_ROOT' in ebuild_data: |
+ filename = os.path.split(original_name)[1] |
+ basename = os.path.splitext(filename)[0] |
+ clobber_list.add(basename) |
+ elif tinfo.name.endswith('/SAFE_TO_CACHE'): |
+ fh = tar.extractfile(tinfo) |
+ for line in fh: |
+ if len(line) > 1 and line[0] != '#': |
+ exempt_list.add(line.strip()) |
+ fh.close() |
+ tar.close() |
+ tgzf.close() |
+ |
+ # Don't clobber ebuilds listed in SAFE_TO_CACHE. |
+ clobber_list -= exempt_list |
+ |
+ # Scan the current directory for any Packages files, modify to remove |
+ # packages that shouldn't be cached. |
+ for root, _, files in os.walk('.', topdown=False): |
+ for name in files: |
+ filename = os.path.join(root, name) |
+ basename = os.path.split(filename)[1] |
+ if basename == 'Packages': |
+ # Filter out entries involving uncache-able ebuilds. |
+ allowed = True |
+ nlines = [] |
+ fh = open(filename, 'r') |
+ for line in fh: |
+ m = re.match('^CPV\: [^\n]+/([^/]+)[\n]$', line) |
+ if m: |
+ allowed = m.group(1) not in clobber_list |
+ if allowed: |
+ nlines.append(line) |
+ fh.close() |
+ # Write out new contents. |
+ fh = open(filename, 'w') |
+ for line in nlines: |
+ fh.write(line) |
+ fh.close() |
+ |
+ |
+if __name__ == '__main__': |
+ main() |