addon update scripts: refactor repo fetching and package updating

Kodi binary and game addons always reference branches in the addon
repo. The only exception is the kodi-platform package which references
a githash.

This allows us to simplify remote repo fetch and tag / branch HEAD
resolving: we don't need named branches in the working copy but can
simply query remote branches or use a detached branch if we need the
actual contents.

With this change the same (out-of-tree) directory containing cloned
repos can be used to update both kodi Leia and master addon versions,
without needing another clone.

Also refactor the package update code, drop update_to_latest_tag from
common functions (it was only used by update_binary-addons,
update_retroplayer-addons needs slightly different logic) and use
update_pkg function. update_retroplayer-addons now also uses update_pkg
instead of duplicating nearly identical code.

Several variable names have been cleaned up to follow a common naming
pattern.

Signed-off-by: Matthias Reichl <hias@horus.com>
This commit is contained in:
Matthias Reichl 2019-07-12 11:53:47 +02:00
parent 3e97dce6c5
commit 38a137c923
3 changed files with 86 additions and 105 deletions

View File

@ -58,20 +58,18 @@ rm -rf "${TMPDIR}"
mkdir -p "${TMPDIR}"
KODI_BRANCH="$1"
KODI_DIR="kodi-${KODI_BRANCH}.git"
KODI_DIR="kodi.git"
. "${MY_DIR}/update_common_functions"
if [ ! -d ${KODI_DIR} ] ; then
git_clone https://github.com/xbmc/xbmc ${KODI_BRANCH} ${KODI_DIR}
fi
git_clone https://github.com/xbmc/xbmc ${KODI_DIR} ${KODI_BRANCH}
# kodi-platform
# kodi-platform, points to repo+githash
REPO=$(cat $KODI_DIR/cmake/addons/depends/common/kodi-platform/kodi-platform.txt | awk '{print $2}')
GIT_HASH=$(cat $KODI_DIR/cmake/addons/depends/common/kodi-platform/kodi-platform.txt | awk '{print $3}')
PKG_NAME="kodi-platform"
git_clone $REPO master $PKG_NAME.git $GIT_HASH
git_clone $REPO $PKG_NAME.git
if [ -f "${ROOT}/packages/mediacenter/kodi-platform/package.mk" ] ; then
# update package.mk
RESOLVED_HASH=$(resolve_hash $PKG_NAME.git $GIT_HASH)
@ -84,30 +82,60 @@ fi
# addons
for addontxt in $KODI_DIR/cmake/addons/bootstrap/repositories/*-addons.txt ; do
ADDONS=$(cat $addontxt | awk '{print $1}')
ADDONREPO=$(cat $addontxt | awk '{print $2}')
GIT_HASH=$(cat $addontxt | awk '{print $3}')
git_clone $ADDONREPO ${KODI_BRANCH} $ADDONS.git $GIT_HASH
for addon in $ADDONS.git/*.*/ ; do
ADDONS_GIT_DIR="${ADDONS}.git"
ADDONS_GIT_REPO=$(cat $addontxt | awk '{print $2}')
ADDONS_GIT_BRANCH=$(cat $addontxt | awk '{print $3}')
git_clone $ADDONS_GIT_REPO $ADDONS_GIT_DIR ${ADDONS_GIT_BRANCH}
for addon in $ADDONS_GIT_DIR/*.*/ ; do
ADDON=$(basename $addon)
[[ ${ADDON} =~ ^game.* ]] && continue # ignore game.* addons - handled by update_retroplayer-addons
check_package_excluded "${ADDON}" "${EXCLUDED_PACKAGES}" && continue
REPO=$(cat $addon/$ADDON.txt | awk '{print $2}')
GIT_HASH=$(cat $addon/$ADDON.txt | awk '{print $3}')
GIT_DIR="${ADDON}.git"
GIT_REPO=$(cat ${addon}/${ADDON}.txt | awk '{print $2}')
GIT_BRANCH=$(cat ${addon}/${ADDON}.txt | awk '{print $3}')
if ! grep -q all $addon/platforms.txt && ! grep -q linux $addon/platforms.txt && ! grep -q ! $addon/platforms.txt; then
if ! grep -q all ${addon}/platforms.txt && ! grep -q linux ${addon}/platforms.txt && ! grep -q ! ${addon}/platforms.txt; then
continue
fi
ADDON_PATH="${ROOT}/packages/mediacenter/kodi-binary-addons/$ADDON/"
ADDON_PATH="${ROOT}/packages/mediacenter/kodi-binary-addons/${ADDON}/"
if [ -f "${ADDON_PATH}/package.mk" ] ; then
# Verify the Kodi repo matches our package repo
# If different, ignore the addon and process it later as an "unofficial" addon
validate_pkg_url "$ADDON" "$REPO" || continue
validate_pkg_url "${ADDON}" "${GIT_REPO}" || continue
update_to_latest_tag "${ADDON_PATH}" ${ADDON} ${REPO} ${KODI_BRANCH} ${GIT_HASH}
git_clone ${GIT_REPO} ${GIT_DIR} ${GIT_BRANCH}
NO_TAG=""
NEW_VERSION=$(resolve_tag_in_branch ${GIT_DIR} ${GIT_BRANCH})
if [ -z "${NEW_VERSION}" ]; then
NO_TAG="yes"
echo "========================================================================"
msg_warn "WARNING: no tag found for addon ${ADDON}, falling back to HEAD"
echo "========================================================================"
NEW_VERSION=$(resolve_hash_in_branch "${GIT_DIR}" "${GIT_BRANCH}")
fi
echo "Resolved version for ${ADDON}: ${GIT_BRANCH} => ${NEW_VERSION}"
if update_pkg "${ADDON_PATH}" ${ADDON} ${NEW_VERSION}; then
if [ -n "${NO_TAG}" ]; then
# always bump PKG_REV on updates as we have no info if version changed
bump_pkg_rev "${ADDON_PATH}" "${ADDON}"
else
reset_pkg_rev "${ADDON_PATH}" "${ADDON}"
fi
else
[ "${BUMP_PKG_REV}" = "yes" ] && bump_pkg_rev "${ADDON_PATH}" "${ADDON}"
fi
if [ "${KEEP_GIT_DIRS}" != "yes" ]; then
rm -rf "${GIT_DIR}"
fi
else
echo "[mkpkg] Skipped $ADDON"
SKIPPED_ADDONS="$SKIPPED_ADDONS $ADDON"
@ -131,12 +159,13 @@ for ADDON in $(ls -1 "${ROOT}/packages/mediacenter/kodi-binary-addons"); do
check_package_excluded "${ADDON}" "${EXCLUDED_PACKAGES}" && continue
# Obtain git url - ignore if not a suitable repo
REPO="$(geturl "${ADDON}")" || continue
GIT_DIR="${ADDON}.git"
GIT_REPO="$(geturl "${ADDON}")" || continue
git_clone $REPO ${KODI_BRANCH} $ADDON.git HEAD
git_clone ${GIT_REPO} ${GIT_DIR}
# update package.mk for stale github.com packages
RESOLVED_HASH=$(resolve_hash ${ADDON}.git HEAD) || continue
RESOLVED_HASH=$(resolve_hash_in_branch ${ADDON}.git HEAD) || continue
echo "Resolving hash for ${ADDON}: HEAD => ${RESOLVED_HASH}"
if update_pkg "${ROOT}/packages/mediacenter/kodi-binary-addons/$ADDON" ${ADDON} ${RESOLVED_HASH}; then
# always bump PKG_REV when updating untagged addons
@ -144,7 +173,7 @@ for ADDON in $(ls -1 "${ROOT}/packages/mediacenter/kodi-binary-addons"); do
fi
if [ "${KEEP_GIT_DIRS}" != "yes" ]; then
rm -rf $ADDON.git
rm -rf ${GIT_DIR}
fi
done

