[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