[145398] users/eborisch/macports_utils/update_checksums.py

eborisch at macports.org eborisch at macports.org
Wed Feb 3 20:21:52 PST 2016


Revision: 145398
          https://trac.macports.org/changeset/145398
Author:   eborisch at macports.org
Date:     2016-02-03 20:21:52 -0800 (Wed, 03 Feb 2016)
Log Message:
-----------
Add update_checksums.py tool.

Added Paths:
-----------
    users/eborisch/macports_utils/update_checksums.py

Added: users/eborisch/macports_utils/update_checksums.py
===================================================================
--- users/eborisch/macports_utils/update_checksums.py	                        (rev 0)
+++ users/eborisch/macports_utils/update_checksums.py	2016-02-04 04:21:52 UTC (rev 145398)
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+#
+# Author:
+#  Eric A. Borisch <eborisch at macports.org>
+#
+# Copyright (c) 2016 Eric A. Borisch <eborisch at macports.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. Neither the name of the copyright owner nor the names of contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+"""
+Usage: update_checksums.py portname [port ...]
+Performs checksum step and updates any incorrect values in specified port[s].
+"""
+
+from __future__ import print_function
+
+import sys
+import re
+
+from subprocess import check_output, STDOUT, CalledProcessError
+
+PORTFILE_PATTERN = re.compile(r'^Portfile checksum: .* ([0-9a-f]+)$')
+DISTFILE_PATTERN = re.compile(r'^Distfile checksum: .* ([0-9a-f]+)$')
+
+
+def create_sed_input(repls):
+    "Takes dictionary of replacements and creates sed command strings."
+    sed_input = []
+    for k in repls.keys():
+        sed_input.extend(['-e', 's/{}/{}/'.format(k, repls[k])])
+    return tuple(sed_input)
+
+
+def run_cmd(*args, **kwargs):
+    "Wrapper around check_output with stderr redirected to stdout."
+    return check_output(*args,
+                        stderr=STDOUT,
+                        universal_newlines=True,
+                        **kwargs)
+
+
+def run_sed(filename, commands):
+    "Runs sed commands on filename in place (without backup.)"
+    try:
+        run_cmd(('sed', '-i', '') + commands + (filename,))
+    except CalledProcessError as err:
+        print("Error while updating portfile [{}]: [{}]".format(filename,
+                                                                str(err)))
+        print("Process output:")
+        for line in err.output.split('\n'):
+            print (">> " + line)
+
+
+def get_portfile(portname):
+    "Returns the path to the requested port's Portfile."
+    return run_cmd(('port', 'file', portname)).strip()
+
+
+def get_replacements(portname):
+    """Checks the selected port for any checksums that need updating.
+
+    Returns a dictionary of replacements[old] = new"""
+
+    try:
+        result = run_cmd(('port', '-v', 'checksum', portname))
+    except CalledProcessError as err:
+        if err.returncode != 1:
+            raise
+        result = err.output
+
+    replacements = {}
+    orig = None
+    new = None
+    for line in result.split('\n'):
+        # port -v checksum lists first what is in the Portfile, and then what
+        # the distfile's checksum actually is.
+        if orig is None:
+            orig = PORTFILE_PATTERN.match(line)
+            if orig:
+                orig = orig.group(1)
+        elif new is None:
+            new = DISTFILE_PATTERN.match(line)
+            if new:
+                new = new.group(1)
+
+        if orig and new:
+            replacements[orig] = new
+            orig = None
+            new = None
+    return replacements
+
+
+def process(portname):
+    """
+    Perform all actions required on specified port to update out-of date
+    checksums.
+    """
+    portfile = get_portfile(portname)
+    replacements = get_replacements(portname)
+    sed_input = create_sed_input(replacements)
+    if len(sed_input):
+        print("Updating: " + portfile)
+        run_sed(portfile, sed_input)
+    else:
+        print("No updates required: " + portfile)
+
+
+if __name__ == "__main__":
+    if len(sys.argv) < 2:
+        print("Usage {} portname [port ...]".format(sys.argv[0]))
+    for n in sys.argv[1:]:
+        process(n)


Property changes on: users/eborisch/macports_utils/update_checksums.py
___________________________________________________________________
Added: svn:executable
   + *
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/macports-changes/attachments/20160203/a55d2938/attachment.html>


More information about the macports-changes mailing list