131 lines
5.5 KiB
Bash
131 lines
5.5 KiB
Bash
#! /bin/sh
|
|
|
|
# $NetBSD: genpkgng.sh,v 1.1.1.1 2014/04/27 00:10:34 agc Exp $
|
|
|
|
# Copyright (c) 2014 Alistair Crooks <agc@NetBSD.org>
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
|
|
# script to convert from a pkgsrc package to a pkgng one
|
|
# usage: genpkgng [-v] binpkg...
|
|
|
|
# small function to get information from build info
|
|
getvar() {
|
|
echo "$1" | awk '/^'$2'=/ { sub("'$2'=", ""); print }'
|
|
}
|
|
|
|
# process command line args
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
-v) set -x ;;
|
|
*) break ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
here=$(pwd)
|
|
|
|
while [ $# -gt 0 ]; do
|
|
binpkg=$1
|
|
echo "Converting ${binpkg}"
|
|
|
|
# get the package metadata from the pkgsrc binary package
|
|
pkgname=${binpkg%.tgz}
|
|
buildinfo=$(pkg_info -B ${binpkg})
|
|
name=${binpkg%-*}
|
|
name=${name##*/}
|
|
origin=$(getvar "${buildinfo}" PKGPATH)
|
|
version=${binpkg##*-}
|
|
version=${version%.tgz}
|
|
comment=$(pkg_info -qc ${binpkg})
|
|
os=$(getvar "${buildinfo}" OPSYS)
|
|
os_version=$(getvar "${buildinfo}" OS_VERSION)
|
|
os_version=${os_version%%.*}
|
|
machine_arch=$(getvar "${buildinfo}" MACHINE_ARCH | awk '{ sub("_", ":"); print }')
|
|
arch="${os}:${os_version}:${machine_arch}"
|
|
maintainer=$(getvar "${buildinfo}" MAINTAINER)
|
|
prefix=$(getvar "${buildinfo}" LOCALBASE)
|
|
www=$(getvar "${buildinfo}" HOMEPAGE)
|
|
licenselogic="single"
|
|
flatsize="$(pkg_info -qs ${binpkg})"
|
|
desc="$(pkg_info -qd ${binpkg} | awk '{ gsub("\"", "\\\""); printf("%s\\\\n", $0) }')"
|
|
categories=$(getvar "${buildinfo}" CATEGORIES)
|
|
categories=$(echo "${categories}" | awk 'NF == 1 { printf("\"%s\"", $0) } NF > 1 { gsub("[ ]+", "\",\""); printf("\"%s\"", $0) }' )
|
|
|
|
# make the temp dir
|
|
newpkgdir=$(mktemp -d -t genpkgng)
|
|
mkdir ${newpkgdir}/metadata ${newpkgdir}/archive
|
|
|
|
# create the basis for the compact and large manifests
|
|
(cd ${newpkgdir} && tar -s'|^[a-z]|archive/usr/pkg/&|' -s'|^\+|metadata/&|' -xzf ${here}/${binpkg})
|
|
awk -v name="${name}" -v origin="${origin}" -v version="${version}" -v arch="${arch}" \
|
|
-v comment="${comment}" -v arch="${arch}" -v maintainer="${maintainer}" \
|
|
-v prefix="${prefix}" -v www="${www}" -v licenselogic="${licenselogic}" \
|
|
-v flatsize="${flatsize}" -v desc="${desc}" -v categories="${categories}" \
|
|
'BEGIN {
|
|
printf("{\"name\":\"%s\",\"origin\":\"%s\",\"version\":\"%s\",\"comment\":\"%s\",\"arch\":\"%s\",\"maintainer\":\"%s\",\"prefix\":\"%s\",\"www\":\"%s\",\"licenselogic\":\"%s\",\"flatsize\":%s,\"desc\":\"%s\",\"categories\":[%s]",
|
|
name, origin, version, comment, arch, maintainer, prefix, www, licenselogic, flatsize, desc, categories)
|
|
}' > ${newpkgdir}/archive/+COMPACT_MANIFEST
|
|
cp ${newpkgdir}/archive/+COMPACT_MANIFEST ${newpkgdir}/archive/+MANIFEST
|
|
echo -n '}' >> ${newpkgdir}/archive/+COMPACT_MANIFEST
|
|
|
|
# copy metadata information
|
|
mkdir -p ${newpkgdir}/archive/${prefix}/etc/metadata/${pkgname}
|
|
cp ${newpkgdir}/metadata/+BUILD_VERSION ${newpkgdir}/archive/${prefix}/etc/metadata/${pkgname}/build_version
|
|
cp ${newpkgdir}/metadata/+BUILD_INFO ${newpkgdir}/archive/${prefix}/etc/metadata/${pkgname}/build_info
|
|
|
|
# add the files and digests to the manifest
|
|
echo -n ',"files":{' >> ${newpkgdir}/archive/+MANIFEST
|
|
sep=""
|
|
for f in $(pkg_info -qL ${binpkg}) ${prefix}/etc/metadata/${pkgname}/build_version ${prefix}/etc/metadata/${pkgname}/build_info; do
|
|
if [ -f ${newpkgdir}/archive/${f} ]; then
|
|
# redirect digest input so that filenames are omitted
|
|
echo -n "${sep}\"${f}\":\"$(digest sha256 < ${newpkgdir}/archive/${f})\"" >> ${newpkgdir}/archive/+MANIFEST
|
|
fi
|
|
sep=","
|
|
done
|
|
echo -n '},"directories":{' >> ${newpkgdir}/archive/+MANIFEST
|
|
directories="$(awk '/^[^+@]/ { match($0, ".*/"); a[substr($0, 1, RLENGTH-1)] = 1 } END { for (i in a) print i }' ${newpkgdir}/metadata/+CONTENTS)"
|
|
sep=""
|
|
for d in ${directories} etc/metadata etc/metadata/${pkgname}; do
|
|
if [ -d ${newpkgdir}/archive/${prefix}/${d} ]; then
|
|
echo -n "${sep}\"${prefix}/${d}\":\"n\"" >> ${newpkgdir}/archive/+MANIFEST
|
|
fi
|
|
sep=","
|
|
done
|
|
echo -n '}' >> ${newpkgdir}/archive/+MANIFEST
|
|
if [ -f ${newpkgdir}/metadata/+INSTALL ]; then
|
|
echo -n ",\"scripts\":{\"pre-install\":\"cd ${prefix}\",\"post-install\":\"cd ${prefix}\",\"pre-install\":\"cd ${prefix}\",\"post-install\":\"cd ${prefix}\"}" >> ${newpkgdir}/archive/+MANIFEST
|
|
fi
|
|
echo -n '}' >> ${newpkgdir}/archive/+MANIFEST
|
|
|
|
# now make the pkgng binary package
|
|
cp @MTREE_DIR_DIR@/MTREE_DIRS ${newpkgdir}/archive/+MTREE_DIRS
|
|
(cd ${newpkgdir}/archive && tar -czf ${here}/${pkgname}.txz *)
|
|
ls -l ${pkgname}.txz
|
|
rm -rf ${newpkgdir}
|
|
shift
|
|
done
|
|
|
|
exit 0
|