DEV Community

Felix
Felix

Posted on

Rename java packages on all branches: script.

Found yourself in need of a script that loops through all branches in a project and renames the package name? No?

It's a bit of a strange situation to be in I grant you, but if you have a project with a lot of branches for some strange reason, and you'd like to change the name / structure of your package. Then this is the script for you!

This scripts takes the paramaters:
Nested packages work just as well.

NOTE: it also pushes on all branches, please comment it out on the first try run.

#!/bin/bash

# Script made to loop though the src/main/java and the src/test/java directories and rename
# the packages based on the input. 
# Example: sh renameJavaPackages.sh to.dev.bacongubbe dev.bacongubbe.example /Users/bacongubbe/Projects/peskyproject

if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
    echo "Usage: $0 <old_package> <new_package> <repository_path>"
    echo "   - old_package: The old package name, ex: 'to.dev.bacongubbe'."
    echo "   - new_package: The new package name to use in package structure. Ex: dev.bacongubbe.example"
    echo "   - repository_path: Path to the repository where the changes should be made"
    exit 0
fi

if [ $# -ne 3 ]; then
    echo "Error: Incorrect number of arguments. Use --help for usage information."
    exit 1
fi

old_package="$1"
new_package="$2"
repository_path="$3"

cd "$repository_path" || exit

for branch in $(git for-each-ref --format='%(refname:short)' refs/heads/); do
    git checkout $branch
    echo "## Switched to $branch branch"

    for directory in "src/main/java" "src/test/java"; do
                echo "Package $old_package is being replaced with $new_package in $directory"

        find "$directory" -name "*.java" -type f -exec sed -i '' -e "s@$old_package@$new_package@g" {} +

        # Rename package directories
        old_dir="${old_package//.//}"
        new_dir="${new_package//.//}"
        mkdir -p "$directory/$new_dir"
        echo "dir $directory/$new_dir made"
        echo "copying contents from $directory/$old_dir to $directory/$new_dir"
        cp -r "$directory/$old_dir"/* "$directory/$new_dir"

        # Loop through the old and new structure and returns the first directory that is not matching. 
        # Ex: if you're renaming se.company.coolapp to se.company.coolerapp, it will return ../company/coolapp, since the se/company/ is the 
        # same in both.
        IFS="/" read -ra old_dir_parts <<< "$old_dir"
        IFS="/" read -ra new_dir_parts <<< "$new_dir"
        first_diff_dir=""
        for ((i=0; i<${#old_dir_parts[@]} && i<${#new_dir_parts[@]}; i++)); do
            if [ "${old_dir_parts[i]}" != "${new_dir_parts[i]}" ]; then
                first_diff_dir="${first_diff_dir}/${old_dir_parts[i]}"
                break
            fi
            first_diff_dir="${first_diff_dir}/${old_dir_parts[i]}"
        done
       echo "deleting: $directory${first_diff_dir}"

     # makes sure that there is a directory that needs to be deleted. 
       if [ -n "$first_diff_dir" ]; then
         rm -rf "$directory$first_diff_dir"
       fi
    done
    git add .
    git commit -m "Chore: Rename packages in $branch from $old_package to $new_package"

    # Push the changes to the remote repository
    git push origin $branch
done


Enter fullscreen mode Exit fullscreen mode

Hope it helps!

AWS GenAI LIVE image

Real challenges. Real solutions. Real talk.

From technical discussions to philosophical debates, AWS and AWS Partners examine the impact and evolution of gen AI.

Learn more

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay