[blivet] Add scripts/makeupdates script

Vratislav Podzimek vpodzime at redhat.com
Thu Feb 21 09:08:39 UTC 2013


On Wed, 2013-02-20 at 11:17 -0800, Brian C. Lane wrote:
> From: "Brian C. Lane" <bcl at redhat.com>
> 
> Create a blivet updates.img for use when booting the installer image.
> ---
>  .gitignore          |   3 +
>  scripts/makeupdates | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 243 insertions(+)
>  create mode 100755 scripts/makeupdates
> 
> diff --git a/.gitignore b/.gitignore
> index e50959c..897cde7 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -11,3 +11,6 @@ po/en at quot.insert-header
>  po/en at quot.po
>  po/remove-potcdate.sed
>  po/stamp-po
> +updates.img
> +updates/
> +
> diff --git a/scripts/makeupdates b/scripts/makeupdates
> new file mode 100755
> index 0000000..b11b554
> --- /dev/null
> +++ b/scripts/makeupdates
> @@ -0,0 +1,240 @@
> +#!/usr/bin/python
> +#
> +# makeupdates - Generate an updates.img containing changes since the last
> +#               tag.
> +#
> +# Copyright (C) 2009-2013  Red Hat, Inc.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU Lesser General Public License as published
> +# by the Free Software Foundation; either version 2.1 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU Lesser General Public License for more details.
> +#
> +# You should have received a copy of the GNU Lesser General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +#
> +# Author: David Cantrell <dcantrell at redhat.com>
> +
> +import getopt
> +import os
> +import shutil
> +import subprocess
> +import sys
> +
> +def getArchiveTag(spec, name="blivet"):
> +    """ Get the last tag from the .spec file
> +    """
> +    f = open(spec)
> +    lines = f.readlines()
> +    f.close()
> +
> +    version = "0.0"
> +    release = "1"
> +    for line in lines:
> +        if line.startswith('Version:'):
> +            version = line.split()[1]
> +        elif line.startswith('Release:'):
> +            release = line.split()[1].split('%')[0]
> +        else:
> +            continue
> +
> +    return "-".join([name, version, release])
> +
> +def getArchiveTagOffset(spec, offset, name="blivet"):
> +    tag = getArchiveTag(spec, name)
> +
> +    if not tag.count("-") >= 2:
> +        return tag
> +    ldash = tag.rfind("-")
> +    bldash = tag[:ldash].rfind("-")
> +    ver = tag[bldash+1:ldash]
> +
> +    if not ver.count(".") >= 1:
> +        return tag
> +    ver = ver[:ver.rfind(".")]
> +
> +    if not len(ver) > 0:
> +        return tag
> +    globstr = "refs/tags/" + tag[:bldash+1] + ver + ".*"
> +    proc = subprocess.Popen(['git', 'for-each-ref', '--sort=taggerdate',
> +                             '--format=%(tag)', globstr],
> +                            stdout=subprocess.PIPE,
> +                            stderr=subprocess.PIPE).communicate()
> +    lines = proc[0].strip("\n").split('\n')
> +    lines.reverse()
> +
> +    try:
> +        return lines[offset]
> +    except IndexError:
> +        return tag
> +
> +def doGitDiff(tag, args=[]):
> +    proc = subprocess.Popen(['git', 'diff', '--name-status', tag] + args,
> +                            stdout=subprocess.PIPE,
> +                            stderr=subprocess.PIPE).communicate()
> +
> +    lines = proc[0].split('\n')
> +    return lines
> +
> +def copyUpdatedFiles(tag, updates, cwd):
> +    def pruneFile(src, names):
> +        lst = []
> +
> +        for name in names:
> +            if name.startswith('Makefile') or name.endswith('.pyc'):
> +                lst.append(name)
> +
> +        return lst
> +
> +    def install_to_dir(fname, relpath):
> +        sys.stdout.write("Including %s\n" % fname)
> +        outdir = os.path.join(updates, relpath)
> +        if not os.path.isdir(outdir):
> +            os.makedirs(outdir)
> +        shutil.copy2(file, outdir)
> +
> +    # Updates get overlaid onto the runtime filesystem. Anaconda expects them
> +    # to be in /run/install/updates, so put them in
> +    # $updatedir/run/install/updates.
> +    tmpupdates = updates.rstrip('/')
> +    if not tmpupdates.endswith("/run/install/updates"):
> +        tmpupdates = os.path.join(tmpupdates, "run/install/updates")
> +
> +    lines = doGitDiff(tag)
> +    for line in lines:
> +        fields = line.split()
> +
> +        if len(fields) < 2:
> +            continue
> +
> +        status = fields[0]
> +        file = fields[1]
> +
> +        if status == "D":
> +            continue
> +
> +        if file.endswith('.spec') or (file.find('Makefile') != -1) or \
> +           file.endswith('.c') or file.endswith('.h') or \
> +           file.endswith('.sh') or file == 'setup.py':
> +            continue
> +
> +        if file.startswith('blivet/'):
> +            # blivet stuff goes into /tmp/updates/[path]
> +            dirname = os.path.join(tmpupdates, os.path.dirname(file))
> +            install_to_dir(file, dirname)
> +        else:
> +            sys.stdout.write("Including %s\n" % (file,))
> +            install_to_dir(file, tmpupdates)
> +
> +def _compilableChanged(tag, compilable):
> +    lines = doGitDiff(tag, [compilable])
> +
> +    for line in lines:
> +        fields = line.split()
> +
> +        if len(fields) < 2:
> +            continue
> +
> +        status = fields[0]
> +        file = fields[1]
> +
> +        if status == "D":
> +            continue
> +
> +        if file.startswith('Makefile') or file.endswith('.h') or \
> +           file.endswith('.c') or file.endswith('.py'):
> +            return True
> +
> +    return False
I believe this function is useless here.

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list