From e206c6620ac6c3f2fd01dd2d1b1390e6e262cd8f Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Tue, 06 Mar 2012 13:39:44 -0500 Subject: Rename all source files. --- (limited to 'src/oh-gencontrol.sh') diff --git a/src/oh-gencontrol.sh b/src/oh-gencontrol.sh new file mode 100644 index 0000000..39b9835 --- /dev/null +++ b/src/oh-gencontrol.sh @@ -0,0 +1,207 @@ +#! /bin/sh +# +# opkhelper +# src/oh-gencontrol +# Generates a control directory with a control file and scripts. +# +# Copyright (C) 2012 Patrick "P. J." McDermott +# +# 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. @@LIBDIR@@/opkhelper/controlfields +. @@LIBDIR@@/opkhelper/architecture + +print_usage() +{ + printf 'Usage: %s -s | pkgname...\n' "$1" +} + +missing_field() +{ + printf 'oh-gencontrol: Error: Missing field "%s" in control file.\n' \ + "${1}" >&2 + exit 2 +} + +invalid_pkg_name() +{ + printf 'oh-gencontrol: Error: Invalid package name: "%s"\n' "${1}" >&2 + exit 2 +} + +copy_required_field() +{ + if [ ${#} -eq 2 ]; then + { printf '%s: ' "${1}" && oh_get_field "${1}";} >> "${2}" + [ ${?} -eq 1 ] && missing_field "${1}" + else + { printf '%s: ' "${2}" && oh_get_field "${1}" "${2}";} >> "${3}" + [ ${?} -eq 1 ] && missing_field "${2}" + fi +} + +copy_optional_field() +{ + if [ ${#} -eq 2 ]; then + field=$(printf '%s: ' "${1}" && oh_get_field "${1}") + [ ${?} -eq 0 ] && printf '%s\n' "${field}" >> "${2}" + else + field=$(printf '%s: ' "${2}" && oh_get_field "${1}" "${2}") + [ ${?} -eq 0 ] && printf '%s\n' "${field}" >> "${3}" + fi +} + +gen_control_src() +{ + srcpkg=$(oh_get_field Source) || missing_field Source + oh_validate_pkg_name "${srcpkg}" || invalid_pkg_name "${srcpkg}" + + printf 'oh-gencontrol: Generating control directory for package "%s"...\n' \ + "${srcpkg}-src" + + control_dir="${srcpkg}-src.control" + control="${control_dir}/control" + + mkdir "${control_dir}" + chmod 755 "${control_dir}" + + printf 'Package: %s\n' "${srcpkg}-src" > ${control} + printf 'Source: %s\n' "${srcpkg}" >> ${control} + copy_required_field Version ${control} + printf 'Architecture: all\n' >> ${control} + # TODO: Calculate "Installed-Size". + copy_required_field Maintainer ${control} + copy_optional_field Homepage ${control} + + chmod 755 ${control} +} + +gen_control_bin() +{ + binpkg="${1}" + oh_validate_pkg_name "${binpkg}" || invalid_pkg_name "${binpkg}" + + printf 'oh-gencontrol: Generating control directory for package "%s"...\n' \ + "${binpkg}" + + data_dir="${binpkg}.data" + control_dir="${binpkg}.control" + control="${control_dir}/control" + + mkdir "${control_dir}" + chmod 755 "${control_dir}" + + # Binary and source package names and version. + copy_required_field ${binpkg} Package ${control} + copy_required_field Source ${control} + copy_required_field Version ${control} + + # Handle architecture. + { printf 'Architecture: ' && oh_get_package_architecture ${binpkg};} \ + >> ${control} + [ ${?} -eq 1 ] && missing_field Architecture + + # Optional fields. + copy_optional_field ${binpkg} Essential ${control} + copy_optional_field ${binpkg} Depends ${control} + copy_optional_field ${binpkg} Recommends ${control} + copy_optional_field ${binpkg} Suggests ${control} + copy_optional_field ${binpkg} Pre-Depends ${control} + copy_optional_field ${binpkg} Conflicts ${control} + copy_optional_field ${binpkg} Provides ${control} + copy_optional_field ${binpkg} Replaces ${control} + + # TODO: Calculate "Installed-Size". + copy_required_field Maintainer ${control} + copy_required_field ${binpkg} Description ${control} + copy_optional_field Homepage ${control} + + chmod 644 ${control} + + # Maintainer scripts. + for script in preinst postinst prerm postrm; do + if [ -L ../${binpkg}.pkg/${script} ]; then + target=$(ls -l "../${binpkg}.pkg/${script}" | \ + sed 's/^.* -> \(.*\)$/\1/') + ln -s ${target} ${control_dir}/${script} + elif [ -f ../${binpkg}.pkg/${script} ]; then + cp ../${binpkg}.pkg/${script} ${control_dir} + chmod 755 ${control_dir}/${script} + fi + done + + # Conffiles. + # Adapted from dh_installdeb of debhelper. + if [ -d ${data_dir}/etc ]; then + find ${data_dir}/etc -type f | sed "s@^${data_dir}@@" \ + >> ${control_dir}/conffiles + if [ -z "$(head -n 1 ${control_dir}/conffiles)" ]; then + rm -f ${control_dir}/conffiles + else + chmod 644 ${control_dir}/conffiles + fi + fi + + # MD5 checksums. + find ${data_dir} -type f | sort | xargs md5sum | sed "s@ ${data_dir}@ @" \ + > ${control_dir}/md5sums + if [ -z "$(head -n 1 ${control_dir}/md5sums)" ]; then + rm -f ${control_dir}/md5sums + else + chmod 644 ${control_dir}/md5sums + fi +} + +if [ ${#} -eq 0 ]; then + print_usage ${0} >&2 + exit 1 +fi + +is_src=false +opts=$(getopt -n "${0}" -o 's' -- "${@}") +if [ ${?} -ne 0 ]; then + print_usage "${0}" >&2 + exit 1; +fi +eval set -- "${opts}" +while true; do + case "${1}" in + -s) + is_src=true + shift + ;; + --) + shift + break + ;; + *) + print_usage "${0}" >&2 + exit 1 + ;; + esac +done + +if ${is_src}; then + gen_control_src +else + if [ ${#} -eq 0 ]; then + print_usage "${0}" >&2 + exit 1 + fi + + while [ ${#} -gt 0 ]; do + gen_control_bin "${1}" + shift + done +fi -- cgit v0.9.1