blob: 57b21cecb93741cf520e84fb7ab884c67811bcab [file] [log] [blame]
#!/bin/bash
#
#
# example usage - you must have your repos checked out on the branch you
# expect to tag.
#
# USAGE: repoRoot relengRoot repoURL [repoURL]*
# repoRoot - absolute path to a folder containing cloned git repositories
# relengRoot - absolute path to releng project containing map files
# repoURL - git repository urls to tag, must match entries in the map files
# EXAMPLE: git-map.sh \
# /opt/pwebster/git/eclipse \
# /opt/pwebster/workspaces/gitMigration/org.eclipse.releng \
# git://git.eclipse.org/gitroot/platform/eclipse.platform.runtime.git \
# git://git.eclipse.org/gitroot/platform/eclipse.platform.ui.git >maps.txt
# examine the file
# grep -v ^OK maps.txt >run.txt
# /bin/bash run.txt
#
PLATFORM=$( uname -s )
get_repo_tag () {
REPO=$1
REPO_DIR=$( basename $REPO .git )
cd $ROOT/$REPO_DIR
REPO_COMMIT=$( git rev-list -1 HEAD )
NEW_DATE=$( git log -1 --format="%ci" "$REPO_COMMIT" )
if [ "$PLATFORM" == "Darwin" ]; then
echo v$( date -u -j -f "%s" "$NEW_DATE" "+%Y%m%d-%H%M" )
else
echo v$( date --date="$NEW_DATE" "+%Y%m%d%H%M" )
fi
}
tag_repo_commit () {
REPO=$1
REPO_DIR=$( basename $REPO .git )
NEW_TAG=$( get_repo_tag $REPO )
cd $ROOT/$REPO_DIR
REPO_COMMIT=$( git rev-list -1 HEAD )
if ! ( git log -1 --format="%d" "$REPO_COMMIT" | grep "[ (]$NEW_TAG[,)]" >/dev/null); then
OLD_TAG=$( git log --pretty=oneline --decorate | grep "[ (][vI][0-9]" \
| head -1 | sed 's/^[^(]* (.*\([vI][0-9][0-9][0-9][0-9]\)/\1/g' | sed 's/[,)].*$//g' )
SUBMISSION_ARGS="$SUBMISSION_ARGS $REPO $OLD_TAG $NEW_TAG"
echo "#OK Executed: cd $ROOT/$REPO_DIR \; git tag \"$NEW_TAG\" \"$REPO_COMMIT\""
cd $ROOT/$REPO_DIR ; git tag "$NEW_TAG" "$REPO_COMMIT"
fi
}
update_map () {
#echo update_map "$@"
REPO=$1
REPO_DIR=$( basename $REPO .git )
MAP=$2
cd $ROOT/$REPO_DIR
grep "repo=${REPO}," "$MAP" >/tmp/maplines_$$.txt
dos2unix /tmp/maplines_$$.txt
if [ ! -s /tmp/maplines_$$.txt ]; then
return
fi
while read LINE; do
LINE_START=$( echo $LINE | sed 's/^\([^=]*\)=.*$/\1/g' )
PROJ_PATH=$( echo $LINE | sed 's/^.*path=//g' )
CURRENT_TAG=$( echo $LINE | sed 's/.*tag=\([^,]*\),.*$/\1/g' )
LAST_COMMIT=$( git rev-list -1 HEAD -- "$PROJ_PATH" )
if [ -z "$LAST_COMMIT" ]; then
echo "#SKIPPING $LINE_START, no commits for $PROJ_PATH"
continue
fi
if ! ( git tag --contains $LAST_COMMIT | grep $CURRENT_TAG >/dev/null ); then
NEW_DATE=$( git log -1 --format="%ci" "$LAST_COMMIT" )
if [ "$PLATFORM" == "Darwin" ]; then
NEW_TAG=v$( date -u -j -f "%s" "$NEW_DATE" "+%Y%m%d-%H%M" )
else
NEW_TAG=v$( date --date="$NEW_DATE" "+%Y%m%d%H%M" )
fi
if ! ( git log -1 --format="%d" "$LAST_COMMIT" | grep "[ (]$NEW_TAG[,)]" >/dev/null); then
SUBMISSION_ARGS="$SUBMISSION_ARGS $REPO $CURRENT_TAG $NEW_TAG"
echo "#OK Executed: cd $ROOT/$REPO_DIR \; git tag \"$NEW_TAG\" \"$LAST_COMMIT\""
cd $ROOT/$REPO_DIR ; git tag "$NEW_TAG" "$LAST_COMMIT"
fi
echo sed "'s/$LINE_START=GIT,tag=$CURRENT_TAG/$LINE_START=GIT,tag=$NEW_TAG/g'" $MAP \>/tmp/t1_$$.txt \; mv /tmp/t1_$$.txt $MAP
#echo \( cd $ROOT/$REPO_DIR \; git commit -a -m \"Update map file for "$LINE_START" by auto tag script\" \)
else
echo OK $LINE_START $CURRENT_TAG
fi
done </tmp/maplines_$$.txt
rm -f /tmp/maplines_$$.txt
echo \( cd $ROOT/$REPO_DIR \; git commit -a -m \"Update map file for "$REPO_DIR" repository by auto tag script\" \)
echo \( cd $ROOT/$REPO_DIR \; git push \; git push --tags \)
}
STATUS=OK
STATUS_MSG=""
LATEST_SUBMISSION=""
SUBMISSION_ARGS=""
if [ $# -lt 3 ]; then
echo "USAGE: $0 repoRoot relengRoot repoURL [repoURL]*"
exit 1
fi
ROOT=$1; shift
RELENG=$1; shift
REPOS="$@"
for REPO in $REPOS; do
cd $ROOT
#tag_repo_commit $REPO
MAPS=$( find $RELENG -name "*.map" -exec grep -l "repo=${REPO}," {} \; )
if [ ! -z "$MAPS" ]; then
for MAP in $MAPS; do
update_map $REPO $MAP
done
fi
done
echo "/bin/bash git-submission.sh $ROOT $SUBMISSION_ARGS > report.txt"