#!/bin/bash set -euo pipefail IFS=$'\n\t' # source libs mydir=$(dirname $(realpath $0)) source $mydir/cloner-lib-general source $mydir/cloner-lib-auth source $mydir/cloner-lib-cfg source $mydir/detector-lib-cfg # interval - in minutes interval=${cloner_interval:-0} stampfile=$CCLONE_CACHE/last-check-time # does it exist - if not, sync [ -d $CCLONE_CACHE ] || mkdir $CCLONE_CACHE [ -f $stampfile ] || echo 0 > $stampfile now=$(date +"%s") last=$(cat $stampfile) diff=$(($now - $last)) mindiff=$(($interval * 60)) unset now last if [ $diff -lt $mindiff ] then echo "Limit not reached - not syncing now" exit 0 fi # check and clone repo submodules=${cloner_submodules:-0} depth=${cloner_submodule_depth:-} export HOME=$CCLONE_CACHE prepareGitAuth $CONFIG_DIR # without submodule support if [ ! "x$submodules" = "x1" ] then mirror-main-repo $repo else mirror-recursive $repo $depth fi date +"%s" > $stampfile # if detector is not enabled, quit quietly if ! detectorRunCapable then exit 0 fi source $mydir/detector-lib-git source $mydir/detector-lib-general detectorLoadConfig repodir=$(gen-mirror-path $repo) if detectorCheckFetchHead $repodir then # nothing changed, just die exit 0 fi # first, solve commits # branches that were deleted or merged find $DET_BRANCHES -type f | sort | while read branchpath do branch=$(basename $branchpath) if ! gitListBranches $repodir | grep -q "^$branch$" then echo "Unexistent branch <$branch>!!" # rm it, should be merget etc... rm $DET_BRANCHES/$branch fi done # new branches or new commits in curent branches # firstly list master branch, to make first commits in it gitPrefBranches $repodir | while read branch do [ -f $DET_BRANCHES/$branch ] || touch $DET_BRANCHES/$branch oldsha=$(cat $DET_BRANCHES/$branch) newsha=$(git --git-dir $repodir show-ref --heads $branch | cut -d' ' -f1) [ -z "$oldsha" ] || oldsha=$oldsha.. # walk through every commit in branch (since last change) for commitId in $(git --no-pager --git-dir $repodir log --reverse --format="%H" $oldsha$branch) do if detectorCheckCommit $commitId then # commit was not processed - start # COMMIT = $commitId # COMMIT_AUTHOR = $author author=$(git --git-dir $repodir log $commitId -1 --format="%an <%ae>") # BRANCH = $branch # PORJECT_NAME = $cloner_project_name set +e env COMMIT="$commitId" \ COMMIT_AUTHOR="$author" \ COMMIT_BRANCH="$branch" \ PROJECT_NAME="$cloner_project_name" \ notify-commit rc=$? [ $rc -eq 0 ] || echo "Notify $branch/$commitId: return code = $rc" set -e detectorSaveCommit $commitId fi done echo $newsha > $DET_BRANCHES/$branch done # solve tags - remove nonexistent refs find $DET_TAGS -type f | sort | while read tagname do tag=$(basename $tagname) if ! gitListTags $repodir | grep -q "^$tag$" then echo "Removing tag: $tag (was [$(cat $tagname)])" rm $tagname fi done # tags that changed or were pushed as new gitListTags $repodir | while read tagname do [ -f $DET_TAGS/$tagname ] || touch $DET_TAGS/$tagname oldsha=$(cat $DET_TAGS/$tagname) newsha=$(git --git-dir $repodir show-ref --tags $tagname | cut -d' ' -f1) if ! [ "$oldsha" = "$newsha" ] then # TAG_HASH = $newsha # TAG_NAME = $tagname # TAG_AUTHOR author=$(git --git-dir $repodir log $newsha -1 --pretty=format:"%an <%ae>") # PROJECT_NAME = $cloner_project_name # call the notify script set +e env TAG_HASH="$newsha" \ TAG_NAME="$tagname" \ TAG_AUTHOR="$author" \ PROJECT_NAME="$cloner_project_name" \ notify-tag rc=$? [ $rc -eq 0 ] || echo "Notify $tagname: return code = $rc" set -e fi echo $newsha > $DET_TAGS/$tagname done # save hash to keep things clear #detectorSumPersist $repodir