blob: a6d3e985c8f32967831335919e8a91fe42f05331 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This script is used to migrate modules from SVN to Git
#!/bin/sh -e
# prefixes to strip from module paths. trailing slash is mandatory
prefixes='bundles/extensions/ bundles/ contrib/bundles contrib/extensions/ contrib/ karaf/ tooling/maven/'
git_repo_location='../sling-modules'
git_src_location='../sling-modules-src'
function usage {
echo "Usage: $0 [-p|-c] < repo-list.txt"
echo ""
echo " -r : provision the Remote repositories"
echo " -c : Convert the Repositories locally"
echo " -p : Push local repositories to remote"
echo ""
echo "The repo-list.txt file can be generated using the "
echo "$(dirname $0)/gen-repo-candidates.sh script"
}
if [ ! -f check_staged_release.sh ]; then
echo "Please run this script from the root of the Sling SVN repository"
exit 1
fi
if [ ! -d ${git_src_location} ]; then
# generate a git-svn checkout
echo "Creating source git-svn checkout ..."
git clone https://github.com/apache/sling.git ${git_src_location}
# ensure we don't accidentally overwrite the source repository
chmod ugo-w ${git_src_location}
echo "Done!"
fi
# validate CLI
if [ $# -ne 1 ]; then
usage
exit -1
fi
case "$1" in
"-r") echo "Provisioning remote repositories" ;;
"-c") echo "Converting local repositories";;
"-p") echo "Pushing local repositories to remote";;
*)
usage
exit -1
esac
while read -r module; do
module_orig=$module
for prefix in $prefixes; do
module=${module#${prefix}}
done
if [ -e ${module_orig}/pom.xml ]; then
artifactId=$(xmllint --xpath "/*[local-name()='project']/*[local-name()='artifactId']/text()" ${module_orig}/pom.xml)
short_desc=$(xmllint --xpath "/*[local-name()='project']/*[local-name()='name']/text()" ${module_orig}/pom.xml)
if [ -z "${short_desc}" ]; then
echo "No name for ${module_orig}, aborting"
exit 3
fi
# some overrides where it does not make sense to switch the artifact id
case $artifactId in
"sling-samples-builder") artifactId="sling-samples";;
"org.apache.sling.performance.reactor" ) artifactId="org.apache.sling.performance";;
"sling") artifactId="parent";;
esac
# add TLP prefix _if needed_
if [[ $artifactId == sling-* ]]; then
repo_name=${artifactId}
else
repo_name="sling-${artifactId}"
fi
else
repo_name="sling-$(echo ${module} | tr '/' '-')"
case ${module} in
"tooling/scm") short_desc="Apache Sling SCM Tooling";;
"tooling/jenkins") short_desc="Apache Sling Jenkins Tooling";;
*) echo "Unknown non-Maven module ${module}, unable to set description"; exit 1;;
esac
fi
# ASF infra does not permit dots in repository names
repo_name=${repo_name//./-}
echo "---- Preparing to process $module_orig as $repo_name ---"
if [ $1 == "-c" ]; then
if [ ! -d ${git_repo_location}/${repo_name}/.git ]; then
echo "Converting from SVN to Git..."
# create the initial repo
git clone --no-hardlinks ${git_src_location} ${git_repo_location}/${repo_name}
pushd ${git_repo_location}/${repo_name}
# make sure we don't push to the incorrect repo and also remove make sure
# we don't keep references to the remote repo
git remote rm origin
# rename trunk to master
git branch -m trunk master
# Remove everything except the path belonging to the module
git filter-branch --subdirectory-filter ${module_orig}
# remove unrelated tags
for tag in $(git tag); do
if [[ $tag != ${artifactId}* ]]; then
git tag -d ${tag} > /dev/null
fi
done
# cleanup and compaction
git for-each-ref --format="%(refname)" refs/original/ | xargs -n1 git update-ref -d
git reflog expire --expire=now --all
git repack -Ad
git gc --aggressive --prune=now
popd
echo "Complete!"
else
echo "Already converted"
fi
elif [ $1 == "-r" ]; then
status=$(curl -s -o /dev/null -I -w "%{http_code}" https://github.com/apache/${repo_name})
if [ $status = "404" ]; then
echo "Repository not found, will create";
elif [ $status = "200" ] ;then
echo "Repository exists, skipping";
continue
else
echo "Unhandled HTTP status code ${status}, aborting"
exit 1
fi
echo "Creating GIT repository ..."
./tooling/scm/scripts/create-gitbox-repo.sh ${repo_name} "${short_desc}"
else # -p
pushd ${git_repo_location}/${repo_name}
if [ $(git remote show | grep origin | wc -l) -eq 0 ]; then
git remote add origin https://github.com/apache/${repo_name}.git
git push -u origin master
else
echo "Remote origin already exists, skipping"
fi
popd
fi
done