[csw-devel] SF.net SVN: gar:[21821] csw/mgar/pkg/alternatives

pfelecan at users.sourceforge.net pfelecan at users.sourceforge.net
Thu Aug 22 11:12:21 CEST 2013


Revision: 21821
          http://gar.svn.sourceforge.net/gar/?rev=21821&view=rev
Author:   pfelecan
Date:     2013-08-22 09:12:15 +0000 (Thu, 22 Aug 2013)
Log Message:
-----------
alternatives/trunk:
- removed the branch but copied the relevant adaptation
- completely garified
- manual page generated on the fly
- removed the components related to the old recipe

Modified Paths:
--------------
    csw/mgar/pkg/alternatives/trunk/Makefile

Added Paths:
-----------
    csw/mgar/pkg/alternatives/trunk/checksums
    csw/mgar/pkg/alternatives/trunk/files/
    csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.i.cswalternatives
    csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.r.cswalternatives
    csw/mgar/pkg/alternatives/trunk/files/LICENSE-2.0.txt
    csw/mgar/pkg/alternatives/trunk/files/README
    csw/mgar/pkg/alternatives/trunk/files/README.user
    csw/mgar/pkg/alternatives/trunk/files/alternatives
    csw/mgar/pkg/alternatives/trunk/files/alternatives.8

Removed Paths:
-------------
    csw/mgar/pkg/alternatives/branches/alternatives-gar/
    csw/mgar/pkg/alternatives/trunk/README
    csw/mgar/pkg/alternatives/trunk/README.user
    csw/mgar/pkg/alternatives/trunk/alternatives
    csw/mgar/pkg/alternatives/trunk/copyright
    csw/mgar/pkg/alternatives/trunk/i.cswalternatives
    csw/mgar/pkg/alternatives/trunk/pkginfo
    csw/mgar/pkg/alternatives/trunk/prototype
    csw/mgar/pkg/alternatives/trunk/r.cswalternatives

Modified: csw/mgar/pkg/alternatives/trunk/Makefile
===================================================================
--- csw/mgar/pkg/alternatives/trunk/Makefile	2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/Makefile	2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,8 +1,54 @@
-package:	alternatives
-	@echo Note: subversion status is:
-	svn status
-	createpkg -b `pwd`
-	touch package
+# $Id$
+NAME = alternatives
+VERSION = 1.0
 
-clean:
-	rm -f *.pkg.gz package
+DESCRIPTION = Alternatives implementation specific to OpenCSW
+define BLURB
+endef
+
+MASTER_SITES = 
+DISTFILES	=	alternatives
+DISTFILES	+=	CSWalternatives.i.cswalternatives
+DISTFILES	+=	CSWalternatives.r.cswalternatives
+DISTFILES	+=	LICENSE-2.0.txt
+DISTFILES	+=	README
+DISTFILES	+=	README.user
+
+# File name regex to get notifications about upstream software releases
+UFILES_REGEX = $(NAME)-(\d+(?:\.\d+)*).tar.gz
+
+LICENSE = LICENSE-2.0.txt
+
+VENDOR_URL = http://wiki.opencsw.org/project-alternatives
+
+CONFIGURE_SCRIPTS = 
+
+BUILD_DEP_PKGS	=	CSWhelp2man
+
+BUILD_SCRIPTS = man
+INSTALL_SCRIPTS = custom
+TEST_SCRIPTS = 
+
+ARCHALL	=	1
+
+include gar/category.mk
+
+build-man:
+	cd $(WORKDIR) && help2man --section=8 --source='Open CSW' --no-info --output=alternatives.8 ./alternatives
+	@$(MAKECOOKIE)
+
+install-custom:
+	ginstall -d $(DESTDIR)$(bindir)
+	ginstall $(WORKDIR)/alternatives $(DESTDIR)$(bindir)
+	ginstall -d $(DESTDIR)$(mandir)/man8
+	ginstall $(WORKDIR)/alternatives.8 $(DESTDIR)$(mandir)/man8
+	ginstall -d $(DESTDIR)/etc/opt/csw/alternatives
+	ginstall -d $(DESTDIR)/etc/opt/csw/preserve/CSWalternatives/alternatives
+	ginstall -d $(DESTDIR)/var/opt/csw/alternatives
+	ginstall -d $(DESTDIR)/usr/sadm/install/scripts
+	ginstall $(WORKDIR)/CSWalternatives.i.cswalternatives $(DESTDIR)/usr/sadm/install/scripts/i.cswalternatives
+	ginstall $(WORKDIR)/CSWalternatives.r.cswalternatives $(DESTDIR)/usr/sadm/install/scripts/r.cswalternatives
+	ginstall -d $(DESTDIR)$(docdir)/$(NAME)
+	ginstall $(WORKDIR)/README $(DESTDIR)$(docdir)/$(NAME)
+	ginstall $(WORKDIR)/README.user $(DESTDIR)$(docdir)/$(NAME)
+	@$(MAKECOOKIE)

