[oe-commits] org.oe.dev stagemanager-naitve: Sync with poky, add ipkg-build and ipkg scripts so packaged-staging dependencies can be removed

rpurdie commit oe at amethyst.openembedded.net
Sat May 24 17:20:18 UTC 2008


stagemanager-naitve: Sync with poky, add ipkg-build and ipkg scripts so packaged-staging dependencies can be removed

Author: rpurdie at openembedded.org
Branch: org.openembedded.dev
Revision: 4e6a3ba4bd9bd203947f72495a8751b35c65cbde
ViewMTN: http://monotone.openembedded.org/revision/info/4e6a3ba4bd9bd203947f72495a8751b35c65cbde
Files:
1
packages/stage-manager/files/stage-manager-ipkg
packages/stage-manager/files/stage-manager-ipkg-build
packages/stage-manager/stagemanager-native_0.0.1.bb
mtn:execute
true
Diffs:

#
# mt diff -r1dcfa68138eae89cc2f1eb1cd49a11c026143db6 -r4e6a3ba4bd9bd203947f72495a8751b35c65cbde
#
#
#
# add_file "packages/stage-manager/files/stage-manager-ipkg"
#  content [7593166519513f8e516b14d394e2d3576854f946]
# 
# add_file "packages/stage-manager/files/stage-manager-ipkg-build"
#  content [243d61c7874d9619b25f2cc0a5a69f1c7467b2f4]
# 
# patch "packages/stage-manager/stagemanager-native_0.0.1.bb"
#  from [61aafb37d4ed9a5018bb80fde5447804ffe644fb]
#    to [2211497f0a41ebfb7c777f8ac13e0462933253c4]
# 
#   set "packages/stage-manager/files/stage-manager-ipkg"
#  attr "mtn:execute"
# value "true"
# 
#   set "packages/stage-manager/files/stage-manager-ipkg-build"
#  attr "mtn:execute"
# value "true"
#
============================================================
--- packages/stage-manager/files/stage-manager-ipkg	7593166519513f8e516b14d394e2d3576854f946
+++ packages/stage-manager/files/stage-manager-ipkg	7593166519513f8e516b14d394e2d3576854f946
@@ -0,0 +1,1186 @@
+#!/bin/sh
+# ipkg - the itsy package management system
+#
+# Copyright (C) 2001 Carl D. Worth
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, 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 General Public License for more details.
+
+set -e
+
+# Uncomment for debugging
+#set -x
+
+# By default do not do globbing. Any command wanting globbing should
+# explicitly enable it first and disable it afterwards.
+set -o noglob
+
+ipkg_srcs() {
+	local srcre="$1"
+	sed -ne "s/^src[[:space:]]\+$srcre[[:space:]]\+//p" < $IPKG_CONF
+}
+
+ipkg_src_names() {
+	sed -ne "s/^src[[:space:]]\+\([^[:space:]]\+\).*/\1/p" < $IPKG_CONF
+}
+
+ipkg_src_byname() {
+	local src="$1"
+	ipkg_srcs $src | head -1
+}
+
+ipkg_dests() {
+	local destre=`echo $1 | ipkg_protect_slashes`
+	sed -ne "/^dest[[:space:]]\+$destre/{
+s/^dest[[:space:]]\+[^[:space:]]\+[[:space:]]\+//
+s/^/`echo $IPKG_OFFLINE_ROOT | ipkg_protect_slashes`/
+p
+}" < $IPKG_CONF
+}
+
+ipkg_dest_names() {
+	sed -ne "s/^dest[[:space:]]\+\([^[:space:]]\+\).*/\1/p" < $IPKG_CONF
+}
+
+ipkg_dests_all() {
+	ipkg_dests '.*'
+}
+
+ipkg_state_dirs() {
+	ipkg_dests_all | sed "s|\$|/$IPKG_DIR_PREFIX|"
+}
+
+ipkg_dest_default() {
+	ipkg_dests_all | head -1
+}
+
+ipkg_dest_default_name() {
+	ipkg_dest_names | head -1
+}
+
+ipkg_dest_byname() {
+	local dest="$1"
+	ipkg_dests $dest | head -1
+}
+
+ipkg_option() {
+	local option="$1"
+	sed -ne "s/^option[[:space:]]\+$option[[:space:]]\+//p" < $IPKG_CONF
+}
+
+ipkg_load_configuration() {
+	if [ -z "$IPKG_CONF_DIR" ]; then
+		IPKG_CONF_DIR=/etc
+	fi
+
+	if [ -z "$IPKG_CONF" ]; then
+		IPKG_CONF=$IPKG_CONF_DIR/ipkg.conf
+	fi
+
+	if [ -z "$IPKG_OFFLINE_ROOT" ]; then
+	    IPKG_OFFLINE_ROOT=`ipkg_option offline_root`
+	fi
+	# Export IPKG_OFFLINE_ROOT for use by update-alternatives
+	export IPKG_OFFLINE_ROOT
+	if [ -n "$DEST_NAME" ]; then
+		IPKG_ROOT=`ipkg_dest_byname $DEST_NAME`
+		if [ -z "$IPKG_ROOT" ]; then
+			if [ -d "$IPKG_OFFLINE_ROOT$DEST_NAME" ]; then
+				IPKG_ROOT="$IPKG_OFFLINE_ROOT$DEST_NAME";
+			else
+				echo "ipkg: invalid destination specification: $DEST_NAME
+Valid destinations are directories or one of the dest names from $IPKG_CONF:" >&2
+				ipkg_dest_names >&2
+				return 1
+			fi
+		fi
+	else
+		IPKG_ROOT=`ipkg_dest_default`
+	fi
+
+	# Global ipkg state directories
+	IPKG_DIR_PREFIX=usr/lib/ipkg
+	IPKG_LISTS_DIR=$IPKG_OFFLINE_ROOT/$IPKG_DIR_PREFIX/lists
+	IPKG_PENDING_DIR=$IPKG_OFFLINE_ROOT/$IPKG_DIR_PREFIX/pending
+	IPKG_TMP=`mktemp -d`
+
+	if [ ! -d "$IPKG_TMP" ]; then
+		echo "Error, could not create a temp directory"
+		return 1
+	fi
+
+	# Destination specific ipkg meta-data directory
+	IPKG_STATE_DIR=$IPKG_ROOT/$IPKG_DIR_PREFIX
+
+	# Proxy Support
+	IPKG_PROXY_USERNAME=`ipkg_option proxy_username`
+	IPKG_PROXY_PASSWORD=`ipkg_option proxy_password`
+	IPKG_HTTP_PROXY=`ipkg_option http_proxy`
+	IPKG_FTP_PROXY=`ipkg_option ftp_proxy`
+	IPKG_NO_PROXY=`ipkg_option no_proxy`
+	if [ -n "$IPKG_HTTP_PROXY" ]; then 
+		export http_proxy="$IPKG_HTTP_PROXY"
+	fi
+
+	if [ -n "$IPKG_FTP_PROXY" ]; then 
+		export ftp_proxy="$IPKG_FTP_PROXY"
+	fi
+
+	if [ -n "$IPKG_NO_PROXY" ]; then 
+		export no_proxy="$IPKG_NO_PROXY"
+	fi
+
+	IPKG_STATUS_FIELDS='\(Package\|Status\|Essential\|Version\|Conffiles\|Root\)'
+}
+
+ipkg_usage() {
+	[ $# -gt 0 ] && echo "ipkg: $*"
+	echo "
+usage: ipkg [options...] sub-command [arguments...]
+where sub-command is one of:
+
+Package Manipulation:
+	update  		Update list of available packages
+	upgrade			Upgrade all installed packages to latest version
+	install <pkg>		Download and install <pkg> (and dependencies)
+	install <file.ipk>	Install package <file.ipk>
+	install <file.deb>	Install package <file.deb>
+	remove <pkg>		Remove package <pkg>
+
+Informational Commands:
+	list    		List available packages and descriptions
+	files <pkg>		List all files belonging to <pkg>
+	search <file>		Search for a packaging providing <file>
+	info [pkg [<field>]]	Display all/some info fields for <pkg> or all
+	status [pkg [<field>]]	Display all/some status fields for <pkg> or all
+	depends <pkg>		Print uninstalled package dependencies for <pkg>
+
+Options:
+	-d <dest_name>          Use <dest_name> as the the root directory for
+	-dest <dest_name>	package installation, removal, upgrading.
+				<dest_name> should be a defined dest name from the
+				configuration file, (but can also be a directory
+				name in a pinch).
+        -o <offline_root>       Use <offline_root> as the root for offline installation.
+        -offline <offline_root> 				
+
+Force Options (use when ipkg is too smart for its own good):
+	-force-depends          Make dependency checks warnings instead of errors
+	-force-defaults         Use default options for questions asked by ipkg.
+                                (no prompts). Note that this will not prevent
+                                package installation scripts from prompting.
+" >&2
+	exit 1
+}
+
+ipkg_dir_part() {
+	local dir=`echo $1 | sed -ne 's/\(.*\/\).*/\1/p'`
+	if [ -z "$dir" ]; then
+		dir="./"
+	fi
+	echo $dir
+}
+
+ipkg_file_part() {
+	echo $1 | sed 's/.*\///'
+}
+
+ipkg_protect_slashes() {
+	sed -e 's/\//\\\//g'
+}
+
+ipkg_download() {
+	local src="$1"
+	local dest="$2"
+
+	local src_file=`ipkg_file_part $src`
+	local dest_dir=`ipkg_dir_part $dest`
+	if [ -z "$dest_dir" ]; then
+		dest_dir="$IPKG_TMP"
+	fi
+
+	local dest_file=`ipkg_file_part $dest`
+	if [ -z "$dest_file" ]; then
+		dest_file="$src_file"
+	fi
+
+	# Proxy support
+	local proxyuser=""
+	local proxypassword=""
+	local proxyoption=""
+		
+	if [ -n "$IPKG_PROXY_USERNAME" ]; then
+		proxyuser="--proxy-user=\"$IPKG_PROXY_USERNAME\""
+		proxypassword="--proxy-passwd=\"$IPKG_PROXY_PASSWORD\""
+	fi
+
+	if [ -n "$IPKG_PROXY_HTTP" -o -n "$IPKG_PROXY_FTP" ]; then
+		proxyoption="--proxy=on"
+	fi
+
+	echo "Downloading $src ..."
+	rm -f $IPKG_TMP/$src_file
+	case "$src" in
+	http://* | ftp://*)
+		if ! wget --passive-ftp -nd $proxyoption $proxyuser $proxypassword -P $IPKG_TMP $src; then
+			echo "ipkg_download: ERROR: Failed to retrieve $src, returning $err"
+			return 1
+		fi
+		mv $IPKG_TMP/$src_file $dest_dir/$dest_file 2>/dev/null
+		;;
+	file:/* )
+		ln -s `echo $src | sed 's/^file://'` $dest_dir/$dest_file 2>/dev/null
+		;;
+	*)
+	echo "DEBUG: $src"
+		;;
+	esac
+
+	echo "Done."
+	return 0
+}
+
+ipkg_update() {
+	if [ ! -e "$IPKG_LISTS_DIR" ]; then
+		mkdir -p $IPKG_LISTS_DIR
+	fi
+
+	local err=
+	for src_name in `ipkg_src_names`; do
+		local src=`ipkg_src_byname $src_name`
+		if ! ipkg_download $src/Packages $IPKG_LISTS_DIR/$src_name; then
+			echo "ipkg_update: Error downloading $src/Packages to $IPKG_LISTS_DIR/$src_name" >&2
+			err=t
+		else
+			echo "Updated list of available packages in $IPKG_LISTS_DIR/$src_name"
+		fi
+	done
+
+	[ -n "$err" ] && return 1
+
+	return 0
+}
+
+ipkg_list() {
+	for src in `ipkg_src_names`; do
+		if ipkg_require_list $src; then 
+# black magic...
+sed -ne "
+/^Package:/{
+s/^Package:[[:space:]]*\<\([a-z0-9.+-]*$1[a-z0-9.+-]*\).*/\1/
+h
+}
+/^Description:/{
+s/^Description:[[:space:]]*\(.*\)/\1/
+H
+g
+s/\\
+/ - /
+p
+}
+" $IPKG_LISTS_DIR/$src
+		fi
+	done
+}
+
+ipkg_extract_paragraph() {
+	local pkg="$1"
+	sed -ne "/Package:[[:space:]]*$pkg[[:space:]]*\$/,/^\$/p"
+}
+
+ipkg_extract_field() {
+	local field="$1"
+# blacker magic...
+	sed -ne "
+: TOP
+/^$field:/{
+p
+n
+b FIELD
+}
+d
+: FIELD
+/^$/b TOP
+/^[^[:space:]]/b TOP
+p
+n
+b FIELD
+"
+}
+
+ipkg_extract_value() {
+	sed -e "s/^[^:]*:[[:space:]]*//"
+}
+
+ipkg_require_list() {
+	[ $# -lt 1 ] && return 1
+	local src="$1"
+	if [ ! -f "$IPKG_LISTS_DIR/$src" ]; then
+		echo "ERROR: File not found: $IPKG_LISTS_DIR/$src" >&2
+		echo "       You probably want to run \`ipkg update'" >&2
+		return 1
+	fi
+	return 0
+}
+
+ipkg_info() {
+	for src in `ipkg_src_names`; do
+		if ipkg_require_list $src; then
+			case $# in
+			0)
+				cat $IPKG_LISTS_DIR/$src
+				;;	
+			1)
+				ipkg_extract_paragraph $1 < $IPKG_LISTS_DIR/$src
+				;;
+			*)
+				ipkg_extract_paragraph $1 < $IPKG_LISTS_DIR/$src | ipkg_extract_field $2
+				;;
+			esac
+		fi
+	done
+}
+
+ipkg_status_sd() {
+	[ $# -lt 1 ] && return 0
+	sd="$1"
+	shift
+	if [ -f $sd/status ]; then
+		case $# in
+		0)
+			cat $sd/status
+			;;
+		1)
+			ipkg_extract_paragraph $1 < $sd/status
+			;;
+		*)
+			ipkg_extract_paragraph $1 < $sd/status | ipkg_extract_field $2
+			;;
+		esac
+	fi
+	return 0
+}
+
+ipkg_status_all() {
+	for sd in `ipkg_state_dirs`; do
+		ipkg_status_sd $sd $*
+	done
+}
+
+ipkg_status() {
+	if [ -n "$DEST_NAME" ]; then
+		ipkg_status_sd $IPKG_STATE_DIR $*
+	else
+		ipkg_status_all $*
+	fi
+}
+
+ipkg_status_matching_sd() {
+	local sd="$1"
+	local re="$2"
+	if [ -f $sd/status ]; then
+		sed -ne "
+: TOP
+/^Package:/{
+s/^Package:[[:space:]]*//
+s/[[:space:]]*$//
+h
+}
+/$re/{
+g
+p
+b NEXT
+}
+d
+: NEXT
+/^$/b TOP
+n
+b NEXT
+" < $sd/status
+	fi
+	return 0
+}
+
+ipkg_status_matching_all() {
+	for sd in `ipkg_state_dirs`; do
+		ipkg_status_matching_sd $sd $*
+	done
+}
+
+ipkg_status_matching() {
+	if [ -n "$DEST_NAME" ]; then
+		ipkg_status_matching_sd $IPKG_STATE_DIR $*
+	else
+		ipkg_status_matching_all $*
+	fi
+}
+
+ipkg_status_installed_sd() {
+	local sd="$1"
+	local pkg="$2"
+	ipkg_status_sd $sd $pkg Status | grep -q "Status: install ok installed"
+}
+
+ipkg_status_installed_all() {
+	local ret=1
+	for sd in `ipkg_state_dirs`; do
+		if `ipkg_status_installed_sd $sd $*`; then
+			ret=0
+		fi
+	done
+	return $ret
+}
+
+ipkg_status_mentioned_sd() {
+	local sd="$1"
+	local pkg="$2"
+	[ -n "`ipkg_status_sd $sd $pkg Status`" ]
+}
+
+ipkg_files() {
+	local pkg="$1"
+	if [ -n "$DEST_NAME" ]; then
+		dests=$IPKG_ROOT
+	else
+		dests=`ipkg_dests_all`
+	fi
+	for dest in $dests; do
+		if [ -f $dest/$IPKG_DIR_PREFIX/info/$pkg.list ]; then
+			dest_sed=`echo $dest | ipkg_protect_slashes`
+			sed -e "s/^/$dest_sed/" < $dest/$IPKG_DIR_PREFIX/info/$pkg.list
+		fi
+	done
+}
+
+ipkg_search() {
+	local pattern="$1"
+
+	for dest_name in `ipkg_dest_names`; do
+		dest=`ipkg_dest_byname $dest_name`
+		dest_sed=`echo $dest | ipkg_protect_slashes`
+
+		set +o noglob
+		local list_files=`ls -1 $dest/$IPKG_DIR_PREFIX/info/*.list 2>/dev/null`
+		set -o noglob
+		for file in $list_files; do
+			if sed "s/^/$dest_sed/" $file | grep -q $pattern; then
+				local pkg=`echo $file | sed "s/^.*\/\(.*\)\.list/\1/"`
+				[ "$dest_name" != `ipkg_dest_default_name` ] && pkg="$pkg ($dest_name)"
+				sed "s/^/$dest_sed/" $file | grep $pattern | sed "s/^/$pkg: /"
+			fi
+		done
+	done
+}
+
+ipkg_status_remove_sd() {
+	local sd="$1"
+	local pkg="$2"
+
+	if [ ! -f $sd/status ]; then
+		mkdir -p $sd
+		touch $sd/status
+	fi
+	sed -ne "/Package:[[:space:]]*$pkg[[:space:]]*\$/,/^\$/!p" < $sd/status > $sd/status.new
+	mv $sd/status.new $sd/status
+}
+
+ipkg_status_remove_all() {
+	for sd in `ipkg_state_dirs`; do
+		ipkg_status_remove_sd $sd $*
+	done
+}
+
+ipkg_status_remove() {
+	if [ -n "$DEST_NAME" ]; then
+		ipkg_status_remove_sd $IPKG_STATE_DIR $*
+	else
+		ipkg_status_remove_all $*
+	fi
+}
+
+ipkg_status_update_sd() {
+	local sd="$1"
+	local pkg="$2"
+
+	ipkg_status_remove_sd $sd $pkg
+	ipkg_extract_field "$IPKG_STATUS_FIELDS" >> $sd/status
+	echo "" >> $sd/status
+}
+
+ipkg_status_update() {
+	ipkg_status_update_sd $IPKG_STATE_DIR $*
+}
+
+ipkg_unsatisfied_dependences() {
+    local pkg=$1
+    local deps=`ipkg_get_depends $pkg`
+    local remaining_deps=
+    for dep in $deps; do
+	local installed=`ipkg_get_installed $dep`
+	if [ "$installed" != "installed" ] ; then
+	    remaining_deps="$remaining_deps $dep"
+	fi
+    done
+    ## echo "ipkg_unsatisfied_dependences pkg=$pkg $remaining_deps" > /dev/console
+    echo $remaining_deps
+}
+
+ipkg_safe_pkg_name() {
+	local pkg=$1
+	local spkg=`echo pkg_$pkg | sed -e y/-+./___/`
+	echo $spkg
+}
+
+ipkg_set_depends() {
+	local pkg=$1; shift 
+	local new_deps="$*"
+	pkg=`ipkg_safe_pkg_name $pkg`
+	## setvar ${pkg}_depends "$new_deps"
+	echo $new_deps > $IPKG_TMP/${pkg}.depends
+}
+
+ipkg_get_depends() {
+	local pkg=$1
+	pkg=`ipkg_safe_pkg_name $pkg`
+	cat $IPKG_TMP/${pkg}.depends
+	## eval "echo \$${pkg}_depends"
+}
+
+ipkg_set_installed() {
+	local pkg=$1
+	pkg=`ipkg_safe_pkg_name $pkg`
+	echo installed > $IPKG_TMP/${pkg}.installed
+	## setvar ${pkg}_installed "installed"
+}
+
+ipkg_set_uninstalled() {
+	local pkg=$1
+	pkg=`ipkg_safe_pkg_name $pkg`
+	### echo ipkg_set_uninstalled $pkg > /dev/console
+	echo uninstalled > $IPKG_TMP/${pkg}.installed
+	## setvar ${pkg}_installed "uninstalled"
+}
+
+ipkg_get_installed() {
+	local pkg=$1
+	pkg=`ipkg_safe_pkg_name $pkg`
+	if [ -f $IPKG_TMP/${pkg}.installed ]; then
+		cat $IPKG_TMP/${pkg}.installed
+	fi
+	## eval "echo \$${pkg}_installed"
+}
+
+ipkg_depends() {
+	local new_pkgs="$*"
+	local all_deps=
+	local installed_pkgs=`ipkg_status_matching_all 'Status:.*[[:space:]]installed'`
+	for pkg in $installed_pkgs; do
+	    ipkg_set_installed $pkg
+	done
+	while [ -n "$new_pkgs" ]; do
+		all_deps="$all_deps $new_pkgs"
+		local new_deps=
+		for pkg in $new_pkgs; do
+			if echo $pkg | grep -q '[^a-z0-9.+-]'; then
+				echo "ipkg_depends: ERROR: Package name $pkg contains illegal characters (should be [a-z0-9.+-])" >&2
+				return 1
+			fi
+			# TODO: Fix this. For now I am ignoring versions and alternations in dependencies.
+			new_deps="$new_deps "`ipkg_info $pkg '\(Pre-\)\?Depends' | ipkg_extract_value | sed -e 's/([^)]*)//g
+s/\(|[[:space:]]*[a-z0-9.+-]\+[[:space:]]*\)\+//g
+s/,/ /g
+s/ \+/ /g'`
+			ipkg_set_depends $pkg $new_deps
+		done
+
+		new_deps=`echo $new_deps | sed -e 's/[[:space:]]\+/\\
+/g' | sort | uniq`
+
+		local maybe_new_pkgs=
+		for pkg in $new_deps; do
+			if ! echo $installed_pkgs | grep -q "\<$pkg\>"; then
+				maybe_new_pkgs="$maybe_new_pkgs $pkg"
+			fi
+		done
+
+		new_pkgs=
+		for pkg in $maybe_new_pkgs; do
+			if ! echo $all_deps | grep -q "\<$pkg\>"; then
+				if [ -z "`ipkg_info $pkg`" ]; then
+					echo "ipkg_depends: Warning: $pkg mentioned in dependency but no package found in $IPKG_LISTS_DIR" >&2
+					ipkg_set_installed $pkg
+				else
+					new_pkgs="$new_pkgs $pkg"
+					ipkg_set_uninstalled $pkg
+				fi
+			else
+				ipkg_set_uninstalled $pkg
+			fi
+		done
+	done
+
+	echo $all_deps
+}
+
+ipkg_get_install_dest() {
+	local dest="$1"
+	shift
+	local sd=$dest/$IPKG_DIR_PREFIX
+	local info_dir=$sd/info
+
+        local requested_pkgs="$*"
+	local pkgs=`ipkg_depends $*`
+
+	mkdir -p $info_dir
+	for pkg in $pkgs; do
+		if ! ipkg_status_mentioned_sd $sd $pkg; then
+			echo "Package: $pkg
+Status: install ok not-installed" | ipkg_status_update_sd $sd $pkg
+		fi
+	done
+        ## mark the packages that we were directly requested to install as uninstalled
+        for pkg in $requested_pkgs; do ipkg_set_uninstalled $pkg; done
+
+	local new_pkgs=
+	local pkgs_installed=0
+	while [ -n "pkgs" ]; do
+		curcheck=0
+		## echo "pkgs to install: {$pkgs}" > /dev/console
+		for pkg in $pkgs; do
+			curcheck=`expr $curcheck + 1`
+			local is_installed=`ipkg_get_installed $pkg`
+			if [ "$is_installed" = "installed" ]; then
+				echo "$pkg is installed" > /dev/console
+				continue
+			fi
+
+			local remaining_deps=`ipkg_unsatisfied_dependences $pkg`
+			if [ -n "$remaining_%s
>>> DIFF TRUNCATED @ 16K






More information about the Openembedded-commits mailing list