/[gentoo-x86]/eclass/savedconfig.eclass
Gentoo

Diff of /eclass/savedconfig.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.2 Revision 1.19
1# Copyright 1999-2007 Gentoo Foundation 1# Copyright 1999-2011 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/savedconfig.eclass,v 1.2 2007/02/04 20:23:28 dragonheart Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/savedconfig.eclass,v 1.19 2012/01/04 07:45:16 vapier Exp $
4 4
5# Original Author: Daniel Black <dragonheart@gentoo.org> 5# @ECLASS: savedconfig.eclass
6# 6# @MAINTAINER:
7# Purpose: Define an interface for ebuilds to save and restore 7# base-system@gentoo.org
8# complex configuration that may be edited by users. 8# @BLURB: common API for saving/restoring complex configuration files
9# 9# @DESCRIPTION:
10# It is not uncommon to come across a package which has a very fine
11# grained level of configuration options that go way beyond what
12# USE flags can properly describe. For this purpose, a common API
13# of saving and restoring the configuration files was developed
14# so users can modify these config files and the ebuild will take it
15# into account as needed.
10 16
11# TODO 17inherit portability
12#
13# - Move away from cp --parents because BSD doesn't like it
14 18
15IUSE="savedconfig" 19IUSE="savedconfig"
16 20
21# @FUNCTION: save_config
22# @USAGE: <config files to save>
23# @DESCRIPTION:
24# Use this function to save the package's configuration file into the
25# right location. You may specify any number of configuration files,
26# but just make sure you call save_config with all of them at the same
27# time in order for things to work properly.
17# save_config 28save_config() {
18# 29 if [[ ${EBUILD_PHASE} != "install" ]]; then
19# Saves the files and/or directories to 30 die "Bad package! save_config only for use in src_install functions!"
20# /etc/portage/savedconfig/${CATEGORY}/${PF} 31 fi
21# If a single file is specified ${PF} is that file else it is a directory 32 [[ $# -eq 0 ]] && die "Usage: save_config <files>"
22# containing all specified files and directories.
23#
24 33
25save_config() { 34 # Be lazy in our EAPI compat
26 case ${EBUILD_PHASE} in 35 : ${ED:=${D}}
27 preinst|install) 36
28 ;; 37 local dest="/etc/portage/savedconfig/${CATEGORY}"
29 *) die "Bad package! save_config only for use in pkg_preinst or src_install functions!" 38 if [[ $# -eq 1 && -f $1 ]] ; then
30 ;; 39 # Just one file, so have the ${PF} be that config file
31 esac 40 dodir "${dest}"
32 case $# in 41 cp "$@" "${ED}/${dest}/${PF}" || die "failed to save $*"
33 0) die "Tell me what to save"
34 ;;
35 1) if [[ -f "$1" ]]; then
36 dodir "${PORTAGE_CONFIGROOT}"/etc/portage/savedconfig/${CATEGORY}
37 cp "$1" "${D}/${PORTAGE_CONFIGROOT}"/etc/portage/savedconfig/${CATEGORY}/${PF} \
38 || die "Failed to save $1"
39 else 42 else
40 dodir "${PORTAGE_CONFIGROOT}"/etc/portage/savedconfig/${CATEGORY}/${PF} 43 # A dir, or multiple files, so have the ${PF} be a dir
41 cp --parents -pPR "$1" "${D}/${PORTAGE_CONFIGROOT}"/etc/portage/savedconfig/${CATEGORY}/${PF} \ 44 # with all the saved stuff below it
42 || die "Failed to save $1" 45 dodir "${dest}/${PF}"
46 treecopy "$@" "${ED}/${dest}/${PF}" || die "failed to save $*"
43 fi 47 fi
44 ;; 48
45 *) 49 elog "Your configuration for ${CATEGORY}/${PF} has been saved in "
50 elog "/etc/portage/savedconfig/${CATEGORY}/${PF} for your editing pleasure."
51 elog "You can edit these files by hand and remerge this package with"
52 elog "USE=savedconfig to customise the configuration."
53 elog "You can rename this file/directory to one of the following for"
54 elog "its configuration to apply to multiple versions:"
46 dodir "${PORTAGE_CONFIGROOT}"/etc/portage/savedconfig/${CATEGORY}/${PF} 55 elog '${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/'
47 while [ "$1" ]; do 56 elog '[${CTARGET}|${CHOST}|""]/${CATEGORY}/[${PF}|${P}|${PN}]'
48 cp --parents -pPR "$1" "${D}/${PORTAGE_CONFIGROOT}"/etc/portage/savedconfig/${CATEGORY}/${PF} \
49 || die "Failed to save $1"
50 shift
51 done
52 esac
53} 57}
54 58
55 59# @FUNCTION: restore_config
56# restore_config 60# @USAGE: <config files to restore>
61# @DESCRIPTION:
62# Restores the configuation saved ebuild previously potentially with user edits.
63# You can restore a single file or a whole bunch, just make sure you call
64# restore_config with all of the files to restore at the same time.
57# 65#
58# Restores the configuation saved ebuild previously potentially with user edits 66# Config files can be laid out as:
59# 67# @CODE
60# Requires the name of the file to restore to if a single file was given to
61# save_config. Otherwise it restores the directory structure.
62#
63# Looks for config files in the following order.
64# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CTARGET}/${CATEGORY}/${PF} 68# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CTARGET}/${CATEGORY}/${PF}
65# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CHOST}/${CATEGORY}/${PF} 69# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CHOST}/${CATEGORY}/${PF}
66# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CATEGORY}/${PF} 70# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CATEGORY}/${PF}
67# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CTARGET}/${CATEGORY}/${P} 71# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CTARGET}/${CATEGORY}/${P}
68# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CHOST}/${CATEGORY}/${P} 72# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CHOST}/${CATEGORY}/${P}
69# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CATEGORY}/${P} 73# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CATEGORY}/${P}
70# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CTARGET}/${CATEGORY}/${PN} 74# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CTARGET}/${CATEGORY}/${PN}
71# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CHOST}/${CATEGORY}/${PN} 75# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CHOST}/${CATEGORY}/${PN}
72# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CATEGORY}/${PN} 76# ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CATEGORY}/${PN}
73# 77# @CODE
74# 78restore_config() {
79 case ${EBUILD_PHASE} in
80 unpack|compile|configure|prepare) ;;
81 *) die "Bad package! restore_config only for use in src_{unpack,compile,configure,prepare} functions!" ;;
82 esac
75 83
76restore_config() {
77 use savedconfig || return 84 use savedconfig || return
78 85
79 case ${EBUILD_PHASE} in 86 local found check configfile
80 unpack|compile)
81 ;;
82 *) die "Bad package! save_config only for use in pkg_preinst or src_install functions!"
83 ;;
84 esac
85 local found;
86 local base=${PORTAGE_CONFIGROOT}/etc/portage/savedconfig 87 local base=${PORTAGE_CONFIGROOT}/etc/portage/savedconfig
87 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do 88 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
88 configfile=${base}/${CTARGET}/${check} 89 configfile=${base}/${CTARGET}/${check}
89 [[ -r ${configfile} ]] || configfile=${base}/${CHOST}/${check} 90 [[ -r ${configfile} ]] || configfile=${base}/${CHOST}/${check}
90 [[ -r ${configfile} ]] || configfile=${base}/${check} 91 [[ -r ${configfile} ]] || configfile=${base}/${check}
91 einfo "Checking existence of ${configfile} ..." 92 einfo "Checking existence of ${configfile} ..."
92 if [[ -r "${configfile}" ]]; then 93 if [[ -r "${configfile}" ]]; then
93 einfo "found ${configfile}" 94 einfo "found ${configfile}"
94 found=${configfile}; 95 found=${configfile};
95 break; 96 break;
96 fi 97 fi
97 done 98 done
98 if [[ -f ${found} ]]; then 99 if [[ -f ${found} ]]; then
100 elog "Building using saved configfile ${found}"
99 if [ $# -gt 0 ]; then 101 if [ $# -gt 0 ]; then
100 cp -pPR "${found}" "$1" || die "Failed to restore ${found} to $1" 102 cp -pPR "${found}" "$1" || die "Failed to restore ${found} to $1"
101 else 103 else
102 die "need to know the restoration filename" 104 die "need to know the restoration filename"
103 fi 105 fi
104 elif [[ -d ${found} ]]; then 106 elif [[ -d ${found} ]]; then
107 elog "Building using saved config directory ${found}"
105 dest=${PWD} 108 local dest=${PWD}
106 pushd "${found}" 109 pushd "${found}" > /dev/null
107 cp --parents . "${DEST}" \
108 || die "Failed to restore ${found} to $1" 110 treecopy . "${dest}" || die "Failed to restore ${found} to $1"
109 popd 111 popd > /dev/null
110 elif [[ -a {found} ]]; then
111 die "do not know how to handle non-file/directory ${found}"
112 else 112 else
113 # maybe the user is screwing around with perms they shouldnt #289168
114 if [[ ! -r ${base} ]] ; then
115 eerror "Unable to read ${base} -- please check its permissions."
116 die "Reading config files failed"
117 fi
113 eerror "No saved config to restore - please remove USE=saveconfig or" 118 ewarn "No saved config to restore - please remove USE=savedconfig or"
114 die "provide a configuration file in ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CATEGORY}/${PN}" 119 ewarn "provide a configuration file in ${PORTAGE_CONFIGROOT}/etc/portage/savedconfig/${CATEGORY}/${PN}"
120 ewarn "Your config file(s) will not be used this time"
115 fi 121 fi
116} 122}
117
118
119#warn_config() {
120#
121#}

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.19

  ViewVC Help
Powered by ViewVC 1.1.20