diff --git a/make/defs.mk b/make/defs.mk index 7e778b07..b5d38455 100644 --- a/make/defs.mk +++ b/make/defs.mk @@ -113,7 +113,7 @@ reverse = $(if $(wordlist 2,2,$(1)),$(call reverse,$(wordli make_subdirs = set -e; for D in $(SUBDIRS) ; do make -C $$D ; done make_subdirs_target = set -e; for D in $(SUBDIRS) ; do make -C $$D $@; done install_local_cfg = $(INSTALL) -p -o $(CFGOWNER) -g $(CFGGROUP) -m $(CFGMODE) $< $@ -cvs_files = sh $(JWB_SCRIPT_DIR)/scm.sh ls-files -f +cvs_files = sh $(JWB_SCRIPT_DIR)/scm.sh ls-files add_flavour_prefix = $(SED) "s/\([^ ][^ ]*\) *\([<>=]*\) *\([^ ]*\)/$(FLAVOUR_PREFIX)\1 \2 \3/g" beautify_lib_path = $(SED) 's/:/\n + /g' find_files = $(wildcard $(addsuffix /$(1),$(patsubst :, ,$(2)))) diff --git a/make/list-files.mk b/make/list-files.mk index 681c5724..ff9b6dd5 100644 --- a/make/list-files.mk +++ b/make/list-files.mk @@ -10,9 +10,9 @@ list-text-files echo-text-files: $(Q)$(LIST_VCS_FILES) -ft tar-files: - $(Q)$(LIST_VCS_FILES) $(TOPDIR) -f | xargs tar -C $(TOPDIR) -cf - + $(Q)$(LIST_VCS_FILES) $(TOPDIR) | xargs tar -C $(TOPDIR) -cf - cpio-files: - $(Q)$(LIST_VCS_FILES) $(TOPDIR) -f | cpio --directory=$(TOPDIR) -o -H newc + $(Q)$(LIST_VCS_FILES) $(TOPDIR) | cpio --directory=$(TOPDIR) -o -H newc endif # ifndef LIST_FILES_MK_INCLUDED diff --git a/make/pkg-dist.mk b/make/pkg-dist.mk index 879bfc54..c5dee869 100644 --- a/make/pkg-dist.mk +++ b/make/pkg-dist.mk @@ -25,9 +25,9 @@ RELEASES_FILE = $(TOPDIR)/RELEASES$(FLAVOUR_SUFFIX) RELEASES ?= $(shell $(PKG_SH_EXE) version \ -p $(OS_NAME_VERSION)/$(PKG_ARCH) $(RELEASES_FILE) read | $(SED) 's/-dev//') PKG_CHECK_VCS_SYNC_BEFORE_RELEASE ?= true -HASH = $(shell $(cvs_files) -z | \ +HASH = $(shell $(cvs_files) -s -z | \ grep -vz "CHANGES\|VERSION\|HASH\|MD5SUMS\|RELEASES" | \ - xargs -0 md5sum | md5sum | $(SED) 's/ .*//') + md5sum | $(SED) 's/ .*//') LOCAL_REPO ?= /srv/dav/pub/local/packages/suse/$(OS_NAME_VERSION) PACKAGE_VCS_FILES ?= false diff --git a/scripts/pkg.sh b/scripts/pkg.sh index 39adaf3b..31cf398d 100644 --- a/scripts/pkg.sh +++ b/scripts/pkg.sh @@ -101,18 +101,22 @@ scm_files() { ( cd $TOPDIR - /bin/bash $JWB_SCRIPT_DIR/scm.sh ls-files -f "$@" + /bin/bash $JWB_SCRIPT_DIR/scm.sh ls-files "$@" ) } calculate_hash() { - ( + local h + h=`( + set -o pipefail cd $TOPDIR - scm_files -z | \ + scm_files -s -z | \ grep -vz "CHANGES\|VERSION\|HASH\|MD5SUMS\|RELEASES" | \ - xargs -0 md5sum | md5sum | sed 's/ .*//' - ) + md5sum | sed 's/ .*//' + )` || fatal "failed to calculate source hash" + [ -n "$h" ] || fatal "failed to calculate source hash" + echo $h } check_scm() @@ -180,6 +184,7 @@ check_next_version() return fi local h=`calculate_hash` + [ -n "$h" ] || fatal "failed to calculate source hash" if [ ! -f $TOPDIR/HASH ]; then echo "+ $PKG_PROJECT has no HASH file, needs release" >&2 echo $v @@ -602,6 +607,7 @@ upload_pkg() local p local v=`read_map $TOPDIR/VERSION | sed 's/-dev//'` local h=`calculate_hash` + [ -n "$h" ] || fatal "failed to calculate source hash" case $PKG_FORMAT in rpm) server=pkg.janware.com diff --git a/scripts/scm.sh b/scripts/scm.sh index 5dfbf80e..ca482409 100644 --- a/scripts/scm.sh +++ b/scripts/scm.sh @@ -121,7 +121,17 @@ cmd_ls_files() local opts="$git_ls_files_opts" git --version | grep -q "version *1" && opt_no_submodules=1 [ "$opt_no_submodules" = 1 ] || opts="$opts --recurse-submodules" - git ls-files --recurse-submodules $opts $1 + if [ "$opt_only_regular_files" != 1 ]; then + git ls-files --recurse-submodules $opts $1 + else + local entry meta + while IFS= read -r -d '' entry; do + meta=${entry%%$'\t'*} + case ${meta%% *} in + 100644|100755) output "${entry#*$'\t'}" ;; + esac + done < <(git ls-files -s -z --recurse-submodules $opts $1) + fi if [ "$include_vcs_files" = 1 -a -d .git ]; then output_find .git fi @@ -140,7 +150,33 @@ cmd_ls_files() list_dirents_git $1 } - set -- `getopt fnzta "$@"` + list_dirents_git_ids() + { + local entry meta mode sha + while IFS= read -r -d '' entry; do + meta=${entry%%$'\t'*} + mode=${meta%% *} + sha=${meta##* } + [ "$opt_no_submodules" = 1 ] && [ "$mode" = 160000 ] && continue + [ "$opt_only_regular_files" = 1 ] && [ "$mode" != 100644 ] && [ "$mode" != 100755 ] && continue + output "$sha ${entry#*$'\t'}" + done < <(git ls-tree -r -z HEAD "$1") + } + + list_dirents_ids() + { + if [ -d $1/CVS ]; then + echo "failed to list file ids in $(realpath $1): $scm has no file ids" >&2 + exit 1 + fi + git -C $1 status >/dev/null 2>&1 || { + echo "failed to list file ids in $(realpath $1): no VCS" >&2 + exit 1 + } + list_dirents_git_ids $1 + } + + set -- `getopt fnzsta "$@"` while [ "$1" != -- ]; do case $1 in @@ -150,6 +186,9 @@ cmd_ls_files() -n) opt_no_submodules=1 ;; + -s) + show_ids=1 + ;; -z) zero_terminate=1 git_ls_files_opts="$git_ls_files_opts -z" @@ -171,6 +210,8 @@ cmd_ls_files() if [ "$text_files" ]; then list_dirents . | sort $opt_sort | xargs file -N | grep ":.*text" | cut -d: -f1 + elif [ "$show_ids" = 1 ]; then + list_dirents_ids . | sort $opt_sort -k2 else list_dirents . | sort $opt_sort fi