#!/bin/bash printf "\n" show_help() { echo "Usage: $0 [--commit-hashes|-c commit hashes] [--deployments-path|-d deployments path]" echo "Options:" echo " --help | -h (Optional) Display help information on how to use this script" echo " --commit-hashes | -c (Required) Specify the commit hashes, separation by comma (,)" echo " --commits-between | --cb (Required) Specify two commit hashes, separation by comma (,), so all commits between them will be considered" echo " --repo-dir | -r (Required) Specify the git repository path that contains the commits" echo " --deployments-path | -d (Required) Specify the Wildfly ports-XX/deployments path" echo " --file-paths | -f (Optional) Specify file paths to consider in the update, separation by comma (,)" echo " Specifying this will make the \"--commit-hashes\" parameter optional" echo " --no-build | -b (Optional) If selected, the script will NOT build the maven components in order to generate the target/ folder" echo " --use-git-status | -g (Optional) Will add the files with differences from the \"git status\" command" echo " --start-server | -s (Optional) Will run the server after the script finishes copying the files" } commit_hashes_arg='' commits_between_arg='' repo_dir='' deployments_path='' file_paths_arg='' build_maven=true use_git_status=false should_start_server=false while [ "$#" -gt 0 ]; do case "$1" in --help|-h) show_help; exit ;; --repo-dir|-r) repo_dir="$2"; shift 2;; --commit-hashes|-c) commit_hashes_arg="$2"; shift 2;; --commits-between|-cb) commits_between_arg="$2"; shift 2;; --deployments-path|-d) deployments_path="$2"; shift 2;; --file-paths|-f) file_paths_arg="$2"; shift 2;; --no-build|-b) build_maven=false; shift 2;; --use-git-status|-g) use_git_status=true; shift 2;; --start-server|-s) should_start_server=true; shift 2;; *) shift ;; esac done print_newline() { echo -e "" } convert_csv_to_array() { csv_arg=$1 res_arr=`echo $csv_arg | tr ',' "\n"` echo $res_arr } commit_exists() { commit_hash=$1 if git cat-file -t $commit_hash; then return 0 else return 1 fi } get_target_paths_from_commit_hash() { commit_hash=$1 echo `git show --oneline --name-only $c | tail -n +2` } find_pom_xml_file_recursively() { path=$1 pom_path=`dirname $path`/pom.xml if [ $pom_path == './pom.xml' ]; then # echo "Could not find a pom.xml file for a module" exit 1 fi if [ ! -f $pom_path ]; then new_dir=`dirname $path` pom_path=`find_pom_xml_file_recursively $new_dir` fi echo $pom_path } # don't use arr_uniq() { arr=$1 echo $(for i in "${arr[@]}"; do echo $i; done | sort -u) } build_mvn() { echo "[INFO] Realizando build Maven no diretório \"`pwd`\"..." mvn --quiet clean install --file ./pom.xml --settings ~/.m2/settings.xml if [ $? -ne 0 ]; then echo "[INFO] A build Maven resultou em erros. O script irá encerrar agora." exit 1 fi echo "[INFO] Build Maven concluída." } function join_by { local d=${1-} f=${2-} if shift 2; then printf %s "$f" "${@/#/$d}" fi } remove_suffix() { local input="$1" local delimiter="-" local count=$(grep -o "${delimiter}" <<< "$input" | wc -l) local index=$(( count - 1 )) local result=$(cut -d"${delimiter}" -f1-"$index" <<< "$input") echo "$result" } get_substring_before_string() { str=$1 subs=$2 echo ${str%$subs*} } get_substring_after_string() { str=$1 subs=$2 echo ${str#*$subs} } sort_pom_paths_for_compilation_order() { local unsorted_pom_paths=("$@") local -A compilation_order_list=( ['main']='' ['commons']='' ['security']='' ['tools']='' ['geo']='' ['meta']='' ['framework']='' ['faces']='' ['application']='' ['plugins']='' ['cdk']='' ['auditing']='' ) local sorted_pom_paths=() for dir in "${!compilation_order_list[@]}"; do for path in "${unsorted_pom_paths[@]}"; do if [[ $path == "${dir}/"* ]]; then sorted_pom_paths+=("$path") fi done done printf "%s\n" "${sorted_pom_paths[@]}" } if [ -z "$file_paths_arg" ] \ && [ -z "$commit_hashes_arg" ] \ && ! $use_git_status; then echo "Error: Either one of these arguments should be provided:" echo " Commit hashes (--commit-hashes or -c) or;" echo " File paths (--file-paths or -f) or;" echo " Use Git Status (--use-git-status or -g)." exit 1 fi if [ ! -z "$repo_dir" ]; then if [ -z "$commit_hashes_arg" ] && [ -z "$commits_between_arg" ]; then echo "Error: If you specify the Commit hashes (--commit-hashes or -c) and/or Commits between (--commits-between or -cb), the repository directory (--repo-dir or -r) is also required." exit 1 fi fi if [ -z "$deployments_path" ]; then echo "Error: Deployments path (--deployments-path or -d) is required." exit 1 fi scripts_folder=$HOME/repos/personal/personal-devboot/scripts/shell/job/gp if [ ! -d "$scripts_folder" ]; then echo "The git repository \"CloudAlb/personal-devboot\" must be in the \"~/repos\" folder!" exit 1 fi cur=`pwd` target_paths=() cd $repo_dir if [ ! -z "$commit_hashes_arg" ]; then commit_hashes=`convert_csv_to_array "$commit_hashes_arg"` for c in ${commit_hashes[@]}; do if ! commit_exists $c; then continue fi target_paths+=(`get_target_paths_from_commit_hash "$c"`) done fi if $use_git_status; then target_paths+=(`git ls-files --modified`) fi if [ ! -z "$commits_between_arg" ]; then commit_hashes=`git rev-list --ancestry-path "${commits_between_arg/","/".."}"` target_paths_arg=() for c in ${commit_hashes[@]}; do if ! commit_exists $c; then continue fi target_paths_arg+=(`get_target_paths_from_commit_hash "$c"`) done for i in ${target_paths_arg[@]}; do target_paths+=($i) done fi cd $cur if [ ! -z "$file_paths_arg" ]; then file_paths=`convert_csv_to_array "$file_paths_arg"` if [ ! -f $f ]; then continue fi target_paths+=("$f") fi cd $repo_dir target_paths_uniq=$(for i in "${target_paths[@]}"; do echo $i; done | sort -u) dot_java_files=() pom_paths=() for i in ${target_paths_uniq[@]}; do if [[ $i == *.java ]]; then dot_java_files+=("$i") fi res=`find_pom_xml_file_recursively $i`; pom_paths+=("$res") done pom_paths_uniq=$(for i in "${pom_paths[@]}"; do echo $i; done | sort -u) sorted_pom_paths_uniq=($(sort_pom_paths_for_compilation_order "${pom_paths_uniq[@]}")) echo "[INFO] Pom order:" for p in ${sorted_pom_paths_uniq[@]}; do echo "$p" done for p in ${sorted_pom_paths_uniq[@]}; do pom_dir=`dirname $p` cd $repo_dir/$pom_dir [ $build_maven == true ] && build_mvn done non_root_deployments_files_to_explode=() non_root_deployments_files_to_explode_full_path=() for p in ${sorted_pom_paths_uniq[@]}; do pom_dir=$repo_dir/`dirname $p` if [ ! -d "$pom_dir/target" ]; then echo "[INFO] Could not find the \"target\" folder in \"$pom_dir\"" echo "[INFO] Initializing maven compilation..." cd $pom_dir build_mvn fi cd $pom_dir/target non_root_deployments_files_to_explode=`find * -maxdepth 0 -type f -regextype sed -regex ".*[jew]ar" ! -name '*-client.jar' ! -name '*-sources.jar'` done cd $deployments_path root_deployments_files_to_explode=`find * -maxdepth 0 -type f -regextype sed -regex ".*[jew]ar"` if [ ! -z "$root_deployments_files_to_explode" ]; then $scripts_folder/explode-java-files.sh --files `join_by , ${root_deployments_files_to_explode}` # webdeskmapreport, etc. fi for f in ${non_root_deployments_files_to_explode[@]}; do f_prefix=`remove_suffix "$f"` file_path=`find * -maxdepth 1 -type f -name "$f_prefix*.jar"` non_root_deployments_files_to_explode_full_path+=("$file_path") done if [ ! -z "$non_root_deployments_files_to_explode_full_path" ]; then $scripts_folder/explode-java-files.sh --files `join_by , ${non_root_deployments_files_to_explode_full_path}` # **/cpqd-geo-renderer-ejb, etc. fi src_path_const='src/main/java/' unsuccessful_copies=() for f in ${dot_java_files[@]}; do printf "\n" f_dirname=`dirname $f` f_basename=`basename $f` class_filename=`echo ${f_basename%".java"}.class` path_in_deployments=`get_substring_after_string "$f_dirname" "$src_path_const"` class_file_paths_in_deployments=`find $deployments_path -type f -wholename "**/$path_in_deployments/$class_filename"` middle_path_subst=`get_substring_before_string "$f_dirname" "$src_path_const"` class_file_path_in_target=`find $repo_dir -type f -wholename "**/${middle_path_subst}target/classes/$path_in_deployments/$class_filename"` # echo "f: $f" # echo "f_dirname: $f_dirname" # echo "class_filename: $class_filename" # echo "path_in_deployments: ${path_in_deployments}" # for i in ${class_file_paths_in_deployments[@]}; do # echo "i: $i" # done # for j in ${class_file_path_in_target[@]}; do # echo "j: $j" # done # printf "\n" # printf "\n" # printf "\n" for p in ${class_file_paths_in_deployments[@]}; do cp_dest=`dirname $p` printf "\n" if [ -z "$class_file_path_in_target" ]; then unsuccessful_copies+=($f_basename) echo "[WARN] O arquivo \"$f_basename\" não foi encontrado em alguma pasta target do repositório. Pulando cópia..." continue fi echo "[INFO] Copiando arquivo:" echo " De: $class_file_path_in_target" echo " Para: $cp_dest" cp --force $class_file_path_in_target $cp_dest if [ $? -eq 0 ]; then echo "[INFO] Concluído." else echo "[INFO] A cópia dos artefatos resultou em erros." exit 1 fi done done if [ ${#unsuccessful_copies[@]} -ne 0 ]; then unsuccessful_copies_uniq=$(for i in "${unsuccessful_copies[@]}"; do echo $i; done | sort -u) printf "\n" echo "[WARN] Houveram arquivos que não foram encontrados em alguma pasta target do repositório." for i in ${unsuccessful_copies_uniq[@]}; do echo " Arquivo mal-sucedido: $i" done fi if $should_start_server; then $cur/debugports-01.sh fi