Deleted: csw/mgar/pkg/alternatives/trunk/README
===================================================================
--- csw/mgar/pkg/alternatives/trunk/README	2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/README	2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,66 +0,0 @@
-This file is more of an "internals" thoughts and notes file.
-For user facing documentation, see  README.user
-
-Phil decided that a from-scratch, CSW-custom implementation was needed,
-because the debian one was hugely bloated, and the redhat smaller one,
-did not play nicely with NFS-shared /opt/csw
-So please dont go getting ideas that we can migrated back to redhat,etc
-in the future! :) we tried, and it failed.
-
-Sections below:
-   * CODE NOTES
-   * FILE FORMATS
-   
-
-CODE NOTES
-
- My initial version seems to expect each "alternative" to have its own
-file as /opt/csw/share/alternatives/xyz
-One line per file only would be nice, please. But this suports
-multiple lines per file now.
-
-When a choice is manually set (overriding auto settings), it records that
-fact by making a symlink from the relevant shipped file, to 
-/etc/opt/csw/alternatives/(progname)
-and then it will make the user-facing symlink(s) indicated by that file
-
-This way, you can have the binary, and alternatives files per software,
-in NFS-shared /opt/csw, but then have machine-local overrides.
-
-Reminder: Do NOT have to get fancy with the class action script not 
- getting called with pathnames on sparse zones with pkg-inherit-dir,
- because since /opt/csw is shared, the symlink will already be in place.
-
-  Ambuguity for --remove:
-  what if --remove is used, on something that has a manually set pref?
-  (rather than calling --auto)
-  I choose that it will LEAVE the manual choice.
-  That is to say, it will leave the saved preference as valid.
-  BUT, if the manual choice matches the --remove", then 
-  it should skip it as a "what to match" option..? !!
-
-  This is to potentially make our pkgrm/pkgadd upgrade cycle
-  function as a user expects: to preserve their manual choice.
-
-FILE FORMATS
-
-  Packages that provide implementation of an "alternative" for a
-  particular path, need to provide a file in
-  /opt/csw/share/alternatives/[softwarename]
-
-  *** Note that it MUST be in that directory and nowhere else !!!  ***
-
-  The format of this file, is one or more lines, of the following format:
-
-  /full/path shortname /provided/path priority [/slave/path shortname /provide!
-
-  Note that tabs are not allowed.
-
-  The purpose of the "slave path", is that sometimes, when the "main" path
-  changes its implementation, one or more other ones must be changed
-  to match.
-
-  This line format, is normally passed onto our
-  "alternatives" binary by the class action script, directly as
-  an arg list to the --install option.
-  

Deleted: csw/mgar/pkg/alternatives/trunk/README.user
===================================================================
--- csw/mgar/pkg/alternatives/trunk/README.user	2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/README.user	2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,44 +0,0 @@
-This is a short documentation file for the OpenCSW targetted implementation of
-linux style "alternatives", aka "update-alternatives" in debian.
-
-USER LEVEL DOCS
-
-  alternatives --display shortname
-  # will display any currently installed symlink for "shortname"
-  # will display any installed packages that provide "shortname".
-  # will display current decision mode for --install, for "shortname"
-  #    (either "auto", or [?? something else]
-  
-
-  alternatives --config shortname
-  # will display any installed packages that provide "shortname".
-  # will prompt user for their preferred choice of package to use,
-     or to stick/revert to auto mode.
-
-  alternatives --auto shortname
-  # sets shortname to be auto-chosen. Will adjust symlinks now, if appropriate
-
-  alternatives --set shortname /provided/path
-  # sets shortname to be the implementation provided by /provided/path,
-  #  IF PRESENT.
-  # Basically, sets that one to be artificially "highest priority", then
-  # configure the link now.
-  # If the manual setting is invalid, it will be ignored
-
-  alternatives --install /full/path/name shortname /path/xx priority [...]
-  # notifies the alternatives handler, and says,
-  # "hey, here's an implementation. If its highest priority right now,
-  #   use it!"
-  # Unlike redhat, we dont actually "register" anything.
-
-  alternatives --remove shortname /full/path/name
-  # basically, a hint to reconfigure shortname "as appropriate",
-  # while ignoring anything matching /full/path/name as a valid alternative
-
-  alternatives --list
-  # Gives a short list of programs "known" to alternatives, on this machine.
-
-  alternatives --relink-missing
-  # if you are in a situation where symlinks have not been created,
-  # call this, and it will create any missing ones as appropriate
-

Deleted: csw/mgar/pkg/alternatives/trunk/alternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/alternatives	2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/alternatives	2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,472 +0,0 @@
-#!/bin/ksh -p
-
-# ksh high-level implentation of linux style "alternatives".
-# Adjusted for OpenCSW needs
-# Author: Philip Brown, phil at bolthole.com, 2010-2011
-# 
-
-PRIORITIESDIR=/opt/csw/share/alternatives 
-MANUALDIR=/etc/opt/csw/alternatives  #manual override location
-AWK=nawk
-DEBUG=${DEBUG:-/bin/true}
-
-#echo DEBUG VERSION of $0: dont ship this
-#DEBUG=echo
-
-function usage {
-	prog=`basename $0`
-	print "Usage for $prog :"
-	print "  $prog --display {name}"
-	print "  $prog --auto {name}"
-	print "  $prog --set {name} {/full/path}"
-	print "  $prog --config {name}"
-	print "  "
-	print " The following are provided for compatibility, but do not work"
-	print " in exactly the same way as linux variants"
-	print " See comments in usage function code for more information."
-	print "  $prog --install {/full/path/name} {name} {#priority}"
-	print "  $prog --remove {name} {/full/path}"
-	print ""
-	print " The following are opencsw-only:"
-	print "  $prog --relink-missing  : create missing symlinks"
-	print "  $prog --list"
-	print ""
-	print "See /opt/csw/share/doc/alternatives/ for more docs"
-	
-
-# I dont want to bloat up the usage message, so here's some more docs
-#  
-# This program is a lightweight 'workalike' to the linux alternatives prog.
-# It is written with OpenCSW in mind, and is specificaly tailored for
-# our needs. You may find it useful in other fields, but be aware that
-# its primary purpose is to be simple, and flexible. NOT an exact clone.
-# Part of its flexibility comes from the fact that it is configuration-file
-# driven, NOT internal-database-driven
-#   The --install and --remove flags, while (hopefully) provided as
-# a convenience, do NOT install, or remove, any configuration. They just
-# update symlinks, "as appropriate"
-# 
-# Priorities are driven by configuration files delivered by our packages.
-# They get delivered to /opt/csw/share/alternatives, which keeps things
-# NFS friendly.
-# Thes files should only get "installed" or "removed" on a per-SVR4 package 
-# basis normally. (although technically, it would be possible to drop in your
-# own config file in either $PRIORITIESDIR or $MANUALDIR, and then
-# have things integrate with your own custom non-packaged software).
-#
-# There is almost NO ERROR CHECKING. There is no saving state of prior actions,
-# other than the --set comand. 
-# It is up to individual packages to make sure that everyone providing
-#  an alternative for {name}, all have the same "slave entries", 
-#  if you choose to use slave entries
-}
-
-
-# Usage: find_highest_prio {name}
-#   search through all conf files for {name}
-# print out the highest priority match. or, potentially nothing.
-function find_highest_prio {
-	if [[ "$1" == "" ]] ; then
-		print INTERNAL ERROR: find_highest_prio called with no args
-		return
-	fi
-	# I hate using cat, but its the only way to avoid nawk throwing a fit.
-	cat $PRIORITIESDIR/* $MANUALDIR/$1 2>/dev/null |
-	$AWK '	BEGIN {save=""}
-		$2 == "'$1'" {if($4 > highest){
-				save=$0;
-				highest=$4
-				}
-		}
-		
-		END {print save}
-	'
-}
-
-if [[ $# -lt 1 ]] ; then
-	print error: need an argument
-	usage
-	exit 1
-fi
-
-
-############################################################
-# Start of subroutine area
-
-# Usage: print_alternatives shortname
-# This prints only the INSTALLED alternatives lines for named software.
-#  Does not display whether or not any have been manually chosen.
-# Prints in priority-sorted order
-# This is used both as a user-facing display, and also internally
-#
-function print_alternatives {
-	if [[ $# != 1 ]] ; then print ERROR print_alternatives needs an arg; fi
-	cat $PRIORITIESDIR/* 2>/dev/null|
-		nawk '$2 == "'$1'" {print}' | sort -nr +3
-}
-
-# User facing function, as well as internal
-# enables "alternatives --list"
-function list_alternatives {
-	cat $PRIORITIESDIR/* 2>/dev/null| nawk '{print $2}' | sort -u
-}
-
-# prints ONLY the manually set alternatives line, if present
-function print_manual_set {
-	if [[ $# != 1 ]] ; then print ERROR print_manual_set needs an arg; fi
-	
-	if [[ -f $MANUALDIR/$1 ]] ; then
-		nawk '$2 == "'$1'" {print}' $MANUALDIR/$1
-	else
-		return 1
-	fi
-}
-
-function fileerr_exit {
-	print Debug: potentially should check to see if /opt/csw is
-	print  specifically read-only, or we are in jumpstart, or something
-	print  before returning a bad status exit, perhaps
-
-	case `/bin/id` in
-	  'uid=0('*)
-	  	:
-		;;
-	  *)
-	  	echo "Hey! Try running this as root whydoncha?"
-		exit 1
-	  ;;
-	esac
-
-	print If someone other than Phil is seeing this,  please let him know
-	
-	exit 1
-}
-
-# Called only internally, by set_alternative.
-#  args:   {target} {shortname} {implementation-path}
-# Split out, because one "alternatives" line may have multiple "slave" links
-function set_link {
-	$DEBUG set_link called with: $1 $2 $3
-	if [[ $# -lt 3 ]] ; then
-		print ERROR: set_link needs 3 arguments
-		return 1
-	fi
-	
-	if [[ -h $1 ]] ; then
-		linktarget=`ls -l $1 | nawk '{print $NF}'`
-		if [[ "$linktarget" == "$3" ]] ; then
-			$DEBUG $1 already linked to $3
-			return 0
-		fi
-		
-		$DEBUG removing symlink $1
-		/bin/rm -f $1
-		if [[ $? -ne 0 ]] ; then
-			$DEBUG permission to remove $1 failed
-			fileerr_exit
-		fi
-	fi
-	if [[ ! -f $1 ]] ; then
-		$DEBUG linking $1 to $3
-		ln -s $3 $1
-		if [[ $? -ne 0 ]] ; then
-			$DEBUG permission to create symlink for $1 failed
-			fileerr_exit
-		fi
-		return 0
-	else
-		print ERROR: $1 exists, and is not symlink.
-		print Not installing $3 as $1
-		return 1
-	fi
-
-	## Note to self: check existing, and dont attempt to
-	## update if already set how we want it?
-	## Also, dont crash if /opt/csw is read-only.
-	## Just politely print warning, and exit cleanly.
-	## At least if running from jumpstart environment?
-	## ALSO, be paranoid and dont remove a "real" file, if
-	## one already exists in the target space.
-	## only a symlink
-}
-
-
-#Used for --remove.
-# removes the old symlinks.
-# pass in the "normal" cache file format.
-# Should be called ONLY IF THERE ARE NO MORE "alternatives" installed
-# or if, perhaps, the "current" alternative is the one being removed.
-function rm_alternative_links {
-	$DEBUG rm_alternative_links called with $@
-	# first one is special
-	if [[ -h $1 ]] ; then
-		rm -f $1
-	fi
-	shift 4
-	while [[ $# -ge 3 ]] ; do
-		rm -f $1
-		shift 3
-	done
-
-}
-
-# set_alternatives: mostly internal function. 
-#  It "sets" only in the sense of making the symlink for the binary(s)
-#  
-# Usage: set_alternative {shortname} [ignore-path]
-#
-# Goes and checks both standard configs, and manual config, for best fit.
-# Mandatory first argument, is the "shortname" of the alternative.
-# Optional second argument implies "remove" mode, and needs to be
-#  a full path to one of the main implementations of an alternative.
-#  The line containing that, will then be ignored.
-#
-#
-function set_alternative {
-	typeset shortname remove_match line
-	$DEBUG set_alternative called with $*
-
-	if [[ $# -lt 1 ]] ; then
-		print ERROR set_alternative needs an arg; exit 1;
-	fi
-
-	shortname="$1"
-	remove_match="$2"
-
-
-	
-	line=`print_manual_set $shortname`
-	if [[ "$line" != "" ]] ; then
-		set $line
-		if [[ "$3" = "$remove_match" ]] ; then
-			$DEBUG Note: manual choice is currently $line
-			rm_alternative_links $line
-			line=""
-		fi
-		if [[ ! -f "$3" ]] ; then
-			print $0 Note: manual choice set, but is invalid.
-			print Ignoring $3
-			line=""
-		fi
-	fi
-
-	if [[ "$line" = "" ]] ; then
-		if [[ "$remove_match" != "" ]] ; then
-			line=`print_alternatives $shortname|
-				nawk ' $3 != "'$remove_match'" {print}' |
-				head -1`
-			if [[ "$line" = "" ]] ; then
-				line=`print_alternatives $shortname`
-				set $line
-				if [[ $3 = "$remove_match" ]] ; then
-					print Removing last alternative for $shortname
-					rm_alternative_links $line
-					return 0
-				fi
-			fi
-		else
-			line=`print_alternatives $shortname|head -1`
-		fi
-	fi
-
-
-	if [[ "$line" != "" ]] ; then
-		set $line
-		set_link $1 $2 $3
-		shift 4
-		while [[ "$1" != "" ]] ; do
-			set_link $1 $2 $3
-			shift 3
-		done
-		return 0
-	fi
-
-	# If we are here, then our "database" is internally
-	# inconsistent...?
-	print $0: Error 52: should not be in this code section.
-	print "Inconsistency with files in $PRIORITIESDIR ?"
-
-	
-}
-
-function revert_to_auto {
-	case $1 in
-		*/*)
-			print Error: need short name for --auto
-			exit 1
-		;;
-	esac
-	if [[ -f "$MANUALDIR/$1" ]] ; then
-		$DEBUG removing manual setting for $1
-		rm "$MANUALDIR/$1"
-	else
-		$DEBUG no manual setting for $1 found
-	fi
-	set_alternative $1
-}
-
-# Usage: set_manual_prio shortname /full/path
-# Sets a manual override for priorities, for "shortname", by finding
-# the alternatives file supporting the desired combo, and making
-# a symlink under $MANUALDIR, pointing to it.
-# Attempting to set non-alternatives-supported paths is a user error
-# Will then call our internal "make a symlink" routine to create the
-# user-facing symlink for 'shortname'.
-function set_manual_prio {
-	case $1 in
-		*/*)
-			print Error: need short name as first arg for --set
-			exit 1
-		;;
-	esac
-
-	if [[ ! -d $MANUALDIR ]] ; then
-		mkdir $MANUALDIR 2>/dev/null
-	fi
-	if [[ ! -d $MANUALDIR ]] ; then
-		print Error: $MANUALDIR does not exist. Cannot continue
-		exit 1
-	fi
-	check=`egrep -l "^[^ ]* [ ]*$1 [ ]*$2 " $PRIORITIESDIR/*`
-	if [[ "$check" == "" ]] ; then
-		print Error: no installed match found for $1 $2
-		exit 1
-	fi
-	# Note: target file may have more than one line in it!!
-
-	$DEBUG found match for $1: $check
-	rm -f $MANUALDIR/$1
-	ln -s $check $MANUALDIR/$1
-	# I use a symlink, so that way, the manual set does not take
-	# effect if the package has been removed.. but it is remembered
-	# if the package is coming right back, hopefully.
-
-	set_alternative $1
-	
-}
-
-
-
-function display_choices {
-	case $1 in
-		*/*)
-			print Error: need short name as arg for --display
-			exit 1
-		;;
-	esac
-
-	if [[ -f $MANUALDIR/$1 ]] ; then
-		print Manual mode for $1 set. Paths are:
-		print_manual_set $1
-	fi
-	print Installed alternatives for $1 are:
-		print_alternatives $1
-}
-
-function config_alternative {
-	case $1 in
-		*/*)
-			print Error: need short name as arg for --config
-			exit 1
-			;;
-		"")
-			print Error: Need a name for --config
-			exit 1
-		;;
-	esac
-	print "Chooser for software '$1'"
-	print_alternatives $1 |nawk '{print $4,$1,$3}'
-	print "Input the priority number for your desired choice, or 0 to quit"
-
-	read prio
-	case $prio in
-		0|Q|q)
-			print Quitting without change
-			exit 0
-		;;
-	esac
-	fullpath=`cat $PRIORITIESDIR/* |
-	  nawk '$2 == "'$1'" && $4 == "'$prio'" {print $3}'`
-
-	if [[ "$fullpath" = "" ]] ; then
-		print Error: no match for priority $prio
-		exit 1
-	fi
-
-	set_manual_prio $1 $fullpath
-}
-
-# User facing function: --relink-missing
-#   Used as a damage control function for zones that are non-sparse.
-# Even though we dont officially support non-sparse zones :-)
-# Go through and create links for all alternatives known.
-function relink_missing {
-	for alt in `list_alternatives` ; do
-		set_alternative $alt
-	done
-}
-############################################################
-# Return to "main" area below
-
-## Comment on --remove arg:
-## It does not actually **remove* registration of alternative.
-## That is left for pkgrm.
-## What it does do, is reset link, while ignoring the specified alternative.
-## So for strict purposes, it would better be called "--ignore-and-set"
-## Left in original flag, but dual-implemented as --ignore
-##
-
-if [[ "$1" == "--remove" ]] ; then
-	$DEBUG $0 $*
-	$DEBUG Note: --remove is really only temporary
-	$DEBUG   It works like --ignore
-	$DEBUG You must pkgrm or rm the appropriate file in $PRIORITIESDIR
-	$DEBUG to remove a "registration" for an alternative
-fi
-
-
-
-case $1 in
-	--install)
-		shift
-		$DEBUG "($0 Using files in $PRIORITIESDIR)"
-		set_alternative $2
-		;;
-	--remove|--ignore)    #args = shortname /local/path
-		shift
-		print "(Note: ignoring arguments for --remove except for '$1')"
-		$DEBUG "(Using files in $PRIORITIESDIR)"
-		set_alternative $1 $2
-		;;
-	--auto)
-		shift
-		revert_to_auto $1
-		;;
-	--list)
-		echo "List of installed software that uses the alternatives system:"
-		list_alternatives
-		;;
-	--display)
-		shift
-		display_choices $1
-		;;
-	--config)
-		shift
-		config_alternative $1
-		;;
-	--set)
-		shift
-		set_manual_prio $1 $2
-		;;
-	--relink-missing)
-		relink_missing
-		;;
-	*)
-		print -- $1 is not a recognized command.
-		usage
-		
-		exit 1
-		;;
-esac
-
-

Added: csw/mgar/pkg/alternatives/trunk/checksums
===================================================================
Deleted: csw/mgar/pkg/alternatives/trunk/copyright
===================================================================
--- csw/mgar/pkg/alternatives/trunk/copyright	2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/copyright	2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,2 +0,0 @@
-Scripts in this package are copyright Dagobert Michelsen and Philip Brown
-They may be freely used and copied as part of this package.

Added: csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.i.cswalternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.i.cswalternatives	                        (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.i.cswalternatives	2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,52 @@
+#!/bin/sh
+#
+# i.cswalternatives - Class action script for
+# registering applications in alternatives
+#
+# Written and maintained by Dagobert Michelsen
+#
+# 2010-02-11 Initial release
+
+: ${PKG_INSTALL_ROOT:=/}
+
+while read src dest; do
+  /usr/bin/cp $src $dest || exit 2
+
+  cat $dest | while read C; do
+    set -- $C
+
+    ALTLINK="$1"
+    ALTNAME="$2"
+    ALTPATH="$3"
+    ALTPRIO="$4"
+
+    echo "Registering '$ALTNAME' alternative $ALTPATH ..."
+
+    ARGS="--install $ALTLINK $ALTNAME $ALTPATH $ALTPRIO"
+    shift; shift; shift; shift
+
+    while [ $# -gt 0 ]; do
+      ARGS="$ARGS --slave $1 $2 $3"
+      shift; shift; shift
+    done
+    
+    if [ ! -x ${PKG_INSTALL_ROOT}/opt/csw/sbin/alternatives ]; then
+      echo "ERROR: /opt/csw/sbin/alternatives could not be found" >&2
+      exit 2
+    fi
+
+    chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives $ARGS
+
+    # Redo previous manual selection if this is an upgrade
+    if /usr/bin/test -L "${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME"; then
+      CHOICE=`/usr/bin/perl -e 'print readlink $ARGV[0]' "${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME"`
+      if [ "${CHOICE}" = "$ALTPATH" ]; then
+        echo "Applying previous manual selection ${CHOICE} ..."
+        chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives --set $ALTNAME ${CHOICE}
+        rm -f ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME
+      fi
+    fi
+  done
+done
+
+exit 0

Added: csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.r.cswalternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.r.cswalternatives	                        (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/CSWalternatives.r.cswalternatives	2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# r.cswalternatives - Class action script for
+# registering applications in alternatives
+#
+# Written and maintained by Dagobert Michelsen
+#
+# 2010-02-11 Initial release
+
+: ${PKG_INSTALL_ROOT:=/}
+
+while read dest; do
+  cat $dest | while read C; do
+    set -- $C
+
+    # If we are in manual mode and the selected item is about to be removed
+    # make sure to remember the selection for next install to be reset.
+
+    if egrep '^manual$' ${PKG_INSTALL_ROOT}/var/opt/csw/alternatives/$2 >/dev/null 2>&1; then
+      CHOICE="`perl -e 'print readlink $ARGV[0]' ${PKG_INSTALL_ROOT}/etc/opt/csw/alternatives/$2`"
+      if [ "$3" = "${CHOICE}" ]; then
+        echo "Preserving '$2' manual choice ${CHOICE} ..."
+        mkdir -p ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives
+        rm -f ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$2
+        ln -s "${CHOICE}" ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$2
+      fi
+    fi
+
+    echo "Unregistering '$2' alternative $3 ..."
+
+    if [ -x ${PKG_INSTALL_ROOT}/opt/csw/sbin/alternatives ]; then
+      chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives --remove $2 $3
+    else
+      echo "ERROR: /opt/csw/sbin/alternatives could not be found" >&2
+      exit 2
+    fi
+  done
+
+  rm -f $dest
+done
+
+exit 0

Added: csw/mgar/pkg/alternatives/trunk/files/LICENSE-2.0.txt
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/LICENSE-2.0.txt	                        (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/LICENSE-2.0.txt	2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

Copied: csw/mgar/pkg/alternatives/trunk/files/README (from rev 21819, csw/mgar/pkg/alternatives/trunk/README)
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/README	                        (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/README	2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,66 @@
+This file is more of an "internals" thoughts and notes file.
+For user facing documentation, see  README.user
+
+Phil decided that a from-scratch, CSW-custom implementation was needed,
+because the debian one was hugely bloated, and the redhat smaller one,
+did not play nicely with NFS-shared /opt/csw
+So please dont go getting ideas that we can migrated back to redhat,etc
+in the future! :) we tried, and it failed.
+
+Sections below:
+   * CODE NOTES
+   * FILE FORMATS
+   
+
+CODE NOTES
+
+ My initial version seems to expect each "alternative" to have its own
+file as /opt/csw/share/alternatives/xyz
+One line per file only would be nice, please. But this suports
+multiple lines per file now.
+
+When a choice is manually set (overriding auto settings), it records that
+fact by making a symlink from the relevant shipped file, to 
+/etc/opt/csw/alternatives/(progname)
+and then it will make the user-facing symlink(s) indicated by that file
+
+This way, you can have the binary, and alternatives files per software,
+in NFS-shared /opt/csw, but then have machine-local overrides.
+
+Reminder: Do NOT have to get fancy with the class action script not 
+ getting called with pathnames on sparse zones with pkg-inherit-dir,
+ because since /opt/csw is shared, the symlink will already be in place.
+
+  Ambuguity for --remove:
+  what if --remove is used, on something that has a manually set pref?
+  (rather than calling --auto)
+  I choose that it will LEAVE the manual choice.
+  That is to say, it will leave the saved preference as valid.
+  BUT, if the manual choice matches the --remove", then 
+  it should skip it as a "what to match" option..? !!
+
+  This is to potentially make our pkgrm/pkgadd upgrade cycle
+  function as a user expects: to preserve their manual choice.
+
+FILE FORMATS
+
+  Packages that provide implementation of an "alternative" for a
+  particular path, need to provide a file in
+  /opt/csw/share/alternatives/[softwarename]
+
+  *** Note that it MUST be in that directory and nowhere else !!!  ***
+
+  The format of this file, is one or more lines, of the following format:
+
+  /full/path shortname /provided/path priority [/slave/path shortname /provide!
+
+  Note that tabs are not allowed.
+
+  The purpose of the "slave path", is that sometimes, when the "main" path
+  changes its implementation, one or more other ones must be changed
+  to match.
+
+  This line format, is normally passed onto our
+  "alternatives" binary by the class action script, directly as
+  an arg list to the --install option.
+  

Copied: csw/mgar/pkg/alternatives/trunk/files/README.user (from rev 21819, csw/mgar/pkg/alternatives/trunk/README.user)
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/README.user	                        (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/README.user	2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,44 @@
+This is a short documentation file for the OpenCSW targetted implementation of
+linux style "alternatives", aka "update-alternatives" in debian.
+
+USER LEVEL DOCS
+
+  alternatives --display shortname
+  # will display any currently installed symlink for "shortname"
+  # will display any installed packages that provide "shortname".
+  # will display current decision mode for --install, for "shortname"
+  #    (either "auto", or [?? something else]
+  
+
+  alternatives --config shortname
+  # will display any installed packages that provide "shortname".
+  # will prompt user for their preferred choice of package to use,
+     or to stick/revert to auto mode.
+
+  alternatives --auto shortname
+  # sets shortname to be auto-chosen. Will adjust symlinks now, if appropriate
+
+  alternatives --set shortname /provided/path
+  # sets shortname to be the implementation provided by /provided/path,
+  #  IF PRESENT.
+  # Basically, sets that one to be artificially "highest priority", then
+  # configure the link now.
+  # If the manual setting is invalid, it will be ignored
+
+  alternatives --install /full/path/name shortname /path/xx priority [...]
+  # notifies the alternatives handler, and says,
+  # "hey, here's an implementation. If its highest priority right now,
+  #   use it!"
+  # Unlike redhat, we dont actually "register" anything.
+
+  alternatives --remove shortname /full/path/name
+  # basically, a hint to reconfigure shortname "as appropriate",
+  # while ignoring anything matching /full/path/name as a valid alternative
+
+  alternatives --list
+  # Gives a short list of programs "known" to alternatives, on this machine.
+
+  alternatives --relink-missing
+  # if you are in a situation where symlinks have not been created,
+  # call this, and it will create any missing ones as appropriate
+

Copied: csw/mgar/pkg/alternatives/trunk/files/alternatives (from rev 21819, csw/mgar/pkg/alternatives/trunk/alternatives)
===================================================================
--- csw/mgar/pkg/alternatives/trunk/files/alternatives	                        (rev 0)
+++ csw/mgar/pkg/alternatives/trunk/files/alternatives	2013-08-22 09:12:15 UTC (rev 21821)
@@ -0,0 +1,479 @@
+#!/bin/ksh -p
+
+# ksh high-level implentation of linux style "alternatives".
+# Adjusted for OpenCSW needs
+# Author: Philip Brown, phil at bolthole.com, 2010-2011
+# $Id$
+Revision="$(echo '$Revision$' | sed -e 's/^[$]Revision: //' -e 's/ [$]$//')"
+
+PRIORITIESDIR=/opt/csw/share/alternatives 
+MANUALDIR=/etc/opt/csw/alternatives  #manual override location
+AWK=nawk
+DEBUG=${DEBUG:-/bin/true}
+
+#echo DEBUG VERSION of $0: dont ship this
+#DEBUG=echo
+
+function usage {
+	prog=`basename $0`
+	print "Usage for $prog :"
+	print "  $prog --display {name}"
+	print "  $prog --auto {name}"
+	print "  $prog --set {name} {/full/path}"
+	print "  $prog --config {name}"
+	print "  "
+	print " The following are provided for compatibility, but do not work"
+	print " in exactly the same way as linux variants"
+	print " See comments in usage function code for more information."
+	print "  $prog --install {/full/path/name} {name} {#priority}"
+	print "  $prog --remove {name} {/full/path}"
+	print ""
+	print " The following are opencsw-only:"
+	print "  $prog --relink-missing  : create missing symlinks"
+	print "  $prog --list"
+	print ""
+	print "See /opt/csw/share/doc/alternatives/ for more docs"
+	
+
+# I dont want to bloat up the usage message, so here's some more docs
+#  
+# This program is a lightweight 'workalike' to the linux alternatives prog.
+# It is written with OpenCSW in mind, and is specificaly tailored for
+# our needs. You may find it useful in other fields, but be aware that
+# its primary purpose is to be simple, and flexible. NOT an exact clone.
+# Part of its flexibility comes from the fact that it is configuration-file
+# driven, NOT internal-database-driven
+#   The --install and --remove flags, while (hopefully) provided as
+# a convenience, do NOT install, or remove, any configuration. They just
+# update symlinks, "as appropriate"
+# 
+# Priorities are driven by configuration files delivered by our packages.
+# They get delivered to /opt/csw/share/alternatives, which keeps things
+# NFS friendly.
+# Thes files should only get "installed" or "removed" on a per-SVR4 package 
+# basis normally. (although technically, it would be possible to drop in your
+# own config file in either $PRIORITIESDIR or $MANUALDIR, and then
+# have things integrate with your own custom non-packaged software).
+#
+# There is almost NO ERROR CHECKING. There is no saving state of prior actions,
+# other than the --set comand. 
+# It is up to individual packages to make sure that everyone providing
+#  an alternative for {name}, all have the same "slave entries", 
+#  if you choose to use slave entries
+}
+
+
+# Usage: find_highest_prio {name}
+#   search through all conf files for {name}
+# print out the highest priority match. or, potentially nothing.
+function find_highest_prio {
+	if [[ "$1" == "" ]] ; then
+		print INTERNAL ERROR: find_highest_prio called with no args
+		return
+	fi
+	# I hate using cat, but its the only way to avoid nawk throwing a fit.
+	cat $PRIORITIESDIR/* $MANUALDIR/$1 2>/dev/null |
+	$AWK '	BEGIN {save=""}
+		$2 == "'$1'" {if($4 > highest){
+				save=$0;
+				highest=$4
+				}
+		}
+		
+		END {print save}
+	'
+}
+
+if [[ $# -lt 1 ]] ; then
+	print error: need an argument
+	usage
+	exit 1
+fi
+
+
+############################################################
+# Start of subroutine area
+
+# Usage: print_alternatives shortname
+# This prints only the INSTALLED alternatives lines for named software.
+#  Does not display whether or not any have been manually chosen.
+# Prints in priority-sorted order
+# This is used both as a user-facing display, and also internally
+#
+function print_alternatives {
+	if [[ $# != 1 ]] ; then print ERROR print_alternatives needs an arg; fi
+	cat $PRIORITIESDIR/* 2>/dev/null|
+		nawk '$2 == "'$1'" {print}' | sort -nr +3
+}
+
+# User facing function, as well as internal
+# enables "alternatives --list"
+function list_alternatives {
+	cat $PRIORITIESDIR/* 2>/dev/null| nawk '{print $2}' | sort -u
+}
+
+# prints ONLY the manually set alternatives line, if present
+function print_manual_set {
+	if [[ $# != 1 ]] ; then print ERROR print_manual_set needs an arg; fi
+	
+	if [[ -f $MANUALDIR/$1 ]] ; then
+		nawk '$2 == "'$1'" {print}' $MANUALDIR/$1
+	else
+		return 1
+	fi
+}
+
+function fileerr_exit {
+	print Debug: potentially should check to see if /opt/csw is
+	print  specifically read-only, or we are in jumpstart, or something
+	print  before returning a bad status exit, perhaps
+
+	case `/bin/id` in
+	  'uid=0('*)
+	  	:
+		;;
+	  *)
+	  	echo "Hey! Try running this as root whydoncha?"
+		exit 1
+	  ;;
+	esac
+
+	print If someone other than Phil is seeing this,  please let him know
+	
+	exit 1
+}
+
+# Called only internally, by set_alternative.
+#  args:   {target} {shortname} {implementation-path}
+# Split out, because one "alternatives" line may have multiple "slave" links
+function set_link {
+	$DEBUG set_link called with: $1 $2 $3
+	if [[ $# -lt 3 ]] ; then
+		print ERROR: set_link needs 3 arguments
+		return 1
+	fi
+	
+	if [[ -h $1 ]] ; then
+		linktarget=`ls -l $1 | nawk '{print $NF}'`
+		if [[ "$linktarget" == "$3" ]] ; then
+			$DEBUG $1 already linked to $3
+			return 0
+		fi
+		
+		$DEBUG removing symlink $1
+		/bin/rm -f $1
+		if [[ $? -ne 0 ]] ; then
+			$DEBUG permission to remove $1 failed
+			fileerr_exit
+		fi
+	fi
+	if [[ ! -f $1 ]] ; then
+		$DEBUG linking $1 to $3
+		ln -s $3 $1
+		if [[ $? -ne 0 ]] ; then
+			$DEBUG permission to create symlink for $1 failed
+			fileerr_exit
+		fi
+		return 0
+	else
+		print ERROR: $1 exists, and is not symlink.
+		print Not installing $3 as $1
+		return 1
+	fi
+
+	## Note to self: check existing, and dont attempt to
+	## update if already set how we want it?
+	## Also, dont crash if /opt/csw is read-only.
+	## Just politely print warning, and exit cleanly.
+	## At least if running from jumpstart environment?
+	## ALSO, be paranoid and dont remove a "real" file, if
+	## one already exists in the target space.
+	## only a symlink
+}
+
+
+#Used for --remove.
+# removes the old symlinks.
+# pass in the "normal" cache file format.
+# Should be called ONLY IF THERE ARE NO MORE "alternatives" installed
+# or if, perhaps, the "current" alternative is the one being removed.
+function rm_alternative_links {
+	$DEBUG rm_alternative_links called with $@
+	# first one is special
+	if [[ -h $1 ]] ; then
+		rm -f $1
+	fi
+	shift 4
+	while [[ $# -ge 3 ]] ; do
+		rm -f $1
+		shift 3
+	done
+
+}
+
+# set_alternatives: mostly internal function. 
+#  It "sets" only in the sense of making the symlink for the binary(s)
+#  
+# Usage: set_alternative {shortname} [ignore-path]
+#
+# Goes and checks both standard configs, and manual config, for best fit.
+# Mandatory first argument, is the "shortname" of the alternative.
+# Optional second argument implies "remove" mode, and needs to be
+#  a full path to one of the main implementations of an alternative.
+#  The line containing that, will then be ignored.
+#
+#
+function set_alternative {
+	typeset shortname remove_match line
+	$DEBUG set_alternative called with $*
+
+	if [[ $# -lt 1 ]] ; then
+		print ERROR set_alternative needs an arg; exit 1;
+	fi
+
+	shortname="$1"
+	remove_match="$2"
+
+
+	
+	line=`print_manual_set $shortname`
+	if [[ "$line" != "" ]] ; then
+		set $line
+		if [[ "$3" = "$remove_match" ]] ; then
+			$DEBUG Note: manual choice is currently $line
+			rm_alternative_links $line
+			line=""
+		fi
+		if [[ ! -f "$3" ]] ; then
+			print $0 Note: manual choice set, but is invalid.
+			print Ignoring $3
+			line=""
+		fi
+	fi
+
+	if [[ "$line" = "" ]] ; then
+		if [[ "$remove_match" != "" ]] ; then
+			line=`print_alternatives $shortname|
+				nawk ' $3 != "'$remove_match'" {print}' |
+				head -1`
+			if [[ "$line" = "" ]] ; then
+				line=`print_alternatives $shortname`
+				set $line
+				if [[ $3 = "$remove_match" ]] ; then
+					print Removing last alternative for $shortname
+					rm_alternative_links $line
+					return 0
+				fi
+			fi
+		else
+			line=`print_alternatives $shortname|head -1`
+		fi
+	fi
+
+
+	if [[ "$line" != "" ]] ; then
+		set $line
+		set_link $1 $2 $3
+		shift 4
+		while [[ "$1" != "" ]] ; do
+			set_link $1 $2 $3
+			shift 3
+		done
+		return 0
+	fi
+
+	# If we are here, then our "database" is internally
+	# inconsistent...?
+	print $0: Error 52: should not be in this code section.
+	print "Inconsistency with files in $PRIORITIESDIR ?"
+
+	
+}
+
+function revert_to_auto {
+	case $1 in
+		*/*)
+			print Error: need short name for --auto
+			exit 1
+		;;
+	esac
+	if [[ -f "$MANUALDIR/$1" ]] ; then
+		$DEBUG removing manual setting for $1
+		rm "$MANUALDIR/$1"
+	else
+		$DEBUG no manual setting for $1 found
+	fi
+	set_alternative $1
+}
+
+# Usage: set_manual_prio shortname /full/path
+# Sets a manual override for priorities, for "shortname", by finding
+# the alternatives file supporting the desired combo, and making
+# a symlink under $MANUALDIR, pointing to it.
+# Attempting to set non-alternatives-supported paths is a user error
+# Will then call our internal "make a symlink" routine to create the
+# user-facing symlink for 'shortname'.
+function set_manual_prio {
+	case $1 in
+		*/*)
+			print Error: need short name as first arg for --set
+			exit 1
+		;;
+	esac
+
+	if [[ ! -d $MANUALDIR ]] ; then
+		mkdir $MANUALDIR 2>/dev/null
+	fi
+	if [[ ! -d $MANUALDIR ]] ; then
+		print Error: $MANUALDIR does not exist. Cannot continue
+		exit 1
+	fi
+	check=`egrep -l "^[^ ]* [ ]*$1 [ ]*$2 " $PRIORITIESDIR/*`
+	if [[ "$check" == "" ]] ; then
+		print Error: no installed match found for $1 $2
+		exit 1
+	fi
+	# Note: target file may have more than one line in it!!
+
+	$DEBUG found match for $1: $check
+	rm -f $MANUALDIR/$1
+	ln -s $check $MANUALDIR/$1
+	# I use a symlink, so that way, the manual set does not take
+	# effect if the package has been removed.. but it is remembered
+	# if the package is coming right back, hopefully.
+
+	set_alternative $1
+	
+}
+
+
+
+function display_choices {
+	case $1 in
+		*/*)
+			print Error: need short name as arg for --display
+			exit 1
+		;;
+	esac
+
+	if [[ -f $MANUALDIR/$1 ]] ; then
+		print Manual mode for $1 set. Paths are:
+		print_manual_set $1
+	fi
+	print Installed alternatives for $1 are:
+		print_alternatives $1
+}
+
+function config_alternative {
+	case $1 in
+		*/*)
+			print Error: need short name as arg for --config
+			exit 1
+			;;
+		"")
+			print Error: Need a name for --config
+			exit 1
+		;;
+	esac
+	print "Chooser for software '$1'"
+	print_alternatives $1 |nawk '{print $4,$1,$3}'
+	print "Input the priority number for your desired choice, or 0 to quit"
+
+	read prio
+	case $prio in
+		0|Q|q)
+			print Quitting without change
+			exit 0
+		;;
+	esac
+	fullpath=`cat $PRIORITIESDIR/* |
+	  nawk '$2 == "'$1'" && $4 == "'$prio'" {print $3}'`
+
+	if [[ "$fullpath" = "" ]] ; then
+		print Error: no match for priority $prio
+		exit 1
+	fi
+
+	set_manual_prio $1 $fullpath
+}
+
+# User facing function: --relink-missing
+#   Used as a damage control function for zones that are non-sparse.
+# Even though we dont officially support non-sparse zones :-)
+# Go through and create links for all alternatives known.
+function relink_missing {
+	for alt in `list_alternatives` ; do
+		set_alternative $alt
+	done
+}
+############################################################
+# Return to "main" area below
+
+## Comment on --remove arg:
+## It does not actually **remove* registration of alternative.
+## That is left for pkgrm.
+## What it does do, is reset link, while ignoring the specified alternative.
+## So for strict purposes, it would better be called "--ignore-and-set"
+## Left in original flag, but dual-implemented as --ignore
+##
+
+if [[ "$1" == "--remove" ]] ; then
+	$DEBUG $0 $*
+	$DEBUG Note: --remove is really only temporary
+	$DEBUG   It works like --ignore
+	$DEBUG You must pkgrm or rm the appropriate file in $PRIORITIESDIR
+	$DEBUG to remove a "registration" for an alternative
+fi
+
+
+
+case $1 in
+	--install)
+		shift
+		$DEBUG "($0 Using files in $PRIORITIESDIR)"
+		set_alternative $2
+		;;
+	--remove|--ignore)    #args = shortname /local/path
+		shift
+		print "(Note: ignoring arguments for --remove except for '$1')"
+		$DEBUG "(Using files in $PRIORITIESDIR)"
+		set_alternative $1 $2
+		;;
+	--auto)
+		shift
+		revert_to_auto $1
+		;;
+	--list)
+		echo "List of installed software that uses the alternatives system:"
+		list_alternatives
+		;;
+	--display)
+		shift
+		display_choices $1
+		;;
+	--config)
+		shift
+		config_alternative $1
+		;;
+	--set)
+		shift
+		set_manual_prio $1 $2
+		;;
+	--relink-missing)
+		relink_missing
+		;;
+	--help)
+		usage
+		;;
+	--version)
+		print ${Revision}
+		;;
+	*)
+		print -- $1 is not a recognized command.
+		usage
+		
+		exit 1
+		;;
+esac
+
+


Property changes on: csw/mgar/pkg/alternatives/trunk/files/alternatives
___________________________________________________________________
Added: svn:executable
   + *
Added: svn:keywords
   + Author Date Id Revision

Added: csw/mgar/pkg/alternatives/trunk/files/alternatives.8
===================================================================
Deleted: csw/mgar/pkg/alternatives/trunk/i.cswalternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/i.cswalternatives	2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/i.cswalternatives	2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,52 +0,0 @@
-#!/bin/sh
-#
-# i.cswalternatives - Class action script for
-# registering applications in alternatives
-#
-# Written and maintained by Dagobert Michelsen
-#
-# 2010-02-11 Initial release
-
-: ${PKG_INSTALL_ROOT:=/}
-
-while read src dest; do
-  /usr/bin/cp $src $dest || exit 2
-
-  cat $dest | while read C; do
-    set -- $C
-
-    ALTLINK="$1"
-    ALTNAME="$2"
-    ALTPATH="$3"
-    ALTPRIO="$4"
-
-    echo "Registering '$ALTNAME' alternative $ALTPATH ..."
-
-    ARGS="--install $ALTLINK $ALTNAME $ALTPATH $ALTPRIO"
-    shift; shift; shift; shift
-
-    while [ $# -gt 0 ]; do
-      ARGS="$ARGS --slave $1 $2 $3"
-      shift; shift; shift
-    done
-    
-    if [ ! -x ${PKG_INSTALL_ROOT}/opt/csw/sbin/alternatives ]; then
-      echo "ERROR: /opt/csw/sbin/alternatives could not be found" >&2
-      exit 2
-    fi
-
-    chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives $ARGS
-
-    # Redo previous manual selection if this is an upgrade
-    if /usr/bin/test -L "${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME"; then
-      CHOICE=`/usr/bin/perl -e 'print readlink $ARGV[0]' "${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME"`
-      if [ "${CHOICE}" = "$ALTPATH" ]; then
-        echo "Applying previous manual selection ${CHOICE} ..."
-        chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives --set $ALTNAME ${CHOICE}
-        rm -f ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$ALTNAME
-      fi
-    fi
-  done
-done
-
-exit 0

Deleted: csw/mgar/pkg/alternatives/trunk/pkginfo
===================================================================
--- csw/mgar/pkg/alternatives/trunk/pkginfo	2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/pkginfo	2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,9 +0,0 @@
-PKG=CSWalternatives
-ARCH=all
-NAME=alternatives - an implementation of linux-style alternatives choice mgr
-VERSION=1.1.1,REV=YYYY.MM.DD
-CATEGORY=system
-VENDOR=http://www.opencsw.org written and packaged for CSW by Philip Brown
-EMAIL=phil at opencsw.org
-HOTLINE=http://www.opencsw.org/bugtrack/
-PSTAMP=cswalternatives v1.1

Deleted: csw/mgar/pkg/alternatives/trunk/prototype
===================================================================
--- csw/mgar/pkg/alternatives/trunk/prototype	2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/prototype	2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,8 +0,0 @@
-i pkginfo
-i copyright
-f none /usr/sadm/install/scripts/i.cswalternatives=i.cswalternatives 0755 root bin
-f none /usr/sadm/install/scripts/r.cswalternatives=r.cswalternatives 0755 root bin
-f none /opt/csw/sbin/alternatives=alternatives 0755 root bin
-d none /opt/csw/share/doc/alternatives 0755 root bin
-f none /opt/csw/share/doc/alternatives/README.user=README.user 0644 root bin
-f none /opt/csw/share/doc/alternatives/README.code=README 0644 root bin

Deleted: csw/mgar/pkg/alternatives/trunk/r.cswalternatives
===================================================================
--- csw/mgar/pkg/alternatives/trunk/r.cswalternatives	2013-08-22 08:03:48 UTC (rev 21820)
+++ csw/mgar/pkg/alternatives/trunk/r.cswalternatives	2013-08-22 09:12:15 UTC (rev 21821)
@@ -1,42 +0,0 @@
-#!/bin/sh
-#
-# r.cswalternatives - Class action script for
-# registering applications in alternatives
-#
-# Written and maintained by Dagobert Michelsen
-#
-# 2010-02-11 Initial release
-
-: ${PKG_INSTALL_ROOT:=/}
-
-while read dest; do
-  cat $dest | while read C; do
-    set -- $C
-
-    # If we are in manual mode and the selected item is about to be removed
-    # make sure to remember the selection for next install to be reset.
-
-    if egrep '^manual$' ${PKG_INSTALL_ROOT}/var/opt/csw/alternatives/$2 >/dev/null 2>&1; then
-      CHOICE="`perl -e 'print readlink $ARGV[0]' ${PKG_INSTALL_ROOT}/etc/opt/csw/alternatives/$2`"
-      if [ "$3" = "${CHOICE}" ]; then
-        echo "Preserving '$2' manual choice ${CHOICE} ..."
-        mkdir -p ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives
-        rm -f ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$2
-        ln -s "${CHOICE}" ${PKG_INSTALL_ROOT}/etc/opt/csw/preserve/${PKG}/alternatives/$2
-      fi
-    fi
-
-    echo "Unregistering '$2' alternative $3 ..."
-
-    if [ -x ${PKG_INSTALL_ROOT}/opt/csw/sbin/alternatives ]; then
-      chroot ${PKG_INSTALL_ROOT} /opt/csw/sbin/alternatives --remove $2 $3
-    else
-      echo "ERROR: /opt/csw/sbin/alternatives could not be found" >&2
-      exit 2
-    fi
-  done
-
-  rm -f $dest
-done
-
-exit 0

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the devel mailing list