mirror of
https://git.yoctoproject.org/poky
synced 2026-04-23 09:32:17 +02:00
stagemanager: Move functionality into the scripts directory
Since scripts is now in PATH thanks to the layer functionality there is no longer any need to have this recipe full of special cases, the scripts can just be placed there. Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
This commit is contained in:
156
scripts/stage-manager
Executable file
156
scripts/stage-manager
Executable file
@@ -0,0 +1,156 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Copyright (C) 2006-2007 Richard Purdie
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License version 2 as published by the Free
|
||||
# Software Foundation;
|
||||
#
|
||||
# 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 General Public License for more details.
|
||||
|
||||
import optparse
|
||||
import os, sys, stat
|
||||
|
||||
__version__ = "0.0.1"
|
||||
|
||||
|
||||
def write_cache(cachefile, cachedata):
|
||||
fd = open(cachefile, 'w')
|
||||
for f in cachedata:
|
||||
s = f + '|' + str(cachedata[f]['ts']) + '|' + str(cachedata[f]['size'])
|
||||
fd.write(s + '\n')
|
||||
fd.close()
|
||||
|
||||
def read_cache(cachefile):
|
||||
cache = {}
|
||||
f = open(cachefile, 'r')
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
for l in lines:
|
||||
data = l.split('|')
|
||||
cache[data[0]] = {}
|
||||
cache[data[0]]['ts'] = int(data[1])
|
||||
cache[data[0]]['size'] = int(data[2])
|
||||
cache[data[0]]['seen'] = False
|
||||
return cache
|
||||
|
||||
def mkdirhier(dir):
|
||||
"""Create a directory like 'mkdir -p', but does not complain if
|
||||
directory already exists like os.makedirs
|
||||
"""
|
||||
try:
|
||||
os.makedirs(dir)
|
||||
except OSError, e:
|
||||
if e.errno != 17: raise e
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = optparse.OptionParser( version = "Metadata Stage Manager version %s" % ( __version__ ),
|
||||
usage = """%prog [options]\n\nPerforms mamagement tasks on a metadata staging area.""" )
|
||||
|
||||
parser.add_option( "-p", "--parentdir", help = "the path to the metadata parent directory",
|
||||
action = "store", dest = "parentdir", default = None)
|
||||
|
||||
parser.add_option( "-c", "--cachefile", help = "the cache file to use",
|
||||
action = "store", dest = "cachefile", default = None)
|
||||
|
||||
parser.add_option( "-d", "--copydir", help = "copy changed files to this directory",
|
||||
action = "store", dest = "copydir", default = None)
|
||||
|
||||
parser.add_option( "-u", "--update", help = "update the cache file",
|
||||
action = "store_true", dest = "update", default = False)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
if options.parentdir is None:
|
||||
print("Error, --parentdir option not supplied")
|
||||
sys.exit(1)
|
||||
|
||||
if options.cachefile is None:
|
||||
print("Error, --cachefile option not supplied")
|
||||
sys.exit(1)
|
||||
|
||||
if not options.parentdir.endswith('/'):
|
||||
options.parentdir = options.parentdir + '/'
|
||||
|
||||
cache = {}
|
||||
if os.access(options.cachefile, os.F_OK):
|
||||
cache = read_cache(options.cachefile)
|
||||
|
||||
found_difference = False
|
||||
|
||||
def updateCache(path, fstamp):
|
||||
cache[path] = {}
|
||||
cache[path]['ts'] = fstamp[stat.ST_MTIME]
|
||||
cache[path]['size'] = fstamp[stat.ST_SIZE]
|
||||
cache[path]['seen'] = True
|
||||
found_difference = True
|
||||
|
||||
def copyfile(path):
|
||||
if options.copydir:
|
||||
copypath = os.path.join(options.copydir, path.replace(options.parentdir, '', 1))
|
||||
mkdirhier(os.path.split(copypath)[0])
|
||||
os.system("cp -dp " + path + " " + copypath)
|
||||
|
||||
def copydir(path, fstamp):
|
||||
if options.copydir:
|
||||
copypath = os.path.join(options.copydir, path.replace(options.parentdir, '', 1))
|
||||
if os.path.exists(copypath):
|
||||
os.system("rm -rf " + copypath)
|
||||
if os.path.islink(path):
|
||||
os.symlink(os.readlink(path), copypath)
|
||||
else:
|
||||
mkdirhier(copypath)
|
||||
os.utime(copypath, (fstamp[stat.ST_ATIME], fstamp[stat.ST_MTIME]))
|
||||
|
||||
for root, dirs, files in os.walk(options.parentdir):
|
||||
for f in files:
|
||||
path = os.path.join(root, f)
|
||||
if not os.access(path, os.R_OK):
|
||||
continue
|
||||
fstamp = os.lstat(path)
|
||||
if path not in cache:
|
||||
print "new file %s" % path
|
||||
updateCache(path, fstamp)
|
||||
copyfile(path)
|
||||
else:
|
||||
if cache[path]['ts'] != fstamp[stat.ST_MTIME] or cache[path]['size'] != fstamp[stat.ST_SIZE]:
|
||||
print "file %s changed" % path
|
||||
updateCache(path, fstamp)
|
||||
copyfile(path)
|
||||
cache[path]['seen'] = True
|
||||
for d in dirs:
|
||||
path = os.path.join(root, d)
|
||||
fstamp = os.lstat(path)
|
||||
if path not in cache:
|
||||
print "new dir %s" % path
|
||||
updateCache(path, fstamp)
|
||||
copydir(path, fstamp)
|
||||
else:
|
||||
if cache[path]['ts'] != fstamp[stat.ST_MTIME]:
|
||||
print "dir %s changed" % path
|
||||
updateCache(path, fstamp)
|
||||
copydir(path, fstamp)
|
||||
cache[path]['seen'] = True
|
||||
|
||||
todel = []
|
||||
for path in cache:
|
||||
if not cache[path]['seen']:
|
||||
print "%s removed" % path
|
||||
found_difference = True
|
||||
todel.append(path)
|
||||
|
||||
if options.update:
|
||||
print "Updating"
|
||||
for path in todel:
|
||||
del cache[path]
|
||||
mkdirhier(os.path.split(options.cachefile)[0])
|
||||
write_cache(options.cachefile, cache)
|
||||
|
||||
if found_difference:
|
||||
sys.exit(5)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
|
||||
1186
scripts/stage-manager-ipkg
Executable file
1186
scripts/stage-manager-ipkg
Executable file
File diff suppressed because it is too large
Load Diff
246
scripts/stage-manager-ipkg-build
Executable file
246
scripts/stage-manager-ipkg-build
Executable file
@@ -0,0 +1,246 @@
|
||||
#!/bin/sh
|
||||
|
||||
# ipkg-build -- construct a .ipk from a directory
|
||||
# Carl Worth <cworth@east.isi.edu>
|
||||
# based on a script by Steve Redler IV, steve@sr-tech.com 5-21-2001
|
||||
# 2003-04-25 rea@sr.unh.edu
|
||||
# Updated to work on Familiar Pre0.7rc1, with busybox tar.
|
||||
# Note it Requires: binutils-ar (since the busybox ar can't create)
|
||||
# For UID debugging it needs a better "find".
|
||||
set -e
|
||||
|
||||
version=1.0
|
||||
|
||||
ipkg_extract_value() {
|
||||
sed -e "s/^[^:]*:[[:space:]]*//"
|
||||
}
|
||||
|
||||
required_field() {
|
||||
field=$1
|
||||
|
||||
value=`grep "^$field:" < $CONTROL/control | ipkg_extract_value`
|
||||
if [ -z "$value" ]; then
|
||||
echo "*** Error: $CONTROL/control is missing field $field" >&2
|
||||
return 1
|
||||
fi
|
||||
echo $value
|
||||
return 0
|
||||
}
|
||||
|
||||
disallowed_field() {
|
||||
field=$1
|
||||
|
||||
value=`grep "^$field:" < $CONTROL/control | ipkg_extract_value`
|
||||
if [ -n "$value" ]; then
|
||||
echo "*** Error: $CONTROL/control contains disallowed field $field" >&2
|
||||
return 1
|
||||
fi
|
||||
echo $value
|
||||
return 0
|
||||
}
|
||||
|
||||
pkg_appears_sane() {
|
||||
local pkg_dir=$1
|
||||
|
||||
local owd=`pwd`
|
||||
cd $pkg_dir
|
||||
|
||||
PKG_ERROR=0
|
||||
|
||||
tilde_files=`find . -name '*~'`
|
||||
if [ -n "$tilde_files" ]; then
|
||||
if [ "$noclean" = "1" ]; then
|
||||
echo "*** Warning: The following files have names ending in '~'.
|
||||
You probably want to remove them: " >&2
|
||||
ls -ld $tilde_files
|
||||
echo >&2
|
||||
else
|
||||
echo "*** Removing the following files: $tilde_files"
|
||||
rm -f "$tilde_files"
|
||||
fi
|
||||
fi
|
||||
|
||||
large_uid_files=`find . -uid +99 || true`
|
||||
|
||||
if [ "$ogargs" = "" ] && [ -n "$large_uid_files" ]; then
|
||||
echo "*** Warning: The following files have a UID greater than 99.
|
||||
You probably want to chown these to a system user: " >&2
|
||||
ls -ld $large_uid_files
|
||||
echo >&2
|
||||
fi
|
||||
|
||||
|
||||
if [ ! -f "$CONTROL/control" ]; then
|
||||
echo "*** Error: Control file $pkg_dir/$CONTROL/control not found." >&2
|
||||
cd $owd
|
||||
return 1
|
||||
fi
|
||||
|
||||
pkg=`required_field Package`
|
||||
[ "$?" -ne 0 ] && PKG_ERROR=1
|
||||
|
||||
version=`required_field Version | sed 's/Version://; s/^.://g;'`
|
||||
[ "$?" -ne 0 ] && PKG_ERROR=1
|
||||
|
||||
arch=`required_field Architecture`
|
||||
[ "$?" -ne 0 ] && PKG_ERROR=1
|
||||
|
||||
required_field Maintainer >/dev/null
|
||||
[ "$?" -ne 0 ] && PKG_ERROR=1
|
||||
|
||||
required_field Description >/dev/null
|
||||
[ "$?" -ne 0 ] && PKG_ERROR=1
|
||||
|
||||
section=`required_field Section`
|
||||
[ "$?" -ne 0 ] && PKG_ERROR=1
|
||||
if [ -z "$section" ]; then
|
||||
echo "The Section field should have one of the following values:" >&2
|
||||
echo "admin, base, comm, editors, extras, games, graphics, kernel, libs, misc, net, text, web, x11" >&2
|
||||
fi
|
||||
|
||||
priority=`required_field Priority`
|
||||
[ "$?" -ne 0 ] && PKG_ERROR=1
|
||||
if [ -z "$priority" ]; then
|
||||
echo "The Priority field should have one of the following values:" >&2
|
||||
echo "required, important, standard, optional, extra." >&2
|
||||
echo "If you don't know which priority value you should be using, then use \`optional'" >&2
|
||||
fi
|
||||
|
||||
source=`required_field Source`
|
||||
[ "$?" -ne 0 ] && PKG_ERROR=1
|
||||
if [ -z "$source" ]; then
|
||||
echo "The Source field contain the URL's or filenames of the source code and any patches"
|
||||
echo "used to build this package. Either gnu-style tarballs or Debian source packages "
|
||||
echo "are acceptable. Relative filenames may be used if they are distributed in the same"
|
||||
echo "directory as the .ipk file."
|
||||
fi
|
||||
|
||||
disallowed_filename=`disallowed_field Filename`
|
||||
[ "$?" -ne 0 ] && PKG_ERROR=1
|
||||
|
||||
if echo $pkg | grep '[^a-z0-9.+-]'; then
|
||||
echo "*** Error: Package name $name contains illegal characters, (other than [a-z0-9.+-])" >&2
|
||||
PKG_ERROR=1;
|
||||
fi
|
||||
|
||||
local bad_fields=`sed -ne 's/^\([^[:space:]][^:[:space:]]\+[[:space:]]\+\)[^:].*/\1/p' < $CONTROL/control | sed -e 's/\\n//'`
|
||||
if [ -n "$bad_fields" ]; then
|
||||
bad_fields=`echo $bad_fields`
|
||||
echo "*** Error: The following fields in $CONTROL/control are missing a ':'" >&2
|
||||
echo " $bad_fields" >&2
|
||||
echo "ipkg-build: This may be due to a missing initial space for a multi-line field value" >&2
|
||||
PKG_ERROR=1
|
||||
fi
|
||||
|
||||
for script in $CONTROL/preinst $CONTROL/postinst $CONTROL/prerm $CONTROL/postrm; do
|
||||
if [ -f $script -a ! -x $script ]; then
|
||||
echo "*** Error: package script $script is not executable" >&2
|
||||
PKG_ERROR=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -f $CONTROL/conffiles ]; then
|
||||
for cf in `cat $CONTROL/conffiles`; do
|
||||
if [ ! -f ./$cf ]; then
|
||||
echo "*** Error: $CONTROL/conffiles mentions conffile $cf which does not exist" >&2
|
||||
PKG_ERROR=1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
cd $owd
|
||||
return $PKG_ERROR
|
||||
}
|
||||
|
||||
###
|
||||
# ipkg-build "main"
|
||||
###
|
||||
ogargs=""
|
||||
outer=ar
|
||||
noclean=0
|
||||
usage="Usage: $0 [-c] [-C] [-o owner] [-g group] <pkg_directory> [<destination_directory>]"
|
||||
while getopts "cg:ho:v" opt; do
|
||||
case $opt in
|
||||
o ) owner=$OPTARG
|
||||
ogargs="--owner=$owner"
|
||||
;;
|
||||
g ) group=$OPTARG
|
||||
ogargs="$ogargs --group=$group"
|
||||
;;
|
||||
c ) outer=tar
|
||||
;;
|
||||
C ) noclean=1
|
||||
;;
|
||||
v ) echo $version
|
||||
exit 0
|
||||
;;
|
||||
h ) echo $usage >&2 ;;
|
||||
\? ) echo $usage >&2
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
shift $(($OPTIND - 1))
|
||||
|
||||
# continue on to process additional arguments
|
||||
|
||||
case $# in
|
||||
1)
|
||||
dest_dir=$PWD
|
||||
;;
|
||||
2)
|
||||
dest_dir=$2
|
||||
if [ "$dest_dir" = "." -o "$dest_dir" = "./" ] ; then
|
||||
dest_dir=$PWD
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo $usage >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
pkg_dir=$1
|
||||
|
||||
if [ ! -d $pkg_dir ]; then
|
||||
echo "*** Error: Directory $pkg_dir does not exist" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# CONTROL is second so that it takes precedence
|
||||
CONTROL=
|
||||
[ -d $pkg_dir/DEBIAN ] && CONTROL=DEBIAN
|
||||
[ -d $pkg_dir/CONTROL ] && CONTROL=CONTROL
|
||||
if [ -z "$CONTROL" ]; then
|
||||
echo "*** Error: Directory $pkg_dir has no CONTROL subdirectory." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! pkg_appears_sane $pkg_dir; then
|
||||
echo >&2
|
||||
echo "ipkg-build: Please fix the above errors and try again." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
tmp_dir=$dest_dir/IPKG_BUILD.$$
|
||||
mkdir $tmp_dir
|
||||
|
||||
echo $CONTROL > $tmp_dir/tarX
|
||||
( cd $pkg_dir && tar $ogargs -X $tmp_dir/tarX -czf $tmp_dir/data.tar.gz . )
|
||||
( cd $pkg_dir/$CONTROL && tar $ogargs -czf $tmp_dir/control.tar.gz . )
|
||||
rm $tmp_dir/tarX
|
||||
|
||||
echo "2.0" > $tmp_dir/debian-binary
|
||||
|
||||
pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk
|
||||
rm -f $pkg_file
|
||||
if [ "$outer" = "ar" ] ; then
|
||||
( cd $tmp_dir && ar -crf $pkg_file ./debian-binary ./data.tar.gz ./control.tar.gz )
|
||||
else
|
||||
( cd $tmp_dir && tar -zcf $pkg_file ./debian-binary ./data.tar.gz ./control.tar.gz )
|
||||
fi
|
||||
|
||||
rm $tmp_dir/debian-binary $tmp_dir/data.tar.gz $tmp_dir/control.tar.gz
|
||||
rmdir $tmp_dir
|
||||
|
||||
echo "Packaged contents of $pkg_dir into $pkg_file"
|
||||
Reference in New Issue
Block a user