View File

@ -23,31 +23,18 @@ msg_info() {
}
git_clone() {
# git_clone https://repo.url branch ./target_dir [githash]
# git_clone https://repo.url target_dir [branch]
echo "[mkpkg] Checking out $1 ..."
if [ ! -d "$3" ]; then
git clone "$1" "$3"
# Try to switch to specified branch if it exist, if not then use default branch
if [ -n "$2" ]; then
cd "$3"
git checkout $2 >/dev/null 2>/dev/null
cd ..
fi
if [ ! -d "$2" ]; then
git clone "$1" "$2"
else
if [ -d "$3" ] ; then
cd "$3"
git checkout $2 >/dev/null 2>/dev/null
git pull
cd ..
fi
cd "$2"
git fetch
cd ..
fi
if [ ! -z "$4" ] ; then
cd "$3"
git fetch >/dev/null 2>/dev/null
git branch -D $4 >/dev/null 2>/dev/null
git checkout $4 >/dev/null 2>/dev/null
git checkout -b ref-$4 >/dev/null 2>/dev/null
if [ -n "$3" ]; then
cd "$2"
git checkout -q origin/"$3";
cd ..
fi
}
@ -66,10 +53,17 @@ resolve_hash() {
fi
}
resolve_tag() {
resolve_hash_in_branch() {
if [ -d "$1" ] ; then
cd "$1"
git describe --abbrev=0 --tags $2 2>/dev/null
git rev-parse origin/$2 2>/dev/null
fi
}
resolve_tag_in_branch() {
if [ -d "$1" ] ; then
cd "$1"
git describe --abbrev=0 --tags origin/$2 2>/dev/null
fi
}
@ -140,47 +134,14 @@ update_pkg() {
download_pkg_file "${pkg_name}"
set_pkg_sha256 "${pkg_path}"
msg_info "UPDATED ${pkg_name} from ${old_version} to ${pkg_version}"
return 0
else
return 1
fi
}
update_to_latest_tag() {
local pkg_path="$1" pkg_name="$2" repo="$3" branch="$4" ref="$5"
local gitdir=${pkg_name}.git
local resolved_version
local no_tag=""
git_clone "${repo}" "${branch}" "${gitdir}" "${ref}"
resolved_version=$(resolve_tag "${gitdir}" "${ref}")
if [ -z "${resolved_version}" ]; then
no_tag="yes"
echo "========================================================================"
msg_warn "WARNING: no tag found for package ${pkg_name}, falling back to HEAD"
echo "========================================================================"
resolved_version=$(resolve_hash "${gitdir}" "${ref}")
fi
echo "Resolved version for ${pkg_name}: ${ref} => ${resolved_version}"
if update_pkg "${pkg_path}" "${pkg_name}" "${resolved_version}"; then
if [ -n "${no_tag}" ]; then
# always bump PKG_REV on updates as we have no info if version changed
bump_pkg_rev "${pkg_path}" "${pkg_name}"
else
reset_pkg_rev "${pkg_path}" "${pkg_name}"
fi
else
[ "${BUMP_PKG_REV}" = "yes" ] && bump_pkg_rev "${pkg_path}" "${pkg_name}"
fi
if [ "${KEEP_GIT_DIRS}" != "yes" ]; then
rm -rf "${gitdir}"
fi
}
# Get url in git:// notation for a package.mk, assuming it is a github.com url
# Return 1 if not a github domain
geturl() {

View File

@ -81,11 +81,12 @@ mkdir -p "${TMPDIR}"
# addons
for addontxt in "game-binary-addons https://github.com/kodi-game/repo-binary-addons.git ${KODI_BRANCH}" ; do
ADDONS=$(echo $addontxt | awk '{print $1}')
ADDONREPO=$(echo $addontxt | awk '{print $2}')
GIT_HASH=$(echo $addontxt | awk '{print $3}')
git_clone $ADDONREPO retroplayer $ADDONS.git $GIT_HASH
ADDONS_DIR="${ADDONS}.git"
ADDONS_REPO=$(echo $addontxt | awk '{print $2}')
ADDONS_BRANCH=$(echo $addontxt | awk '{print $3}')
git_clone ${ADDONS_REPO} ${ADDONS_DIR} ${ADDONS_BRANCH}
for addon in $ADDONS.git/*.*/ ; do
for addon in ${ADDONS_DIR}/*.*/ ; do
GAME_ADDON=$(basename ${addon})
[[ "${GAME_ADDON}" =~ ^game. ]] || continue
@ -121,34 +122,28 @@ for addontxt in "game-binary-addons https://github.com/kodi-game/repo-binary-add
NO_TAG=""
CHECK_RETRO=""
git_clone "${GAME_GIT_REPO}" "${GAME_GIT_BRANCH}" "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}"
GAME_NEW_VERSION=$(resolve_tag "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}")
git_clone "${GAME_GIT_REPO}" "${GAME_GIT_DIR}"
GAME_NEW_VERSION=$(resolve_tag_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}")
if [ -z "${GAME_NEW_VERSION}" ]; then
NO_TAG="yes"
echo "========================================================================"
msg_warn "WARNING: no tag found for addon ${GAME_ADDON}, falling back to HEAD"
echo "========================================================================"
GAME_NEW_VERSION=$(resolve_hash "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}")
GAME_NEW_VERSION=$(resolve_hash_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}")
fi
if [ "${KEEP_GIT_DIRS}" != "yes" ]; then
rm -rf "${GAME_GIT_DIR}"
fi
GAME_VERSION=$(get_pkg_var "${GAME_ADDON}" PKG_VERSION)
if [ "${GAME_VERSION}" != "${GAME_NEW_VERSION}" ]; then
if update_pkg "${GAME_PATH}" "${GAME_ADDON}" "${GAME_NEW_VERSION}"; then
BUMPED_ADDON="yes"
[ -n "${RETRO_NAME}" ] && CHECK_RETRO="yes"
set_pkg_version "${GAME_PATH}" "${GAME_NEW_VERSION}"
download_pkg_file "${GAME_ADDON}"
set_pkg_sha256 "${GAME_PATH}"
msg_info "UPDATED ${GAME_ADDON} from ${GAME_VERSION} to ${GAME_NEW_VERSION}"
fi
if [ -n "${FORCE_LIBRETRO_BUMP}" -a -n "${RETRO_NAME}" -a -z "${CHECK_RETRO}" ]; then
download_pkg_file "${GAME_ADDON}"
CHECK_RETRO="yes"
else
if [ -n "${FORCE_LIBRETRO_BUMP}" -a -n "${RETRO_NAME}" ]; then
download_pkg_file "${GAME_ADDON}"
CHECK_RETRO="yes"
fi
fi
if [ -n "${CHECK_RETRO}" ]; then
@ -172,21 +167,17 @@ for addontxt in "game-binary-addons https://github.com/kodi-game/repo-binary-add
VERSION_INFO=$(grep "^${RETRO_NAME}" "${RETRO_VERSION_FILE}" | head -1)
if [[ "$VERSION_INFO" =~ .zip$ ]] ; then
# version referenced by githash
RETRO_NEW_HASH=$(sed -e 's|^.*/archive/||' -e 's|\.zip$||' "${RETRO_VERSION_FILE}")
RETRO_NEW_VERSION=$(sed -e 's|^.*/archive/||' -e 's|\.zip$||' "${RETRO_VERSION_FILE}")
else
msg_warn "unmanaged version in kodi package: ${VERSION_INFO}"
# unmanaged version, repo plus branch
RETRO_SITE=$(echo "${VERSION_INFO}" | awk '{print $2}')
RETRO_BRANCH=$(echo "${VERSION_INFO}" | awk '{print $3}')
RETRO_NEW_HASH=$(git ls-remote "${RETRO_SITE}" "${RETRO_BRANCH}" | awk '{print $1}')
RETRO_NEW_VERSION=$(git ls-remote "${RETRO_SITE}" "${RETRO_BRANCH}" | awk '{print $1}')
fi
if [ "${RETRO_VERSION}" != "${RETRO_NEW_HASH}" ]; then
if update_pkg "${RETRO_PATH}" "${RETRO_ADDON}" "${RETRO_NEW_VERSION}"; then
BUMPED_RETRO="yes"
set_pkg_version "${RETRO_PATH}" "${RETRO_NEW_HASH}"
download_pkg_file "${RETRO_ADDON}"
set_pkg_sha256 "${RETRO_PATH}"
msg_info "UPDATED ${RETRO_ADDON} from ${RETRO_VERSION} to ${RETRO_NEW_HASH}"
fi
fi