diff --git a/Makefile b/Makefile index a00d031..8bfb78e 100644 --- a/Makefile +++ b/Makefile @@ -49,9 +49,6 @@ sed-rules = -e 's,@PREFIX@,${PREFIX},g' \ -e 's,@BEE_VERSION@,${BEE_VERSION},g' \ -e 's,@DATADIR@,${DATADIR},g' -sed-compat-bashlt4 = -e 'sx\$${\([a-zA-Z_]*\),,}x\$$(tr A-Z a-z <<<\$${\1})xg' \ - -e 'sx\$${\([a-zA-Z_]*\)^^}x\$$(tr a-z A-Z <<<\$${\1})xg' - PROGRAMS_C+=beecut PROGRAMS_C+=beeflock PROGRAMS_C+=beegetopt @@ -103,6 +100,7 @@ HELPER_HOOKS_SHELL+=gdk-pixbuf-query-loaders HELPER_HOOKS_SHELL+=mandb HELPER_HOOKS_SHELL+=systemd-tmpfiles HELPER_HOOKS_SHELL+=gconf-install-schemas +HELPER_HOOKS_SHELL+=info-dir MANPAGES+=bee.1 MANPAGES+=bee-check.1 @@ -119,23 +117,12 @@ CONFIG_TEMPLATES+=fallback CONFIG_FILES+=skiplist CONFIG_FILES+=beerc -COMPAT_BASHLT4+=beesh.sh -COMPAT_BASHLT4+=bee-check.sh -COMPAT_BASHLT4+=buildtypes/autogen.sh -COMPAT_BASHLT4+=buildtypes/configure.sh -COMPAT_BASHLT4+=buildtypes/make.sh - .SUFFIXES: .in .sh .sh.in all: build build: shellscripts buildtypes cprograms manpages -compat: compat-bashlt4 - -compat-bashlt4: ${COMPAT_BASHLT4} - $(call quiet-command, sed ${sed-compat-bashlt4} -i ${COMPAT_BASHLT4}, "COMPAT $^" ) - SHELLSCRIPTS=$(PROGRAMS_SHELL) $(HELPER_BEE_SHELL) $(HELPER_SHELL) BEEVERSION_OBJECTS=beeversion.o bee_version_parse.o bee_version_compare.o bee_version_output.o @@ -151,7 +138,7 @@ bee_MANPAGES=$(addprefix manpages/,${MANPAGES}) bee_BUILDTYPES=$(addsuffix .sh,$(addprefix buildtypes/,$(BUILDTYPES))) shellscripts: $(addsuffix .sh,$(SHELLSCRIPTS)) $(LIBRARY_SHELL) -cprograms: $(PROGRAMS_C) ${HELPER_BEE_C} ${HELPER_C} +cprograms: $(PROGRAMS_C) ${HELPER_C} manpages: ${bee_MANPAGES} buildtypes: ${bee_BUILDTYPES} @@ -177,7 +164,7 @@ beeflock: $(addprefix src/, ${BEEFLOCK_OBJECTS}) $(call quiet-command,${CC} ${LDFLAGS} -o $@ $^,"LD $@") bee-cache-inventory: $(addprefix src/, ${BEECACHEINVENTORY_OBJECTS}) - $(call quiet-command,${CC} ${LDFLAGS} -lcrypt -o $@ $^,"LD $@") + $(call quiet-command,${CC} ${LDFLAGS} -o $@ $^,"LD $@") %.o: %.c $(call quiet-command,${CC} ${CFLAGS} -o $@ -c $^,"CC $@") @@ -194,7 +181,6 @@ bee-cache-inventory: $(addprefix src/, ${BEECACHEINVENTORY_OBJECTS}) clean: $(call quiet-command,rm -f $(addsuffix .sh,${SHELLSCRIPTS}) $(LIBRARY_SHELL) $(HELPER_SHELL),"CLEAN .sh") $(call quiet-command,rm -f ${PROGRAMS_C},"CLEAN ${PROGRAMS_C}") - $(call quiet-command,rm -f ${HELPER_BEE_C},"CLEAN ${HELPER_BEE_C}") $(call quiet-command,rm -f ${HELPER_C},"CLEAN ${HELPER_C}") $(call quiet-command,rm -f src/*.o,"CLEAN c object files") $(call quiet-command,rm -f ${bee_MANPAGES},"CLEAN manpages") @@ -215,7 +201,7 @@ ${DESTDIR}${BINDIR}/%: % install-dir-bindir ${DESTDIR}${BINDIR}/%: %.sh install-dir-bindir $(call quiet-install,0755,$<,$@) -install-tools: $(addprefix ${DESTDIR}${LIBEXECDIR}/bee/bee.d/,${HELPER_BEE_SHELL} ${HELPER_BEE_C}) +install-tools: $(addprefix ${DESTDIR}${LIBEXECDIR}/bee/bee.d/,${HELPER_BEE_SHELL}) install-dir-tools: $(call quiet-installdir,0755,${DESTDIR}${LIBEXECDIR}/bee/bee.d) diff --git a/hooks/info-dir.sh b/hooks/info-dir.sh index 8c3d535..6d26038 100644 --- a/hooks/info-dir.sh +++ b/hooks/info-dir.sh @@ -44,7 +44,7 @@ fi . ${BEE_METADIR}/${pkg}/META -if [ ! "${BEEMETAFORMAT}" -ge 2 ] ; then +if [ ! "${BEEMETAFORMAT:=0}" -ge 2 ] ; then exit 0 fi @@ -63,4 +63,4 @@ case "${action}" in ${INSTALLINFO} --delete ${i} ${DIRFILE} >/dev/null done ;; -esac \ No newline at end of file +esac diff --git a/manpages/bee-update.1.in b/manpages/bee-update.1.in index c76da8a..0e18c8a 100644 --- a/manpages/bee-update.1.in +++ b/manpages/bee-update.1.in @@ -1 +1 @@ -.so bee-install.1 +.so man1/bee-install.1 diff --git a/src/bee-cache-inventory.c b/src/bee-cache-inventory.c index c97a325..588f3c5 100644 --- a/src/bee-cache-inventory.c +++ b/src/bee-cache-inventory.c @@ -59,6 +59,7 @@ struct item { char *type; char *filename; char *destination; + char free_destination; }; struct inventory_meta { @@ -146,6 +147,28 @@ int substitute(char *data, char from, char to) return 1; } +char *read_symlink(const char *filename) +{ + ssize_t ret; + char buffer[PATH_MAX + 1] = {0}; + char *copy; + + ret = readlink(filename, buffer, PATH_MAX); + + if (ret == -1) { + fprintf(stderr, "bee-cache-inventory: warning: " + "cannot restore empty symlink destination for file '%s': %m\n", filename); + return NULL; + } + + copy = strdup(buffer); + + if (!copy) + fprintf(stderr, "bee-cache-inventory: read_symlink: strdup: %m\n"); + + return copy; +} + BEE_STATIC_INLINE char *_extract_pattern(struct item *item, char **dest, char *hint, char *pattern, char size, int failok) { char *p; @@ -182,12 +205,17 @@ int do_separation(char *line, struct item *item) /* get possible symlink destination */ q = strstr(item->filename, "//"); if (q) { + *q = '\0'; item->destination = q + 2; + if (!*item->destination) { - fprintf (stderr, "bee-cache-inventory: syntax error: empty destination for file '%s'\n", item->filename); - return 0; + item->destination = read_symlink(item->filename); + + if (!item->destination) + item->destination = item->filename; + else + item->free_destination = 1; } - *q = '\0'; } *(p-6) = 0; @@ -344,6 +372,9 @@ int inventory_fhfh(FILE *infh, FILE *outfh, struct inventory_meta meta) print_item(outfh, item, meta); + if (item.free_destination) + /* symlink destination was generated by read_symlink */ + free(item.destination); } return 1; diff --git a/src/bee-cache-update.sh.in b/src/bee-cache-update.sh.in index b0e9b59..3f6f20a 100644 --- a/src/bee-cache-update.sh.in +++ b/src/bee-cache-update.sh.in @@ -48,6 +48,7 @@ function create_pkgbcfile() if [ ! -d "${PKGMETADIR}" ] ; then # cleanup cache if metadir does not exist rm -f "${PKGBCFILE}" "${PKGBCRFILE}" + return 0 elif [ ! -e "${CONTENTFILE}" ] ; then if [ -e "${PKGBCFILE}" ] ; then print_info "moving ${PKGBCFILE} to ${PKGBCRFILE}.." diff --git a/src/bee-init.sh.in b/src/bee-init.sh.in index 7e5d115..dbaf4f9 100644 --- a/src/bee-init.sh.in +++ b/src/bee-init.sh.in @@ -155,7 +155,7 @@ function create_beefile_from_template { function initialize() { surl=${1} - shift + [ ! -z "${surl}" ] && shift pname=${OPT_OUTPUT} @@ -398,7 +398,7 @@ while true ; do *) shift - if [ -z "${1}" ] ; then + if [ -z "${1}" -a -z "${OPT_OUTPUT}" ] ; then usage exit 1 fi diff --git a/src/beelib.config.sh.in b/src/beelib.config.sh.in index 9d63f6f..1cd1586 100644 --- a/src/beelib.config.sh.in +++ b/src/beelib.config.sh.in @@ -366,6 +366,7 @@ function config_export() { export BEE_TMP_TMPDIR export BEE_TMP_BUILDROOT + export BEE_BINDIR export BEE_SYSCONFDIR export BEE_DATADIR export BEE_LIBEXECDIR diff --git a/src/beesh.sh.in b/src/beesh.sh.in index 07b4557..e18f25b 100644 --- a/src/beesh.sh.in +++ b/src/beesh.sh.in @@ -534,7 +534,7 @@ function bee_pkg_pack() { ${D}/CONTENT ) beefilename=${BEE##*/} - beefiledest=${BEE_BEEDIR}/${beefilename} + beefiledest=${BEE_BEEDIR}/${PKGALLPKG}.bee print_info "-> saving bee-file ${beefilename} .." print_info "${COLOR_CYAN}${beefiledest}" @@ -543,7 +543,7 @@ function bee_pkg_pack() { mkdir -pv ${BEE_BEEDIR} fi - cp -v ${BEE} ${BEE_BEEDIR} + cp -v ${BEE} ${beefiledest} } @@ -569,7 +569,7 @@ function bee_archivebuild() { --absolute-names \ ${S} ${B} \ ${bee_FETCHED_FILES[@]} \ - ${BEE_BEEDIR}/${BEE##*/} \ + ${BEE_BEEDIR}/${PKGALLPKG}.bee \ --transform="s,^${BEEWORKDIR},${PKGALLPKG}," \ --transform="s,^${F},${PKGALLPKG}/files," \ --transform="s,^${BEE_BEEDIR},${PKGALLPKG}/files," @@ -600,6 +600,81 @@ function load_buildmagic() { fi } +function save_current_package_variables() { + oPKGNAME=${PKGNAME} + oPKGEXTRANAME=${PKGEXTRANAME} + oPKGFULLNAME=${PKGFULLNAME} + oPKGVERSION=${PKGVERSION} + oPKGEXTRAVERSION=${PKGEXTRAVERSION} + oPKGFULLVERSION=${PKGFULLVERSION} + oPKGREVISION=${PKGREVISION} +} + +function verify_new_package_variables() { + nPKGFULLNAME="${PKGNAME}${PKGEXTRANAME:+_${PKGEXTRANAME}}" + + if [ "${oPKGFULLNAME}" != "${PKGFULLNAME}" ] ; then + if [ "${oPKGFULLNAME}" != "${nPKGFULLNAME}" ] ; then + print_error "${BEE##*/}: Changing PKGFULLNAME and one of PKGNAME or PKGEXTRANAME is not supported." + exit 1 + fi + PKGNAME=${PKGFULLNAME//_*} + PKGEXTRANAME=${PKGFULLNAME#*_} + fi + PKGFULLNAME="${PKGNAME}${PKGEXTRANAME:+_${PKGEXTRANAME}}" + + nPKGFULLVERSION="${PKGVERSION}${PKGEXTRAVERSION:+_${PKGEXTRAVERSION}}" + if [ "${oPKGFULLVERSION}" != "${PKGFULLVERSION}" ] ; then + if [ "${oPKGFULLVERSION}" != "${nPKGFULLVERSION}" ] ; then + print_error "${BEE##*/}: Changing PKGFULLVERSION and one of PKGVERSION or PKGEXTRAVERSION is not supported." + exit 1 + fi + PKGVERSION=${PKGFULLVERSION//_*} + PKGEXTRAVERSION=${PKGFULLVERSION#*_} + fi + PKGFULLVERSION="${PKGVERSION}${PKGEXTRAVERSION:+_${PKGEXTRAVERSION}}" +} + +function extract_new_package_variables() { + if [ "${PKGNAME}" != "${oPKGNAME}" ] ; then + # pkgname changed! we allow prefixing 'anything-' to the packagename + if [ "${PKGNAME}" != "${PKGNAME/-${oPKGNAME}}-${oPKGNAME}" ] ; then + print_error "${BEE##*/}: Invalid change in PKGNAME(${PKGNAME}) detected. Only prefixing 'something-' is supported." + exit 1 + fi + print_info "${COLOR_YELLOW}PKGNAME changed from '${oPKGNAME}' to '${PKGNAME}'" + fi + if [ "${PKGEXTRANAME}" != "${oPKGEXTRANAME}" ] ; then + if [ ! -z "${oPKGEXTRANAME}" -a "${PKGEXTRANAME}" != "${oPKGEXTRANAME}_${PKGEXTRANAME#${oPKGEXTRANAME}_}" ] ; then + print_error "${BEE##*/}: Invalid change in PKGEXTRANAME(${PKGEXTRANAME}) detected. Only appending '_something' is supported." + exit 1 + fi + print_info "${COLOR_YELLOW}PKGEXTRANAME changed from '${oPKGEXTRANAME}' to '${PKGEXTRANAME}'" + fi + if [ "${PKGVERSION}" != "${oPKGVERSION}" ] ; then + print_error "${BEE##*/}: Invalid change in PKGVERSION(${PKGVERSION}) detected. Changing PKGVERSION is not supported." + exit 1 + fi + if [ "${PKGEXTRAVERSION}" != "${oPKGEXTRAVERSION}" ] ; then + if [ ! -z "${oPKGEXTRAVERSION}" -a "${PKGEXTRAVERSION}" != "${oPKGEXTRAVERSION}_${PKGEXTRAVERSION#${oPKGEXTRAVERSION}_}" ] ; then + print_error "${BEE##*/}: Invalid change in PKGEXTRAVERSION(${PKGEXTRAVERSION}) detected. Only appending '_something' is supported." + exit 1 + fi + print_info "${COLOR_YELLOW}PKGEXTRAVERSION changed from '${oPKGEXTRAVERSION}' to '${PKGEXTRAVERSION}'" + fi + if [ "${PKGREVISION}" != "${oPKGREVISION}" ] ; then + print_error "${BEE##*/}: Invalid change in PKGREVISION(${PKGREVISION}) detected. Changing PKGREVISION is not supported." + exit 1 + fi + + PKGFULLPKG=${PKGFULLNAME}-${PKGFULLVERSION}-${PKGREVISION} + + # since PKGARCH is now known reconstruct PKGALLPKG + : ${PKGALLPKG:=${PKGFULLPKG}.${PKGARCH}} + + eval $(${BEE_BINDIR}/beeversion ${PKGALLPKG}) +} + ############################################################################### ############################################################################### ############################################################################### @@ -764,12 +839,7 @@ if [ -z "${PKGNAME}" -o -z "${PKGVERSION}" -o -z "${PKGREVISION}" ] ; then exit 1 fi -PN=${PKGNAME} PV=( ${PKGVERSION[@]} ) -PS=${PKGEXTRAVERSION} -PR=${PKGREVISION} - -P=${PKGFULLNAME}-${PKGFULLVERSION} BEEPKGROOT="${BEE_TMP_BUILDROOT}/${PKGNAME}" BEEWORKDIR="${BEEPKGROOT}/${PKGFULLPKG}" @@ -787,14 +857,16 @@ D=${BEEWORKDIR}/image # clear PKGALLPKG since we can't trust PKGARCH in this state PKGALLPKG= +save_current_package_variables + # source file.bee . ${BEE} # now set PKGARCH if set or changed by user via ARCH=.. and not given via file.arch.bee : ${PKGARCH:=${ARCH}} -# since PKGARCH is now known reconstruct PKGALLPKG -: ${PKGALLPKG:=${PKGFULLPKG}.${PKGARCH}} +verify_new_package_variables +extract_new_package_variables config_handle_deprecated_beefile expand_prefix_variables diff --git a/src/filelist2content.sh.in b/src/filelist2content.sh.in index 22b2d6e..9600b1d 100644 --- a/src/filelist2content.sh.in +++ b/src/filelist2content.sh.in @@ -113,9 +113,10 @@ function do_f2c() { exit 1 fi - echo -n ":md5=${md5%% *}" + echo -n ":md5=${md5%% *}" elif [ "${type}" = "symlink" ] ; then - file="${file}//$(readlink ${root}${file})" + target=$(readlink ${root}${file}) + file="${file}//${target#${root}}" elif [ "${type}" = "block" -o "${type}" = "char" ] ; then echo -n ":major=${major}" echo -n ":minor=${minor}"