diff --git a/tools/mkpkg/update_binary-addons b/tools/mkpkg/update_binary-addons index 5fd1b67dd4..4412dbb06d 100755 --- a/tools/mkpkg/update_binary-addons +++ b/tools/mkpkg/update_binary-addons @@ -68,10 +68,33 @@ fi . "${MY_DIR}/update_common_functions" -git_clone https://github.com/xbmc/xbmc ${KODI_DIR} ${KODI_BRANCH} +get_gh_token + +if [ -z "${GITHUB_API_TOKEN}" ]; then + git_clone https://github.com/xbmc/xbmc ${KODI_DIR} ${KODI_BRANCH} + ADDONS_REPO_LOCATION="${KODI_DIR}/cmake/addons/bootstrap/repositories" +else + # check if depends are available + command -v curl >/dev/null 2>&1 || die "please install curl" + command -v jq >/dev/null 2>&1 || die "please install jq" + + TMP_REPO_DIR="${TMPDIR}/bootstrap-repos" + + curl -s -L -H "Authorization: token ${GITHUB_API_TOKEN}" \ + "https://api.github.com/repos/xbmc/xbmc/contents/cmake/addons/bootstrap/repositories?ref=${KODI_BRANCH}" | awk \ + '/download_url/ { gsub("\"|,", "", $2); system("mkdir -p '${TMP_REPO_DIR}'; (cd '${TMP_REPO_DIR}'; curl -O "$2")"); }' \ + 2>/dev/null + ADDONS_REPO_LOCATION=${TMP_REPO_DIR} +fi + +if ! ls ${ADDONS_REPO_LOCATION}/*-addons.txt &> /dev/null; then + echo "No binary addon repo description found, nothing to do!" + echo "Path searched: ${ADDONS_REPO_LOCATION}" + exit 0 +fi # addons -for addontxt in $KODI_DIR/cmake/addons/bootstrap/repositories/*-addons.txt ; do +for addontxt in ${ADDONS_REPO_LOCATION}/*-addons.txt ; do ADDONS=$(cat $addontxt | awk '{print $1}') ADDONS_GIT_DIR="${ADDONS}.git" ADDONS_GIT_REPO=$(cat $addontxt | awk '{print $2}') @@ -99,16 +122,28 @@ for addontxt in $KODI_DIR/cmake/addons/bootstrap/repositories/*-addons.txt ; do # If different, ignore the addon and process it later as an "unofficial" addon validate_pkg_url "${ADDON}" "${GIT_REPO}" || continue - git_clone ${GIT_REPO} ${GIT_DIR} ${GIT_BRANCH} - NO_TAG="" - NEW_VERSION=$(resolve_tag_in_branch ${GIT_DIR} ${GIT_BRANCH}) + if [ -z "${GITHUB_API_TOKEN}" ]; then + git_clone ${GIT_REPO} ${GIT_DIR} ${GIT_BRANCH} + PARAMS="resolve_tag_in_branch ${GIT_DIR} ${GIT_BRANCH}" + else + REPO=$(basename "${GIT_REPO}") + OWNER=$(basename "${GIT_REPO%/${REPO}*}") + PARAMS="resolve_tag_on_gh ${OWNER} ${REPO} ${GIT_BRANCH}" + fi + NEW_VERSION=$(${PARAMS}) + 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}") + if [ -z "${GITHUB_API_TOKEN}" ]; then + PARAMS="resolve_hash_in_branch ${GIT_DIR} ${GIT_BRANCH}" + else + PARAMS="resolve_hash_on_gh ${GIT_REPO} ${GIT_BRANCH}" + fi + NEW_VERSION=$(${PARAMS}) fi echo "Resolved version for ${ADDON}: ${GIT_BRANCH} => ${NEW_VERSION}" @@ -125,7 +160,7 @@ for addontxt in $KODI_DIR/cmake/addons/bootstrap/repositories/*-addons.txt ; do fi if [ "${KEEP_GIT_DIRS}" != "yes" ]; then - rm -rf "${GIT_DIR}" + [ -d "${GIT_DIR}" ] && rm -rf "${GIT_DIR}" fi else echo "[mkpkg] Skipped $ADDON" @@ -134,6 +169,10 @@ for addontxt in $KODI_DIR/cmake/addons/bootstrap/repositories/*-addons.txt ; do PROCESSED="${PROCESSED}${ADDON}\n" done + if [ "${KEEP_GIT_DIRS}" != "yes" ]; then + [ -d "${ADDONS_GIT_DIR}" ] && rm -rf "${ADDONS_GIT_DIR}" + fi + echo echo "The following addons were skipped, please add packages for these addons:" echo "[${SKIPPED_ADDONS}]" @@ -154,11 +193,18 @@ for ADDON in $(ls -1 "${ROOT}/packages/mediacenter/kodi-binary-addons"); do GIT_DIR="${ADDON}.git" GIT_REPO="$(geturl "${ADDON}")" || continue - git_clone ${GIT_REPO} ${GIT_DIR} + if [ -z "${GITHUB_API_TOKEN}" ]; then + git_clone ${GIT_REPO} ${GIT_DIR} + RESOLVE_UNOFFICIAL_BRANCH="resolve_hash_in_branch ${ADDON}.git ${UNOFFICIAL_ADDON_BRANCH}" + RESOLVE_HEAD="resolve_hash_in_branch ${ADDON}.git HEAD" + else + RESOLVE_UNOFFICIAL_BRANCH="resolve_hash_on_gh ${GIT_REPO%.git} ${UNOFFICIAL_ADDON_BRANCH}" + RESOLVE_HEAD="resolve_hash_on_gh ${GIT_REPO%.git} HEAD" + fi - if RESOLVED_HASH=$(resolve_hash_in_branch ${ADDON}.git ${UNOFFICIAL_ADDON_BRANCH}); then + if RESOLVED_HASH=$(${RESOLVE_UNOFFICIAL_BRANCH}); then echo "Resolved hash for ${ADDON}: ${UNOFFICIAL_ADDON_BRANCH} => ${RESOLVED_HASH}" - elif RESOLVED_HASH=$(resolve_hash_in_branch ${ADDON}.git HEAD); then + elif RESOLVED_HASH=$(${RESOLVE_HEAD}); then echo "Resolved hash for ${ADDON}: HEAD => ${RESOLVED_HASH}" else msg_warn "WARNING: Could not resolve hash for ${ADDON}" @@ -173,8 +219,10 @@ for ADDON in $(ls -1 "${ROOT}/packages/mediacenter/kodi-binary-addons"); do fi if [ "${KEEP_GIT_DIRS}" != "yes" ]; then - rm -rf ${GIT_DIR} + [ -d "${GIT_DIR}" ] && rm -rf ${GIT_DIR} fi done rm -rf "${TMPDIR}" + +[ -d "${TMP_REPO_DIR}" ] && rm -rf "${TMP_REPO_DIR}" diff --git a/tools/mkpkg/update_common_functions b/tools/mkpkg/update_common_functions index 41ac0708c7..220ed3af21 100644 --- a/tools/mkpkg/update_common_functions +++ b/tools/mkpkg/update_common_functions @@ -5,7 +5,7 @@ msg_color() { echo $( cd "${ROOT}" - PROJECT=Generic ARCH=x86_64 . config/options "" + PROJECT="${PROJECT:-Generic}" ARCH="${ARCH:-x86_64}" . config/options "" echo $(print_color "$1" "$2") ) } @@ -42,7 +42,7 @@ git_clone() { get_pkg_var() { local pkg_name="$1" pkg_var="$2" cd "${ROOT}" - PROJECT=Generic ARCH=x86_64 source config/options ${pkg_name} &>/dev/null + PROJECT="${PROJECT:-Generic}" ARCH="${ARCH:-x86_64}" source config/options ${pkg_name} &>/dev/null echo "${!pkg_var}" } @@ -60,21 +60,59 @@ resolve_hash_in_branch() { fi } +resolve_hash_on_gh() { + curl -s -L -H "Authorization: token ${GITHUB_API_TOKEN}" \ + -H "Accept: application/vnd.github.VERSION.sha" \ + "${1/*github.com/https:\/\/api.github.com\/repos}/commits/$2" +} + resolve_tag_in_branch() { - local tag + local tag tags if [ -d "$1" ] ; then cd "$1" - if [ $# -eq 3 ] ; then - tag=$(git describe --abbrev=0 --tags --match "$3" origin/$2 2>/dev/null) - if [ -n "$tag" ] ; then - echo "$tag" - return - fi + tag=$(git describe --abbrev=0 --tags origin/$2 2>/dev/null) + if [ -z "${tag}" ]; then + return fi - git describe --abbrev=0 --tags origin/$2 2>/dev/null + tags=( $(git tag --points-at "${tag}" | sort -r -n) ) + if [ $# -eq 3 -a ${#tags[@]} -gt 1 ]; then + for tag in "${tags[@]}"; do + if [[ "${tag}" =~ $3 ]]; then + echo "$tag" + return + fi + done + fi + echo "${tags[0]}" fi } +resolve_tag_on_gh() { + local tag + + local QUERY=$(tr '\n' ' ' <" + echo "Usage: $0 [options] []" echo " -b, --bump-pkg-rev: bump PKG_REV if package was not updated" echo " -d, --delete-git-dirs: delete cloned git dirs after update" echo " -f, --force-libretro-bump: check for new libretro package" @@ -46,12 +46,19 @@ while [ $# -ne 0 ]; do done -if [ $# -ne 1 ]; then +if [ $# -eq 0 -o $# -gt 2 ]; then usage exit 1 fi + KODI_BRANCH="$1" +if [ $# -eq 2 ]; then + TAG_SUFFIX="$2" +else + TAG_SUFFIX="${KODI_BRANCH}" +fi + # list of packages to exclude from update EXCLUDED_PACKAGES="game.libretro.chailove game.libretro.fbalpha2012 @@ -73,6 +80,14 @@ mkdir -p "${TMPDIR}" . "${MY_DIR}/update_common_functions" +get_gh_token + +# check if depends are available +if [ -n "${GITHUB_API_TOKEN}" ]; then + command -v curl >/dev/null 2>&1 || die "please install curl" + command -v jq >/dev/null 2>&1 || die "please install jq" +fi + ADDONS="game-binary-addons" ADDONS_DIR="${ADDONS}.git" ADDONS_REPO="https://github.com/kodi-game/repo-binary-addons.git" @@ -114,14 +129,33 @@ for addon in ${ADDONS_DIR}/*.*/ ; do NO_TAG="" CHECK_RETRO="" - git_clone "${GAME_GIT_REPO}" "${GAME_GIT_DIR}" - GAME_NEW_VERSION=$(resolve_tag_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}" "*-${KODI_BRANCH}") + if [ -z "$GITHUB_API_TOKEN" ]; then + git_clone "${GAME_GIT_REPO}" "${GAME_GIT_DIR}" + if [ -n "${TAG_SUFFIX}" ]; then + GAME_NEW_VERSION=$(resolve_tag_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}" ".*-${TAG_SUFFIX}$") + else + GAME_NEW_VERSION=$(resolve_tag_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}") + fi + else + REPO=$(basename "${GAME_GIT_REPO}") + OWNER=$(basename "${GAME_GIT_REPO%/${REPO}*}") + if [ -n "${TAG_SUFFIX}" ]; then + GAME_NEW_VERSION=$(resolve_tag_on_gh "${OWNER}" "${REPO}" "-${TAG_SUFFIX}") + else + GAME_NEW_VERSION=$(resolve_tag_on_gh "${OWNER}" "${REPO}") + fi + fi + 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_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}") + if [ -z "$GITHUB_API_TOKEN" ]; then + GAME_NEW_VERSION=$(resolve_hash_in_branch "${GAME_GIT_DIR}" "${GAME_GIT_BRANCH}") + else + GAME_NEW_VERSION=$(resolve_hash_on_gh "${GAME_GIT_REPO}" "${GAME_GIT_BRANCH}") + fi fi if [ "${KEEP_GIT_DIRS}" != "yes" ]; then @@ -157,18 +191,24 @@ for addon in ${ADDONS_DIR}/*.*/ ; do fi VERSION_INFO=$(grep "^${RETRO_NAME}" "${RETRO_VERSION_FILE}" | head -1) - if [[ "$VERSION_INFO" =~ .zip$ ]] ; then + if [[ "$VERSION_INFO" =~ github\.com/[^/]+/[^/]+/archive/[^/]+\.zip$ ]] ; then # version referenced by githash RETRO_NEW_VERSION=$(sed -e 's|^.*/archive/||' -e 's|\.zip$||' "${RETRO_VERSION_FILE}") - else + elif [[ "$VERSION_INFO" =~ github\.com/[^/]+/[^/]+/archive/[^/]+\.tar\.gz$ ]] ; then + # version referenced by githash + RETRO_NEW_VERSION=$(sed -e 's|^.*/archive/||' -e 's|\.tar.gz$||' "${RETRO_VERSION_FILE}") + elif [[ "$VERSION_INFO" =~ github\.com/[^/[:space:]]+/[^/[:space:]]+[[:space:]][^[:space:]]+ ]] ; then 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_VERSION=$(git ls-remote "${RETRO_SITE}" "${RETRO_BRANCH}" | awk '{print $1}') + else + msg_warn "UNSUPPORTED ${RETRO_ADDON} version info, update manually: ${VERSION_INFO}" + RETRO_NEW_VERSION="" fi - if update_pkg "${RETRO_PATH}" "${RETRO_ADDON}" "${RETRO_NEW_VERSION}"; then + if [ -n "${RETRO_NEW_VERSION}" ] && update_pkg "${RETRO_PATH}" "${RETRO_ADDON}" "${RETRO_NEW_VERSION}"; then BUMPED_RETRO="yes" fi fi