summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am36
-rw-r--r--scripts/Makefile.am3
-rwxr-xr-xscripts/makeupdates212
3 files changed, 217 insertions, 34 deletions
diff --git a/Makefile.am b/Makefile.am
index 572dfe86a..c2c657702 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -136,43 +136,13 @@ install-buildrequires:
# created. By default, the updates subdirectory is removed after the
# image is made, but if you want to keep it around, run:
# make updates.img KEEP=y
-# And since shell is both stupid and amusing, I only match the first
-# character to be a 'y' or 'Y', so you can do:
-# make updates.img KEEP=yosemite
-# Ahh, shell.
updates:
- @if [ ! -d updates-img ]; then \
- mkdir updates-img ; \
- fi ; \
- build_isys="$$(git diff --stat $(ARCHIVE_TAG) isys | grep " | " | cut -d ' ' -f 2 | egrep "(Makefile|\.h|\.c)$$")" ; \
- git diff --stat $(ARCHIVE_TAG) | grep " | " | \
- grep -v "\.spec" | grep -v "Makefile" | grep -v "\.c\ " | \
- grep -v "\.h" | grep -v "\.sh" | grep -v "configure\.ac" | \
- while read sourcefile stuff ; do \
- dn="$$(echo $$sourcefile | cut -d '/' -f 1)" ; \
- case $$dn in \
- installclasses|storage|booty) \
- rm -rf updates-img/$$dn ; \
- cp -a $$dn updates-img ; \
- find updates-img/$$dn -type f | egrep 'Makefile|\.pyc' | xargs rm -f ;; \
- loader|po|scripts|command-stubs|tests|bootdisk|docs|fonts|utils|gptsync) \
- continue ;; \
- *) \
- cp -a $$sourcefile updates-img ;; \
- esac ; \
- done ; \
- if [ ! -z "$$build_isys" ]; then \
- make -C isys ; \
- cp isys/_isys.so updates-img ; \
- fi ; \
- cd updates-img ; \
- echo -n "Creating updates.img..." ; \
- ( find . | cpio -c -o | gzip -9c ) > ../updates.img ; \
- cd .. ; \
+ @opts="-c" ; \
keep="$$(echo $(KEEP) | cut -c1 | tr [a-z] [A-Z])" ; \
if [ ! "$$keep" = "Y" ]; then \
- rm -rf updates-img ; \
+ opts="${opts} -k" ; \
fi
+ scripts/makeupdates ${opts}
# DEPRECATED TARGETS:
archive-no-tag: dist
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index 1f2352abe..1c5933877 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -22,6 +22,7 @@ dist_scripts_SCRIPTS = upd-instroot mk-images buildinstall \
buildinstall.functions scrubtree getkeymaps \
makestamp.py maketreeinfo.py upd-updates
dist_scripts_DATA = mk-images.* pyrc.py
-dist_noinst_SCRIPTS = getlangnames.py upd-bootimage upd-initrd upd-kernel
+dist_noinst_SCRIPTS = getlangnames.py upd-bootimage upd-initrd upd-kernel \
+ makeupdates
MAINTAINERCLEANFILES = Makefile.in
diff --git a/scripts/makeupdates b/scripts/makeupdates
new file mode 100755
index 000000000..a8947ed0a
--- /dev/null
+++ b/scripts/makeupdates
@@ -0,0 +1,212 @@
+#!/usr/bin/env python
+#
+# makeupdates - Generate an updates.img containing changes since the last
+# tag, but only changes that do not need to be compiled. If
+# you need an updated _isys.so or a new loader, you should
+# still compile things as usual.
+#
+# Copyright (C) 2009 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@redhat.com>
+
+import getopt
+import os
+import shutil
+import subprocess
+import sys
+
+def getArchiveTag(configure, spec):
+ tag = ""
+
+ f = open(configure)
+ lines = f.readlines()
+ f.close()
+
+ for line in lines:
+ if line.startswith('AC_INIT('):
+ fields = line.split('[')
+ tag += fields[1].split(']')[0] + '-' + fields[2].split(']')[0]
+ break
+ else:
+ continue
+
+ f = open(spec)
+ lines = f.readlines()
+ f.close()
+
+ for line in lines:
+ if line.startswith('Release:'):
+ tag += '-' + line.split()[1].split('%')[0]
+ else:
+ continue
+
+ return tag
+
+def doGitDiff(tag, args=[]):
+ proc = subprocess.Popen(['git', 'diff', '--stat', 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
+
+ subdirs = []
+
+ lines = doGitDiff(tag)
+ for line in lines:
+ if line.find(' | ') == -1:
+ continue
+
+ fields = line.split()
+ file = fields[0]
+
+ if file.endswith('.spec.in') or file.startswith('Makefile') or \
+ file.endswith('.c') or file.endswith('.h') or \
+ file.endswith('.sh') or file == 'configure.ac':
+ continue
+
+ if file.find('/') != -1:
+ fields = file.split('/')
+ subdir = fields[0]
+
+ if subdir == 'installclasses' or subdir == 'storage' or \
+ subdir == 'booty':
+ subupdates = os.path.realpath(updates + '/' + subdir)
+ if os.path.isdir(subupdates):
+ shutil.rmtree(subupdates)
+
+ if not subdir in subdirs:
+ sys.stdout.write("Including %s/\n" % (subdir,))
+ subdirs.append(subdir)
+
+ shutil.copytree(os.path.realpath(cwd + '/' + subdir),
+ subupdates, ignore=pruneFile)
+ elif subdir == 'loader' or subdir == 'po' or \
+ subdir =='scripts' or subdir == 'command-stubs' or \
+ subdir == 'tests' or subdir == 'bootdisk' or \
+ subdir == 'docs' or subdir == 'fonts' or \
+ subdir == 'utils' or subdir == 'gptsync':
+ continue
+ else:
+ sys.stdout.write("Including %s\n" % (file,))
+ shutil.copy2(file, updates)
+
+def isysChanged(tag):
+ lines = doGitDiff(tag, ['isys'])
+
+ for line in lines:
+ if line.find(' | ') == -1:
+ continue
+
+ fields = line.split()
+ file = fields[0]
+
+ if file.startswith('Makefile') or file.endswith('.h') or \
+ file.endswith('.c'):
+ return True
+
+ return False
+
+def copyUpdatedIsys(updates, cwd):
+ os.chdir(cwd)
+
+ if not os.path.isfile('Makefile'):
+ if not os.path.isfile('configure'):
+ os.system('./autogen.sh')
+ os.system('./configure')
+
+ os.system('make')
+
+ isysmodule = os.path.realpath(cwd + '/isys/.libs/_isys.so')
+ if os.path.isfile(isysmodule):
+ shutil.copy2(isysmodule, updates)
+
+def createUpdatesImage(cwd, updates):
+ os.chdir(updates)
+ os.system("find . | cpio -c -o | gzip -9cv > %s/updates.img" % (cwd,))
+ sys.stdout.write("updates.img ready\n")
+
+def usage(cmd):
+ sys.stdout.write("Usage: %s [OPTION]...\n" % (cmd,))
+ sys.stdout.write("Options:\n")
+ sys.stdout.write(" -k, --keep Do not delete updates subdirectory.\n")
+ sys.stdout.write(" -c, --compile Compile code if there are isys changes.\n")
+ sys.stdout.write(" -h, --help Display this help and exit.\n")
+
+def main(argv):
+ prog = os.path.basename(sys.argv[0])
+ cwd = os.getcwd()
+ configure = os.path.realpath(cwd + '/configure.ac')
+ spec = os.path.realpath(cwd + '/anaconda.spec.in')
+ updates = cwd + '/updates'
+ keep, compile, help, unknown = False, False, False, False
+
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], 'kc?',
+ ['keep', 'compile', 'help'])
+ except getopt.GetoptError:
+ help = True
+
+ for o, a in opts:
+ if o in ('-k', '--keep'):
+ keep = True
+ elif o in ('-c', '--compile'):
+ compile = True
+ elif o in ('-?', '--help'):
+ help = True
+ else:
+ unknown = True
+
+ if help:
+ usage(prog)
+ sys.exit(0)
+ elif unknown:
+ sys.stderr.write("%s: extra operand `%s'" % (prog, sys.argv[1],))
+ sys.stderr.write("Try `%s --help' for more information." % (prog,))
+ sys.exit(1)
+
+ if not os.path.isfile(configure) and not os.path.isfile(spec):
+ sys.stderr.write("You must be at the top level of the anaconda source tree.\n")
+ sys.exit(1)
+
+ tag = getArchiveTag(configure, spec)
+
+ if not os.path.isdir(updates):
+ os.makedirs(updates)
+
+ copyUpdatedFiles(tag, updates, cwd)
+
+ if compile:
+ if isysChanged(tag):
+ copyUpdatedIsys(updates, cwd)
+
+ createUpdatesImage(cwd, updates)
+
+ if not keep:
+ shutil.rmtree(updates)
+
+if __name__ == "__main__":
+ main(sys.argv)