#!/bin/bash # Copyright (C) 2007-2010 Matias A. Fonzo, Santiago del Estero, AR # # 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 . # Localización: TEXTDOMAINDIR=/usr/share/locale TEXTDOMAIN=makepkg VERSION=3.2 # Funciones # msg() { printf '%s\n' "$@"; } usage() { msg $"Makes a Dragora compatible package." \ "" \ $"Usage: makepkg [options] package.tlz" \ "" \ "Options:" \ $" -h, --help Show this help and exit." \ $" -v, --version Show the version of the program." \ $" -l, --links Make or add (if it already exists)" \ $" found symlinks to post-install script." \ "" \ $"Keywords:" \ $" prepend Keyword to use in conjunction with the" \ $" --links option. This is to prepend the" \ $" symlinks, rather than the commands." \ "" \ $"Format of the package:" \ "" \ " bash-01.02.3-i486-1.tlz" \ $" name-version-architecture-buildnumber.extension" \ "" } version() { msg "makepkg $VERSION" \ "Copyright (C) 2007-2010 Matias A. Fonzo ." \ "License GPLv3+: GNU GPL version 3 or later:" \ "" \ "This is free software: you are free to change and redistribute it." \ "There is NO WARRANTY, to the extent permitted by law." } # Opciones: while (( $# )); do case "$1" in -l|--links) OPT=LINKS FILE=post-install if [[ $2 = prepend ]]; then FILE=pre-post shift fi shift ;; -[h?]|--help) usage exit ;; -[vV]|--version) version exit ;; -*) msg $"Invalid option: $1" \ $"For more information, type: $0 --help" exit 1 ;; *) break; esac done # Si no hay argumentos, llama a la función de ayuda: (( $# == 0 )) && { usage ; exit; } # Sale ante cualquier error: set -e # Más funciones # # Una función para mensajes de advertencia: warn() { printf '%b\n' "$@" >&2; } # Una función que muere con `set -e': die() { local status status="$?" case "$2" in *) status="$2";; esac warn "$1" return $status } # Cuerpo # PKG="$1" DIR=$(dirname "$PKG") PKG=${PKG##*/} TAR=${PKG%.tlz} # Chequeo de sanidad: if [[ $DIR = . ]]; then die $"makepkg: Cannot create the package on the current working directory." 1 fi if [[ $TAR = $PKG ]]; then die $"makepkg: Package format (${PKG}) not supported." 1 fi # Imprime el banner: msg "" $"The package maker of Dragora GNU/Linux in his version ${VERSION}." "" # Imprime un mensaje ante la presencia de los scripts de instalación: if [[ -e install/pre-post ]]; then msg $"[-] install/pre-post: Detected." fi if [[ -e install/post-install ]]; then msg $"[-] install/post-install: Detected." fi umask 022 # Comprobamos si la opción de agregar enlaces está activada: if [[ $OPT = LINKS ]]; then msg "" $"Searching symbolic links to add to the post-install script ..." "" if [[ -e install/post-install ]]; then msg $"An existing installation script (install/post-install) has" \ $"been detected. If found any symlink, this will be added to" \ $"the current installation script." "" fi # Crea o agrega al script de post-instalación los enlaces encontrados: mkdir -p install find . -type l -printf '%P\n' | while read file ; do name=${file##*/} target=$(readlink $file) msg "# Link: $file -> $target" \ "( cd $(dirname $file)" \ " rm -rf $name" \ " ln -sf $target $name" \ ")" "" \ >> install/${FILE} msg "@ $file -> $target" done # Remueve los enlaces encontrados (que más tarde serán recreados): msg "" $"Removing symbolic links:" find . -type l -delete -printf $"removed: %P\n" rmdir install/ > /dev/null 2>&1 || true; fi msg "" $"Creating package $PKG ..." ( LC_ALL=C tar cvf - . | lzip -9c -vv ) > "${DIR}/$PKG" # Advierte sobre posibles archivos vacios: find . -type f -empty | while read file ; do msg $"WARNING: Empty file: ${file#./}" done # Advierte sobre posibles archivos comprimidos vacíos: find . -type f -name '*.gz' | while read file ; do if [[ $(gzip -l $file | awk 'END { print $2 }') -eq 0 ]]; then msg $"WARNING: Empty gzipped file: ${file#./}" fi done # Advierte sobre posibles enlaces rotos: find . -xtype l | while read file ; do msg $"WARNING: Broken symlink: ${file#./}" done msg "" $"Package created: ${DIR}/$PKG" ""