summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan McRae <mcrae_allan@hotmail.com>2008-06-06 20:17:06 +1000
committerDan McGee <dan@archlinux.org>2008-06-06 07:01:22 -0500
commitfcac23763b0cd6242a1e126b5063d95d4a46fd09 (patch)
tree200c6e13290bb421b7ee8335218db80b2507bf04
parentb04d6e751a4359337c84128681a06f436c99197a (diff)
bacman - regenerate package from system
Original work by Carlo "carlocci" Bersani with additions by Xavier Chantry and Allan McRae This script rebuilds an already installed package using metadata stored into the pacman database and system files. Replaces the outdated re-pacman script Signed-off-by: Allan McRae <mcrae_allan@hotmail.com> Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--contrib/Makefile.am2
-rw-r--r--contrib/README2
-rwxr-xr-xcontrib/bacman282
-rwxr-xr-xcontrib/re-pacman77
4 files changed, 284 insertions, 79 deletions
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index c68ef51c..25d5aac2 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -1,11 +1,11 @@
EXTRA_DIST = \
PKGBUILD.vim \
+ bacman \
bash_completion \
gensync \
pacdiff \
paclist \
pacsearch \
- re-pacman \
updatesync \
vimprojects \
wget-xdelta.sh \
diff --git a/contrib/README b/contrib/README
index 73dbade0..5ce7ca40 100644
--- a/contrib/README
+++ b/contrib/README
@@ -20,7 +20,7 @@ pacsearch - a colorized search combining both -Ss and -Qs output. Installed
packages are easily identified with a *** and local-only packages are also
listed.
-re-pacman - regenerate a pacman package based on installed files and the pacman
+bacman - regenerate a pacman package based on installed files and the pacman
database entries. Useful for reuse, or possible config file extension.
vimprojects - a project file for the vim project plugin.
diff --git a/contrib/bacman b/contrib/bacman
new file mode 100755
index 00000000..410482f4
--- /dev/null
+++ b/contrib/bacman
@@ -0,0 +1,282 @@
+#!/bin/bash
+#
+# bacman: recreate a package from a running system
+# This script rebuilds an already installed package using metadata
+# stored into the pacman database and system files
+#
+# (c) 2008 - locci <carlocci_at_gmail_dot_com>
+#
+# 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 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 <http://www.gnu.org/licenses/>.
+#
+
+readonly progname="bacman"
+readonly progver="0.2.0"
+
+#
+# User Friendliness
+#
+function usage(){
+ echo "This program recreates a package using pacman's db and system files"
+ echo "Usage: $progname <installed package name>"
+ echo "Example: $progname kernel26"
+}
+
+if [ $# -ne 1 ] ; then
+ usage
+ exit 1
+fi
+
+if [ "$1" = "--help" -o "$1" = "-h" ] ; then
+ usage
+ exit 0
+fi
+
+if [ "$1" = "--version" -o "$1" = "-v" ]; then
+ echo "$progname version $progver"
+ echo "Copyright (C) 2008 locci"
+ exit 0
+fi
+
+#
+# Fakeroot support
+#
+if [ $EUID -gt 0 ]; then
+ if [ -f /usr/bin/fakeroot ]; then
+ echo "Entering fakeroot environment"
+ export INFAKEROOT="1"
+ /usr/bin/fakeroot -u -- $0 $1
+ exit $?
+ else
+ echo "WARNING: installing fakeroot or running ${progname} as root is required to"
+ echo " preserve the ownership permissions of files in some packages"
+ echo ""
+ fi
+fi
+
+#
+# Setting environmental variables
+#
+if [ ! -r /etc/pacman.conf ]; then
+ echo "ERROR: unable to read /etc/pacman.conf"
+ exit 1
+fi
+
+eval $(awk '/DBPath/ {print $1$2$3}' /etc/pacman.conf)
+pac_db="${DBPath:-/var/lib/pacman/}/local"
+
+if [ ! -r /etc/makepkg.conf ]; then
+ echo "ERROR: unable to read /etc/makepkg.conf"
+ exit 1
+fi
+
+source "/etc/makepkg.conf"
+if [ -r ~/.makepkg.conf ]; then
+ source ~/.makepkg.conf
+fi
+
+pkg_arch=${CARCH:-'unknown'}
+pkg_dest="${PKGDEST:-$PWD}"
+pkg_pkger=${PACKAGER:-'Unknown Packager'}
+
+pkg_name="$1"
+pkg_dir="$(echo $pac_db/$pkg_name-[0-9]*)"
+pkg_namver="${pkg_dir##*/}"
+
+#
+# Checks everything is in place
+#
+if [ ! -d "$pac_db" ] ; then
+ echo "ERROR: pacman database directory ${pac_db} not found"
+ exit 1
+fi
+
+if [ ! -d "$pkg_dir" ] ; then
+ echo "ERROR: package ${pkg_name} not found in pacman database"
+ exit 1
+fi
+
+#
+# Begin
+#
+echo Package: ${pkg_namver}
+work_dir=$(mktemp -d -p /tmp)
+cd $work_dir || exit 1
+
+#
+# File copying
+#
+echo "Copying package files..."
+
+cat "$pkg_dir"/files |
+while read i; do
+ if [ -z "$i" ] ; then
+ continue
+ fi
+
+ if [[ "$i" =~ %[A-Z]*% ]] ; then
+ current=$i
+ continue
+ fi
+
+ case $current in
+ %FILES%)
+ ret=0
+ if [ -e "/$i" ]; then
+ bsdtar -cnf - "/$i" 2> /dev/null | bsdtar -xpf -
+
+ # Workaround to bsdtar not reporting a missing file as an error
+ if [ ! -e "$work_dir"/"$i" ]; then
+ echo ""
+ echo "ERROR: unable to add /$i to the package"
+ echo " If your user does not have permssion to read this file then"
+ echo " you will need to run $progname as root"
+ rm -rf $work_dir
+ exit 1
+ fi
+ else
+ echo ""
+ echo "WARNING: package file /$i is missing"
+ echo ""
+ fi
+
+
+ ;;
+ esac
+done
+
+ret=$?
+if [ $ret -ne 0 ]; then
+ rm -rf $work_dir
+ exit 1
+fi
+
+pkg_size=$(du -sk | awk '{print $1 * 1024}')
+
+if [ -f "$pkg_dir/install" ] ; then
+ cp "$pkg_dir/install" "$work_dir/.INSTALL"
+fi
+if [ -f $pkg_dir/changelog ] ; then
+ cp "$pkg_dir/changelog" "$work_dir/.CHANGELOG"
+fi
+
+#
+# .PKGINFO stuff
+#
+echo Generating .PKGINFO metadata...
+echo "# Generated by $progname $progver" > .PKGINFO
+if [ "$INFAKEROOT" = "1" ]; then
+ echo "# Using $(fakeroot -v)" >> .PKGINFO
+fi
+echo "# $(LC_ALL=C date)" >> .PKGINFO
+echo "#" >> .PKGINFO
+
+cat "$pkg_dir"/{desc,files,depends} |
+while read i; do
+ if [[ -z "$i" ]]; then
+ continue;
+ fi
+
+ if [[ "$i" =~ %[A-Z]*% ]] ; then
+ current=$i
+ continue
+ fi
+
+ case "$current" in
+ # desc
+ %NAME%)
+ echo "pkgname = $i" >> .PKGINFO
+ ;;
+ %VERSION%)
+ echo "pkgver = $i" >> .PKGINFO
+ ;;
+ %DESC%)
+ echo "pkgdesc = $i" >> .PKGINFO
+ ;;
+ %URL%)
+ echo "url = $i" >> .PKGINFO
+ ;;
+ %LICENSE%)
+ echo "license = $i" >> .PKGINFO
+ ;;
+ %ARCH%)
+ echo "arch = $i" >> .PKGINFO
+ ;;
+ %BUILDDATE%)
+ echo "builddate = $(date -u "+%s")" >> .PKGINFO
+ ;;
+ %PACKAGER%)
+ echo "packager = $pkg_pkger" >> .PKGINFO
+ ;;
+ %SIZE%)
+ echo "size = $pkg_size" >> .PKGINFO
+ ;;
+ %GROUPS%)
+ echo "group = $i" >> .PKGINFO
+ ;;
+ %REPLACES%)
+ echo "replaces = $i" >> .PKGINFO
+ ;;
+ %FORCE%)
+ echo "force = true" >> .PKGINFO
+ ;;
+
+ # files
+ %BACKUP%)
+ # strip the md5sum after the tab
+ echo "backup = ${i%%$'\t'*}" >> .PKGINFO
+ ;;
+
+ # depends
+ %DEPENDS%)
+ echo "depend = $i" >> .PKGINFO
+ ;;
+ %OPTDEPENDS%)
+ echo "optdepend = $i" >> .PKGINFO
+ ;;
+ %CONFLICTS%)
+ echo "conflict = $i" >> .PKGINFO
+ ;;
+ %PROVIDES%)
+ echo "provides = $i" >> .PKGINFO
+ ;;
+ esac
+done
+
+#
+# Fixes owner:group and permissions for .PKGINFO, .CHANGELOG, .INSTALL
+#
+chown root:root $work_dir/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
+chmod 644 $work_dir/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
+
+#
+# Generate the package
+#
+echo "Generating the package..."
+
+ret=0
+bsdtar -czf "$pkg_dest/$pkg_namver-$pkg_arch.tar.gz" $(ls -A) || ret=$?
+if [ $ret -ne 0 ]; then
+ echo "ERROR: unable to write package to $pkg_dest"
+ echo " Maybe the disk is full or you do not have write access"
+ rm -rf $work_dir
+ exit 1
+fi
+
+rm -rf $work_dir
+
+echo Done
+
+exit 0
+
+# vim: set ts=2 sw=2 noet: \ No newline at end of file
diff --git a/contrib/re-pacman b/contrib/re-pacman
deleted file mode 100755
index fff1c873..00000000
--- a/contrib/re-pacman
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/bin/sh
-#
-# re-pacman: regenerate a pacman package based on installed files and the
-# pacman database entries. Useful for reuse, or possible config file
-# extension
-#
-# Copyright (c) 2006 Aaron Griffin <aaron@archlinux.org>
-#
-# 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 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 <http://www.gnu.org/licenses/>.
-#
-
-#TODO
-# * Check for md5 changes in backup lines and change pkgrel
-
-pacinfo () {
- [ $# -ne 2 ] && return 1
- #use echo to strip spaces
- echo $(pacman -Qi ${1} | grep "${2}" | cut -d: -f2-)
-}
-
-make_pkginfo () {
- echo "# Generated by re-pacman 1.0.0"
- echo "# On $(date)"
- echo "pkgname =$(pacinfo ${1} Name)"
- echo "pkgver =$(pacinfo ${1} Version)"
- echo "pkgdesc =$(pacinfo ${1} Description)"
- echo "url =$(pacinfo ${1} URL)"
- echo "builddate =$(pacinfo ${1} 'Build Date')"
- echo "packager =$(pacinfo ${1} Packager)"
- echo "size =$(pacinfo ${1} Size)"
- echo "arch =$(pacinfo ${1} Architecture)"
- deps=$(pacinfo ${1} 'Depends On')
- for d in ${deps}; do
- echo "depend = ${d}"
- done
-}
-
-LANG="POSIX"
-
-if [ $# -ne 1 ]; then
- echo "usage: re-pacman <installed package name>"
- exit 1
-fi
-
-ver=$(pacinfo ${1} Version)
-if [ "x${ver}" = "x" ]; then
- echo "Package '${1}' not found, aborting."
- exit 1
-fi
-
-echo ":: Cleaning up old files"
-rm -f .PKGINFO "${1}-${ver}.pkg.tar.gz"
-
-echo ":: Building PKGINFO"
-make_pkginfo ${1} > .PKGINFO
-
-flist=".PKGINFO"
-flist="${flist} $(pacman -Ql ${1} | sed 's|\w* \(.*\)|/\1|g' | grep -v '/$')"
-
-echo ":: Building final package tarball"
-echo ${flist} | tr ' ' '\n' | tar czf "${1}-${ver}.pkg.tar.gz" -T - 2>/dev/null
-
-rm -f .PKGINFO
-echo ":: Package '${1}-${ver}.pkg.tar.gz' is now ready for installation"
-
-# vim: set ts=2 sw=2 noet: