index : pacman | |
Archlinux32 fork of pacman | gitolite user |
summaryrefslogtreecommitdiff |
-rw-r--r-- | scripts/.gitignore | 2 | ||||
-rw-r--r-- | scripts/Makefile.am | 31 | ||||
-rw-r--r-- | scripts/gensync.sh.in | 169 | ||||
-rw-r--r-- | scripts/makepkg.sh.in | 334 | ||||
-rw-r--r-- | scripts/repo-add.sh.in | 154 | ||||
-rw-r--r-- | scripts/repo-remove.sh.in | 191 | ||||
-rw-r--r-- | scripts/updatesync.sh.in | 172 |
diff --git a/scripts/.gitignore b/scripts/.gitignore index 53164a41..f2f19fd8 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -1,7 +1,5 @@ -gensync makepkg pacman-optimize rankmirrors repo-add repo-remove -updatesync diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 24b9c12d..7dccff9d 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -2,33 +2,38 @@ AUTOMAKE_OPTIONS = std-options bin_SCRIPTS = \ - gensync \ + $(OURSCRIPTS) \ + repo-remove + +OURSCRIPTS = \ makepkg \ pacman-optimize \ rankmirrors \ - repo-add \ - repo-remove \ - updatesync + repo-add EXTRA_DIST = \ - gensync.sh.in \ makepkg.sh.in \ pacman-optimize.sh.in \ rankmirrors.py.in \ - repo-add.sh.in \ - repo-remove.sh.in \ - updatesync.sh.in + repo-add.sh.in # Files that should be removed, but which Automake does not know. MOSTLYCLEANFILES = $(bin_SCRIPTS) *.tmp +if USE_GIT_VERSION +GIT_VERSION := $(shell sh -c 'git describe --abbrev=4 | sed s/^v//')-dirty +REAL_PACKAGE_VERSION = $(GIT_VERSION) +else +REAL_PACKAGE_VERSION = $(PACKAGE_VERSION) +endif + #### Taken from the autoconf scripts Makefile.am #### edit = sed \ -e 's|@localedir[@]|$(localedir)|g' \ -e 's|@sysconfdir[@]|$(sysconfdir)|g' \ -e 's|@localstatedir[@]|$(localstatedir)|g' \ -e 's|@prefix[@]|$(prefix)|g' \ - -e 's|@PACKAGE_VERSION[@]|$(PACKAGE_VERSION)|g' \ + -e 's|@PACKAGE_VERSION[@]|$(REAL_PACKAGE_VERSION)|g' \ -e 's|@PACKAGE_BUGREPORT[@]|$(PACKAGE_BUGREPORT)|g' \ -e 's|@PACKAGE_NAME[@]|$(PACKAGE_NAME)|g' \ -e 's|@DBEXT[@]|$(DBEXT)|g' \ @@ -39,7 +44,7 @@ edit = sed \ ## wrong file by accident. # two 'test' lines- make sure we can handle both sh and py type scripts # third 'test' line- make sure one of the two checks succeeded -$(bin_SCRIPTS): Makefile +$(OURSCRIPTS): Makefile rm -f $@ $@.tmp test -f $(srcdir)/$@.sh.in && $(edit) $(srcdir)/$@.sh.in >$@.tmp || true test -f $(srcdir)/$@.py.in && $(edit) $(srcdir)/$@.py.in >$@.tmp || true @@ -48,13 +53,11 @@ $(bin_SCRIPTS): Makefile chmod a-w $@.tmp mv $@.tmp $@ -gensync: $(srcdir)/gensync.sh.in makepkg: $(srcdir)/makepkg.sh.in pacman-optimize: $(srcdir)/pacman-optimize.sh.in rankmirrors: $(srcdir)/rankmirrors.py.in repo-add: $(srcdir)/repo-add.sh.in -repo-remove: $(srcdir)/repo-remove.sh.in -re-pacman: $(srcdir)/re-pacman.sh.in -updatesync: $(srcdir)/updatesync.sh.in +repo-remove: $(srcdir)/repo-add.sh.in + ln -sf repo-add repo-remove # vim:set ts=2 sw=2 noet: diff --git a/scripts/gensync.sh.in b/scripts/gensync.sh.in deleted file mode 100644 index d5dec275..00000000 --- a/scripts/gensync.sh.in +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/bash -# -# gensync -# @configure_input@ -# -# Copyright (c) 2002-2007 by Judd Vinet <jvinet@zeroflux.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/>. -# - -# gettext initialization -export TEXTDOMAIN='pacman' -export TEXTDOMAINDIR='@localedir@' - -myver='@PACKAGE_VERSION@' - -# functions - -usage() { - printf "gensync (pacman) %s\n\n" "$myver" - printf "$(gettext "Usage: %s <root> <destfile> [package_directory]")\n\n" "$0" - printf "$(gettext "\ -NOTE: this script is DEPRECATED. It will be removed in the next major\n\ -release of pacman, so please use repo-add and repo-remove instead.\n\n")" - printf "$(gettext "\ -gensync will generate a sync database by reading all PKGBUILD files\n\ -from <root>. gensync builds the database in a temporary directory\n\ -and then compresses it to <destfile>.\n\n")" - printf "$(gettext "\ -gensync will calculate md5sums of packages in the same directory as\n\ -<destfile>, unless an alternate [package_directory] is specified.\n\n")" - printf "$(gettext "\ -note: The <destfile> name is important. It must be of the form\n\ - {treename}.db.tar.gz where {treename} is the name of the custom\n\ - package repository you configured in /etc/pacman.conf. The\n\ - generated database must reside in the same directory as your\n\ - custom packages (also configured in /etc/pacman.conf)\n\n")" - echo "$(gettext "Example: gensync /var/abs/local /home/mypkgs/custom.db.tar.gz")" -} - -version() { - printf "gensync (pacman) %s\n" "$myver" - printf "$(gettext "\ -Copyright (C) 2002-2007 Judd Vinet <jvinet@zeroflux.org>.\n\n\ -This is free software; see the source for copying conditions.\n\ -There is NO WARRANTY, to the extent permitted by law.\n")" -} - -error () { - local mesg=$1; shift - printf "==> ERROR: ${mesg}\n" "$@" >&2 -} - -die () { - error $* - exit 1 -} - -check_force () { - local i - for i in ${options[@]}; do - local lc=$(echo $i | tr [:upper:] [:lower:]) - if [ "$lc" = "force" ]; then - true - fi - done - false -} - -# PROGRAM START - -# determine whether we have gettext; make it a no-op if we do not -if [ ! $(type -t gettext) ]; then - gettext() { - echo "$@" - } -fi - -if [ "$1" = "-h" -o "$1" = "--help" ]; then - usage - exit 0 -fi - -if [ "$1" = "-V" -o "$1" = "--version" ]; then - version - exit 0 -fi - -if [ $# -lt 2 ]; then - usage - exit 1 -fi - -# source system and user makepkg.conf -if [ -r @sysconfdir@/makepkg.conf ]; then - source @sysconfdir@/makepkg.conf -else - die "$(gettext "%s not found. Can not continue.")" "@sysconfdir@/makepkg.conf" -fi - -if [ -r ~/.makepkg.conf ]; then - source ~/.makepkg.conf -fi - - -d=$(dirname $1) -rootdir="$(cd $d && pwd)/$(basename $1)" -d="$(dirname $2)" -destdir="$(cd $d && pwd)" -destfile="$destdir/$(basename $2)" -pkgdir="" -if [ "$3" != "" ]; then - pkgdir="$3" -fi - -[ ! -d "$rootdir" ] && die "$(gettext "invalid root dir: %s")" $rootdir - -printf "$(gettext "\ -NOTE: this script is DEPRECATED. It will be removed in the next major\n\ -release of pacman, so please use repo-add and repo-remove instead.\n\n")" - -echo "$(gettext "gensync: building database entries, generating md5sums...")" >&2 -cd "$destdir" - -pkgs="" -forcepkgs="" - -for file in $(find "$rootdir"/* -name "$BUILDSCRIPT"); do - unset pkgname pkgver pkgrel options - - source $file || die "$(gettext "failed to parse %s")" $file - if [ "$arch" = 'any' ]; then - CARCH='any' - fi - if [ "$pkgdir" != "" ]; then - pkgfile="$pkgdir/$pkgname-$pkgver-$pkgrel-${CARCH}${PKGEXT}" - else - pkgfile="$destdir/$pkgname-$pkgver-$pkgrel-${CARCH}${PKGEXT}" - fi - - if [ ! -f "$pkgfile" ]; then - error "$(gettext "could not find %s-%s-%s-%s%s - skipping")" $pkgname $pkgver $pkgrel $CARCH $PKGEXT - else - if check_force; then - forcepkgs="$forcepkgs $pkgfile" - else - pkgs="$pkgs $pkgfile" - fi - fi -done - -echo "$(gettext "creating repo DB...")" - -# we'll trim the output just a tad, as gensync may be used on large repos -repo-add $destfile $pkgs --force $force_pkgs \ - | grep -e "package" -e "database" - -# vim: set ts=2 sw=2 noet: diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index da11d00d..b810d608 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -27,24 +27,32 @@ # makepkg uses quite a few external programs during its execution. You # need to have at least the following installed for makepkg to function: # awk, bsdtar (libarchive), bzip2, coreutils, fakeroot, find (findutils), -# getopt (util-linux), gettext, grep, gzip, sed +# getopt (util-linux), gettext, grep, gzip, openssl, sed # gettext initialization export TEXTDOMAIN='pacman' export TEXTDOMAINDIR='@localedir@' +# file -i does not work on Mac OSX unless legacy mode is set +export COMMAND_MODE='legacy' + +# when fileglobbing, we want * in an empty directory to expand to the null +# string rather than itself +shopt -s nullglob + myver='@PACKAGE_VERSION@' confdir='@sysconfdir@' startdir="$PWD" srcdir="$startdir/src" pkgdir="$startdir/pkg" +known_options=('strip' 'docs' 'libtool' 'emptydirs' 'zipman' 'ccache' 'distcc' 'makeflags' 'force') +readonly -a known_options # Options ASROOT=0 CLEANUP=0 CLEANCACHE=0 DEP_BIN=0 -DEP_SRC=0 FORCE=0 INFAKEROOT=0 GENINTEG=0 @@ -140,8 +148,7 @@ clean_up() { if [ $EXIT_CODE -eq 0 -a "$CLEANUP" = "1" ]; then # If it's a clean exit and -c/--clean has been passed... msg "$(gettext "Cleaning up...")" - cd "$startdir" - rm -rf pkg src + rm -rf "$pkgdir" "$srcdir" if [ "$pkgname" != "" ]; then # Can't do this unless the BUILDSCRIPT has been sourced. rm -f "${pkgname}-${pkgver}-${pkgrel}-${CARCH}.log*" @@ -182,25 +189,6 @@ check_option() { return fi - # BEGIN DEPRECATED - # TODO: This code should be removed in the next release of makepkg. - local needle=$(echo $1 | tr [:upper:] [:lower:]) - local opt - for opt in ${options[@]}; do - opt=$(echo $opt | tr [:upper:] [:lower:]) - if [ "$opt" = "no$needle" ]; then - warning "$(gettext "Options beginning with 'no' will be deprecated in the next version of makepkg!")" - plain "$(gettext "Please replace 'no' with '!': %s -> %s.")" "no$needle" "!$needle" - echo 'n' # Disabled - return - elif [ "$opt" = "keepdocs" -a "$needle" = "docs" ]; then - warning "$(gettext "Option 'keepdocs' may not work as intended. Please replace with 'docs'.")" - echo 'y' # Enabled - return - fi - done - # END DEPRECATED - # fall back to makepkg.conf options ret=$(in_opt_array "$1" ${OPTIONS[@]}) if [ "$ret" != '?' ]; then @@ -232,11 +220,11 @@ check_buildenv() { # ? - not found ## in_opt_array() { - local needle=$(echo $1 | tr [:upper:] [:lower:]); shift + local needle=$(echo $1 | tr '[:upper:]' '[:lower:]'); shift local opt for opt in "$@"; do - opt=$(echo $opt | tr [:upper:] [:lower:]) + opt=$(echo $opt | tr '[:upper:]' '[:lower:]') if [ "$opt" = "$needle" ]; then echo 'y' # Enabled return @@ -299,6 +287,20 @@ get_downloadclient() { echo "$agent" } +get_downloadcmd() { + local dlagent=$1 + local netfile=$2 + local file=$3 + + if echo "$dlagent" | grep -q "%u" ; then + local dlcmd=$(echo "$dlagent" | sed "s|%o|$file.part|" | sed "s|%u|$netfile|") + else + local dlcmd="$dlagent $netfile" + fi + + echo "$dlcmd" +} + check_deps() { [ $# -gt 0 ] || return @@ -325,7 +327,7 @@ handledeps() { striplist="$striplist $depstrip" done - if [ "$DEP_SRC" = "0" -a "$DEP_BIN" = "0" ]; then + if [ "$DEP_BIN" = "0" ]; then return $R_DEPS_MISSING fi @@ -344,40 +346,6 @@ handledeps() { error "$(gettext "Pacman failed to install missing dependencies.")" exit 1 # TODO: error code fi - elif [ "$DEP_SRC" = "1" ]; then - msg "$(gettext "Building missing dependencies...")" - - # install missing deps by building them from source. - # we look for each package name in $SRCROOT and build it. - if [ "$SRCROOT" = "" ]; then - error "$(gettext "Source root cannot be found - please make sure it is specified in %s.")" "$confdir/makepkg.conf" - exit 1 # TODO: error code - fi - - # TODO: handle version comparators (eg, glibc>=2.2.5) - for dep in $striplist; do - local candidates="$(find "$SRCROOT" -type d -name "$dep")" - if [ "$candidates" = "" ]; then - error "$(gettext "Could not find '%s' under %s")" "$dep" "$SRCROOT" - exit 1 # TODO: error code - fi - - local makepkg_opts='-i -c -b' - [ "$RMDEPS" = "1" ] && makepkg_opts="$makepkg_opts -r" - [ "$ASROOT" = "1" ] && makepkg_opts="$makepkg_opts --asroot" - local ret packagedir - for packagedir in $candidates; do - if [ -f "$packagedir/$BUILDSCRIPT" ]; then - cd "$packagedir" - ret=0 - PKGDEST="$PKGDEST" makepkg $makepkg_opts $PACMAN_OPTS || ret=$? - [ $ret -eq 0 ] && continue 2 - fi - done - - error "$(gettext "Failed to build '%s'")" "$dep" - exit 1 # TODO: error code - done fi # rerun any additional sh scripts found in /etc/profile.d/ @@ -407,7 +375,7 @@ resolve_deps() { # check deps again to make sure they were resolved deplist="$(check_deps $*)" [ "$deplist" = "" ] && return $R_DEPS_SATISFIED - elif [ "$DEP_BIN" = "1" -o "$DEP_SRC" = "1" ]; then + elif [ "$DEP_BIN" = "1" ]; then error "$(gettext "Failed to install all missing dependencies.")" fi @@ -433,10 +401,17 @@ remove_deps() { done msg "Removing installed dependencies..." + local ret=0 if [ "$ASROOT" = "0" ]; then - sudo pacman $PACMAN_OPTS -Rns $deplist + sudo pacman $PACMAN_OPTS -Rns $deplist || ret=$? else - pacman $PACMAN_OPTS -Rns $deplist + pacman $PACMAN_OPTS -Rns $deplist || ret=$? + fi + + # Fixes FS#10039 - exit cleanly as package has built successfully + if [ $ret -ne 0 ]; then + warning "$(gettext "Failed to remove installed dependencies.")" + return 0 fi } @@ -452,15 +427,17 @@ download_sources() { pushd "$SRCDEST" &>/dev/null local netfile - for netfile in ${source[@]}; do + for netfile in "${source[@]}"; do local file=$(strip_url "$netfile") if [ -f "$startdir/$file" ]; then msg2 "$(gettext "Found %s in build dir")" "$file" - cp -s --remove-destination "$startdir/$file" "$srcdir/" + rm -f "$srcdir/$file" + ln -s "$startdir/$file" "$srcdir/" continue elif [ -f "$SRCDEST/$file" ]; then msg2 "$(gettext "Using cached copy of %s")" "$file" - cp -s --remove-destination "$SRCDEST/$file" "$srcdir/" + rm -f "$srcdir/$file" + ln -s "$SRCDEST/$file" "$srcdir/" continue fi @@ -471,18 +448,22 @@ download_sources() { fi # find the client we should use for this URL - local dlclient=$(get_downloadclient $netfile) || exit $? + local dlclient=$(get_downloadclient "$netfile") || exit $? msg2 "$(gettext "Downloading %s...")" "$file" # fix flyspray bug #3289 local ret=0 - $dlclient "$netfile" || ret=$? + $(get_downloadcmd "$dlclient" "$netfile" "$file") || ret=$? if [ $ret -gt 0 ]; then error "$(gettext "Failure while downloading %s")" "$file" plain "$(gettext "Aborting...")" exit 1 fi - cp -s --remove-destination "$SRCDEST/$file" "$srcdir/" + if echo "$dlclient" | grep -q "%o" ; then + mv -f "$SRCDEST/$file.part" "$SRCDEST/$file" + fi + rm -f "$srcdir/$file" + ln -s "$SRCDEST/$file" "$srcdir/" done popd &>/dev/null @@ -494,7 +475,7 @@ generate_checksums() { local integ for integ in ${INTEGRITY_CHECK[@]}; do - integ="$(echo $integ | tr [:upper:] [:lower:])" + integ="$(echo $integ | tr '[:upper:]' '[:lower:]')" case "$integ" in md5|sha1|sha256|sha384|sha512) : ;; *) @@ -502,8 +483,8 @@ generate_checksums() { exit 1;; # $E_CONFIG_ERROR esac - if [ ! $(type -p "${integ}sum") ]; then - error "$(gettext "Cannot find the '%s' program.")" "${integ}sum" + if [ ! $(type -p openssl) ]; then + error "$(gettext "Cannot find openssl.")" exit 1 # $E_MISSING_PROGRAM fi @@ -519,7 +500,7 @@ generate_checksums() { done local netfile - for netfile in ${source[@]}; do + for netfile in "${source[@]}"; do local file="$(strip_url "$netfile")" if [ ! -f "$file" ] ; then @@ -528,11 +509,11 @@ generate_checksums() { plain "$(gettext "Aborting...")" exit 1 else - file=$SRCDEST/$file + file="$SRCDEST/$file" fi fi - local sum="$(${integ}sum "$file" | cut -d ' ' -f 1)" + local sum="$(openssl dgst -${integ} "$file" | awk '{print $NF}')" [ $ct -gt 0 ] && echo -n "$indent" echo -n "'$sum'" ct=$(($ct+1)) @@ -546,7 +527,7 @@ generate_checksums() { check_checksums() { local integ for integ in ${INTEGRITY_CHECK[@]}; do - integ="$(echo $integ | tr [:upper:] [:lower:])" + integ="$(echo $integ | tr '[:upper:]' '[:lower:]')" case "$integ" in md5|sha1|sha256|sha384|sha512) : ;; *) @@ -554,12 +535,12 @@ check_checksums() { exit 1;; # $E_CONFIG_ERROR esac - if [ ! $(type -p "${integ}sum") ]; then - error "$(gettext "Cannot find the '%s' program.")" "${integ}sum" + if [ ! $(type -p openssl) ]; then + error "$(gettext "Cannot find openssl.")" exit 1 # $E_MISSING_PROGRAM fi - local integrity_sums=($(eval echo \${${integ}sums[@]})) + local integrity_sums=($(eval echo "\${${integ}sums[@]}")) if [ ${#integrity_sums[@]} -eq ${#source[@]} ]; then msg "$(gettext "Validating source files with %s...")" "${integ}sums" local errors=0 @@ -575,11 +556,11 @@ check_checksums() { errors=1 continue else - file=$SRCDEST/$file + file="$SRCDEST/$file" fi fi - if echo "${integrity_sums[$idx]} $file" | ${integ}sum --status -c - &>/dev/null; then + if [ "${integrity_sums[$idx]}" = "$(openssl dgst -${integ} "$file" | awk '{print $NF}')" ]; then echo "$(gettext "Passed")" >&2 else echo "$(gettext "FAILED")" >&2 @@ -616,7 +597,7 @@ extract_sources() { plain "$(gettext "Aborting...")" exit 1 else - file=$SRCDEST/$file + file="$SRCDEST/$file" fi fi @@ -647,8 +628,8 @@ extract_sources() { done if [ $EUID -eq 0 ]; then - # chown all source files to root.root - chown -R root.root "$srcdir" + # change perms of all source files to root user & root group + chown -R 0:0 "$srcdir" fi } @@ -716,37 +697,41 @@ tidy_install() { rm -rf ${DOC_DIRS[@]} fi - msg2 "$(gettext "Compressing man pages...")" - local manpage mandirs ext file link hardlinks hl - mandirs="usr/man usr/share/man usr/local/man usr/local/share/man opt/*/man" - find ${mandirs} -type f 2>/dev/null | while read manpage ; do - # check file still exists (potentially compressed with hard link) - if [ -f ${manpage} ]; then - ext="${manpage##*.}" - file="${manpage##*/}" - if [ "$ext" != "gz" -a "$ext" != "bz2" ]; then - # update symlinks to this manpage - find ${mandirs} -lname "$file" 2>/dev/null | while read link ; do - rm -f "$link" - ln -sf "${file}.gz" "${link}.gz" - done - # find hard links and remove them - # the '|| true' part keeps the script from bailing if find returned an - # error, such as when one of the man directories doesn't exist - hardlinks="$(find ${mandirs} \! -name "$file" -samefile "$manpage" 2>/dev/null)" || true - for hl in ${hardlinks}; do - rm -f "${hl}"; - done - # compress the original - gzip -9 "$manpage" - # recreate hard links removed earlier - for hl in ${hardlinks}; do - ln "${manpage}.gz" "${hl}.gz" - chmod 644 ${hl}.gz - done + if [ "$(check_option zipman)" = "y" ]; then + msg2 "$(gettext "Compressing man pages...")" + local manpage mandirs ext file link hardlinks hl + mandirs="usr/man usr/share/man usr/local/man usr/local/share/man opt/*/man" + find ${mandirs} -type f 2>/dev/null | + while read manpage ; do + # check file still exists (potentially compressed with hard link) + if [ -f ${manpage} ]; then + ext="${manpage##*.}" + file="${manpage##*/}" + if [ "$ext" != "gz" -a "$ext" != "bz2" ]; then + # update symlinks to this manpage + find ${mandirs} -lname "$file" 2>/dev/null | + while read link ; do + rm -f "$link" + ln -sf "${file}.gz" "${link}.gz" + done + # find hard links and remove them + # the '|| true' part keeps the script from bailing if find returned an + # error, such as when one of the man directories doesn't exist + hardlinks="$(find ${mandirs} \! -name "$file" -samefile "$manpage" 2>/dev/null)" || true + for hl in ${hardlinks}; do + rm -f "${hl}"; + done + # compress the original + gzip -9 "$manpage" + # recreate hard links removed earlier + for hl in ${hardlinks}; do + ln "${manpage}.gz" "${hl}.gz" + chmod 644 ${hl}.gz + done + fi fi - fi - done + done + fi if [ "$(check_option strip)" = "y" ]; then @@ -790,7 +775,7 @@ create_package() { else local packager="Unknown Packager" fi - local size=$(du -sb | awk '{print $1}') + local size=$(du -sk | awk '{print $1 * 1024}') # write the .PKGINFO file msg2 "$(gettext "Generating .PKGINFO file...")" @@ -849,7 +834,6 @@ create_package() { local comp_files=".PKGINFO" # check for an install script - # TODO: should we include ${pkgname}.install if it exists and $install is unset? if [ "$install" != "" ]; then msg2 "$(gettext "Adding install script...")" cp "$startdir/$install" .INSTALL @@ -868,7 +852,7 @@ create_package() { local pkg_file="$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}" - if ! bsdtar -czf "$pkg_file" $comp_files $(ls); then + if ! bsdtar -czf "$pkg_file" $comp_files *; then error "$(gettext "Failed to create package file.")" exit 1 # TODO: error code fi @@ -940,14 +924,26 @@ create_xdelta() { create_srcpackage() { cd "$startdir" + if [ "$SOURCEONLY" = "2" ]; then + # get back to our src directory so we can begin with sources + mkdir -p "$srcdir" + cd "$srcdir" + download_sources + # we can only check checksums if we have all files + check_checksums + cd "$startdir" + fi msg "$(gettext "Creating source package...")" - local comp_files="$BUILDSCRIPT" + local srclinks="$(mktemp -d "$startdir"/srclinks.XXXXXXXXX)" + mkdir "${srclinks}"/${pkgname} + msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT" + ln -s "${startdir}/${BUILDSCRIPT}" "${srclinks}/${pkgname}/" if [ "$install" != "" ]; then if [ -f $install ]; then msg2 "$(gettext "Adding install script...")" - comp_files="$comp_files $install" + ln -s "${startdir}/$install" "${srclinks}/${pkgname}/" else error "$(gettext "Install script %s not found.")" "$install" fi @@ -955,14 +951,18 @@ create_srcpackage() { if [ -f ChangeLog ]; then msg2 "$(gettext "Adding %s...")" "ChangeLog" - comp_files="$comp_files ChangeLog" + ln -s "${startdir}/ChangeLog" "${srclinks}/${pkgname}" fi - local i - for i in ${source[@]}; do - if [ -f $i ]; then - msg2 "$(gettext "Adding %s...")" "$i" - comp_files="$comp_files $i" + local netfile + for netfile in "${source[@]}"; do + local file=$(strip_url "$netfile") + if [ -f "$netfile" ]; then + msg2 "$(gettext "Adding %s...")" "$netfile" + ln -s $netfile "${srclinks}/${pkgname}" + elif [ "$SOURCEONLY" = "2" -a -f "$SRCDEST/$file" ]; then + msg2 "$(gettext "Adding %s...")" "$file" + ln -s "$SRCDEST/$file" "${srclinks}/${pkgname}/" fi done @@ -970,10 +970,13 @@ create_srcpackage() { # tar it up msg2 "$(gettext "Compressing source package...")" - if ! bsdtar -czf "$pkg_file" $comp_files; then + cd "${srclinks}" + if ! bsdtar -czLf "$pkg_file" ${pkgname}; then error "$(gettext "Failed to create source package file.")" exit 1 # TODO: error code fi + cd "${startdir}" + rm -rf "${srclinks}" } install_package() { @@ -1071,7 +1074,6 @@ usage() { echo echo "$(gettext "Options:")" printf "$(gettext " -A, --ignorearch Ignore incomplete arch field in %s")\n" "$BUILDSCRIPT" - echo "$(gettext " -b, --builddeps Build missing dependencies from source")" echo "$(gettext " -c, --clean Clean up work files after build")" echo "$(gettext " -C, --cleancache Clean up source files from the cache")" echo "$(gettext " -d, --nodeps Skip all dependency checks")" @@ -1145,9 +1147,11 @@ SRCDEST=${_SRCDEST:-$SRCDEST} SRCDEST=${SRCDEST:-$startdir} #default to $startdir if undefined # Parse Command Line Options. -OPT_SHORT="AbcCdefFghiLmop:rRsSV" -OPT_LONG="ignorearch,asroot,builddeps,clean,cleancache,nodeps,noextract,force,forcever:,geninteg,help,holdver" -OPT_LONG="$OPT_LONG,install,log,nocolor,nobuild,rmdeps,repackage,source,syncdeps,usesudo,version" +OPT_SHORT="AbcCdefFghiLmop:rRsV" +OPT_LONG="allsource,asroot,ignorearch,builddeps,clean,cleancache,nodeps" +OPT_LONG="$OPT_LONG,noextract,force,forcever:,geninteg,help,holdver" +OPT_LONG="$OPT_LONG,install,log,nocolor,nobuild,rmdeps,repackage,source" +OPT_LONG="$OPT_LONG,syncdeps,version" # Pacman Options OPT_LONG="$OPT_LONG,noconfirm,noprogressbar" OPT_TEMP="$(getopt -o "$OPT_SHORT" -l "$OPT_LONG" -n "$(basename "$0")" -- "$@" || echo 'GETOPT GO BANG!')" @@ -1165,9 +1169,9 @@ while true; do --noprogressbar) PACMAN_OPTS="$PACMAN_OPTS --noprogressbar" ;; # Makepkg Options + --allsource) SOURCEONLY=2 ;; --asroot) ASROOT=1 ;; -A|--ignorearch) IGNOREARCH=1 ;; - -b|--builddeps) DEP_SRC=1 ;; -c|--clean) CLEANUP=1 ;; -C|--cleancache) CLEANCACHE=1 ;; -d|--nodeps) NODEPS=1 ;; @@ -1188,11 +1192,6 @@ while true; do --source) SOURCEONLY=1 ;; -s|--syncdeps) DEP_BIN=1 ;; - # BEGIN DEPRECATED - -S|--usesudo) - warning "$(gettext "Sudo is used by default now. The --usesudo option is deprecated!")" ;; - # END DEPRECATED - -h|--help) usage; exit 0 ;; # E_OK -V|--version) version; exit 0 ;; # E_OK @@ -1203,8 +1202,7 @@ while true; do done if [ "$HOLDVER" = "1" -a "$FORCE_VER" != "" ]; then - # The extra '--' is here to prevent gettext from thinking --holdver is - # an option + # The '\\0' is here to prevent gettext from thinking --holdver is an option error "$(gettext "\\0--holdver and --forcever cannot both be specified" )" exit 1 fi @@ -1215,7 +1213,7 @@ if [ "$CLEANCACHE" = "1" ]; then msg "$(gettext "Cleaning up ALL files from %s.")" "$SRCDEST" echo -n "$(gettext " Are you sure you wish to do this? [Y/n] ")" read answer - answer=$(echo $answer | tr [:upper:] [:lower:]) + answer=$(echo $answer | tr '[:upper:]' '[:lower:]') if [ "$answer" = "yes" -o "$answer" = "y" ]; then rm "$SRCDEST"/* if [ $? -ne 0 ]; then @@ -1276,7 +1274,7 @@ else fi # check for sudo if we will need it during makepkg execution -if [ "$ASROOT" = "0" -a \( "$DEP_BIN" = "1" -o "$DEP_SRC" = "1" \ +if [ "$ASROOT" = "0" -a \( "$DEP_BIN" = "1" \ -o "$RMDEPS" = "1" -o "$INSTALL" = "1" \) ]; then if [ ! "$(type -p sudo)" ]; then error "$(gettext "Cannot find the sudo binary! Is sudo installed?")" @@ -1293,17 +1291,18 @@ unset optdepends options noextract if [ ! -f "$BUILDSCRIPT" ]; then error "$(gettext "%s does not exist.")" "$BUILDSCRIPT" exit 1 - #TODO this is an attempt at a generic way to unset all package specific - #variables in a PKGBUILD - #else - # #this is fun.... we'll unset - # for var in $(grep "=" $BUILDSCRIPT | sed "s|.*\(\<.*\>\)=.*|\1|g"); do - # unset $var - # done fi source "$BUILDSCRIPT" +if [ "$GENINTEG" = "1" ]; then + mkdir -p "$srcdir" + cd "$srcdir" + download_sources + generate_checksums + exit 0 # $E_OK +fi + # check for no-no's in the build script if [ -z "$pkgname" ]; then error "$(gettext "%s is not allowed to be empty.")" "pkgname" @@ -1348,6 +1347,25 @@ if [ "$install" -a ! -f "$install" ]; then exit 1 fi +valid_options=1 +for opt in ${options[@]}; do + known=0 + # check if option matches a known option or its inverse + for kopt in ${known_options[@]}; do + if [ "${opt}" = "${kopt}" -o "${opt}" = "!${kopt}" ]; then + known=1 + fi + done + if [ $known -eq 0 ]; then + error "$(gettext "options array contains unknown option '%s'")" "$opt" + valid_options=0 + fi +done +if [ $valid_options -eq 0 ]; then + exit 1 +fi +unset valid_options opt known kopt + # We need to run devel_update regardless of whether we are in the fakeroot # build process so that if the user runs makepkg --forcever manually, we # 1) output the correct pkgver, and 2) use the correct filename when @@ -1356,7 +1374,7 @@ devel_check devel_update if [ -f "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}" \ - -a "$FORCE" = "0" -a "$GENINTEG" = "0" -a "$SOURCEONLY" = "0" -a "$NOBUILD" = "0" ]; then + -a "$FORCE" = "0" -a "$SOURCEONLY" = "0" -a "$NOBUILD" = "0" ]; then if [ "$INSTALL" = "1" ]; then warning "$(gettext "A package has already been built, installing existing package...")" install_package @@ -1383,14 +1401,14 @@ if [ "$INFAKEROOT" = "1" ]; then exit 0 # $E_OK fi -msg "$(gettext "Making package: %s")" "$pkgname $pkgver-$pkgrel ($(date))" +msg "$(gettext "Making package: %s")" "$pkgname $pkgver-$pkgrel $CARCH ($(date))" if [ $EUID -eq 0 ]; then warning "$(gettext "Running makepkg as root...")" fi # if we are creating a source-only package, go no further -if [ "$SOURCEONLY" = "1" ]; then +if [ "$SOURCEONLY" != "0" ]; then if [ -f "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}${SRCEXT}" \ -a "$FORCE" = "0" ]; then error "$(gettext "A package has already been built. (use -f to overwrite)")" @@ -1402,11 +1420,11 @@ if [ "$SOURCEONLY" = "1" ]; then fi # fix flyspray bug #5973 -if [ "$NODEPS" = "1" -o "$GENINTEG" = "1" -o "$NOBUILD" = "1" -o "$REPKG" = "1" ]; then +if [ "$NODEPS" = "1" -o "$NOBUILD" = "1" -o "$REPKG" = "1" ]; then if [ "$NODEPS" = "1" ]; then warning "$(gettext "Skipping dependency checks.")" fi - # skip printing a warning message for the others: geninteg, nobuild, repkg + # skip printing a warning message for the others: nobuild, repkg elif [ $(type -p pacman) ]; then unset pkgdeps # Set by resolve_deps() and used by remove_deps() deperr=0 @@ -1432,12 +1450,6 @@ umask 0022 mkdir -p "$srcdir" cd "$srcdir" -if [ "$GENINTEG" = "1" ]; then - download_sources - generate_checksums - exit 0 # $E_OK -fi - if [ "$NOEXTRACT" = "1" -o "$REPKG" = "1" ]; then warning "$(gettext "Skipping source retrieval -- using existing src/ tree")" warning "$(gettext "Skipping source integrity checks -- using existing src/ tree")" @@ -1470,8 +1482,8 @@ else mkdir -p "$pkgdir" cd "$startdir" - if [ $EUID -eq 0 ]; then - # if we are root, then we don't need to recall makepkg with fakeroot + if [ "$(check_buildenv fakeroot)" != "y" -o $EUID -eq 0 ]; then + # if we are root or if fakeroot is not enabled, then we don't use it if [ "$REPKG" = "1" ]; then warning "$(gettext "Skipping build.")" else @@ -1494,7 +1506,7 @@ else create_xdelta "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}" fi -msg "$(gettext "Finished making: %s")" "$pkgname ($(date))" +msg "$(gettext "Finished making: %s")" "$pkgname $pkgver-$pkgrel $CARCH ($(date))" install_package diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index 63d94d37..9ab023d6 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -1,9 +1,11 @@ #!/bin/bash # # repo-add - add a package to a given repo database file +# repo-remove - remove a package entry from a given repo database file # @configure_input@ # -# Copyright (c) 2006 Aaron Griffin <aaron@archlinux.org> +# Copyright (c) 2006-2008 Aaron Griffin <aaron@archlinux.org> +# Copyright (c) 2007-2008 Dan McGee <dan@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 @@ -25,18 +27,20 @@ export TEXTDOMAINDIR='@localedir@' myver='@PACKAGE_VERSION@' confdir='@sysconfdir@' -FORCE=0 +QUIET=0 REPO_DB_FILE="" # ensure we have a sane umask set umask 0022 msg() { + [ $QUIET -ne 0 ] && return local mesg=$1; shift printf "==> ${mesg}\n" "$@" >&1 } msg2() { + [ $QUIET -ne 0 ] && return local mesg=$1; shift printf " -> ${mesg}\n" "$@" >&1 } @@ -53,37 +57,39 @@ error() { # print usage instructions usage() { - printf "repo-add (pacman) %s\n\n" "$myver" - printf "$(gettext "Usage: %s <path-to-db> [--force] <package> ...\n\n")" "$0" + printf "repo-add, repo-remove (pacman) %s\n\n" "$myver" + printf "$(gettext "Usage: repo-add [-q] <path-to-db> <package> ...\n")" + printf "$(gettext "Usage: repo-remove [-q] <path-to-db> <packagename> ...\n\n")" printf "$(gettext "\ repo-add will update a package database by reading a package file.\n\ Multiple packages to add can be specified on the command line.\n\n")" printf "$(gettext "\ -The --force flag will add a 'force' entry to the sync database, which\n\ -tells pacman to skip its internal version number checking and update\n\ -the package regardless.\n\n")" +repo-remove will update a package database by removing the package name\n\ +specified on the command line from the given repo database. Multiple\n\ +packages to remove can be specified on the command line.\n\n")" + printf "$(gettext "\ +The -q/--quiet flag to either program will force silent running except\n\ +in the case of warnings or errors.\n\n")" echo "$(gettext "Example: repo-add /path/to/repo.db.tar.gz pacman-3.0.0.pkg.tar.gz")" + echo "$(gettext "Example: repo-remove /path/to/repo.db.tar.gz kernel26")" } version() { - printf "repo-add (pacman) %s\n" "$myver" + printf "repo-add, repo-remove (pacman) %s\n\n" "$myver" printf "$(gettext "\ -Copyright (C) 2006 Aaron Griffin <aaron@archlinux.org>.\n\n\ +Copyright (C) 2006-2008 Aaron Griffin <aaron@archlinux.org>.\n\ +Copyright (c) 2007-2008 Dan McGee <dan@archlinux.org>.\n\n\ This is free software; see the source for copying conditions.\n\ There is NO WARRANTY, to the extent permitted by law.\n")" } # test if a file is a repository DB test_repo_db_file () { - if [ -f "$REPO_DB_FILE" ]; then - if bsdtar -tf "$REPO_DB_FILE" | grep -q "/desc"; then - return 0 # YES - fi + if bsdtar -tf "$REPO_DB_FILE" | grep -q "/desc"; then + return 0 # YES else - return 0 # YES - No database file is also allowed + return 1 # NO fi - - return 1 # NO } # write a list entry @@ -102,8 +108,8 @@ write_list_entry() { # arg1 - path to delta db_write_delta() { - # blank out all variables and set deltafile - local deltafile=$(readlink -f "$1") + # blank out all variables and set deltafile to absolute path + local deltafile=$($realpath "$1") local filename=$(basename "$deltafile") local deltavars pkgname fromver tover arch csize md5sum @@ -117,7 +123,7 @@ db_write_delta() # get md5sum and size of delta md5sum="$(md5sum "$deltafile" | cut -d ' ' -f 1)" - csize=$(du -b -L "$deltafile" | cut -f 1) + csize=$(du -kL "$deltafile" | awk '{print $1 * 1024}') # ensure variables were found if [ -z "$pkgname" -o -z "$fromver" -o -z "$tover" -o -z "$arch" ]; then @@ -133,8 +139,8 @@ db_write_delta() # arg1 - path to package db_write_entry() { - # blank out all variables and set pkgfile - local pkgfile=$(readlink -f "$1") + # blank out all variables and set pkgfile to an absolute path + local pkgfile=$($realpath "$1") local pkgname pkgver pkgdesc url builddate packager csize size \ group depend backup license replaces provides conflict force \ _groups _depends _backups _licenses _replaces _provides _conflicts \ @@ -164,7 +170,7 @@ db_write_entry() IFS=$OLDIFS # get compressed size of package - csize=$(du -b -L "$pkgfile" | cut -f 1) + csize=$(du -kL "$pkgfile" | awk '{print $1 * 1024}') startdir=$(pwd) pushd "$gstmpdir" 2>&1 >/dev/null @@ -176,14 +182,8 @@ db_write_entry() return 1 fi - # remove any other package in the DB with same name - local existing - for existing in *; do - if [ "${existing%-*-*}" = "$pkgname" ]; then - msg2 "$(gettext "Removing existing package '%s'...")" "$existing" - rm -rf "$existing" - fi - done + # remove an existing entry if it exists, ignore failures + db_remove_entry "$pkgname" # create package directory mkdir "$pkgname-$pkgver" @@ -209,7 +209,7 @@ db_write_entry() [ -n "$builddate" ] && echo -e "%BUILDDATE%\n$builddate\n" >>desc [ -n "$packager" ] && echo -e "%PACKAGER%\n$packager\n" >>desc write_list_entry "REPLACES" "$_replaces" "desc" - [ $FORCE -eq 1 -o -n "$force" ] && echo -e "%FORCE%\n" >>desc + [ -n "$force" ] && echo -e "%FORCE%\n" >>desc # create depends entry msg2 "$(gettext "Creating 'depends' db entry...")" @@ -236,7 +236,7 @@ db_write_entry() if db_write_delta "$delta"; then msg2 "$(gettext "Added delta '%s'")" "$(basename "$delta")" else - msg2 "$(gettext "Could not add delta '%s'")" "$(basename "$delta")" + warning "$(gettext "Could not add delta '%s'")" "$(basename "$delta")" fi fi done @@ -250,6 +250,23 @@ db_write_entry() popd 2>&1 >/dev/null } # end db_write_entry +# remove existing entries from the DB +# arg1 - package name +db_remove_entry() { + pushd "$gstmpdir" 2>&1 >/dev/null + + # remove any other package in the DB with same name + local existing + for existing in *; do + if [ "${existing%-*-*}" = "$1" ]; then + msg2 "$(gettext "Removing existing package '%s'...")" "$existing" + rm -rf "$existing" + fi + done + + popd 2>&1 >/dev/null +} # end db_remove_entry + # PROGRAM START # determine whether we have gettext; make it a no-op if we do not @@ -277,6 +294,16 @@ if [ $# -lt 2 ]; then exit 1 fi +# check for and store the name of a realpath-like program +if [ $(type -t realpath) ]; then + realpath='realpath' +elif [ $(type -t readlink) ]; then + realpath='readlink -f' +else + error "$(gettext "Either realpath or readlink are required by repo-add.")" + exit 1 # $E_MISSING_PROGRAM +fi + # source system and user makepkg.conf if [ -r "$confdir/makepkg.conf" ]; then source "$confdir/makepkg.conf" @@ -290,44 +317,69 @@ if [ -r ~/.makepkg.conf ]; then fi # main routine -gstmpdir=$(mktemp -d /tmp/repo-add.XXXXXXXXXX) || (\ +gstmpdir=$(mktemp -d /tmp/repo-tools.XXXXXXXXXX) || (\ error "$(gettext "Cannot create temp directory for database building.")"; \ exit 1) +# figure out what program we are +cmd="$(basename $0)" +if [ "$cmd" != "repo-add" -a "$cmd" != "repo-remove" ]; then + error "$(gettext "Invalid command name '%s' specified.")" "$cmd" + exit 1 +fi + success=0 # parse arguments for arg in "$@"; do if [ "$arg" == "--force" -o "$arg" == "-f" ]; then - FORCE=1 + warning "$(gettext "the -f and --force options are no longer recognized")" + msg2 "$(gettext "use options=(force) in the PKGBUILD instead")" + elif [ "$arg" == "--quiet" -o "$arg" == "-q" ]; then + QUIET=1 elif [ -z "$REPO_DB_FILE" ]; then - REPO_DB_FILE=$(readlink -f "$arg") - if ! test_repo_db_file; then - error "$(gettext "Repository file '%s' is not a proper pacman database.")" "$REPO_DB_FILE" - exit 1 - elif [ -f "$REPO_DB_FILE" ]; then + # store absolute path to repo DB + REPO_DB_FILE=$($realpath "$arg") + if [ -f "$REPO_DB_FILE" ]; then + if ! test_repo_db_file $cmd; then + error "$(gettext "Repository file '%s' is not a proper pacman database.")" "$REPO_DB_FILE" + exit 1 + fi msg "$(gettext "Extracting database to a temporary location...")" bsdtar -xf "$REPO_DB_FILE" -C "$gstmpdir" + elif [ "$cmd" == "repo-remove" ]; then + error "$(gettext "Repository file '%s' was not found.")" "$REPO_DB_FILE" + exit 1 fi else - if [ -f "$arg" ]; then - if ! bsdtar -tf "$arg" .PKGINFO 2>&1 >/dev/null; then - error "$(gettext "'%s' is not a package file, skipping")" "$arg" + if [ "$cmd" == "repo-add" ]; then + if [ -f "$arg" ]; then + if ! bsdtar -tf "$arg" .PKGINFO 2>&1 >/dev/null; then + error "$(gettext "'%s' is not a package file, skipping")" "$arg" + else + msg "$(gettext "Adding package '%s'")" "$arg" + + if db_write_entry "$arg"; then + success=1 + fi + fi else - msg "$(gettext "Adding package '%s'")" "$arg" + error "$(gettext "Package '%s' not found.")" "$arg" + fi + elif [ "$cmd" == "repo-remove" ]; then + msg "$(gettext "Searching for package '%s'...")" "$arg" - if db_write_entry "$arg"; then - success=1 - fi + if db_remove_entry "$arg"; then + success=1 + else + error "$(gettext "Package matching '%s' not found.")" "$arg" fi - else - error "$(gettext "Package '%s' not found.")" "$arg" fi fi done # if all operations were a success, re-zip database if [ $success -eq 1 ]; then - msg "$(gettext "Creating updated database file %s")" "$REPO_DB_FILE" + msg "$(gettext "Creating updated database file '%s'")" "$REPO_DB_FILE" pushd "$gstmpdir" 2>&1 >/dev/null if [ -n "$(ls)" ]; then @@ -341,6 +393,10 @@ if [ $success -eq 1 ]; then esac bsdtar -c${TAR_OPT}f "$REPO_DB_FILE" * + else + # we should only end up with an empty db after a remove of the last package in the database + error "$(gettext "All packages have been removed from the database. Deleting '%s'.")" "$REPO_DB_FILE" + rm "$REPO_DB_FILE" fi popd 2>&1 >/dev/null diff --git a/scripts/repo-remove.sh.in b/scripts/repo-remove.sh.in deleted file mode 100644 index 47a0d5ae..00000000 --- a/scripts/repo-remove.sh.in +++ /dev/null @@ -1,191 +0,0 @@ -#!/bin/bash -# -# repo-remove - remove a package entry from a given repo database file -# @configure_input@ -# -# Copyright (c) 2002-2007 by Judd Vinet <jvinet@zeroflux.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/>. - -# gettext initialization -export TEXTDOMAIN='pacman' -export TEXTDOMAINDIR='@localedir@' - -myver='@PACKAGE_VERSION@' -confdir='@sysconfdir@' - -REPO_DB_FILE="" - -msg() { - local mesg=$1; shift - printf "==> ${mesg}\n" "$@" >&1 -} - -msg2() { - local mesg=$1; shift - printf " -> ${mesg}\n" "$@" >&1 -} - -warning() { - local mesg=$1; shift - printf "==> $(gettext "WARNING:") ${mesg}\n" "$@" >&2 -} - -error() { - local mesg=$1; shift - printf "==> $(gettext "ERROR:") ${mesg}\n" "$@" >&2 -} - -# print usage instructions -usage() { - printf "$(gettext "repo-remove %s\n\n")" $myver - printf "$(gettext "usage: %s <path-to-db> <packagename> ...\n\n")" "$0" - printf "$(gettext "\ -repo-remove will update a package database by removing the package name\n\ -specified on the command line from the given repo database. Multiple\n\ -packages to remove can be specified on the command line.\n\n")" - echo "$(gettext "Example: repo-remove /path/to/repo.db.tar.gz kernel26")" -} - -version() { - printf "repo-remove (pacman) %s\n" "$myver" - printf "$(gettext "\ -Copyright (C) 2002-2007 Judd Vinet <jvinet@zeroflux.org>.\n\n\ -This is free software; see the source for copying conditions.\n\ -There is NO WARRANTY, to the extent permitted by law.\n")" -} - -# test if a file is a repository DB -test_repo_db_file () { - if [ -f "$REPO_DB_FILE" ]; then - if bsdtar -tf "$REPO_DB_FILE" | grep -q "/desc"; then - return 0 # YES - fi - fi - - return 1 # NO -} - -# remove existing entries from the DB -db_remove_entry() { - pushd "$gstmpdir" 2>&1 >/dev/null - - # remove any other package in the DB with same name - local existing - for existing in *; do - if [ "${existing%-*-*}" = "$1" ]; then - msg2 "$(gettext "Removing existing package '%s'...")" "$existing" - rm -rf "$existing" - fi - done - - popd 2>&1 >/dev/null -} # end db_remove_entry - -# PROGRAM START - -# determine whether we have gettext; make it a no-op if we do not -if [ ! $(type -t gettext) ]; then - gettext() { - echo "$@" - } -fi - -# check for help flags -if [ "$1" = "-h" -o "$1" = "--help" ]; then - usage - exit 0 -fi - -# check for version flags -if [ "$1" = "-V" -o "$1" = "--version" ]; then - version - exit 0 -fi - -# check for correct number of args -if [ $# -lt 2 ]; then - usage - exit 1 -fi - -# source system and user makepkg.conf -if [ -r "$confdir/makepkg.conf" ]; then - source "$confdir/makepkg.conf" -else - error "$(gettext "%s not found. Cannot continue.")" "$confdir/makepkg.conf" - exit 1 # $E_CONFIG_ERROR -fi - -if [ -r ~/.makepkg.conf ]; then - source ~/.makepkg.conf -fi - -# main routine -gstmpdir=$(mktemp -d /tmp/repo-remove.XXXXXXXXXX) || (\ - error "$(gettext "Cannot create temp directory for database building.")"; \ - exit 1) - -success=0 -# parse arguments -for arg in "$@"; do - if [ -z "$REPO_DB_FILE" ]; then - REPO_DB_FILE=$(readlink -f "$arg") - if ! test_repo_db_file; then - error "$(gettext "Repository file '%s' is not a proper pacman database.")\n" "$REPO_DB_FILE" - exit 1 - elif [ -f "$REPO_DB_FILE" ]; then - msg "$(gettext "Extracting database to a temporary location...")" - bsdtar -xf "$REPO_DB_FILE" -C "$gstmpdir" - fi - else - msg "$(gettext "Searching for package '%s'...")" "$arg" - - if db_remove_entry "$arg"; then - success=1 - else - error "$(gettext "Package matching '%s' not found.")" "$arg" - fi - fi -done - -# if all operations were a success, re-zip database -if [ $success -eq 1 ]; then - msg "$(gettext "Creating updated database file '%s'...")" "$REPO_DB_FILE" - pushd "$gstmpdir" 2>&1 >/dev/null - - if [ -n "$(ls)" ]; then - [ -f "${REPO_DB_FILE}.old" ] && rm "${REPO_DB_FILE}.old" - [ -f "$REPO_DB_FILE" ] && mv "$REPO_DB_FILE" "${REPO_DB_FILE}.old" - case "$DB_COMPRESSION" in - gz) TAR_OPT="z" ;; - bz2) TAR_OPT="j" ;; - *) warning "$(gettext "No compression set.")" ;; - esac - - bsdtar -c${TAR_OPT}f "$REPO_DB_FILE" * - else - error "$(gettext "All packages have been removed from the database. Deleting '%s'.")" "$REPO_DB_FILE" - rm "$REPO_DB_FILE" - fi - - popd 2>&1 >/dev/null -else - msg "$(gettext "No packages modified, nothing to do.")" -fi - -# remove the temp directory used to unzip -[ -d "$gstmpdir" ] && rm -rf $gstmpdir - -# vim: set ts=2 sw=2 noet: diff --git a/scripts/updatesync.sh.in b/scripts/updatesync.sh.in deleted file mode 100644 index 5f5cc6c9..00000000 --- a/scripts/updatesync.sh.in +++ /dev/null @@ -1,172 +0,0 @@ -#!/bin/bash -# -# updatesync -# @configure_input@ -# -# Copyright (c) 2004 by Jason Chu <jason@archlinux.org> -# Derived from gensync (c) 2002-2006 Judd Vinet <jvinet@zeroflux.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/>. -# - -# gettext initialization -export TEXTDOMAIN='pacman' -export TEXTDOMAINDIR='@localedir@' - -myver='@PACKAGE_VERSION@' - -# functions - -usage() { - printf "updatesync (pacman) %s\n\n" "$myver" - printf "$(gettext "Usage: %s <action> <destfile> <option> [package_directory]")\n\n" "$0" - printf "$(gettext "\ -NOTE: this script is DEPRECATED. It will be removed in the next major\n\ -release of pacman, so please use repo-add and repo-remove instead.\n\n")" - printf "$(gettext "\ -updatesync will update a sync database by reading a PKGBUILD and\n\ -modifying the destfile. updatesync updates the database in a temporary\n\ -directory and then compresses it to <destfile>.\n\n")" - printf "$(gettext "There are two types of actions:\n\n")" - printf "$(gettext "upd - Will update a package's entry or create it if it doesn't exist.\n It takes the package's PKGBUILD as an option.\n")" - printf "$(gettext "del - Will remove a package's entry from the db. It takes the package's\n name as an option.\n")" - echo - printf "$(gettext "\ -updatesync will calculate md5sums of packages in the same directory as\n\ -<destfile>, unless an alternate [package_directory] is specified.\n\n")" - echo "$(gettext "Example: updatesync upd /home/mypkgs/custom.db.tar.gz PKGBUILD")" -} - -version() { - printf "updatesync (pacman) %s\n" "$myver" - printf "$(gettext "\ -Copyright (C) 2004 Jason Chu <jason@archlinux.org>.\n\n\ -This is free software; see the source for copying conditions.\n\ -There is NO WARRANTY, to the extent permitted by law.\n")" -} - -error () { - local mesg=$1; shift - printf "==> ERROR: ${mesg}\n" "$@" >&2 -} - -die () { - error $* - exit 1 -} - -check_force () { - local i - for i in ${options[@]}; do - local lc=$(echo $i | tr [:upper:] [:lower:]) - if [ "$lc" = "force" ]; then - true - fi - done - false -} - -# PROGRAM START - -# determine whether we have gettext; make it a no-op if we do not -if [ ! $(type -t gettext) ]; then - gettext() { - echo "$@" - } -fi - -if [ "$1" = "-h" -o "$1" = "--help" ]; then - usage - exit 0 -fi - -if [ "$1" = "-V" -o "$1" = "--version" ]; then - version - exit 0 -fi - -if [ $# -lt 3 ]; then - usage - exit 1 -fi - -# source system and user makepkg.conf -if [ -r @sysconfdir@/makepkg.conf ]; then - source @sysconfdir@/makepkg.conf -else - die "$(gettext "%s not found. Can not continue.")" "@sysconfdir@/makepkg.conf" -fi - -if [ -r ~/.makepkg.conf ]; then - source ~/.makepkg.conf -fi - -if [ "$1" != "upd" -a "$1" != "del" ]; then - usage - exit 1 -fi - -action=$1 -pkgdb=$2 -option=$3 -pkgdir="$(pwd)" -if [ "$4" != "" ]; then - pkgdir="$4" -fi -opt_force="" - -printf "$(gettext "\ -NOTE: this script is DEPRECATED. It will be removed in the next major\n\ -release of pacman, so please use repo-add and repo-remove instead.\n\n")" - -if [ "$action" = "upd" ]; then # INSERT / UPDATE - if [ ! -f "$option" ]; then - die "$(gettext "%s not found")" $option - fi - - unset pkgname pkgver pkgrel options - - source $option || die "$(gettext "failed to parse %s")" $option - if [ "$arch" = 'any' ]; then - CARCH='any' - fi - pkgfile="$pkgdir/$pkgname-$pkgver-$pkgrel-${CARCH}${PKGEXT}" - - if [ ! -f "$pkgfile" ]; then - die "$(gettext "could not find %s-%s-%s-%s%s - aborting")" $pkgname $pkgver $pkgrel $CARCH $PKGEXT - fi - - if check_force; then - opt_force="--force" - fi - - repo-add "$pkgdb" $opt_force "$pkgfile" -else # DELETE - fname="$(basename $option)" - if [ "$fname" = "PKGBUILD" ]; then - if [ ! -f "$option" ]; then - die "$(gettext "%s not found")" $option - fi - - unset pkgname pkgver pkgrel options - source $option - else - pkgname=$option - fi - - repo-remove "$pkgdb" "$pkgname" -fi - -exit 0 -# vim: set ts=2 sw=2 noet: |