This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository buildscripts. commit 92b0df7405fdbe05691c14ea52241b768b85be8b Author: Mihai Moldovan <ionic@ionic.de> Date: Sat Oct 29 01:16:30 2016 +0200 bin/build-rpm-package: implement cache_mock_config () and use it in generate_mock_config (). --- bin/build-rpm-package | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/bin/build-rpm-package b/bin/build-rpm-package index 57b7787..c46dc00 100755 --- a/bin/build-rpm-package +++ b/bin/build-rpm-package @@ -71,6 +71,7 @@ test -f "${HOME}/.buildscripts/${PREFIX}.conf" && . "${HOME}/.buildscripts/${PRE TMP_MOCK_CFG_DIR="" TMP_MOCK_CFG_FILE="" TEMP_BASE="${HOME}/tmp/" +MOCK_CACHE_DIR="${HOME}/mock-cache/" typeset -ag temp_cleanup # End of non-user-serviceable part. @@ -131,6 +132,9 @@ set_vars() { mkdir -p -- "${TEMP_BASE}" chmod 2770 -- "${TEMP_BASE}" + mkdir -p -- "${MOCK_CACHE_DIR}" + chmod 2770 -- "${MOCK_CACHE_DIR}" + # first argv is the name of the Git project PROJECT_PATH="${1}" PROJECT_PATH="${PROJECT_PATH/%.git/}" @@ -419,9 +423,73 @@ create_mock_config () { # MOCK_BASE CUSTOM_REPO COMPONENT TARGET # Reset input field separator to its original value. IFS="${OLDIFS}" + # Cache config file to work around mock constantly rebuilding its cache if the + # config file's modification time is newer than the cache, even though the + # the config file's content didn't change between runs. + cache_mock_config + return 0 } +# Either caches, updates or uses a cached mock config file. +# +# Calling this function in a subshell is an error, as it NEEDS to modify +# variables in global scope! +cache_mock_config () { + # Check argument sanity. + + typeset tmp_mock_config="${TMP_MOCK_CFG_FILE}" + + # Append .cfg if not already specified. + typeset tmp_regex='^.*\.cfg$' + if [[ ! "${tmp_mock_config}" =~ ${tmp_regex} ]]; then + echo "Error: mock temporary config path must end in '.cfg'." >&2 + exit 1 + fi + + # Must exist and be readable. + if [ ! -f "${tmp_mock_config}" ] || [ ! -r "${tmp_mock_config}" ]; then + echo "Error: ${tmp_mock_config} parameter must exist, be a regular file and readable." >&2 + exit 1 + fi + + # Fetch file name only and delete the extension. + typeset mock_cache_file_name="$(basename -s '.cfg' "${tmp_mock_config}")" + typeset tmp="${mock_cache_file_name}" + mock_cache_file_name="${mock_cache_file_name%.*}" + + if [ "${mock_cache_file_name}" = "${tmp}" ]; then + echo "Error: unable to remove the random suffix of the temporary config file name '${tmp}'." >&2 + exit 1 + fi + + typeset mock_cache_file_path="${MOCK_CACHE_DIR}/${mock_cache_file_name}" + if [ -f "${mock_cache_file_path}" ]; then + # A cached config file exists. + if [ -r "${mock_cache_file_path}" ]; then + # It's also readable. Compare it. + cmp "${TMP_MOCK_CFG_FILE}" "${mock_cache_file_path}" && { + echo "Cached mock config file matches generated one, using the cached file." >&2 + } || { + echo "Refreshing cached mock config file due to differing content." >&2 + cp -av "${TMP_MOCK_CFG_FILE}" "${mock_cache_file_path}" + } + else + echo "Error: a cached mock config file already exists as '${mock_cache_file_path}', but is not readable." >&2 + exit 1 + fi + else + # No cached config file exists yet, copy the file + # and set it as the new mock config file. + echo "Caching mock config file." + cp -av "${TMP_MOCK_CFG_FILE}" "${mock_cache_file_path}" + fi + + TMP_MOCK_CFG_FILE="${mock_cache_file_path}" + + return "0" +} + # Fetches extras repositories, if requested. # Takes the build system type (suse or redhat -- implicitly means OBS or mock), # the distribution, its version (either a real number or a codename), -- Alioth's /srv/git/code.x2go.org/buildscripts.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/buildscripts.git