Skip to content

Instantly share code, notes, and snippets.

@MilhouseVH
Last active March 2, 2018 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MilhouseVH/7c4c265c102162b3b3b7cca9aeed2fa9 to your computer and use it in GitHub Desktop.
Save MilhouseVH/7c4c265c102162b3b3b7cca9aeed2fa9 to your computer and use it in GitHub Desktop.
################################################################################
# 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