diff --git a/.gitignore b/.gitignore index a31eff71e7d..5d31f3c7b7b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ *.iws work/ /data/ -/plugins/ logs/ .DS_Store build/ diff --git a/migrate.sh b/migrate.sh new file mode 100755 index 00000000000..44b808c1836 --- /dev/null +++ b/migrate.sh @@ -0,0 +1,221 @@ +#!/bin/bash +set -e +set -u +set -o pipefail + +# This script creates a new branch then migrate all the maven stuff in it and commit that branch. +# then it runs mvn install to check that everything is still running + +# Useful commands while testing +# rm -rf migration/tmp plugins +# git checkout pr/migration_script -f +# git add .; git commit -m "Add migration script" --amend +# ./migrate.sh +# mvn clean install -DskipTests + +DIR_TMP="../migration" +MODULE_CORE="core" +GIT_BRANCH="refactoring/maven" +PARENT_NAME="elasticsearch-parent" +PARENT_GIT="https://github.com/elastic/elasticsearch-parent.git" + +# Insert a new text after a given line +# insertLinesAfter text_to_find text_to_add newLine_separator filename +# insertLinesAfter "<\/project>" " = <\/modules>" "§" "pom.xml" +function insertLinesAfter() { + # echo "## modify $4 with $2" + sed "s/$1/$1$3$2/" $4 | tr "$3" "\n" > $4.new + mv $4.new $4 +} + +# Insert a new text before a given line +# insertLinesBefore text_to_find text_to_add newLine_separator filename +# insertLinesBefore "<\/project>" " = <\/modules>" "§" "pom.xml" +function insertLinesBefore() { + # echo "## modify $4 with $2" + sed "s/$1/$2$3$1/" $4 | tr "$3" "\n" > $4.new + mv $4.new $4 +} + +# Replace text in a file +# replaceLine old_text new_text filename +# replaceLine "old" "new" "pom.xml" +function replaceLine() { + # echo "## modify $3 with $2" + sed "s/^$1/$2/" $3 > $3.new + mv $3.new $3 +} + +# Remove lines in a file +# removeLines from_text_included to_text_included filename +# removeLines "old" "new" "pom.xml" +function removeLines() { + # echo "## remove lines in $3 from $1 to $2" + sed "/$1/,/$2/d" $3 > $3.new + mv $3.new $3 +} + +# Migrate a plugin +# migratePlugin short_name +function migratePlugin() { + PLUGIN_GIT_REPO="https://github.com/elastic/elasticsearch-$1.git" + git remote add remote_$1 $PLUGIN_GIT_REPO + git fetch remote_$1 > /dev/null 2>/dev/null + echo "## Add $1 module from $PLUGIN_GIT_REPO" + + # echo "### fetch $1 project from $PLUGIN_GIT_REPO in plugins" + # If you want to run that locally, uncomment this line and comment one below + #cp -R ../elasticsearch-$1/* plugins/$1 + # git clone $PLUGIN_GIT_REPO plugins/$1 > /dev/null 2>/dev/null + git checkout -b migrate_$1 remote_$1/master > /dev/null 2>/dev/null + git remote rm remote_$1 > /dev/null 2>/dev/null + mkdir -p plugins/$1 + git mv -k * plugins/$1 > /dev/null 2>/dev/null + git rm .gitignore > /dev/null 2>/dev/null + # echo "### change $1 groupId to org.elasticsearch.plugins" + # Change the groupId to avoid conflicts with existing 2.0.0 versions. + replaceLine " org.elasticsearch<\/groupId>" " org.elasticsearch.plugin<\/groupId>" "plugins/$1/pom.xml" + + # echo "### cleanup $1 pom.xml" + removeLines "" "<\/issueManagement>" "plugins/$1/pom.xml" + removeLines "" "<\/repositories>" "plugins/$1/pom.xml" + removeLines "" "<\/scm>" "plugins/$1/pom.xml" + + # echo "### remove version 3.0.0-SNAPSHOT from $1 pom.xml" + # All plugins for ES 2.0.0 uses 3.0.0-SNAPSHOT version number + replaceLine " 3.0.0-SNAPSHOT<\/version>" "" "plugins/$1/pom.xml" + + # echo "### remove unused dev-tools and .git dirs and LICENSE.txt and CONTRIBUTING.md files" + rm -r plugins/$1/dev-tools + rm -rf plugins/$1/.git + rm plugins/$1/LICENSE.txt + rm plugins/$1/CONTRIBUTING.md + + # echo "### commit changes" + git add --all . + git commit -m "add $1 module" > /dev/null + git checkout $GIT_BRANCH + git merge -m "migrate branch for $1" migrate_$1 > /dev/null 2>/dev/null + # We can now add plugin module + insertLinesBefore " <\/modules>" " $1<\/module>" "§" "plugins/pom.xml" + git add . + git commit -m "add $1 module" > /dev/null + git branch -D migrate_$1 +} + +echo "# STEP 0 : prepare the job" + +# echo "## clean $DIR_TMP plugins dev-tools/target target" +rm -rf $DIR_TMP +rm -rf plugins +rm -rf dev-tools/target +rm -rf target + +# echo "## create git $GIT_BRANCH work branch" + +# It first clean the existing branch if any +echo "(You can safely ignore branch not found below)" +git branch -D $GIT_BRANCH > /dev/null || : + +# Create the new branch +git branch $GIT_BRANCH > /dev/null +git checkout $GIT_BRANCH > /dev/null 2>/dev/null + +echo "# STEP 1 : Core module" + +# create the tmp work dir +# echo "## create $DIR_TMP temporary dir" +mkdir $DIR_TMP + +# create the core module +# echo "## create core module in $MODULE_CORE" +rm -rf $MODULE_CORE +mkdir $MODULE_CORE +# echo "## create $MODULE_CORE pom.xml" +cp pom.xml $MODULE_CORE +# echo "## modify $MODULE_CORE/pom.xml" +# We move block on top +removeLines "" "<\/parent>" "$MODULE_CORE/pom.xml" +insertLinesAfter "<\/modelVersion>" " § org.elasticsearch<\/groupId>§ elasticsearch-parent<\/artifactId>§ 2.0.0-SNAPSHOT<\/version>§ <\/parent>§" "§" "$MODULE_CORE/pom.xml" +# We clean useless data +replaceLine " 2.0.0-SNAPSHOT<\/version>" "" "$MODULE_CORE/pom.xml" +removeLines "" "<\/scm>" "$MODULE_CORE/pom.xml" +removeLines "" "<\/repositories>" "$MODULE_CORE/pom.xml" + +# echo "## move src in $MODULE_CORE" +git mv src/ $MODULE_CORE +# echo "## move bin in $MODULE_CORE" +git mv bin/ $MODULE_CORE +# echo "## move config in $MODULE_CORE" +git mv config/ $MODULE_CORE +# echo "## move lib in $MODULE_CORE" +git mv lib/ $MODULE_CORE +# echo "## copy README.textile, LICENSE.txt and NOTICE.txt in $MODULE_CORE" +cp README.textile $MODULE_CORE +cp LICENSE.txt $MODULE_CORE +cp NOTICE.txt $MODULE_CORE +# echo "## modify rest-api-spec location in $MODULE_CORE/pom.xml" +replaceLine " \${project.basedir}\/rest-api-spec<\/directory>" " \${project.basedir}\/..\/rest-api-spec<\/directory>" "$MODULE_CORE/pom.xml" + + +# echo "## commit changes" +git add . +git commit -m "create $MODULE_CORE module" > /dev/null + +echo "# STEP 2 : Parent pom.xml from $PARENT_GIT" + +# echo "## fetch parent project from $PARENT_GIT in $DIR_TMP" +# If you want to run that locally, uncomment this line and comment one below +# cp -R ../elasticsearch-parent $DIR_TMP +git clone $PARENT_GIT $DIR_TMP/$PARENT_NAME > /dev/null 2>/dev/null + +cp $DIR_TMP/$PARENT_NAME/pom.xml . +cp -R $DIR_TMP/$PARENT_NAME/dev-tools . +cp -R $DIR_TMP/$PARENT_NAME/plugins . + +# echo "## commit changes" +git add . +git commit -m "create parent pom project from its original location" > /dev/null + +echo "# STEP 3 : Add $MODULE_CORE module to pom.xml" + +insertLinesBefore " <\/modules>" " $MODULE_CORE<\/module>" "§" "pom.xml" + +# echo "## change name to Elasticsearch Core" +replaceLine " Elasticsearch core<\/name>" " Elasticsearch Core<\/name>" "$MODULE_CORE/pom.xml" + +# echo "## commit changes" +git add . +git commit -m "add core module" > /dev/null + +echo "# STEP 4 : Migrate plugins" + +# We need to add in the plugins parent project as it does not exist +insertLinesBefore "<\/project>" " § <\/modules>" "§" "plugins/pom.xml" +git add plugins/pom.xml +git commit -m "add modules section" +# Analysis +migratePlugin "analysis-kuromoji" +migratePlugin "analysis-smartcn" +migratePlugin "analysis-stempel" +migratePlugin "analysis-phonetic" +migratePlugin "analysis-icu" + +# Mapper +# TODO: look at this one later +# migratePlugin "mapper-attachments" + +# Cloud +migratePlugin "cloud-gce" +migratePlugin "cloud-azure" +migratePlugin "cloud-aws" + +echo "# STEP 5 : Clean tmp dir" + +# echo "## clean $DIR_TMP" +rm -rf $DIR_TMP + +echo "you can now run:" +echo "mvn clean install -DskipTests" + +