Last active
March 2, 2018 14:23
-
-
Save MilhouseVH/7c4c265c102162b3b3b7cca9aeed2fa9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
################################################################################ | |
# This file is part of LibreELEC - https://libreelec.tv | |
# Copyright (C) 2018-present Team LibreELEC | |
# | |
# LibreELEC is free software: you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation, either version 2 of the License, or | |
# (at your option) any later version. | |
# | |
# LibreELEC is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License | |
# along with LibreELEC. If not, see <http://www.gnu.org/licenses/>. | |
################################################################################ | |
# Handler for git | |
# Usage (in package.mk): | |
# PKG_URL (mandatory) must point to a git repository (git://... or https://example.com/repo.git) | |
# PKG_VERSION (mandatory) must point to a commit SHA, e.g. a1b2c3d | |
# PKG_GIT_SHA (optional) full hash of git commit | |
# PKG_GIT_CLONE_BRANCH (optional) clone specific branch | |
# PKG_GIT_CLONE_SINGLE (optional) clone single branch only (set to yes) | |
# PKG_GIT_CLONE_DEPTH (optional) history to clone, must be a number | |
# PKG_GIT_SUBMODULE_DEPTH (optional) history of submodules to clone, must be a number | |
_get_repo_already_downloaded() { | |
if [ -d $PACKAGE ]; then | |
( | |
cd $PACKAGE | |
_get_repo_clean | |
[ -n "$(git ls-remote . | grep -m1 HEAD | awk "/^${PKG_VERSION}/ {print \$1;}")" ] || exit 1 | |
[ "$PKG_URL" = "$(git remote get-url origin)" ] || exit 1 | |
[ -z "$PKG_GIT_CLONE_BRANCH" ] && exit 0 | |
[ "$PKG_GIT_CLONE_BRANCH" = "$(git branch | grep ^\* | cut -d ' ' -f2)" ] || exit 1 | |
exit 0 | |
) | |
return | |
else | |
return 1 | |
fi | |
} | |
_get_repo_clean() { | |
git clean -fdx | |
git checkout -- . | |
} | |
# Latest file already present, exit now... | |
_get_repo_already_downloaded && exit 0 | |
lock_source_dir $1 | |
# Check again in case of concurrent access - if nothing needs to be downloaded, exit now... | |
_get_repo_already_downloaded && exit 0 | |
# At this point, we need to download something... | |
printf "%${BUILD_INDENT}c $(print_color CLR_GET "GET") $1 (git)\n" ' '>&$SILENT_OUT | |
export BUILD_INDENT=$((${BUILD_INDENT:-1}+$BUILD_INDENT_SIZE)) | |
rm -f $STAMP_URL $STAMP_SHA | |
GIT_CLONE_PARAMS="" | |
GIT_SUBMODULE_PARAMS="" | |
[ -n "$PKG_GIT_CLONE_BRANCH" ] && GIT_CLONE_PARAMS="$GIT_CLONE_PARAMS --branch $PKG_GIT_CLONE_BRANCH" | |
[ "$PKG_GIT_CLONE_SINGLE" = "yes" ] && GIT_CLONE_PARAMS="$GIT_CLONE_PARAMS --single-branch" | |
if [ -n "$PKG_GIT_CLONE_DEPTH" ]; then | |
if [[ $PKG_GIT_CLONE_DEPTH =~ ^[0-9]+$ ]]; then | |
GIT_CLONE_PARAMS="$GIT_CLONE_PARAMS --depth $PKG_GIT_CLONE_DEPTH" | |
else | |
echo "Fatal: PKG_GIT_CLONE_DEPTH is not a number! ($PKG_GIT_CLONE_DEPTH)" | |
exit 1 | |
fi | |
fi | |
if [ -n "$PKG_GIT_SUBMODULE_DEPTH" ]; then | |
if [[ $PKG_GIT_SUBMODULE_DEPTH =~ ^[0-9]+$ ]]; then | |
GIT_SUBMODULE_PARAMS="$GIT_SUBMODULE_PARAMS --depth $PKG_GIT_SUBMODULE_DEPTH" | |
else | |
echo "Fatal: PKG_GIT_SUBMODULE_DEPTH is not a number! ($PKG_GIT_SUBMODULE_DEPTH)" | |
exit 1 | |
fi | |
fi | |
GIT_FOUND="no" | |
opwd=$(pwd) | |
for d in $SOURCES/$1/$1-* ; do | |
if [ -d "$d/.git" ]; then | |
if [ "${GIT_FOUND}" = "no" ]; then | |
cd $d | |
if [ "$PKG_URL" = "$(git remote get-url origin)" ]; then | |
if [ -n "$PKG_GIT_CLONE_BRANCH" -a $(git branch | grep "^\* ${PKG_GIT_CLONE_BRANCH}$" | wc -l) -eq 1 -o -z "$PKG_GIT_CLONE_BRANCH" ]; then | |
GIT_FOUND="yes" | |
GIT_DIR="$d" | |
_get_repo_clean | |
elif [ -n "$PKG_GIT_CLONE_BRANCH" -a $(git branch | grep "^ ${PKG_GIT_CLONE_BRANCH}$" | wc -l) -eq 1 ]; then | |
GIT_FOUND="yes" | |
GIT_DIR="$d" | |
_get_repo_clean | |
git checkout $PKG_GIT_CLONE_BRANCH | |
elif [ -n "$PKG_GIT_CLONE_BRANCH" -a $(git branch -a | grep "^ remotes/origin/${PKG_GIT_CLONE_BRANCH}$" | wc -l) -eq 1 ]; then | |
GIT_FOUND="yes" | |
GIT_DIR="$d" | |
_get_repo_clean | |
git checkout -b $PKG_GIT_CLONE_BRANCH origin/$PKG_GIT_CLONE_BRANCH | |
else | |
printf "%${BUILD_INDENT}c $(print_color CLR_CLEAN "DELETE") ($d)\n" ' '>&$SILENT_OUT | |
rm -rf "$d" | |
fi | |
if [ "$GIT_FOUND" = "yes" ]; then | |
printf "%${BUILD_INDENT}c $(print_color CLR_GET "GIT PULL") $1\n" ' '>&$SILENT_OUT | |
git pull | |
fi | |
else | |
printf "%${BUILD_INDENT}c $(print_color CLR_CLEAN "DELETE") ($d)\n" ' '>&$SILENT_OUT | |
rm -rf "$d" | |
fi | |
cd ${opwd} | |
else | |
printf "%${BUILD_INDENT}c $(print_color CLR_CLEAN "DELETE") ($d)\n" ' '>&$SILENT_OUT | |
rm -rf "$d" | |
fi | |
fi | |
done | |
if [ "${GIT_FOUND}" = "no" ]; then | |
printf "%${BUILD_INDENT}c $(print_color CLR_GET "GIT CLONE") $1\n" ' '>&$SILENT_OUT | |
git clone $GIT_CLONE_PARAMS $PKG_URL $PACKAGE | |
else | |
if [ ! "${GIT_DIR}" = "${PACKAGE}" ]; then | |
mv "${GIT_DIR}" "${PACKAGE}" | |
fi | |
fi | |
( | |
cd $PACKAGE | |
[ $(git log --oneline --pretty=tformat:"%H" | grep "^$PKG_VERSION" | wc -l) -eq 1 ] || { echo "There is no commit '$PKG_VERSION' on branch '$(git branch | grep ^\* | cut -d ' ' -f2)' of package '$1'! Aborting!" ; exit 1 ; } | |
git reset --hard $PKG_VERSION | |
printf "%${BUILD_INDENT}c $(print_color CLR_GET "GIT SUBMODULE") $1\n" ' '>&$SILENT_OUT | |
git submodule update --init --recursive $GIT_SUBMODULE_PARAMS | |
) | |
GIT_SHA=$(git ls-remote $PACKAGE | grep -m1 HEAD | awk '{print $1;}') | |
if [ -n "$PKG_GIT_SHA" ]; then | |
[ "$PKG_GIT_SHA" = "$GIT_SHA" ] || printf "%${BUILD_INDENT}c $(print_color CLR_WARNING "WARNING") Incorrect git hash in respository: got ${GIT_SHA}, wanted ${PKG_GIT_SHA}\n\n" ' '>&$SILENT_OUT | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment