From 0986e780ffec6c95049a79b2b61706456fb4db36 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 14 Dec 2022 13:50:52 +0100 Subject: [PATCH 01/88] refactor - move menu utility functions --- git-mr | 934 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 469 insertions(+), 465 deletions(-) diff --git a/git-mr b/git-mr index 95bcde4..60f7cd2 100755 --- a/git-mr +++ b/git-mr @@ -1121,265 +1121,355 @@ function mr_update_labels ################################################################################ -# Merge request top-level functions +# Merge request menu utility functions -function mr_print +function mr_menu_merge_requests { ISSUE_CODE=${1:-$(guess_issue_code)} - local current_branch; current_branch=$(git_current_branch) - local base_branch=${2:-$(git_base_branch)} - - cat << EOF + local mr_summaries; mr_summaries=$(gitlab_merge_requests_search "$ISSUE_CODE") || exit $? + if [ -z "$mr_summaries" ]; then + return + fi --------------------------------------------------------------------------------- -$(mr_description "$current_branch" "$base_branch") + # Load project names into bash associative array + declare -A project_arr + while IFS="=" read -r id name + do + project_arr[$id]="$name" + done < <(gitlab_projects | jq -r 'map((.id | tostring)+"="+.name) | .[]') --------------------------------------------------------------------------------- + # Enrich merge request summaries with project names + while IFS=$'\n' read -r mr_summary + do + local project_id; project_id=$(echo "$mr_summary" | jq -r '.project_id') + local project_name; project_name=${project_arr[$project_id]} -EOF + echo "$mr_summary" | jq -c --arg project_name "$project_name" '. + {project_name: $project_name}' - mr_actions "$current_branch" "$base_branch" + done < <(echo "$mr_summaries") } -function mr_open +function mr_menu_contents { - local current_branch; current_branch=$(git_current_branch) - local base_branch; base_branch=${2:-$(git_base_branch)} + local issue_code=$1 + local menu_items=$2 + local current_mr_url=$3; - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") - local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} + local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} - if [ ! -z "${mr_url}" ]; then - mr_print_status "${mr_iid}" - open_in_browser "${mr_url}" - return - fi + echo "$git_mr_menu_start" + echo - ISSUE_CODE=${1:-$(guess_issue_code)} + while IFS=$'\n' read -r menu_item; do + local project_name; project_name=$(echo "$menu_item" | jq -r '.project_name') + local title; title=$(echo "$menu_item" | jq -r '.title') + local web_url; web_url=$(echo "$menu_item" | jq -r '.web_url') - local description; description=$(mr_description "$current_branch" "$base_branch") + title=$(gitlab_title_undraft "$title") - cat << EOF + local item_label + item_label=$(echo "${project_name}: $(markdown_link "${title}" "$web_url")") --------------------------------------------------------------------------------- -${description} + local wrap='' + if [ "$current_mr_url" == "$web_url" ]; then + wrap='**' # Markdown bold + fi --------------------------------------------------------------------------------- + echo "* ${wrap}${item_label}${wrap}" -EOF + done < <(echo "$menu_items") - local new_mr_url; new_mr_url=$(gitlab_new_merge_request_url "${current_branch}" "${base_branch}") + echo + echo "$git_mr_menu_end" +} - if [ ! -z "${new_mr_url}" ]; then +function mr_menu_status +{ + local issue_code=$1 + local menu_items=$2 - # add description - new_mr_url="${new_mr_url}&$(urlencode "merge_request[description]")=$(urlencode "$description")" + local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} + local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} - echo_debug - echo_debug "Opening:" - echo_debug "$new_mr_url" + echo "$git_mr_menu_start" + echo - open_in_browser "${new_mr_url}" - fi -} + while IFS=$'\n' read -r menu_item; do + local mr_iid; mr_iid=$(echo "$menu_item" | jq -r '.iid') + local project_name; project_name=$(echo "$menu_item" | jq -r '.project_name') + local title; title=$(echo "$menu_item" | jq -r '.title') + local web_url; web_url=$(echo "$menu_item" | jq -r '.web_url') -function mr_status -{ - gitlab_check_env + title=$(gitlab_title_undraft "$title") - local current_branch; current_branch=$(git_current_branch) - local base_branch; base_branch=${1:-$(git_base_branch)} + local item_label + item_label=$(echo "${project_name}: $(markdown_link "${title}" "$web_url")") - # Search existing merge request + echo "* ${item_label}" - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + local project_url; project_url=$(gitlab_extract_project_url "$web_url") - if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then - echo_error "Merge request not found" - mr_print "$(guess_issue_code)" "${base_branch}" - return - fi + # Load existing merge request details + # Do NOT use `gitlab_merge_request` + merge_request=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid") - # Load existing merge request details + mr_print_status "${mr_iid}" "$merge_request" - local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - local mr_title; mr_title=$(gitlab_extract_title "$merge_request") - local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") + done < <(echo "$menu_items") - # Print merge request title & status - echo - echo "-------------------------------------------------------------------" - echo "$mr_title" - echo "-------------------------------------------------------------------" echo - mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" + echo "$git_mr_menu_end" } -function mr_update +function mr_menu_show { - gitlab_check_env + local issue_code=$1 + local menu_items=$2 - local current_branch; current_branch=$(git_current_branch) - local base_branch; base_branch=${1:-$(git_base_branch)} + echo + mr_menu_contents "$issue_code" "$menu_items" +} - # Search existing merge request +function mr_menu_update +{ + local issue_code=$1 + local menu_items=$2 - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + # Look for existing merge request + local current_branch + current_branch=$(git_current_branch) - if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then + local current_mr_summary; current_mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local current_mr_iid; current_mr_iid=$(gitlab_extract_iid "$current_mr_summary") + local current_mr_url; current_mr_url=$(gitlab_extract_url "$current_mr_summary") + + if [ -z "${current_mr_iid}" ] || [ -z "${current_mr_url}" ]; then echo_error "Merge request not found" - mr_print "$(guess_issue_code)" "${base_branch}" + echo + mr_menu_contents "$issue_code" "$menu_items" return fi # Load existing merge request details - - local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - local mr_title; mr_title=$(gitlab_extract_title "$merge_request") + local merge_request; merge_request=$(gitlab_merge_request "$current_mr_iid") local mr_description; mr_description=$(gitlab_extract_description "$merge_request") - local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") - # Init commit lists + local mr_menu_content; + mr_menu_content=$(mr_menu_contents "$issue_code" "$menu_items" "$current_mr_url") - local commit_messages; commit_messages=$(git_commits "$current_branch" "$base_branch") + local updated_description; + updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" - local current_commits; current_commits=$(echo "$commit_messages" | cut -d ' ' -f1) - local old_commits; old_commits=$(echo "$mr_description" | - grep -Po '^[^0-9a-fA-F]*[0-9a-fA-F]{7,}\s' | - sed -r 's/^[^0-9a-fA-F]*([0-9a-fA-F]{7,})\s/\1/g') + echo + echo "$updated_description" + echo + echo '--------------------------------------------------------------------------------' - local current_commits_array; current_commits_array=($(echo "$current_commits" | tr "\n" " ")) - local old_commits_array; old_commits_array=($(echo "$old_commits" | tr "\n" " ")) + local mr_update_data='{}' + if [ "$(confirm "Do you want to update the menu in the merge request description?")" = "yes" ]; then + mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? + fi + if [ "$mr_update_data" != "{}" ]; then + echo -n "Updating merge request..." + local result + result=$(gitlab_merge_request_update "$current_mr_iid" "$mr_update_data") + if [ ! -z "$result" ]; then echo -e "OK\n"; fi + fi +} - local updated_commit_count=0 - local new_commit_messages_display=() - local new_commit_messages_content=() +function mr_menu_update_all +{ + local issue_code=$1 + local menu_items=$2 - local new_description_display="$mr_description" - local new_description_content="$mr_description" + local mr_iid + local mr_url + local project_url + local merge_request + local mr_description + local mr_menu_content + local updated_description + local mr_update_data + local result - local sameColor="lightblue" - local updatedColor="orange" - local newColor="green" + # Use array instead of looping over variable content with `read` to leave standard input open for `confirm` + readarray menu_array < <(echo "$menu_items") - # Iterate over commit lists, compare sha-1 and update description - for i in ${!current_commits_array[*]}; do + for menu_item in "${menu_array[@]}"; do - local curr=${current_commits_array[$i]} - local old=${old_commits_array[$i]} + mr_iid=$(echo "$menu_item" | jq -r '.iid') + mr_url=$(echo "$menu_item" | jq -r '.web_url') - if [ ! -z "$old" ]; then - if [ "$old" = "$curr" ]; then - # same sha-1 - only decorate - new_description_display=$(echo "$new_description_display" | sed "s/$old/$(colorize "$curr" "$sameColor")/") - new_description_content=$(echo "$new_description_content" | sed "s/$old/$curr/" ) - else - # different sha-1 - replace & decorate - new_description_display=$(echo "$new_description_display" | sed "s/$old/$(colorize "$curr" "$updatedColor")/") - new_description_content=$(echo "$new_description_content" | sed "s/$old/$curr/" ) - updated_commit_count=$((updated_commit_count+1)) - fi - else - # new commits - new_commit_messages_display+=("$(echo "$commit_messages" | grep "$curr" | sed "s/$curr/$(colorize "$curr" "$newColor")/")") - new_commit_messages_content+=("$(echo "$commit_messages" | grep "$curr")") - fi - done + # Beware, `gitlab_merge_request` and `gitlab_merge_request_update` use 'gitlab_project_request', which is project-specific + # Here, we can expect other target projects here. + project_url=$(gitlab_extract_project_url "$mr_url") - local new_commit_count=${#new_commit_messages_display[@]} + # Load existing merge request details + # Do NOT use `gitlab_merge_request` + merge_request=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid") - # implode arrays - local new_commit_messages_display_str; new_commit_messages_display_str=$(printf "%s\n" "${new_commit_messages_display[@]}") - local new_commit_messages_content_str; new_commit_messages_content_str=$(printf "%s\n" "${new_commit_messages_content[@]}") + mr_description=$(gitlab_extract_description "$merge_request") + + mr_menu_content=$(mr_menu_contents "$issue_code" "$menu_items" "$mr_url") + updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" - # Print updated merge request description - echo - echo "-------------------------------------------------------------------" - echo "$mr_title" - echo "-------------------------------------------------------------------" - echo "$new_description_display" - echo - echo - if [ "$new_commit_count" -gt 0 ]; then - echo "## Update" echo - echo "$(markdown_list "$new_commit_messages_display_str" "**")" + echo "$updated_description" echo - fi - echo "--------------------------------------------------------------------------------" - echo - echo " updated commits: $(colorize "$updated_commit_count" "$updatedColor")" - echo " new commits: $(colorize "$new_commit_count" "$newColor")" + echo '--------------------------------------------------------------------------------' + echo + echo "Merge request:" + echo + echo " ${mr_url}" + echo + + mr_update_data='{}' + + if [ "$(confirm "Do you want to update the menu in the merge request description?")" = "yes" ]; then + mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? + fi + + if [ "$mr_update_data" != "{}" ]; then + echo -n "Updating merge request..." + # Do NOT use `gitlab_merge_request_update` + result=$(gitlab_request "projects/${project_url}/merge_requests/${mr_iid}" "PUT" "${mr_update_data}") + if [ ! -z "$result" ]; then echo -e "OK\n"; fi + fi + done + + echo '--------------------------------------------------------------------------------' echo - # Propose update if changes are detected + mr_menu_contents "$issue_code" "$menu_items" +} - if [ ! -x "$(command -v jq)" ]; then - echo_error "Please install jq to be able to update merge request" +function mr_menu_replace_description +{ + local mr_description=$1 + local menu_content=$2 - else - local mr_update_data='{}' + local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} + local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} - if [ $((updated_commit_count + new_commit_count)) -gt 0 ] \ - && [ "$(confirm "Do you want to update the merge request description?")" = "yes" ]; then + menu_start=$(echo "$mr_description" | grep -n "$git_mr_menu_start" | cut -f1 -d:) + menu_end=$(echo "$mr_description" | grep -n -- "$git_mr_menu_end" | cut -f1 -d: | head -n 1) - local new_description - new_description=$(echo -e "${new_description_content}") + has_menu=0 + if [ -n "$menu_start" ] && [ -n "$menu_end" ] && [ "$menu_start" -gt "0" ] && [ "$menu_end" -gt "$menu_start" ]; then + has_menu=1 + fi - if [ "$new_commit_count" -gt 0 ]; then - new_description=$(echo -e "${new_description}\n\n## Update") - new_description=$(echo -e "${new_description}\n\n$(markdown_list "$new_commit_messages_content_str" "**")") + # Iterate over description lines and insert/replace menu + i=1 + while IFS=$'\n' read -r mr_description_line + do + if [ "$has_menu" = "1" ]; then + if [ "$i" -lt "$menu_start" ] || [ "$i" -gt "$menu_end" ]; then + # output non-menu line + echo "$mr_description_line" + else + # replace menu once + if [ "$i" -eq "$menu_end" ]; then + echo_debug "Replacing menu" + echo "$menu_content" + fi + fi + else + # output non-menu line + echo "$mr_description_line" + # insert menu once + if [ "$i" -eq "2" ]; then + echo_debug "Inserting menu" + echo "$menu_content" + echo fi - new_description=$(echo -e "${new_description}")$'\n' - - mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit $? fi - if [ "$base_branch" != "$current_target" ] \ - && [ "$(confirm "Do you want to update the merge request target branch from '$current_target' to '$base_branch'?")" = "yes" ]; then - mr_update_data=$(jq_build "target_branch" "$base_branch" "$mr_update_data") || exit $? - fi + ((i+=1)) - if [ "$mr_update_data" != "{}" ]; then + done < <(echo "$mr_description") +} - echo -n "Updating merge request..." - local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_update_data") +################################################################################ +# Merge request top-level functions - if [ ! -z "$result" ]; then echo -e "OK\n"; fi +function mr_print +{ + ISSUE_CODE=${1:-$(guess_issue_code)} - # reload merge request details - merge_request=$(gitlab_merge_request "$mr_iid") - fi + local current_branch; current_branch=$(git_current_branch) + local base_branch=${2:-$(git_base_branch)} + + cat << EOF + +-------------------------------------------------------------------------------- +$(mr_description "$current_branch" "$base_branch") + +-------------------------------------------------------------------------------- + +EOF + + mr_actions "$current_branch" "$base_branch" +} + +function mr_open +{ + local current_branch; current_branch=$(git_current_branch) + local base_branch; base_branch=${2:-$(git_base_branch)} + + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") + local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") + local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + + if [ ! -z "${mr_url}" ]; then + mr_print_status "${mr_iid}" + open_in_browser "${mr_url}" + return fi - echo "--------------------------------------------------------------------------------" - echo + ISSUE_CODE=${1:-$(guess_issue_code)} - mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" + local description; description=$(mr_description "$current_branch" "$base_branch") + + cat << EOF + +-------------------------------------------------------------------------------- +${description} + +-------------------------------------------------------------------------------- + +EOF + + local new_mr_url; new_mr_url=$(gitlab_new_merge_request_url "${current_branch}" "${base_branch}") + + if [ ! -z "${new_mr_url}" ]; then + + # add description + new_mr_url="${new_mr_url}&$(urlencode "merge_request[description]")=$(urlencode "$description")" + + echo_debug + echo_debug "Opening:" + echo_debug "$new_mr_url" + + open_in_browser "${new_mr_url}" + fi } -function mr_merge +function mr_status { gitlab_check_env - local gitlab_base_url="https://${GITLAB_DOMAIN}/api/v4" - local current_branch; current_branch=$(git_current_branch) local base_branch; base_branch=${1:-$(git_base_branch)} # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") - local project_url; project_url=$(gitlab_extract_project_url "$mr_url") + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then echo_error "Merge request not found" @@ -1390,392 +1480,306 @@ function mr_merge # Load existing merge request details local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - local title; title=$(gitlab_extract_title "$merge_request") - local merge_status; merge_status=$(gitlab_extract_merge_status "$merge_request") + local mr_title; mr_title=$(gitlab_extract_title "$merge_request") local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") + # Print merge request title & status echo echo "-------------------------------------------------------------------" - echo "$title" + echo "$mr_title" echo "-------------------------------------------------------------------" echo mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" +} - # test merge status - if [ "$merge_status" = "merged" ]; then - echo_error "Merge request is already merged." - echo_error - return - fi - if [ "$merge_status" != "can_be_merged" ]; then - echo_error "Merge request can not be merged. You probably need to rebase the branch and resolve conflicts." - echo_error - return - fi +function mr_update +{ + gitlab_check_env - # test open threads - local unresolved_thread_count; - unresolved_thread_count=$(gitlab_merge_request_threads "$project_url" "$mr_iid" | grep -c 'unresolved:true') + local current_branch; current_branch=$(git_current_branch) + local base_branch; base_branch=${1:-$(git_base_branch)} - if [ "$unresolved_thread_count" -gt 0 ]; then - echo_error "There are $unresolved_thread_count unresolved threads. Please resolve them before merging." - echo_error + # Search existing merge request + + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + + if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then + echo_error "Merge request not found" + mr_print "$(guess_issue_code)" "${base_branch}" return fi - if gitlab_title_is_draft "$title"; then - echo_error "Merge request is a draft (work in progress)" - - if [ "$(confirm "Do you want to resolve draft status?")" != "yes" ]; then echo_error; return; fi + # Load existing merge request details - echo -n "Resolving draft status... " - local undraft_title; undraft_title=$(gitlab_title_undraft "$title") - local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit $? + local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") + local mr_title; mr_title=$(gitlab_extract_title "$merge_request") + local mr_description; mr_description=$(gitlab_extract_description "$merge_request") + local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") - local result; result=$(gitlab_merge_request_update "${mr_iid}" "${mr_data}") + # Init commit lists - if [ ! -z "$result" ]; then echo -e "OK\n"; - else echo_error; return; fi - fi + local commit_messages; commit_messages=$(git_commits "$current_branch" "$base_branch") - # Merge + local current_commits; current_commits=$(echo "$commit_messages" | cut -d ' ' -f1) + local old_commits; old_commits=$(echo "$mr_description" | + grep -Po '^[^0-9a-fA-F]*[0-9a-fA-F]{7,}\s' | + sed -r 's/^[^0-9a-fA-F]*([0-9a-fA-F]{7,})\s/\1/g') - if [ "$(confirm "Do you want to merge '$current_branch' into '$current_target'?")" != "yes" ]; then echo; return; fi + local current_commits_array; current_commits_array=($(echo "$current_commits" | tr "\n" " ")) + local old_commits_array; old_commits_array=($(echo "$old_commits" | tr "\n" " ")) - echo -n "Merging '$current_branch'... " - local result; result=$(gitlab_merge_request_merge "${mr_iid}") - if [ -z "$result" ]; then echo; return; - else echo -e "OK\n"; fi + local updated_commit_count=0 + local new_commit_messages_display=() + local new_commit_messages_content=() - # checkout target branch + local new_description_display="$mr_description" + local new_description_content="$mr_description" - if [ "$(confirm "Do you want to checkout '$current_target' and pull changes?")" != "yes" ]; then echo; return; fi + local sameColor="lightblue" + local updatedColor="orange" + local newColor="green" - echo "git checkout $current_target && git pull --rebase" - git checkout "$current_target" && git pull --rebase - echo + # Iterate over commit lists, compare sha-1 and update description + for i in ${!current_commits_array[*]}; do - # delete local branch - - if [ "$(confirm "Do you want to delete local branch '$current_branch'")" != "yes" ]; then echo; return; fi - - echo "git branch -d $current_branch" - git branch -d "$current_branch" - echo -} - -function mr_menu -{ - gitlab_check_env - - local git_mr_menu_mode=show - local git_mr_menu_update_all=0 - - # Parse options - args=() - while [[ $# -gt 0 ]]; do - case "$1" in - # Consume options - up|update) git_mr_menu_mode=update ;; - st|status) git_mr_menu_mode=status ;; - -a|-A|--all) git_mr_menu_update_all=1 ;; - # Default: conserve argument - *) args+=("${1}") ;; - esac - shift - done - set -- "${args[@]}" - - ISSUE_CODE=${1:-$(guess_issue_code)} - - # All non-closed merge requests for issue code - local menu_items; menu_items=$(mr_menu_merge_requests "$ISSUE_CODE") - - if [ -z "$menu_items" ]; then - echo_error "No merge requests found for '$ISSUE_CODE'." - return - fi + local curr=${current_commits_array[$i]} + local old=${old_commits_array[$i]} - case "$git_mr_menu_mode" in - show) mr_menu_show "$ISSUE_CODE" "$menu_items" ;; - update) - if [ "$git_mr_menu_update_all" = "1" ]; then - mr_menu_update_all "$ISSUE_CODE" "$menu_items" + if [ ! -z "$old" ]; then + if [ "$old" = "$curr" ]; then + # same sha-1 - only decorate + new_description_display=$(echo "$new_description_display" | sed "s/$old/$(colorize "$curr" "$sameColor")/") + new_description_content=$(echo "$new_description_content" | sed "s/$old/$curr/" ) else - mr_menu_update "$ISSUE_CODE" "$menu_items" + # different sha-1 - replace & decorate + new_description_display=$(echo "$new_description_display" | sed "s/$old/$(colorize "$curr" "$updatedColor")/") + new_description_content=$(echo "$new_description_content" | sed "s/$old/$curr/" ) + updated_commit_count=$((updated_commit_count+1)) fi - ;; - status) mr_menu_status "$ISSUE_CODE" "$menu_items" ;; - esac -} - -function mr_menu_merge_requests -{ - ISSUE_CODE=${1:-$(guess_issue_code)} - - local mr_summaries; mr_summaries=$(gitlab_merge_requests_search "$ISSUE_CODE") || exit $? - if [ -z "$mr_summaries" ]; then - return - fi + else + # new commits + new_commit_messages_display+=("$(echo "$commit_messages" | grep "$curr" | sed "s/$curr/$(colorize "$curr" "$newColor")/")") + new_commit_messages_content+=("$(echo "$commit_messages" | grep "$curr")") + fi + done - # Load project names into bash associative array - declare -A project_arr - while IFS="=" read -r id name - do - project_arr[$id]="$name" - done < <(gitlab_projects | jq -r 'map((.id | tostring)+"="+.name) | .[]') + local new_commit_count=${#new_commit_messages_display[@]} - # Enrich merge request summaries with project names - while IFS=$'\n' read -r mr_summary - do - local project_id; project_id=$(echo "$mr_summary" | jq -r '.project_id') - local project_name; project_name=${project_arr[$project_id]} + # implode arrays + local new_commit_messages_display_str; new_commit_messages_display_str=$(printf "%s\n" "${new_commit_messages_display[@]}") + local new_commit_messages_content_str; new_commit_messages_content_str=$(printf "%s\n" "${new_commit_messages_content[@]}") - echo "$mr_summary" | jq -c --arg project_name "$project_name" '. + {project_name: $project_name}' + # Print updated merge request description + echo + echo "-------------------------------------------------------------------" + echo "$mr_title" + echo "-------------------------------------------------------------------" + echo "$new_description_display" + echo + echo + if [ "$new_commit_count" -gt 0 ]; then + echo "## Update" + echo + echo "$(markdown_list "$new_commit_messages_display_str" "**")" + echo + fi + echo "--------------------------------------------------------------------------------" + echo + echo " updated commits: $(colorize "$updated_commit_count" "$updatedColor")" + echo " new commits: $(colorize "$new_commit_count" "$newColor")" + echo - done < <(echo "$mr_summaries") -} + # Propose update if changes are detected -function mr_menu_contents -{ - local issue_code=$1 - local menu_items=$2 - local current_mr_url=$3; + if [ ! -x "$(command -v jq)" ]; then + echo_error "Please install jq to be able to update merge request" - local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} - local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} + else + local mr_update_data='{}' - echo "$git_mr_menu_start" - echo + if [ $((updated_commit_count + new_commit_count)) -gt 0 ] \ + && [ "$(confirm "Do you want to update the merge request description?")" = "yes" ]; then - while IFS=$'\n' read -r menu_item; do - local project_name; project_name=$(echo "$menu_item" | jq -r '.project_name') - local title; title=$(echo "$menu_item" | jq -r '.title') - local web_url; web_url=$(echo "$menu_item" | jq -r '.web_url') + local new_description + new_description=$(echo -e "${new_description_content}") - title=$(gitlab_title_undraft "$title") + if [ "$new_commit_count" -gt 0 ]; then + new_description=$(echo -e "${new_description}\n\n## Update") + new_description=$(echo -e "${new_description}\n\n$(markdown_list "$new_commit_messages_content_str" "**")") + fi + new_description=$(echo -e "${new_description}")$'\n' - local item_label - item_label=$(echo "${project_name}: $(markdown_link "${title}" "$web_url")") + mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit $? + fi - local wrap='' - if [ "$current_mr_url" == "$web_url" ]; then - wrap='**' # Markdown bold + if [ "$base_branch" != "$current_target" ] \ + && [ "$(confirm "Do you want to update the merge request target branch from '$current_target' to '$base_branch'?")" = "yes" ]; then + mr_update_data=$(jq_build "target_branch" "$base_branch" "$mr_update_data") || exit $? fi - echo "* ${wrap}${item_label}${wrap}" + if [ "$mr_update_data" != "{}" ]; then - done < <(echo "$menu_items") + echo -n "Updating merge request..." - echo - echo "$git_mr_menu_end" -} + local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_update_data") -function mr_menu_status -{ - local issue_code=$1 - local menu_items=$2 + if [ ! -z "$result" ]; then echo -e "OK\n"; fi - local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} - local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} + # reload merge request details + merge_request=$(gitlab_merge_request "$mr_iid") + fi + fi - echo "$git_mr_menu_start" + echo "--------------------------------------------------------------------------------" echo - while IFS=$'\n' read -r menu_item; do - local mr_iid; mr_iid=$(echo "$menu_item" | jq -r '.iid') - local project_name; project_name=$(echo "$menu_item" | jq -r '.project_name') - local title; title=$(echo "$menu_item" | jq -r '.title') - local web_url; web_url=$(echo "$menu_item" | jq -r '.web_url') - - title=$(gitlab_title_undraft "$title") - - local item_label - item_label=$(echo "${project_name}: $(markdown_link "${title}" "$web_url")") - - echo "* ${item_label}" - - local project_url; project_url=$(gitlab_extract_project_url "$web_url") - - # Load existing merge request details - # Do NOT use `gitlab_merge_request` - merge_request=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid") - - mr_print_status "${mr_iid}" "$merge_request" - - done < <(echo "$menu_items") - - echo - echo "$git_mr_menu_end" + mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" } -function mr_menu_show +function mr_merge { - local issue_code=$1 - local menu_items=$2 + gitlab_check_env - echo - mr_menu_contents "$issue_code" "$menu_items" -} + local gitlab_base_url="https://${GITLAB_DOMAIN}/api/v4" -function mr_menu_update -{ - local issue_code=$1 - local menu_items=$2 + local current_branch; current_branch=$(git_current_branch) + local base_branch; base_branch=${1:-$(git_base_branch)} - # Look for existing merge request - local current_branch - current_branch=$(git_current_branch) + # Search existing merge request - local current_mr_summary; current_mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? - local current_mr_iid; current_mr_iid=$(gitlab_extract_iid "$current_mr_summary") - local current_mr_url; current_mr_url=$(gitlab_extract_url "$current_mr_summary") + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + local project_url; project_url=$(gitlab_extract_project_url "$mr_url") - if [ -z "${current_mr_iid}" ] || [ -z "${current_mr_url}" ]; then + if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then echo_error "Merge request not found" - echo - mr_menu_contents "$issue_code" "$menu_items" + mr_print "$(guess_issue_code)" "${base_branch}" return fi # Load existing merge request details - local merge_request; merge_request=$(gitlab_merge_request "$current_mr_iid") - local mr_description; mr_description=$(gitlab_extract_description "$merge_request") - local mr_menu_content; - mr_menu_content=$(mr_menu_contents "$issue_code" "$menu_items" "$current_mr_url") - - local updated_description; - updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" + local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") + local title; title=$(gitlab_extract_title "$merge_request") + local merge_status; merge_status=$(gitlab_extract_merge_status "$merge_request") + local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") echo - echo "$updated_description" + echo "-------------------------------------------------------------------" + echo "$title" + echo "-------------------------------------------------------------------" echo - echo '--------------------------------------------------------------------------------' + mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" - local mr_update_data='{}' - if [ "$(confirm "Do you want to update the menu in the merge request description?")" = "yes" ]; then - mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? + # test merge status + if [ "$merge_status" = "merged" ]; then + echo_error "Merge request is already merged." + echo_error + return fi - if [ "$mr_update_data" != "{}" ]; then - echo -n "Updating merge request..." - local result - result=$(gitlab_merge_request_update "$current_mr_iid" "$mr_update_data") - if [ ! -z "$result" ]; then echo -e "OK\n"; fi + if [ "$merge_status" != "can_be_merged" ]; then + echo_error "Merge request can not be merged. You probably need to rebase the branch and resolve conflicts." + echo_error + return fi -} -function mr_menu_update_all -{ - local issue_code=$1 - local menu_items=$2 - - local mr_iid - local mr_url - local project_url - local merge_request - local mr_description - local mr_menu_content - local updated_description - local mr_update_data - local result + # test open threads + local unresolved_thread_count; + unresolved_thread_count=$(gitlab_merge_request_threads "$project_url" "$mr_iid" | grep -c 'unresolved:true') - # Use array instead of looping over variable content with `read` to leave standard input open for `confirm` - readarray menu_array < <(echo "$menu_items") + if [ "$unresolved_thread_count" -gt 0 ]; then + echo_error "There are $unresolved_thread_count unresolved threads. Please resolve them before merging." + echo_error + return + fi - for menu_item in "${menu_array[@]}"; do + if gitlab_title_is_draft "$title"; then + echo_error "Merge request is a draft (work in progress)" - mr_iid=$(echo "$menu_item" | jq -r '.iid') - mr_url=$(echo "$menu_item" | jq -r '.web_url') + if [ "$(confirm "Do you want to resolve draft status?")" != "yes" ]; then echo_error; return; fi - # Beware, `gitlab_merge_request` and `gitlab_merge_request_update` use 'gitlab_project_request', which is project-specific - # Here, we can expect other target projects here. - project_url=$(gitlab_extract_project_url "$mr_url") + echo -n "Resolving draft status... " + local undraft_title; undraft_title=$(gitlab_title_undraft "$title") + local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit $? - # Load existing merge request details - # Do NOT use `gitlab_merge_request` - merge_request=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid") + local result; result=$(gitlab_merge_request_update "${mr_iid}" "${mr_data}") - mr_description=$(gitlab_extract_description "$merge_request") + if [ ! -z "$result" ]; then echo -e "OK\n"; + else echo_error; return; fi + fi - mr_menu_content=$(mr_menu_contents "$issue_code" "$menu_items" "$mr_url") - updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" + # Merge - echo - echo "$updated_description" - echo - echo '--------------------------------------------------------------------------------' - echo - echo "Merge request:" - echo - echo " ${mr_url}" - echo + if [ "$(confirm "Do you want to merge '$current_branch' into '$current_target'?")" != "yes" ]; then echo; return; fi - mr_update_data='{}' + echo -n "Merging '$current_branch'... " + local result; result=$(gitlab_merge_request_merge "${mr_iid}") + if [ -z "$result" ]; then echo; return; + else echo -e "OK\n"; fi - if [ "$(confirm "Do you want to update the menu in the merge request description?")" = "yes" ]; then - mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? - fi + # checkout target branch - if [ "$mr_update_data" != "{}" ]; then - echo -n "Updating merge request..." - # Do NOT use `gitlab_merge_request_update` - result=$(gitlab_request "projects/${project_url}/merge_requests/${mr_iid}" "PUT" "${mr_update_data}") - if [ ! -z "$result" ]; then echo -e "OK\n"; fi - fi - done + if [ "$(confirm "Do you want to checkout '$current_target' and pull changes?")" != "yes" ]; then echo; return; fi - echo '--------------------------------------------------------------------------------' + echo "git checkout $current_target && git pull --rebase" + git checkout "$current_target" && git pull --rebase echo - mr_menu_contents "$issue_code" "$menu_items" + # delete local branch + + if [ "$(confirm "Do you want to delete local branch '$current_branch'")" != "yes" ]; then echo; return; fi + + echo "git branch -d $current_branch" + git branch -d "$current_branch" + echo } -function mr_menu_replace_description +function mr_menu { - local mr_description=$1 - local menu_content=$2 + gitlab_check_env - local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} - local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} + local git_mr_menu_mode=show + local git_mr_menu_update_all=0 - menu_start=$(echo "$mr_description" | grep -n "$git_mr_menu_start" | cut -f1 -d:) - menu_end=$(echo "$mr_description" | grep -n -- "$git_mr_menu_end" | cut -f1 -d: | head -n 1) + # Parse options + args=() + while [[ $# -gt 0 ]]; do + case "$1" in + # Consume options + up|update) git_mr_menu_mode=update ;; + st|status) git_mr_menu_mode=status ;; + -a|-A|--all) git_mr_menu_update_all=1 ;; + # Default: conserve argument + *) args+=("${1}") ;; + esac + shift + done + set -- "${args[@]}" - has_menu=0 - if [ -n "$menu_start" ] && [ -n "$menu_end" ] && [ "$menu_start" -gt "0" ] && [ "$menu_end" -gt "$menu_start" ]; then - has_menu=1 + ISSUE_CODE=${1:-$(guess_issue_code)} + + # All non-closed merge requests for issue code + local menu_items; menu_items=$(mr_menu_merge_requests "$ISSUE_CODE") + + if [ -z "$menu_items" ]; then + echo_error "No merge requests found for '$ISSUE_CODE'." + return fi - # Iterate over description lines and insert/replace menu - i=1 - while IFS=$'\n' read -r mr_description_line - do - if [ "$has_menu" = "1" ]; then - if [ "$i" -lt "$menu_start" ] || [ "$i" -gt "$menu_end" ]; then - # output non-menu line - echo "$mr_description_line" + case "$git_mr_menu_mode" in + show) mr_menu_show "$ISSUE_CODE" "$menu_items" ;; + update) + if [ "$git_mr_menu_update_all" = "1" ]; then + mr_menu_update_all "$ISSUE_CODE" "$menu_items" else - # replace menu once - if [ "$i" -eq "$menu_end" ]; then - echo_debug "Replacing menu" - echo "$menu_content" - fi - fi - else - # output non-menu line - echo "$mr_description_line" - # insert menu once - if [ "$i" -eq "2" ]; then - echo_debug "Inserting menu" - echo "$menu_content" - echo + mr_menu_update "$ISSUE_CODE" "$menu_items" fi - fi - - ((i+=1)) - - done < <(echo "$mr_description") + ;; + status) mr_menu_status "$ISSUE_CODE" "$menu_items" ;; + esac } function mr_ip From ecee8bcf3110db031e9681be312788e047fffb25 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 14 Dec 2022 13:50:52 +0100 Subject: [PATCH 02/88] git-mr for non-current branch - target branch determination --- git-mr | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/git-mr b/git-mr index 60f7cd2..599b908 100755 --- a/git-mr +++ b/git-mr @@ -13,10 +13,12 @@ function git_current_branch function git_base_branch { + local branch=${1:-HEAD} + # Nearest branch in commit history local base_branch; base_branch=$( \ - git log --decorate --simplify-by-decoration --oneline \ - --decorate-refs='refs/heads/*' | # select only commits with a local branch + git log --oneline --decorate "${branch}" \ + --simplify-by-decoration --decorate-refs='refs/heads/*' | # select only commits with a local branch head -n2 | tail -n1 | # select closest decoration before current HEAD sed 's/[a-f0-9]\+ (\([^)]*\)) .*/\1/' | # filters out everything but decorations sed -e 's/, /\n/g' | # splits decorations From 67c6b9f922044c65f39115f058efdf388f21e611 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 14 Dec 2022 13:50:52 +0100 Subject: [PATCH 03/88] git-mr for non-current branch - target & code options --- git-mr | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/git-mr b/git-mr index 599b908..20b9890 100755 --- a/git-mr +++ b/git-mr @@ -1882,6 +1882,9 @@ SYNOPSIS OPTIONS + -t | --target TARGET_BRANCH Force target branch. + -c | --code ISSUE_CODE Force issue code. + -v Verbose output (displays called API URLs) -y Bypass confirmation prompts ("yes") -e Use full commit messages in description ("extended", for \`git mr update\`) @@ -1968,6 +1971,9 @@ GITLAB_DRAFT_PREFIXES=("WIP" "Draft") args=() while [[ $# -gt 0 ]]; do case "$1" in + -t|--target) GIT_MR_TARGET="$2"; shift ;; + -c|--code) GIT_MR_CODE="$2"; shift ;; + -v|-V) GIT_MR_VERBOSE=1 ;; -y|-Y) GIT_MR_YES=1 ;; -e|-E) GIT_MR_EXTENDED=1 ;; From 22c856c8edd883de8661b47e0a2f0b4c27086467 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 14 Dec 2022 13:50:52 +0100 Subject: [PATCH 04/88] git-mr for non-current branch - arguments refactor --- git-mr | 222 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 109 insertions(+), 113 deletions(-) diff --git a/git-mr b/git-mr index 20b9890..572ce47 100755 --- a/git-mr +++ b/git-mr @@ -36,20 +36,20 @@ function git_base_branch function git_commits { - local current_branch=${1:-$(git_current_branch)} - local base_branch=${2:-$(git_base_branch)} + local source_branch=${1:-$(git_current_branch)} + local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} - git log --oneline --reverse --no-decorate "heads/${base_branch}..heads/${current_branch}" + git log --oneline --reverse --no-decorate "heads/${target_branch}..heads/${source_branch}" } function git_commits_extended { - local current_branch=${1:-$(git_current_branch)} - local base_branch=${2:-$(git_base_branch)} + local source_branch=${1:-$(git_current_branch)} + local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} local format="* **%h %s**%n%n%b" - git log --reverse --no-decorate --format="${format}" "${base_branch}".."${current_branch}" + git log --reverse --no-decorate --format="${format}" "${target_branch}".."${source_branch}" } function git_titlize_branch @@ -482,7 +482,7 @@ function gitlab_new_merge_request_url if [ -z "$project_url" ]; then return; fi local source_branch=${1:-$(git_current_branch)} - local target_branch=${2:-$(git_base_branch)} + local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} local gitlab_mr_url="https://${GITLAB_DOMAIN}/${project_url}/-/merge_requests/new" @@ -757,18 +757,17 @@ function gitlab_undraft { gitlab_check_env - local current_branch; current_branch=$(git_current_branch) - local base_branch; base_branch=$(git_base_branch) + local source_branch=${1:-$(git_current_branch)} # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then echo_error "Merge request not found" - mr_print "$(guess_issue_code)" "${base_branch}" + mr_print "$source_branch" return fi @@ -782,7 +781,7 @@ function gitlab_undraft echo "$mr_title" echo "-------------------------------------------------------------------" echo - mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" + mr_actions "$source_branch" "$mr_summary" "$merge_request" echo if ! gitlab_title_is_draft "$mr_title"; then @@ -813,9 +812,9 @@ function guess_issue_code { [ ! -z "$JIRA_CODE_PATTERN" ] || exit_error 0 "JIRA_CODE_PATTERN not set - unable to guess issue code" - local current_branch; current_branch=$(git_current_branch) + local branch=${1:-$(git_current_branch)} - local issue_code; issue_code=$(echo "${current_branch}" | + local issue_code; issue_code=$(echo "${branch}" | grep -Eo "$JIRA_CODE_PATTERN" | tail -n1) @@ -831,25 +830,26 @@ function guess_issue_code function mr_title { - local current_branch=${1:-$(git_current_branch)} + local source_branch=${1:-$(git_current_branch)} + local issue_code=${2:-${GIT_MR_CODE:-$(guess_issue_code "$source_branch")}} - if [ -z "$ISSUE_CODE" ]; then - echo "$current_branch" + if [ -z "$issue_code" ]; then + echo "$source_branch" return fi - local issue_content; issue_content=$(jira_ticket_data "$ISSUE_CODE") + local issue_content; issue_content=$(jira_ticket_data "$issue_code") local issue_key; issue_key=$(echo "$issue_content" | jq -r '.key // empty' ) local issue_title; issue_title=$(echo "$issue_content" | jq -r '.fields.summary // empty') if [ -z "$issue_key" ]; then - issue_key=${ISSUE_CODE^^} + issue_key=${issue_code^^} fi if [ -z "$issue_title" ]; then echo_error "Unable to get issue title from Jira" - echo_error " ISSUE_CODE: $ISSUE_CODE" + echo_error " issue_code: $issue_code" if [ ! -z "$issue_content" ]; then echo_error " $issue_content" fi @@ -865,19 +865,20 @@ function mr_title function mr_description { - local current_branch=${1:-$(git_current_branch)} - local base_branch=${2:-$(git_base_branch)} + local source_branch=${1:-$(git_current_branch)} + local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} + local issue_code=${3:-${GIT_MR_CODE:-$(guess_issue_code "$source_branch")}} - local title; title=$(mr_title "$current_branch") || exit $? + local title; title=$(mr_title "$source_branch" "$issue_code") || exit $? local commits local description if [ "$GIT_MR_EXTENDED" = "1" ]; then - commits=$(git_commits_extended "$current_branch" "$base_branch") + commits=$(git_commits_extended "$source_branch" "$target_branch") # indent extended description (not starting with '* **') description=$(echo "$commits" | sed -E 's/^([^*].*|\*[^ ].*|\* [^*].*|\* \*[^*].*)$/ \1/gm') else - commits=$(git_commits "$current_branch" "$base_branch") + commits=$(git_commits "$source_branch" "$target_branch") description=$(markdown_list "$commits" "**") fi @@ -894,13 +895,13 @@ EOF function mr_actions { - local current_branch=${1:-$(git_current_branch)} - local base_branch=${2:-$(git_base_branch)} - local mr_summary=${3} - local mr_detail=${4} + local source_branch=${1:-$(git_current_branch)} + + local mr_summary=${2} + local mr_detail=${3} if [ -z "$mr_summary" ]; then - mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? fi local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") @@ -916,8 +917,9 @@ EOF return fi + local target_branch=${GIT_MR_TARGET:-$(git_base_branch "$source_branch")} local new_mr_url - new_mr_url=$(gitlab_new_merge_request_url "${current_branch}" "${base_branch}") + new_mr_url=$(gitlab_new_merge_request_url "${source_branch}" "${target_branch}") cat << EOF To create a new merge request: @@ -1072,18 +1074,25 @@ function mr_print_status function mr_update_labels { - local current_branch; current_branch=$(git_current_branch) - local base_branch; base_branch=$(git_base_branch) + local source_branch=${1:-$(git_current_branch)} + + # strip leading & trailing label commas + local to_remove; to_remove=$(echo -e "$2" | sed 's/^,*//' | sed 's/,*$//') + local to_add; to_add=$(echo -e "$3" | sed 's/^,*//' | sed 's/,*$//') + + if [ -z "$to_remove" ] && [ -z "$to_add" ]; then + echo_error "No label to add or remove"; return + fi # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then echo_error "Merge request not found" - mr_print "$(guess_issue_code)" "${base_branch}" + mr_print "$source_branch" return fi @@ -1099,17 +1108,9 @@ function mr_update_labels echo "$mr_title" echo "-------------------------------------------------------------------" echo - mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" + mr_actions "$source_branch" "$mr_summary" "$merge_request" echo - # strip leading & trailing label commas - local to_remove; to_remove=$(echo -e "$1" | sed 's/^,*//' | sed 's/,*$//') - local to_add; to_add=$(echo -e "$2" | sed 's/^,*//' | sed 's/,*$//') - - if [ -z "$to_remove" ] && [ -z "$to_add" ]; then - echo_error "No label to add or remove"; return - fi - local new_labels; new_labels=$(replace_labels "$labels" "$to_remove" "$to_add") if [ "$(confirm "Do you want to update the merge request labels to \"$new_labels\"?")" = "yes" ]; then echo -n "Updating merge request labels... " @@ -1127,9 +1128,9 @@ function mr_update_labels function mr_menu_merge_requests { - ISSUE_CODE=${1:-$(guess_issue_code)} + local issue_code=${1:-${GIT_MR_CODE:-$(guess_issue_code)}} - local mr_summaries; mr_summaries=$(gitlab_merge_requests_search "$ISSUE_CODE") || exit $? + local mr_summaries; mr_summaries=$(gitlab_merge_requests_search "$issue_code") || exit $? if [ -z "$mr_summaries" ]; then return fi @@ -1154,9 +1155,8 @@ function mr_menu_merge_requests function mr_menu_contents { - local issue_code=$1 - local menu_items=$2 - local current_mr_url=$3; + local menu_items=$1 + local current_mr_url=$2; local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} @@ -1189,8 +1189,7 @@ function mr_menu_contents function mr_menu_status { - local issue_code=$1 - local menu_items=$2 + local menu_items=$1 local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} @@ -1227,17 +1226,15 @@ function mr_menu_status function mr_menu_show { - local issue_code=$1 - local menu_items=$2 + local menu_items=$1 echo - mr_menu_contents "$issue_code" "$menu_items" + mr_menu_contents "$menu_items" } function mr_menu_update { - local issue_code=$1 - local menu_items=$2 + local menu_items=$1 # Look for existing merge request local current_branch @@ -1250,7 +1247,7 @@ function mr_menu_update if [ -z "${current_mr_iid}" ] || [ -z "${current_mr_url}" ]; then echo_error "Merge request not found" echo - mr_menu_contents "$issue_code" "$menu_items" + mr_menu_contents "$menu_items" return fi @@ -1259,7 +1256,7 @@ function mr_menu_update local mr_description; mr_description=$(gitlab_extract_description "$merge_request") local mr_menu_content; - mr_menu_content=$(mr_menu_contents "$issue_code" "$menu_items" "$current_mr_url") + mr_menu_content=$(mr_menu_contents "$menu_items" "$current_mr_url") local updated_description; updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" @@ -1283,8 +1280,7 @@ function mr_menu_update function mr_menu_update_all { - local issue_code=$1 - local menu_items=$2 + local menu_items=$1 local mr_iid local mr_url @@ -1314,7 +1310,7 @@ function mr_menu_update_all mr_description=$(gitlab_extract_description "$merge_request") - mr_menu_content=$(mr_menu_contents "$issue_code" "$menu_items" "$mr_url") + mr_menu_content=$(mr_menu_contents "$menu_items" "$mr_url") updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" echo @@ -1344,7 +1340,7 @@ function mr_menu_update_all echo '--------------------------------------------------------------------------------' echo - mr_menu_contents "$issue_code" "$menu_items" + mr_menu_contents "$menu_items" } function mr_menu_replace_description @@ -1400,29 +1396,28 @@ function mr_menu_replace_description function mr_print { - ISSUE_CODE=${1:-$(guess_issue_code)} - - local current_branch; current_branch=$(git_current_branch) - local base_branch=${2:-$(git_base_branch)} + local source_branch=${1:-$(git_current_branch)} + local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} + local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} cat << EOF -------------------------------------------------------------------------------- -$(mr_description "$current_branch" "$base_branch") +$(mr_description "$source_branch" "$target_branch" "$issue_code") -------------------------------------------------------------------------------- EOF - mr_actions "$current_branch" "$base_branch" + mr_actions "$source_branch" } function mr_open { - local current_branch; current_branch=$(git_current_branch) - local base_branch; base_branch=${2:-$(git_base_branch)} + local source_branch=${1:-$(git_current_branch)} + local target_branch=${GIT_MR_TARGET:-$(git_base_branch "$source_branch")} - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") @@ -1434,7 +1429,7 @@ function mr_open ISSUE_CODE=${1:-$(guess_issue_code)} - local description; description=$(mr_description "$current_branch" "$base_branch") + local description; description=$(mr_description "$source_branch" "$target_branch") cat << EOF @@ -1445,7 +1440,7 @@ ${description} EOF - local new_mr_url; new_mr_url=$(gitlab_new_merge_request_url "${current_branch}" "${base_branch}") + local new_mr_url; new_mr_url=$(gitlab_new_merge_request_url "${source_branch}" "${target_branch}") if [ ! -z "${new_mr_url}" ]; then @@ -1464,18 +1459,17 @@ function mr_status { gitlab_check_env - local current_branch; current_branch=$(git_current_branch) - local base_branch; base_branch=${1:-$(git_base_branch)} + local source_branch=${1:-$(git_current_branch)} # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then echo_error "Merge request not found" - mr_print "$(guess_issue_code)" "${base_branch}" + mr_print "$source_branch" return fi @@ -1491,25 +1485,25 @@ function mr_status echo "$mr_title" echo "-------------------------------------------------------------------" echo - mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" + mr_actions "$source_branch" "$mr_summary" "$merge_request" } function mr_update { gitlab_check_env - local current_branch; current_branch=$(git_current_branch) - local base_branch; base_branch=${1:-$(git_base_branch)} + local source_branch=${1:-$(git_current_branch)} + local target_branch=${GIT_MR_TARGET:-$(git_base_branch "$source_branch")} # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then echo_error "Merge request not found" - mr_print "$(guess_issue_code)" "${base_branch}" + mr_print "$source_branch" "$target_branch" return fi @@ -1522,7 +1516,7 @@ function mr_update # Init commit lists - local commit_messages; commit_messages=$(git_commits "$current_branch" "$base_branch") + local commit_messages; commit_messages=$(git_commits "$source_branch" "$target_branch") local current_commits; current_commits=$(echo "$commit_messages" | cut -d ' ' -f1) local old_commits; old_commits=$(echo "$mr_description" | @@ -1616,9 +1610,9 @@ function mr_update mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit $? fi - if [ "$base_branch" != "$current_target" ] \ - && [ "$(confirm "Do you want to update the merge request target branch from '$current_target' to '$base_branch'?")" = "yes" ]; then - mr_update_data=$(jq_build "target_branch" "$base_branch" "$mr_update_data") || exit $? + if [ "$target_branch" != "$current_target" ] \ + && [ "$(confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?")" = "yes" ]; then + mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit $? fi if [ "$mr_update_data" != "{}" ]; then @@ -1637,28 +1631,25 @@ function mr_update echo "--------------------------------------------------------------------------------" echo - mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" + mr_actions "$source_branch" "$mr_summary" "$merge_request" } function mr_merge { gitlab_check_env - local gitlab_base_url="https://${GITLAB_DOMAIN}/api/v4" - - local current_branch; current_branch=$(git_current_branch) - local base_branch; base_branch=${1:-$(git_base_branch)} + local source_branch=${1:-$(git_current_branch)} # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") local project_url; project_url=$(gitlab_extract_project_url "$mr_url") if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then echo_error "Merge request not found" - mr_print "$(guess_issue_code)" "${base_branch}" + mr_print "$source_branch" return fi @@ -1674,7 +1665,7 @@ function mr_merge echo "$title" echo "-------------------------------------------------------------------" echo - mr_actions "$current_branch" "$base_branch" "$mr_summary" "$merge_request" + mr_actions "$source_branch" "$mr_summary" "$merge_request" # test merge status if [ "$merge_status" = "merged" ]; then @@ -1715,9 +1706,9 @@ function mr_merge # Merge - if [ "$(confirm "Do you want to merge '$current_branch' into '$current_target'?")" != "yes" ]; then echo; return; fi + if [ "$(confirm "Do you want to merge '$source_branch' into '$current_target'?")" != "yes" ]; then echo; return; fi - echo -n "Merging '$current_branch'... " + echo -n "Merging '$source_branch'... " local result; result=$(gitlab_merge_request_merge "${mr_iid}") if [ -z "$result" ]; then echo; return; else echo -e "OK\n"; fi @@ -1732,10 +1723,10 @@ function mr_merge # delete local branch - if [ "$(confirm "Do you want to delete local branch '$current_branch'")" != "yes" ]; then echo; return; fi + if [ "$(confirm "Do you want to delete local branch '$source_branch'")" != "yes" ]; then echo; return; fi - echo "git branch -d $current_branch" - git branch -d "$current_branch" + echo "git branch -d $source_branch" + git branch -d "$source_branch" echo } @@ -1761,26 +1752,31 @@ function mr_menu done set -- "${args[@]}" - ISSUE_CODE=${1:-$(guess_issue_code)} + local source_branch; source_branch=$(git_current_branch) + local issue_code=${GIT_MR_CODE:-${1:-$(guess_issue_code "$source_branch")}} + + if [ -z "$issue_code" ]; then + return + fi # All non-closed merge requests for issue code - local menu_items; menu_items=$(mr_menu_merge_requests "$ISSUE_CODE") + local menu_items; menu_items=$(mr_menu_merge_requests "$issue_code") if [ -z "$menu_items" ]; then - echo_error "No merge requests found for '$ISSUE_CODE'." + echo_error "No merge requests found for '$issue_code'." return fi case "$git_mr_menu_mode" in - show) mr_menu_show "$ISSUE_CODE" "$menu_items" ;; + show) mr_menu_show "$menu_items" ;; update) if [ "$git_mr_menu_update_all" = "1" ]; then - mr_menu_update_all "$ISSUE_CODE" "$menu_items" + mr_menu_update_all "$menu_items" else - mr_menu_update "$ISSUE_CODE" "$menu_items" + mr_menu_update "$menu_items" fi ;; - status) mr_menu_status "$ISSUE_CODE" "$menu_items" ;; + status) mr_menu_status "$menu_items" ;; esac } @@ -1790,9 +1786,9 @@ function mr_ip [ ! -z "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" [ ! -z "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" - ISSUE_CODE=${1:-$(guess_issue_code)} + local source_branch=${1:-$(git_current_branch)} - mr_update_labels "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS},${GITLAB_CR_LABELS}" "" + mr_update_labels "${source_branch}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS},${GITLAB_CR_LABELS}" "" if [ ! -z "$ISSUE_CODE" ] \ && [ ! -z "$JIRA_IP_ID" ] \ @@ -1810,9 +1806,9 @@ function mr_cr [ ! -z "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" [ ! -z "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" - ISSUE_CODE=${1:-$(guess_issue_code)} + local source_branch=${1:-$(git_current_branch)} - mr_update_labels "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_CR_LABELS}" + mr_update_labels "${source_branch}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_CR_LABELS}" if [ ! -z "$ISSUE_CODE" ] \ && [ ! -z "$JIRA_CR_ID" ] \ @@ -1830,9 +1826,9 @@ function mr_qa [ ! -z "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" [ ! -z "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" - ISSUE_CODE=${1:-$(guess_issue_code)} + local source_branch=${1:-$(git_current_branch)} - mr_update_labels "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS}" "${GITLAB_QA_LABELS}" + mr_update_labels "${source_branch}" "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS}" "${GITLAB_QA_LABELS}" if [ ! -z "$ISSUE_CODE" ] \ && [ ! -z "$JIRA_QA_ID" ] \ @@ -1997,7 +1993,7 @@ case $1 in menu) mr_menu "${@:2}" ;; - undraft) gitlab_undraft ;; + undraft) gitlab_undraft "${@:2}" ;; p|ip|IP) mr_ip "${@:2}" ;; r|cr|CR) mr_cr "${@:2}" ;; From 7da12ed1678dee06e35521c05d69fe4adce2469d Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 14 Dec 2022 13:50:52 +0100 Subject: [PATCH 05/88] Humanize MR title when using branch name --- git-mr | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/git-mr b/git-mr index 572ce47..a5176d7 100755 --- a/git-mr +++ b/git-mr @@ -85,8 +85,7 @@ function git_titlize_branch local title_ref; title_ref="${prefix^}${issue_id}" local title_label; title_label="$(echo "${label^}" | sed 's/[-_]/ /g')" - # Draft prefix - gitlab_title_to_draft "${title_ref}${title_label}" + echo "${title_ref}${title_label}" } @@ -502,6 +501,7 @@ function gitlab_new_merge_request_url # title local title title=$(git_titlize_branch "$source_branch") + title=$(gitlab_title_to_draft "$title") title=$(urlencode "$title") gitlab_mr_url="${gitlab_mr_url}&$(urlencode "merge_request[title]")=${title}" @@ -834,7 +834,7 @@ function mr_title local issue_code=${2:-${GIT_MR_CODE:-$(guess_issue_code "$source_branch")}} if [ -z "$issue_code" ]; then - echo "$source_branch" + git_titlize_branch "$source_branch" return fi From c95636c394fdb3fb9103056875c44da1f1f3ce2e Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 29 Dec 2022 14:24:21 +0100 Subject: [PATCH 06/88] Tweak markdown list generation Remove blank lines from 'extended' merge request descriptions --- git-mr | 50 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/git-mr b/git-mr index a5176d7..61c4f43 100755 --- a/git-mr +++ b/git-mr @@ -47,9 +47,15 @@ function git_commits_extended local source_branch=${1:-$(git_current_branch)} local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} - local format="* **%h %s**%n%n%b" + local prefix="* ${MD_BOLD}" + local suffix="${MD_BOLD}${MD_BR}" - git log --reverse --no-decorate --format="${format}" "${target_branch}".."${source_branch}" + local end="---COMMIT-BODY-END---" # useful to remove trailing blank line + + local format="${prefix}%h %s${suffix}%n%b${end}" + + git log --reverse --no-decorate --format="${format}" "${target_branch}".."${source_branch}" | + grep -v "^${end}" # remove trailing blank line } function git_titlize_branch @@ -209,6 +215,12 @@ function jq_build '$initial_data + $current_object' } +# escape regex special characters for literal usage +function regex_escape +{ + echo "${1}" | sed -e 's/[]\/$*.^[]/\\&/g' +} + function replace_labels { local labels=$1 @@ -295,14 +307,25 @@ function markdown_link function markdown_list { local content=$1 - local wrap=$2 - local prefix="* ${wrap}" - local suffix="${wrap}
" + local prefix="* ${MD_BOLD}" + local suffix="${MD_BOLD}${MD_BR}" + + echo "$content" | sed "s/.*/${prefix}&${suffix}/" +} + +function markdown_indent_list_items +{ + local content=$1 + + local list_prefix_pattern + list_prefix_pattern="$(regex_escape "* ${MD_BOLD}")" - echo "$content" | - sed "s/^/${prefix}/g" | - sed "s/$/${suffix}/g" + # indent extended description (not starting with list prefix) + local indent=" " + echo "$content" | sed -E \ + -e "/^${list_prefix_pattern}/! s/^(.*)$/${indent}\1${MD_BR}/gm" \ + -e "s/^${indent}${MD_BR}$/${indent}/gm" } @@ -875,11 +898,10 @@ function mr_description local description if [ "$GIT_MR_EXTENDED" = "1" ]; then commits=$(git_commits_extended "$source_branch" "$target_branch") - # indent extended description (not starting with '* **') - description=$(echo "$commits" | sed -E 's/^([^*].*|\*[^ ].*|\* [^*].*|\* \*[^*].*)$/ \1/gm') + description=$(markdown_indent_list_items "$commits") else commits=$(git_commits "$source_branch" "$target_branch") - description=$(markdown_list "$commits" "**") + description=$(markdown_list "$commits") fi cat << EOF @@ -1578,7 +1600,7 @@ function mr_update if [ "$new_commit_count" -gt 0 ]; then echo "## Update" echo - echo "$(markdown_list "$new_commit_messages_display_str" "**")" + echo "$(markdown_list "$new_commit_messages_display_str")" echo fi echo "--------------------------------------------------------------------------------" @@ -1603,7 +1625,7 @@ function mr_update if [ "$new_commit_count" -gt 0 ]; then new_description=$(echo -e "${new_description}\n\n## Update") - new_description=$(echo -e "${new_description}\n\n$(markdown_list "$new_commit_messages_content_str" "**")") + new_description=$(echo -e "${new_description}\n\n$(markdown_list "$new_commit_messages_content_str")") fi new_description=$(echo -e "${new_description}")$'\n' @@ -1962,6 +1984,8 @@ fi # Hardcoded constants GITLAB_DRAFT_PREFIX="Draft" GITLAB_DRAFT_PREFIXES=("WIP" "Draft") +MD_BOLD=${MD_BOLD="**"} # Markdown bold +MD_BR=${MD_BR=" "} # Markdown line break # Parse options args=() From d5ab1e1179658578f160f1430d071de8566b1703 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 2 Jan 2023 15:52:14 +0100 Subject: [PATCH 07/88] Introduce completion --- git-mr-completion.bash | 91 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 git-mr-completion.bash diff --git a/git-mr-completion.bash b/git-mr-completion.bash new file mode 100644 index 0000000..4eb7e3c --- /dev/null +++ b/git-mr-completion.bash @@ -0,0 +1,91 @@ +# See https://github.com/git/git/blob/master/contrib/completion/git-completion.bash +_git_mr() { + local isAnyAction + local isMenu + local isMenuStatus + local isMenuUpdate + local isMenuUpdateAll + local isUpdate + + # Parse current command words to get context + for w in "${words[@]}"; do + case "$w" in + open|status|update|merge|menu|ip|cr|qa|undraft|hook|base|code|help) isAnyAction=1 ;; + esac + [[ $w == "menu" ]] && isMenu=1 + if [[ -n "$isMenu" ]]; then + [[ "$w" == "update" ]] && isMenuUpdate=1 + [[ "$w" == "status" ]] && isMenuStatus=1 + if [[ -n "$isMenuUpdate" ]]; then + [[ "$w" == "--all" ]] && isMenuUpdateAll=1 + fi + else + [[ "$w" == "update" ]] && isUpdate=1 + fi + done + + case "$prev" in + # Options with values + -t|--target) __git_complete_refs --mode="heads"; return ;; + -c|--code) COMPREPLY=(); return ;; + # Actions without additional argument or option + hook|base|code) COMPREPLY=(); return ;; + esac + + # Menu + if [[ -n $isMenu ]]; then + [[ -n $isMenuStatus ]] && return + [[ -n $isMenuUpdateAll ]] && return + [[ -n $isMenuUpdate ]] && __gitcomp "--all" && return + __gitcomp "status update" + return + fi + + case "$cur" in + --*) + __gitcomp "--code --target" + return + ;; + -*) + __gitcomp "-c --code -e -t --target -v -y" + [[ -n $isUpdate ]] && __gitcomp_nl_append "-n" + return + ;; + *) + __git_complete_refs --mode="heads" + [[ -z $isAnyAction ]] && __gitcomp_nl_append "$(cat <<-'ACTIONS' + open + status + update + merge + menu + ip + cr + qa + undraft + hook + base + code + help + ACTIONS +)" + return + ;; + esac +} + + +# Load git completion if not loaded yet and available at usual path +if ! declare -f __git_complete > /dev/null && [ -f /usr/share/bash-completion/completions/git ]; then + . /usr/share/bash-completion/completions/git +fi + +if declare -f __git_complete > /dev/null; then + # Add completion for direct script usage + __git_complete "git-mr" _git_mr + + # Add completion for aliases + for a in $(alias -p | grep "git[- ]mr" | cut -d' ' -f2 | cut -d= -f1); do + __git_complete "$a" _git_mr + done +fi From 3405d8c33e39399b08b49cbcf827a202c0226226 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 2 Jan 2023 15:59:17 +0100 Subject: [PATCH 08/88] Introduce `-n` option for `git-mr update` update new line mgmt --- git-mr | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/git-mr b/git-mr index 61c4f43..7f440ce 100755 --- a/git-mr +++ b/git-mr @@ -1595,11 +1595,12 @@ function mr_update echo "$mr_title" echo "-------------------------------------------------------------------" echo "$new_description_display" - echo - echo if [ "$new_commit_count" -gt 0 ]; then - echo "## Update" - echo + if [ -n "$GIT_MR_UPDATE_NEW_SECTION" ]; then + echo + echo "## Update" + echo + fi echo "$(markdown_list "$new_commit_messages_display_str")" echo fi @@ -1624,8 +1625,12 @@ function mr_update new_description=$(echo -e "${new_description_content}") if [ "$new_commit_count" -gt 0 ]; then - new_description=$(echo -e "${new_description}\n\n## Update") - new_description=$(echo -e "${new_description}\n\n$(markdown_list "$new_commit_messages_content_str")") + if [ -n "$GIT_MR_UPDATE_NEW_SECTION" ]; then + new_description=$(echo -e "${new_description}\n\n## Update\n\n") + elif [ -z "$lastDescriptionLineIsCommit" ]; then + new_description=$(echo -e "${new_description}\n") # add new line + fi + new_description=$(echo -e "${new_description}\n$(markdown_list "$new_commit_messages_content_str")") fi new_description=$(echo -e "${new_description}")$'\n' @@ -1997,6 +2002,7 @@ while [[ $# -gt 0 ]]; do -v|-V) GIT_MR_VERBOSE=1 ;; -y|-Y) GIT_MR_YES=1 ;; -e|-E) GIT_MR_EXTENDED=1 ;; + -n|-N) GIT_MR_UPDATE_NEW_SECTION=1 ;; *) args+=("${1}") ;; esac From 448e4ddaf2297856f7ccec0ccc14d7894814e8b0 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 6 Jan 2023 22:14:57 +0100 Subject: [PATCH 09/88] Check branch coherence --- git-mr | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/git-mr b/git-mr index 7f440ce..956d478 100755 --- a/git-mr +++ b/git-mr @@ -13,7 +13,11 @@ function git_current_branch function git_base_branch { - local branch=${1:-HEAD} + local branch=${1:-$(git_current_branch)} + + [ -z "$branch" ] && exit 3 # Not on any branch + [ "$branch" == "main" ] || [ "$branch" == "master" ] && exit 3 # On default branch + git show-ref -q --heads "$branch" || exit 3 # Branch does not exist # Nearest branch in commit history local base_branch; base_branch=$( \ @@ -34,6 +38,27 @@ function git_base_branch echo "$base_branch" } +function git_check_branches +{ + local source_branch="$1" + local target_branch="$2" + + [ -z "$source_branch" ] && + exit_error 3 "Not on any branch" + + [ "$source_branch" == "main" ] || + [ "$source_branch" == "master" ] && + exit_error 3 "On default branch" + + git show-ref -q --heads "$source_branch" || + exit_error 3 "Branch '$source_branch' does not exist" + + [ -z "$target_branch" ] && + exit_error 3 "Unable to determine target branch" + + return 0 +} + function git_commits { local source_branch=${1:-$(git_current_branch)} @@ -1420,6 +1445,8 @@ function mr_print { local source_branch=${1:-$(git_current_branch)} local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} + git_check_branches "$source_branch" "$target_branch" + local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} cat << EOF @@ -1438,6 +1465,7 @@ function mr_open { local source_branch=${1:-$(git_current_branch)} local target_branch=${GIT_MR_TARGET:-$(git_base_branch "$source_branch")} + git_check_branches "$source_branch" "$target_branch" local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") @@ -2045,6 +2073,7 @@ esac # # 1 Not a git repository # 2 jq is not installed +# 3 Git branch error # # 10 Gitlab request error # 11 GITLAB_DOMAIN|GITLAB_TOKEN is not set From 21930d781d06982041b867c3833437909f4dcb9f Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 6 Jan 2023 22:19:41 +0100 Subject: [PATCH 10/88] Extract GIT_MR_MENU_* constants --- git-mr | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/git-mr b/git-mr index 956d478..8053f84 100755 --- a/git-mr +++ b/git-mr @@ -1205,10 +1205,7 @@ function mr_menu_contents local menu_items=$1 local current_mr_url=$2; - local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} - local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} - - echo "$git_mr_menu_start" + echo "$GIT_MR_MENU_START" echo while IFS=$'\n' read -r menu_item; do @@ -1231,17 +1228,14 @@ function mr_menu_contents done < <(echo "$menu_items") echo - echo "$git_mr_menu_end" + echo "$GIT_MR_MENU_END" } function mr_menu_status { local menu_items=$1 - local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} - local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} - - echo "$git_mr_menu_start" + echo "$GIT_MR_MENU_START" echo while IFS=$'\n' read -r menu_item; do @@ -1268,7 +1262,7 @@ function mr_menu_status done < <(echo "$menu_items") echo - echo "$git_mr_menu_end" + echo "$GIT_MR_MENU_END" } function mr_menu_show @@ -1395,13 +1389,10 @@ function mr_menu_replace_description local mr_description=$1 local menu_content=$2 - local git_mr_menu_start=${GIT_MR_MENU_START:-## Menu} - local git_mr_menu_end=${GIT_MR_MENU_END:---------------------------------------------------------------------------------} - - menu_start=$(echo "$mr_description" | grep -n "$git_mr_menu_start" | cut -f1 -d:) - menu_end=$(echo "$mr_description" | grep -n -- "$git_mr_menu_end" | cut -f1 -d: | head -n 1) + local menu_start; menu_start=$(echo "$mr_description" | grep -n "$GIT_MR_MENU_START" | cut -f1 -d:) + local menu_end; menu_end=$(echo "$mr_description" | grep -n -- "$GIT_MR_MENU_END" | cut -f1 -d: | head -n 1) - has_menu=0 + local has_menu=0 if [ -n "$menu_start" ] && [ -n "$menu_end" ] && [ "$menu_start" -gt "0" ] && [ "$menu_end" -gt "$menu_start" ]; then has_menu=1 fi @@ -2019,6 +2010,8 @@ GITLAB_DRAFT_PREFIX="Draft" GITLAB_DRAFT_PREFIXES=("WIP" "Draft") MD_BOLD=${MD_BOLD="**"} # Markdown bold MD_BR=${MD_BR=" "} # Markdown line break +GIT_MR_MENU_START=${GIT_MR_MENU_START:-"## Menu"} +GIT_MR_MENU_END=${GIT_MR_MENU_END:-"---------------------------------------------------------------------------------"} # Parse options args=() From 5e99bd40404049d87125d80894d25a1e4f5a82b2 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 9 Jan 2023 17:11:56 +0100 Subject: [PATCH 11/88] Handle extended commit description in `git mr update` Handle extended commit description in `git mr update` update echo liiine --- git-mr | 58 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/git-mr b/git-mr index 8053f84..d26f2a9 100755 --- a/git-mr +++ b/git-mr @@ -83,6 +83,21 @@ function git_commits_extended grep -v "^${end}" # remove trailing blank line } +function git_commit_extended +{ + local revision=${1:-HEAD} + + local prefix="* ${MD_BOLD}" + local suffix="${MD_BOLD}${MD_BR}" + + local end="---COMMIT-BODY-END---" # useful to remove trailing blank line + + local format="${prefix}%h %s${suffix}%n%b${end}" + + git show -s --format="${format}" "${revision}" | + grep -v "^${end}" # remove trailing blank line +} + function git_titlize_branch { local branch=${1:-$(git_current_branch)} @@ -1568,6 +1583,7 @@ function mr_update local old_commits_array; old_commits_array=($(echo "$old_commits" | tr "\n" " ")) local updated_commit_count=0 + local new_commit= local new_commit_messages_display=() local new_commit_messages_content=() @@ -1596,9 +1612,13 @@ function mr_update updated_commit_count=$((updated_commit_count+1)) fi else - # new commits - new_commit_messages_display+=("$(echo "$commit_messages" | grep "$curr" | sed "s/$curr/$(colorize "$curr" "$newColor")/")") - new_commit_messages_content+=("$(echo "$commit_messages" | grep "$curr")") + # new commit + [ "$GIT_MR_EXTENDED" = "1" ] && + new_commit="$(git_commit_extended "$curr")" || + new_commit="$(echo "$commit_messages" | grep "$curr")" + + new_commit_messages_display+=("$(echo "$new_commit" | sed "s/$curr/$(colorize "$curr" "$newColor")/")") + new_commit_messages_content+=("$(echo "$new_commit")") fi done @@ -1620,9 +1640,12 @@ function mr_update echo "## Update" echo fi - echo "$(markdown_list "$new_commit_messages_display_str")" - echo + [ "$GIT_MR_EXTENDED" = "1" ] && + markdown_indent_list_items "$new_commit_messages_display_str" || + markdown_list "$new_commit_messages_display_str" fi + + echo echo "--------------------------------------------------------------------------------" echo echo " updated commits: $(colorize "$updated_commit_count" "$updatedColor")" @@ -1640,20 +1663,21 @@ function mr_update if [ $((updated_commit_count + new_commit_count)) -gt 0 ] \ && [ "$(confirm "Do you want to update the merge request description?")" = "yes" ]; then - local new_description - new_description=$(echo -e "${new_description_content}") - - if [ "$new_commit_count" -gt 0 ]; then - if [ -n "$GIT_MR_UPDATE_NEW_SECTION" ]; then - new_description=$(echo -e "${new_description}\n\n## Update\n\n") - elif [ -z "$lastDescriptionLineIsCommit" ]; then - new_description=$(echo -e "${new_description}\n") # add new line + local new_description; new_description=$(echo -e "${new_description_content}") + local newLines="" + + if [ "$new_commit_count" -gt 0 ]; then + if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then + new_description=$(echo -e "${new_description}\n\n## Update") + newLines="\n" + fi + [[ $GIT_MR_EXTENDED -eq 1 ]] && + new_description=$(echo -e "${new_description}\n${newLines}$(markdown_indent_list_items "$new_commit_messages_content_str")") || + new_description=$(echo -e "${new_description}\n${newLines}$(markdown_list "$new_commit_messages_content_str")") fi - new_description=$(echo -e "${new_description}\n$(markdown_list "$new_commit_messages_content_str")") + new_description=$(echo -e "$new_description")$'\n' + mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit $? fi - new_description=$(echo -e "${new_description}")$'\n' - - mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit $? fi if [ "$target_branch" != "$current_target" ] \ From aba2428bc0df9a23206524211d0311db66aacfe5 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 10 Jan 2023 19:55:09 +0100 Subject: [PATCH 12/88] Highlight menu in `git mr menu update` output --- git-mr | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/git-mr b/git-mr index d26f2a9..1165215 100755 --- a/git-mr +++ b/git-mr @@ -1318,7 +1318,7 @@ function mr_menu_update updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" echo - echo "$updated_description" + mr_menu_colorize "$updated_description" "$current_mr_url" echo echo '--------------------------------------------------------------------------------' @@ -1370,7 +1370,7 @@ function mr_menu_update_all updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" echo - echo "$updated_description" + mr_menu_colorize "$updated_description" "$mr_url" echo echo '--------------------------------------------------------------------------------' echo @@ -1392,11 +1392,7 @@ function mr_menu_update_all if [ ! -z "$result" ]; then echo -e "OK\n"; fi fi done - - echo '--------------------------------------------------------------------------------' echo - - mr_menu_contents "$menu_items" } function mr_menu_replace_description @@ -1404,7 +1400,7 @@ function mr_menu_replace_description local mr_description=$1 local menu_content=$2 - local menu_start; menu_start=$(echo "$mr_description" | grep -n "$GIT_MR_MENU_START" | cut -f1 -d:) + local menu_start; menu_start=$(echo "$mr_description" | grep -n "$GIT_MR_MENU_START" | head -n1 | cut -f1 -d:) local menu_end; menu_end=$(echo "$mr_description" | grep -n -- "$GIT_MR_MENU_END" | cut -f1 -d: | head -n 1) local has_menu=0 @@ -1443,6 +1439,30 @@ function mr_menu_replace_description done < <(echo "$mr_description") } +function mr_menu_colorize +{ + local mr_description=$1 + local current_mr_url=$2 + + local menu_start; menu_start=$(echo "$mr_description" | grep -n "$GIT_MR_MENU_START" | head -n1 | cut -f1 -d:) + local menu_end; menu_end=$(echo "$mr_description" | grep -n -- "$GIT_MR_MENU_END" | cut -f1 -d: | head -n 1) + + # Iterate over description lines and colorize menu lines + i=1 + while IFS=$'\n' read -r mr_description_line + do + if [ "$i" -lt "$menu_start" ] || [ "$i" -gt "$menu_end" ]; then + # output non-menu line + echo -e "$(colorize "$mr_description_line" "lightgray")" + else + # colorize menu line + [[ $mr_description_line =~ $current_mr_url ]] && + echo -e "$(colorize "$mr_description_line" "bold" "lightyellow")" || + echo -e "$(colorize "$mr_description_line" "lightyellow")" + fi + ((i+=1)) + done < <(echo "$mr_description") +} ################################################################################ # Merge request top-level functions From 8fc626e6752f640b7adf0c30ebfcccd39f88813e Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 9 Jan 2023 09:45:19 +0100 Subject: [PATCH 13/88] Tests tests --- .github/workflows/test.yml | 23 + .gitmodules | 6 + git-mr | 42 +- test/.gitignore | 1 + test/git-mr.bats | 602 ++++++++++++++++++ test/test_helper/bats-assert | 1 + test/test_helper/bats-support | 1 + test/test_helper/gitlab-mock-menu.bash | 16 + test/test_helper/gitlab-mock-mr-extended.bash | 29 + test/test_helper/gitlab-mock-mr.bash | 25 + test/test_helper/jira-mock.bash | 8 + 11 files changed, 739 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/test.yml create mode 100644 .gitmodules create mode 100644 test/.gitignore create mode 100644 test/git-mr.bats create mode 160000 test/test_helper/bats-assert create mode 160000 test/test_helper/bats-support create mode 100644 test/test_helper/gitlab-mock-menu.bash create mode 100644 test/test_helper/gitlab-mock-mr-extended.bash create mode 100644 test/test_helper/gitlab-mock-mr.bash create mode 100644 test/test_helper/jira-mock.bash diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..ebca895 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: Tests + +on: [push, pull_request] + +jobs: + + build: + name: build + runs-on: ubuntu-latest + steps: + + - name: Setup BATS + uses: mig4/setup-bats@v1 + with: + bats-version: 1.8.2 + + - name: Check out code + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Test + run: bats ./test diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..614fe61 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "test/test_helper/bats-support"] + path = test/test_helper/bats-support + url = https://github.com/bats-core/bats-support.git +[submodule "test/test_helper/bats-assert"] + path = test/test_helper/bats-assert + url = https://github.com/bats-core/bats-assert.git diff --git a/git-mr b/git-mr index 1165215..840cb4c 100755 --- a/git-mr +++ b/git-mr @@ -200,7 +200,11 @@ function terminal_link local href=$1 local text=$2 - printf "\e]8;;${href}\e\\${text}\e]8;;\e\\" + if which tput > /dev/null 2>&1 && [ ! -z "$TERM" ] && [ "$(tput -T"$TERM" colors)" -ge 8 ]; then + printf "\e]8;;${href}\e\\${text}\e]8;;\e\\" + else + echo -n "$text" + fi } function echo_error @@ -936,7 +940,7 @@ function mr_description local commits local description - if [ "$GIT_MR_EXTENDED" = "1" ]; then + if [[ $GIT_MR_EXTENDED -eq 1 ]]; then commits=$(git_commits_extended "$source_branch" "$target_branch") description=$(markdown_indent_list_items "$commits") else @@ -1063,8 +1067,8 @@ function mr_print_status # Threads local threads; threads=$(gitlab_merge_request_threads "$project_url" "$mr_iid") - local thread_count; thread_count=$(echo "$threads" | grep -c 'unresolved:') - local resolved_count; resolved_count=$(echo "$threads" | grep -c 'unresolved:false') + local thread_count; thread_count="$(echo "$threads" | grep -c 'unresolved:' || true)" + local resolved_count; resolved_count="$(echo "$threads" | grep -c 'unresolved:false' || true)" local thread_count_display; thread_count_display=$(colorize "$thread_count" "bold") @@ -1202,7 +1206,7 @@ function mr_menu_merge_requests while IFS="=" read -r id name do project_arr[$id]="$name" - done < <(gitlab_projects | jq -r 'map((.id | tostring)+"="+.name) | .[]') + done < <(gitlab_projects | jq -r 'map((.id | tostring)+"="+.name) | .[]' | sed 's/\r//g') # Enrich merge request summaries with project names while IFS=$'\n' read -r mr_summary @@ -1633,7 +1637,7 @@ function mr_update fi else # new commit - [ "$GIT_MR_EXTENDED" = "1" ] && + [[ $GIT_MR_EXTENDED -eq 1 ]] && new_commit="$(git_commit_extended "$curr")" || new_commit="$(echo "$commit_messages" | grep "$curr")" @@ -1655,12 +1659,12 @@ function mr_update echo "-------------------------------------------------------------------" echo "$new_description_display" if [ "$new_commit_count" -gt 0 ]; then - if [ -n "$GIT_MR_UPDATE_NEW_SECTION" ]; then + if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then echo echo "## Update" echo fi - [ "$GIT_MR_EXTENDED" = "1" ] && + [[ $GIT_MR_EXTENDED -eq 1 ]] && markdown_indent_list_items "$new_commit_messages_display_str" || markdown_list "$new_commit_messages_display_str" fi @@ -1935,6 +1939,8 @@ function mr_hook local git_dir; git_dir=$(git rev-parse --show-toplevel) local git_mr_dir; git_mr_dir="$(dirname "${BASH_SOURCE[0]}")" + [ ! -d "${git_dir}/.git/hooks" ] && mkdir "${git_dir}/.git/hooks" + find "${git_mr_dir}/hooks" -type f -print0 | while read -d $'\0' hook; do local hook_name; hook_name="$(basename $hook)" echo "Linking hook: ${hook_name}" @@ -2038,9 +2044,22 @@ EOF } +################################################################################ +# Hardcoded constants +GITLAB_DRAFT_PREFIX="Draft" +GITLAB_DRAFT_PREFIXES=("WIP" "Draft") +MD_BOLD=${MD_BOLD="**"} # Markdown bold +MD_BR=${MD_BR=" "} # Markdown line break +GIT_MR_MENU_START=${GIT_MR_MENU_START:-"## Menu"} +GIT_MR_MENU_END=${GIT_MR_MENU_END:-"---------------------------------------------------------------------------------"} + + ################################################################################ # Run +# Exit if not running script directly (ex: when sourcing) +[ "$(basename "$0")" != 'git-mr' ] && return; + # Init git rev-parse > /dev/null 2>&1 || exit_error 1 "Not a git repository" @@ -2049,13 +2068,6 @@ if [ ! -x "$(command -v jq)" ]; then exit_error 2 "Git-MR requires jq [https://stedolan.github.io/jq/]" fi -# Hardcoded constants -GITLAB_DRAFT_PREFIX="Draft" -GITLAB_DRAFT_PREFIXES=("WIP" "Draft") -MD_BOLD=${MD_BOLD="**"} # Markdown bold -MD_BR=${MD_BR=" "} # Markdown line break -GIT_MR_MENU_START=${GIT_MR_MENU_START:-"## Menu"} -GIT_MR_MENU_END=${GIT_MR_MENU_END:-"---------------------------------------------------------------------------------"} # Parse options args=() diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..1269488 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1 @@ +data diff --git a/test/git-mr.bats b/test/git-mr.bats new file mode 100644 index 0000000..51ab537 --- /dev/null +++ b/test/git-mr.bats @@ -0,0 +1,602 @@ +#!/usr/bin/env bats + +load "test_helper/bats-support/load" +load "test_helper/bats-assert/load" + +git() { + command git \ + -c init.defaultBranch=main \ + -c user.email=test@example.com \ + -c user.name=Test \ + -c init.templatedir= \ + "$@" +} + +git-mr() { + "${BATS_TEST_DIRNAME}"/../git-mr "$@" +} + +setup_file() { + export JIRA_CODE_PATTERN="[A-Z]{2,3}-[0-9]+" + export JIRA_INSTANCE= + export JIRA_USER= + export GITLAB_DOMAIN= + export GITLAB_TOKEN= + + export MD_BR='..' # for easier visualization + + cd "${BATS_TEST_DIRNAME}" || exit + + mkdir data && cd data || exit + + git init --bare remote + git init repo && cd repo || exit + git remote add origin ../remote + + git switch -c main + git commit --allow-empty -m "Main 1" + git commit --allow-empty -m "Main 2" + git commit --allow-empty -m "Main 3" + + git switch -c epic/big-feature main + git commit --allow-empty -m "Epic 1" + git commit --allow-empty -m "Epic 2" + git commit --allow-empty -m "Epic 3" + + git switch -c feature/base + git commit --allow-empty -m "Feature base - 1" + git tag fbc1 + git push origin feature/base # remote branch should not be considered as base + git commit --allow-empty -m "Feature base - 2" -m "This is my second commit" + git tag fbc2 + git commit --allow-empty -m "Feature base - 3" -m "This is my third commit" -m "With an extended description" + git tag fbc3 + + git switch -c feature/AB-123-test-feature + git commit --allow-empty -m "Feature test - 1" + git tag f1c1 + git push origin feature/AB-123-test-feature # remote branch should not be considered as base + git commit --allow-empty -m "Feature test - 2" -m "This is my second commit" + git tag f1c2 + git commit --allow-empty -m "Feature test - 3" -m "This is my third commit" -m "With an extended description" + git tag f1c3 + + cd .. +} + +teardown_file() { + cd "${BATS_TEST_DIRNAME}" || exit + rm -rf data +} + +setup() { + # Source git-mr to load functions + . "${BATS_TEST_DIRNAME}"/../git-mr >&3 + + cd "${BATS_TEST_DIRNAME}/data" || exit + cd repo + git switch feature/AB-123-test-feature +} + +################################################################################ +# Git functions + +@test "Fails outside a Git repository" { + cd /tmp + run git-mr + assert_failure +} + +@test "Determines current branch" { + git switch main + run git_current_branch + assert_output "main" + + git switch epic/big-feature + run git_current_branch + assert_output "epic/big-feature" + + git switch feature/base + run git_current_branch + assert_output "feature/base" + + git switch feature/AB-123-test-feature + run git_current_branch + assert_output "feature/AB-123-test-feature" + + git checkout -f "$(git rev-parse HEAD)" + run git_current_branch + assert_output "" +} + +@test "Determines base branch" { + git switch epic/big-feature + run git-mr base + assert_output "main" + + git switch feature/base + run git-mr base + assert_output "epic/big-feature" + + git switch feature/AB-123-test-feature + run git-mr base + assert_output "feature/base" + + git checkout -f "$(git rev-parse HEAD)" + run git-mr base + assert_failure + + git switch main + run git-mr base + assert_failure +} + +@test "Checks branch coherence" { + run git_check_branches feature/base main + assert_success + assert_output "" + + run git_check_branches "" main + assert_failure + assert_output --partial "Not on any branch" + + run git_check_branches test main + assert_failure + assert_output --partial "Branch 'test' does not exist" + + run git_check_branches main epic/big-feature + assert_failure + assert_output --partial "On default branch" + + run git_check_branches master epic/big-feature + assert_failure + assert_output --partial "On default branch" + + run git_check_branches feature/base "" + assert_failure + assert_output --partial "Unable to determine target branch" +} + +@test "Lists current branch commits" { + + cb1sha=$(git rev-parse --short fbc1) + cb2sha=$(git rev-parse --short fbc2) + cb3sha=$(git rev-parse --short fbc3) + + cf1sha=$(git rev-parse --short f1c1) + cf2sha=$(git rev-parse --short f1c2) + cf3sha=$(git rev-parse --short f1c3) + + run git_commits + + assert_output "$(cat <<- EOF + ${cf1sha} Feature test - 1 + ${cf2sha} Feature test - 2 + ${cf3sha} Feature test - 3 + EOF + )" + + git switch main + + run git_commits "feature/base" + + assert_output "$(cat <<- EOF + ${cb1sha} Feature base - 1 + ${cb2sha} Feature base - 2 + ${cb3sha} Feature base - 3 + EOF + )" + + run git_commits "feature/AB-123-test-feature" "epic/big-feature" + + assert_output "$(cat <<- EOF + ${cb1sha} Feature base - 1 + ${cb2sha} Feature base - 2 + ${cb3sha} Feature base - 3 + ${cf1sha} Feature test - 1 + ${cf2sha} Feature test - 2 + ${cf3sha} Feature test - 3 + EOF + )" +} + +@test "Lists current branch commits with commit body" { + c1sha=$(git rev-parse --short f1c1) + c2sha=$(git rev-parse --short f1c2) + c3sha=$(git rev-parse --short f1c3) + + run git_commits_extended + + assert_output "$(cat <<- EOF + * **${c1sha} Feature test - 1**.. + * **${c2sha} Feature test - 2**.. + This is my second commit + * **${c3sha} Feature test - 3**.. + This is my third commit + + With an extended description + EOF + )" +} + +@test "Shows commit with commit body" { + c2sha=$(git rev-parse --short f1c2) + + run git_commit_extended "$c2sha" + + assert_output "$(cat <<- EOF + * **${c2sha} Feature test - 2**.. + This is my second commit + EOF + )" +} + +@test "Makes title from branch" { + run git_titlize_branch feature/AB-123-some_branch_title + assert_output "Feature/AB-123 Some branch title" +} + +################################################################################ +# Misc. utilities + +@test "Encodes URL arguments" { + run urlencode "Some 'string'&\"stuff\" (that needs [to] be) encoded!" + assert_output "Some%20%27string%27%26%22stuff%22%20%28that%20needs%20%5Bto%5D%20be%29%20encoded%21" +} + +@test "Asks for confirmation" { + if [ "$(confirm "Do you want to resolve draft status?" <<< "yes")" = "yes" ]; then confirmed=1; else confirmed=0; fi + assert_equal $confirmed 1 + + if [ "$(confirm "Do you want to resolve draft status?" <<< "y")" = "yes" ]; then confirmed=1; else confirmed=0; fi + assert_equal $confirmed 1 + + if [ "$(confirm "Do you want to resolve draft status?" <<< "no")" = "yes" ]; then confirmed=1; else confirmed=0; fi + assert_equal $confirmed 0 + + if [ "$(confirm "Do you want to resolve draft status?" <<< "n")" = "yes" ]; then confirmed=1; else confirmed=0; fi + assert_equal $confirmed 0 + + GIT_MR_YES=1 + if [ "$(confirm "Do you want to resolve draft status?" <<< "n")" = "yes" ]; then confirmed=1; else confirmed=0; fi + assert_equal $confirmed 1 +} + +@test "Builds json" { + data=$(jq_build "title" "Some Title") + data=$(jq_build "description" "Some Description" "$data") + data=$(jq_build "value" 3 "$data") + + assert_equal "$data" '{"title":"Some Title","description":"Some Description","value":3}' +} + +@test "Escapes regex literals" { + run regex_escape '[] \/ $ * . ^ []' + assert_output '\[\] \\\/ \$ \* \. \^ \[\]' +} + +################################################################################ +# Markdown formatting + +@test "Formats markdown titles" { + run markdown_title "This is a title" + assert_output "# This is a title" +} + +@test "Formats markdown links" { + run markdown_link "Link" "https://example.net/" + assert_output "[Link](https://example.net/)" +} + +@test "Formats markdown lists" { + input=$(echo -e "one\ntwo\nthree") + expected=$(echo -e "* **one**..\n* **two**..\n* **three**..") + + run markdown_list "$input" + assert_output "$expected" +} + +@test "Formats markdown list descriptions" { + run markdown_indent_list_items "$(cat <<- EOF + * **one**.. + blah + * **two**.. + blah + blah + EOF + )" + assert_output "$(cat <<- EOF + * **one**.. + blah.. + * **two**.. + blah.. + blah.. + EOF + )" +} + +################################################################################ +# Gitlab functions + +@test "Extracts MR info from list" { + mr_summary='[{"iid":123,"web_url":"https://gitlab.com/mr/123"},{}]' + + run gitlab_extract_iid "$mr_summary" + assert_output 123 + + run gitlab_extract_url "$mr_summary" + assert_output "https://gitlab.com/mr/123" +} + +@test "Extracts MR info from detail" { + mr_summary='{ + "title":"MR title", + "description":"MR description", + "merge_status":"can_be_merged", + "target_branch":"main", + "labels":["aaa","bbb","ccc"] + }' + assert_equal "$(gitlab_extract_title "$mr_summary")" "MR title" + assert_equal "$(gitlab_extract_description "$mr_summary")" "MR description" + assert_equal "$(gitlab_extract_merge_status "$mr_summary")" 'can_be_merged' + assert_equal "$(gitlab_extract_target_branch "$mr_summary")" 'main' + assert_equal "$(gitlab_extract_labels "$mr_summary")" 'aaa,bbb,ccc' + + mr_summary='{"title":"MR title","state":"merged"}' + assert_equal "$(gitlab_extract_merge_status "$mr_summary")" 'merged' +} + +@test "Extracts Gitlab project part from MR URL" { + GITLAB_DOMAIN="example.com" + mr_url="https://example.com/some/project/-/merge_requests/123" + + run gitlab_extract_project_url "$mr_url" + assert_output "some%2Fproject" +} + +@test "Handles draft MR titles" { + run gitlab_title_is_draft "WIP: My MR" + assert_success + + run gitlab_title_is_draft "Draft: My MR" + assert_success + + run gitlab_title_is_draft "My MR" + assert_failure + + run gitlab_title_to_draft "My MR" + assert_output "Draft: My MR" + + run gitlab_title_undraft "Draft: My MR" + assert_output "My MR" + + run gitlab_title_undraft "WIP: My MR" + assert_output "My MR" +} + +################################################################################ +# Merge request utility functions + +@test "Determines issue code" { + git switch feature/AB-123-test-feature + run git-mr code + assert_output "AB-123" + + git switch feature/base + run git-mr code + assert_output --partial "Unable to guess issue code" +} + +@test "Generates MR title from Jira issue title" { + load "test_helper/jira-mock.bash" + + run mr_title + assert_output "[AB-123 This is an issue](https://mycompany.example.net/browse/AB-123)" +} + +@test "Generates MR description from commits" { + load "test_helper/jira-mock.bash" + + c1sha=$(git rev-parse --short f1c1) + c2sha=$(git rev-parse --short f1c2) + c3sha=$(git rev-parse --short f1c3) + + GIT_MR_EXTENDED= + run mr_description + + assert_output "$(cat <<- EOF + # [AB-123 This is an issue](https://mycompany.example.net/browse/AB-123) + + + ## Commits + + * **${c1sha} Feature test - 1**.. + * **${c2sha} Feature test - 2**.. + * **${c3sha} Feature test - 3**.. + EOF + )" + + GIT_MR_EXTENDED=1 + run mr_description + + empty="" + assert_output "$(cat <<- EOF + # [AB-123 This is an issue](https://mycompany.example.net/browse/AB-123) + + + ## Commits + + * **${c1sha} Feature test - 1**.. + * **${c2sha} Feature test - 2**.. + This is my second commit.. + * **${c3sha} Feature test - 3**.. + This is my third commit.. + ${empty} + With an extended description.. + EOF + )" +} + +@test "Searches MRs across projects to build menu" { + load "test_helper/gitlab-mock-menu.bash" + + run mr_menu + + assert_output "$(cat <<- EOF + + ## Menu + + * Project C: [MR 31 title](https://example.net/31) + * Project A: [MR 11 title](https://example.net/11) + * Project B: [MR 21 title](https://example.net/21) + * Project D: [MR 41 title](https://example.net/21) + + --------------------------------------------------------------------------------- + EOF + )" +} + +@test "Updates MR description with new commits in new section" { + load "test_helper/gitlab-mock-mr.bash" + + TERM=xterm-mono # disable colors + GIT_MR_EXTENDED= + GIT_MR_UPDATE_NEW_SECTION=1 + + c1sha=$(git rev-parse --short f1c1) + c2sha=$(git rev-parse --short f1c2) + c3sha=$(git rev-parse --short f1c3) + + # Amend last commit + git reset --hard HEAD~1 + git commit --allow-empty -m "Feature test - 3" -m "Updated" + c3shaNew=$(git rev-parse --short HEAD) + + # Add new commits + git commit --allow-empty -m "Feature test - 4" -m "With extended message too" + c4shaNew=$(git rev-parse --short HEAD) + + git commit --allow-empty -m "Feature test - 5" + c5shaNew=$(git rev-parse --short HEAD) + + run mr_update <<< 'n' + + assert_output "$(cat <<- EOF + + ------------------------------------------------------------------- + My MR + ------------------------------------------------------------------- + [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) + + ## Commits + + * **${c1sha} Feature test - 1**.. + * **${c2sha} Feature test - 2**.. + * **${c3shaNew} Feature test - 3** + + ## Update + + * **${c4shaNew} Feature test - 4**.. + * **${c5shaNew} Feature test - 5**.. + + -------------------------------------------------------------------------------- + + updated commits: 1 + new commits: 2 + + -------------------------------------------------------------------------------- + EOF + )" + + git reset --hard "$c3sha" +} + +@test "Updates MR description with new commits with extended description" { + load "test_helper/gitlab-mock-mr-extended.bash" + + TERM=xterm-mono # disable colors + GIT_MR_EXTENDED=1 + GIT_MR_UPDATE_NEW_SECTION= + + c1sha=$(git rev-parse --short f1c1) + c2sha=$(git rev-parse --short f1c2) + c3sha=$(git rev-parse --short f1c3) + + # Amend last commit + git reset --hard HEAD~1 + git commit --allow-empty -m "Feature test - 3" -m "Updated" + c3shaNew=$(git rev-parse --short HEAD) + + # Add new commits + git commit --allow-empty -m "Feature test - 4" -m "With extended message too" + c4shaNew=$(git rev-parse --short HEAD) + + git commit --allow-empty -m "Feature test - 5" + c5shaNew=$(git rev-parse --short HEAD) + + run mr_update <<< 'n' + + empty="" + assert_output "$(cat <<-EOF + + ------------------------------------------------------------------- + My MR + ------------------------------------------------------------------- + [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) + + ## Commits + + * **${c1sha} Feature test - 1**.. + * **${c2sha} Feature test - 2**.. + This is my second commit.. + * **${c3shaNew} Feature test - 3**.. + This is my third commit.. + ${empty} + With an extended description + * **${c4shaNew} Feature test - 4**.. + With extended message too.. + * **${c5shaNew} Feature test - 5**.. + + -------------------------------------------------------------------------------- + + updated commits: 1 + new commits: 2 + + -------------------------------------------------------------------------------- + EOF + )" + + git reset --hard "$c3sha" +} + +################################################################################ +# Merge request labels utility functions + +@test "Replaces labels" { + run replace_labels "toto,tata,titi" "tata" "tutu" + assert_output "toto,titi,tutu" + + run replace_labels "toto,tata" "tata,toto" + assert_output "" + + run replace_labels "toto,tata" "nope" "plop,pouet" + assert_output "toto,tata,plop,pouet" +} + +################################################################################ +# Merge request top-level functions + +@test "Provides pre-commit-msg hook" { + run git-mr hook >&3 + + assert [ -f ".git/hooks/prepare-commit-msg" ] + + git commit --allow-empty -m "Some message" + csha=$(git rev-parse --short HEAD) + + run git log --oneline --no-decorate -n1 + + assert_output "${csha} AB-123 Some message" + + git reset --hard HEAD~1 +} diff --git a/test/test_helper/bats-assert b/test/test_helper/bats-assert new file mode 160000 index 0000000..db015db --- /dev/null +++ b/test/test_helper/bats-assert @@ -0,0 +1 @@ +Subproject commit db015db5edfd788301d42eda0348301d9893a3b8 diff --git a/test/test_helper/bats-support b/test/test_helper/bats-support new file mode 160000 index 0000000..3c8fadc --- /dev/null +++ b/test/test_helper/bats-support @@ -0,0 +1 @@ +Subproject commit 3c8fadc5097c9acfc96d836dced2bb598e48b009 diff --git a/test/test_helper/gitlab-mock-menu.bash b/test/test_helper/gitlab-mock-menu.bash new file mode 100644 index 0000000..f8d0871 --- /dev/null +++ b/test/test_helper/gitlab-mock-menu.bash @@ -0,0 +1,16 @@ +GITLAB_DOMAIN="example.com" +GITLAB_TOKEN="example" + +function gitlab_merge_requests_search { + echo '{"iid": 31,"title":"MR 31 title","web_url":"https://example.net/31","state":"opened","project_id": 3} + {"iid": 11,"title":"MR 11 title","web_url":"https://example.net/11","state":"opened","project_id": 1} + {"iid": 21,"title":"MR 21 title","web_url":"https://example.net/21","state":"opened","project_id": 2} + {"iid": 41,"title":"MR 41 title","web_url":"https://example.net/21","state":"closed","project_id": 4}' +} + +function gitlab_projects { + echo '[{"id":1,"name":"Project A"}, + {"id":2,"name":"Project B"}, + {"id":3,"name":"Project C"}, + {"id":4,"name":"Project D"}]' +} diff --git a/test/test_helper/gitlab-mock-mr-extended.bash b/test/test_helper/gitlab-mock-mr-extended.bash new file mode 100644 index 0000000..619d834 --- /dev/null +++ b/test/test_helper/gitlab-mock-mr-extended.bash @@ -0,0 +1,29 @@ +GITLAB_DOMAIN="example.com" +GITLAB_TOKEN="example" + +function gitlab_merge_requests_for_branch { + echo '[{"iid":1,"web_url":"https://example.com/some/project/-/merge_requests/1"}]' +} + +function gitlab_merge_request { + local oldDesc + oldDesc="[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" + oldDesc="${oldDesc}$(echo "\n\n## Commits")" + oldDesc="${oldDesc}$(echo "\n\n* **${c1sha} Feature test - 1**..")" + oldDesc="${oldDesc}$(echo "\n* **${c2sha} Feature test - 2**..")" + oldDesc="${oldDesc}$(echo "\n This is my second commit..")" + oldDesc="${oldDesc}$(echo "\n* **${c3sha} Feature test - 3**..")" + oldDesc="${oldDesc}$(echo "\n This is my third commit..")" + oldDesc="${oldDesc}$(echo "\n ")" + oldDesc="${oldDesc}$(echo "\n With an extended description")" + + echo '{ + "iid":1, "web_url":"https://example.com/some/project/-/merge_requests/1", + "title":"My MR", "target_branch":"feature/base", + "description":"'"$oldDesc"'" + }' +} + +function mr_actions { + return 0 +} diff --git a/test/test_helper/gitlab-mock-mr.bash b/test/test_helper/gitlab-mock-mr.bash new file mode 100644 index 0000000..e45d0c7 --- /dev/null +++ b/test/test_helper/gitlab-mock-mr.bash @@ -0,0 +1,25 @@ +GITLAB_DOMAIN="example.com" +GITLAB_TOKEN="example" + +function gitlab_merge_requests_for_branch { + echo '[{"iid":1,"web_url":"https://example.com/some/project/-/merge_requests/1"}]' +} + +function gitlab_merge_request { + local oldDesc + oldDesc="[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" + oldDesc="${oldDesc}$(echo "\n\n## Commits")" + oldDesc="${oldDesc}$(echo "\n\n* **${c1sha} Feature test - 1**..")" + oldDesc="${oldDesc}$(echo "\n* **${c2sha} Feature test - 2**..")" + oldDesc="${oldDesc}$(echo "\n* **${c3sha} Feature test - 3**")" + + echo '{ + "iid":1, "web_url":"https://example.com/some/project/-/merge_requests/1", + "title":"My MR", "target_branch":"feature/base", + "description":"'"$oldDesc"'" + }' +} + +function mr_actions { + return 0 +} diff --git a/test/test_helper/jira-mock.bash b/test/test_helper/jira-mock.bash new file mode 100644 index 0000000..d9cbb31 --- /dev/null +++ b/test/test_helper/jira-mock.bash @@ -0,0 +1,8 @@ +JIRA_INSTANCE="mycompany.example.net" + +function jira_ticket_data { + echo '{ + "key":"AB-123", + "fields":{"summary":"This is an issue"} + }' +} From 7f6d42cbc9c9f1227a63546f89b39fabe782a107 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 14 Dec 2022 13:50:52 +0100 Subject: [PATCH 14/88] Documentation --- README.md | 308 +++++++++++++++++++++++++++++++++++------------------- git-mr | 142 +++++++++++++------------ 2 files changed, 280 insertions(+), 170 deletions(-) diff --git a/README.md b/README.md index 52882ac..498aa38 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # git-mr +[![Tests](https://github.com/Djuuu/git-mr/actions/workflows/test.yml/badge.svg)](https://github.com/Djuuu/git-mr/actions/workflows/test.yml) +[![License](https://img.shields.io/badge/license-Beerware%20%F0%9F%8D%BA-yellow)](https://web.archive.org/web/20160322002352/http://www.cs.trincoll.edu/hfoss/wiki/Chris_Fei:_Beerware_License) + Prepares a merge request description, with link to Jira ticket and current branch commit list. ---------------------------------------------------------------- @@ -18,10 +21,10 @@ Prepares a merge request description, with link to Jira ticket and current branc + [`git mr merge`](#git-mr-merge) + [`git mr hook`](#git-mr-hook) * [Hooks](#hooks) - + [prepare-commit-msg](#prepare-commit-msg) + + [`prepare-commit-msg`](#prepare-commit-msg) * [Plumbing](#plumbing) - + [git mr base](#git-mr-base) - + [git mr code](#git-mr-code) + + [`git mr base`](#git-mr-base) + + [`git mr code`](#git-mr-code) * [Sample output](#sample-output) ---------------------------------------------------------------- @@ -29,40 +32,64 @@ Prepares a merge request description, with link to Jira ticket and current branc ## Synopsis
-git mr  [OPTIONS]          [ISSUE_CODE] [BASE_BRANCH]
-git mr  [OPTIONS]  open    [ISSUE_CODE] [BASE_BRANCH]
-git mr  [OPTIONS]  status
-git mr  [OPTIONS]  update  [BASE_BRANCH]
-
-git mr  [OPTIONS]  menu    [update [--all] | status] [ISSUE_CODE]
+git mr  [OPTIONS]          [BRANCH]
+git mr  [OPTIONS]  open    [BRANCH]
+git mr  [OPTIONS]  status  [BRANCH]
+git mr  [OPTIONS]  update  [BRANCH]
+git mr  [OPTIONS]  merge   [BRANCH]
 
-git mr  [OPTIONS]  ip
-git mr  [OPTIONS]  cr
-git mr  [OPTIONS]  qa
-git mr  [OPTIONS]  undraft
+git mr  [OPTIONS]  menu                 [SEARCH_TERM]
+git mr  [OPTIONS]  menu update [--all]  [SEARCH_TERM]
+git mr  [OPTIONS]  menu status          [SEARCH_TERM]
 
-git mr  [OPTIONS]  merge   [BASE_BRANCH]
+git mr  [OPTIONS]  (ip|cr|qa)  [BRANCH]
+git mr  [OPTIONS]  undraft     [BRANCH]
 
-git mr  [OPTIONS]  hook
+git mr hook
 
-git mr  base
-git mr  code
+git mr base
+git mr code
 
### Arguments -* `ISSUE_CODE` Force Jira issue code, if not detected properly -* `BASE_BRANCH` Force base branch, if not detected properly +* `BRANCH` + Force merge request source branch. + Defaults to current branch. +* `SEARCH_TERM` + Term searched in merge requests titles to build menu. + Defaults to Jira issue code guessed from branch name. ### Options -* `-v` Verbose output (displays called API URLs) -* `-y` Bypass confirmation prompts (always answer "yes") -* `-e` Use full commit messages in description ("extended", for `git mr update`) -* `-a`|`--all` Update all merge requests (`git mr menu update`) +* `-c|--code` `ISSUE_CODE` + Force issue code. +* `-t|--target` `TARGET_BRANCH` + Force target branch. +* `-v` + Verbose output (displays called API URLs). +* `-y` + Bypass confirmation prompts (always answer "yes"). +* `-e` + Use full commit messages in description ("extended", for `git mr [open|update]`). + You can also set `GIT_MR_EXTENDED=1` in your environment variables to always use extended commit descriptions. +* `-n` + Add new section in description for new commits (for `git mr update`) +* `-a`|`--all` + Update all merge requests (for `git mr menu update`). +* `-h` + Show help page. + ## Installation +### Dependencies + +* `bash`, `git` and usual command-line utilities: `grep`, `sed`, `curl`, `head`, `tail`, `tr`. +* [**`jq`**](https://stedolan.github.io/jq/) is required and needs to be in PATH. + +### git-mr + * Add the `git-mr` directory to your `PATH`
in one of your shell startup scripts: ```bash @@ -71,7 +98,7 @@ Prepares a merge request description, with link to Jira ticket and current branc _OR_ -* Define it as a git alias:
+* Define it as a Git alias:
run: ```bash git config --global alias.mr '!bash /path/to/git-mr/git-mr' @@ -82,9 +109,12 @@ _OR_ mr = "!bash /path/to/git-mr/git-mr" ``` -### Dependencies +### Completion -* [**`jq`**](https://stedolan.github.io/jq/) is required and needs to be in PATH. +Completion is available in `git-mr-completion.bash`. Source it in one of your shell startup scripts: +```bash +. "/path/to/git-mr/git-mr-completion.bash" +``` ## Configuration @@ -101,11 +131,11 @@ export GITLAB_TOKEN="Zyxwvutsrqponmlkjihg" ``` To create a Jira API Token, go to: -* https://id.atlassian.com/manage-profile/security/api-tokens
+* https://id.atlassian.com/manage-profile/security/api-tokens (Account Settings -> Security -> API Token -> Create and manage API tokens) To create a Gitlab API Token, go to: -* https://myapp.gitlab.com/profile/personal_access_tokens
+* https://myapp.gitlab.com/-/profile/personal_access_tokens?name=Git-MR+Access+token&scopes=api (Settings -> Access Tokens) Other optional configuration variables: @@ -136,12 +166,15 @@ export JIRA_QA_ID="xx" # "Quality Assurance" status ID ### `git mr`
-git mr [OPTIONS] [ISSUE_CODE] [BASE_BRANCH]
+git mr [OPTION...] [BRANCH]
 
This will print a merge request description, with a link to Jira ticket and current branch commit list. -* `ISSUE_CODE` can be guessed from the branch name according to `JIRA_CODE_PATTERN` -* `BASE_BRANCH` is determined by going up the commit history and finding the first one attached to a branch + +* Issue code can be guessed from the branch name according to `JIRA_CODE_PATTERN`. + It can also be forced with the `-c|--code` option. +* Target branch is determined by going up the commit history and finding the first one attached to another local branch. + It can also be forced with the `-t|--target` option. If a merge request based on the current branch is found on Gitlab, its URL will be provided, along with current votes, open and resolved threads and mergeable status. @@ -153,7 +186,7 @@ can be configured with the `GITLAB_DEFAULT_LABELS` and `GITLAB_DEFAULT_FORCE_REM ### `git mr open`
-git mr [OPTIONS] o|op|open [ISSUE_CODE] [BASE_BRANCH]
+git mr [OPTION...] o|op|open [BRANCH]
 
Similar to `git mr`, but will open browser directly. @@ -163,7 +196,7 @@ Similar to `git mr`, but will open browser directly. ### `git mr status`
-git mr [OPTIONS] s|st|status [BASE_BRANCH]
+git mr [OPTION...] s|st|status [BRANCH]
 
Displays a quick summary of the merge request, with useful indicators (tags, target branch, votes, open threads, draft status, ...) @@ -173,7 +206,7 @@ Displays a quick summary of the merge request, with useful indicators (tags, tar ### `git mr update`
-git mr [OPTIONS] u|up|update [BASE_BRANCH]
+git mr [OPTION...] u|up|update [BRANCH]
 
This will: @@ -189,7 +222,9 @@ You can also update the source branch if it is different from the current one. ### `git mr menu`
-git mr [OPTIONS] menu [st|status] [up|update [--all]] [ISSUE_CODE] 
+git mr [OPTION...] menu                   [ISSUE_CODE] 
+git mr [OPTION...] menu up|update [--all] [ISSUE_CODE] 
+git mr [OPTION...] menu st|status         [ISSUE_CODE] 
 
Searches for all (non-closed) merge requests with the current issue code in the title, and generates a menu. @@ -198,9 +233,9 @@ Sample: ```markdown ## Menu -* My Project: [feature/XY-1234 My feature main stuff](https://myapp.gitlab.com/my/project/merge_requests/5) -* My Other Project: [feature/XY-1234 My feature related stuff](https://myapp.gitlab.com/my/other-project/merge_requests/6) -* My Other Project: [feature/XY-1234 My feature other stuff](https://myapp.gitlab.com/my/other-project/merge_requests/7) +* Some Project: [Feature/XY-1234 Ipsum](https://myapp.gitlab.com/some/project/-/merge_requests/12) +* Other Project: [Feature/XY-1234 Quisque sed](https://myapp.gitlab.com/other/project/-/merge_requests/34) +* Third Project: [Feature/XY-1234 Nunc vestibulum](https://myapp.gitlab.com/third/project/-/merge_requests/56) -------------------------------------------------------------------------------- @@ -222,7 +257,7 @@ Sample: ### `git mr ip|cr|qa`
-git mr [OPTIONS] ip|cr|qa [ISSUE_CODE]
+git mr [OPTION...] ip|cr|qa [BRANCH]
 
This will: @@ -235,16 +270,16 @@ This will: - `JIRA_CR_ID` - `JIRA_QA_ID` -#### `git mr ip` +#### `git mr ip` _("in progress")_ * removes Gitlab labels defined in `GITLAB_CR_LABELS`, `GITLAB_QA_LABELS` and `GITLAB_OK_LABELS` * sets Jira ticket to status ID defined in `JIRA_IP_ID` -#### `git mr cr` +#### `git mr cr` _("code review")_ * removes Gitlab labels defined in `GITLAB_QA_LABELS`, and `GITLAB_OK_LABELS` * adds Gitlab labels defined in `GITLAB_CR_LABELS` * sets Jira ticket to status ID defined in `JIRA_CR_ID` -#### `git mr qa` +#### `git mr qa` _("quality assurance")_ * removes Gitlab labels defined in `GITLAB_CR_LABELS`, and `GITLAB_OK_LABELS` * adds Gitlab labels defined in `GITLAB_QA_LABELS` * sets Jira ticket to status ID defined in `JIRA_QA_ID` @@ -254,7 +289,7 @@ This will: ### `git mr undraft`
-git mr [OPTIONS] undraft
+git mr [OPTION...] undraft [BRANCH]
 
This will resolve the Gitlab _Work in Progress_ status. @@ -264,7 +299,7 @@ This will resolve the Gitlab _Work in Progress_ status. ### `git mr merge`
-git mr [OPTIONS] m|mg|merge [BASE_BRANCH]
+git mr [OPTION...] m|mg|merge [BRANCH]
 
This will: @@ -282,14 +317,14 @@ and if applicable, will prompt you to: ### `git mr hook`
-git mr [OPTIONS] hook
+git mr hook
 
-This will symlink hooks of your repository to the ones provided by git-mr: -* `prepare-commit-msg` +Adds the `prepare-commit-msg` Git hook to your current repository. ---------------------------------------------------------------- + ## Hooks The following hooks are provided for convenience: @@ -300,8 +335,11 @@ Ensures your commit messages are prefixed with the code of related issue. ---------------------------------------------------------------- + ## Plumbing +These "plumbing" commands can be useful in other scripts or git aliases. + ### `git mr base` Outputs guessed base branch. @@ -314,71 +352,83 @@ Outputs guessed issue code. ---------------------------------------------------------------- + ## Sample output +## `git mr` +
-me@mystation:~/projects/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr
+me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr
 
-
-
-Output --------------------------------------------------------------------------------- +
--------------------------------------------------------------------------------
 # [XY-1234 Ipsum consectetur adipiscing](https://mycompany.atlassian.net/browse/XY-1234)
 
 ## Commits
 
-* **78330c9 In vulputate quam ac ultrices volutpat**<br>
-* **0010a6a Curabitur vel purus sed tortor finibus posuere**<br>
-* **3621817 Aenean sed sem hendrerit ex egestas**<br>
+* **78330c9 In vulputate quam ac ultrices volutpat**  
+* **0010a6a Curabitur vel purus sed tortor finibus posuere**  
+* **3621817 Aenean sed sem hendrerit ex egestas**  
 
 --------------------------------------------------------------------------------
 
 To create a new merge request:
 
-  https://myapp.gitlab.com/my/project/merge_requests/new?merge_request%5Bsource_branch%5D=feature/xy-1234-ipsum&merge_request%5Btarget_branch%5D=develop
-
+ https://myapp.gitlab.com/my/project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature/xy-1234-ipsum&merge_request%5Btarget_branch%5D=develop + ------------------------------------------------------------------------------------------------------------------------
-me@mystation:~/projects/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr -e
+me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr -e
 
-
-
-Output --------------------------------------------------------------------------------- +
--------------------------------------------------------------------------------
 # [XY-1234 Ipsum consectetur adipiscing](https://mycompany.atlassian.net/browse/XY-1234)
 
 ## Commits
 
-* **78330c9 In vulputate quam ac ultrices volutpat**
+* **78330c9 In vulputate quam ac ultrices volutpat**  
+  Some commit description  
+* **0010a6a Curabitur vel purus sed tortor finibus posuere**  
+  Extended description  
+  - stuff  
+  - other stuff  
+* **3621817 Aenean sed sem hendrerit ex egestas**  
 
-  Some commit description
+--------------------------------------------------------------------------------
 
-* **0010a6a Curabitur vel purus sed tortor finibus posuere**
+To create a new merge request:
 
-  Extended description
-  - stuff
-  - other stuff
+  https://myapp.gitlab.com/my/project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature/xy-1234-ipsum&merge_request%5Btarget_branch%5D=develop
+
-* **3621817 Aenean sed sem hendrerit ex egestas** +------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------- +## `git mr status` -To create a new merge request: +
+me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr status
+
+
-------------------------------------------------------------------
+Draft: Feature/XY-1234 Ipsum
+-------------------------------------------------------------------
+
+Merge request:
 
-  https://myapp.gitlab.com/my/project/merge_requests/new?merge_request%5Bsource_branch%5D=feature/xy-1234-ipsum&merge_request%5Btarget_branch%5D=develop
-
+ https://myapp.gitlab.com/my/project/merge_requests/6 + + 🏷 [Review] [My Team] (↣ main) + + 👍 1 👎 1 Resolved threads: 0/1 Draft: yes Can be merged: ❌ + ------------------------------------------------------------------------------------------------------------------------ +## `git mr update` +
-me@mystation:~/projects/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr update
+me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr update -n
 
-
-
-Output -------------------------------------------------------------------- +
-------------------------------------------------------------------
 Draft: Feature/XY-1234 Ipsum
 -------------------------------------------------------------------
 # [XY-1234 Ipsum consectetur adipiscing](https://mycompany.atlassian.net/browse/XY-1234)
@@ -387,27 +437,25 @@ Vivamus venenatis tortor et neque sollicitudin, eget suscipit est malesuada
 
 ## Commits
 
-* **78330c9 In vulputate quam ac ultrices volutpat**<br>
-  In vulputate quam<br>
-  ac ultrices volutpat
-
-* **0010a6a Curabitur vel purus sed tortor finibus posuere**<br>
+* **78330c9 In vulputate quam ac ultrices volutpat**  
+  In vulputate quam  
+  ac ultrices volutpat  
+* **0010a6a Curabitur vel purus sed tortor finibus posuere**  
   Curabitur vel
-
-* **aac348f Aenean sed sem hendrerit ex egestas tincidunt**<br>
-  Hendrerit ex egestas<br>
-  egestas sed
+* **aac348f Aenean sed sem hendrerit ex egestas tincidunt**  
+  Hendrerit ex egestas  
+  egestas sed  
 
 ## Update
 
-* **e9642b7 Ut consectetur leo ut leo commodo porttitor**<br>
+* **e9642b7 Ut consectetur leo ut leo commodo porttitor**  
 
 --------------------------------------------------------------------------------
 
   updated commits: 1
       new commits: 1
 
-Do you want to update the merge request description? [y/N] y
+Do you want to update the merge request description? [y/N] y
 OK
 --------------------------------------------------------------------------------
 
@@ -415,18 +463,19 @@ Merge request:
 
   https://myapp.gitlab.com/my/project/merge_requests/6
 
-    👍  1    👎  0        Resolved threads: 1/2        Draft: yes        Can be merged: ✅
-
+ 🏷 [Testing] [My Team] (↣ main) + + 👍 2 👎 0 Resolved threads: 1/2 Draft: yes Can be merged: + ------------------------------------------------------------------------------------------------------------------------ +## `git mr merge` +
-me@mystation:~/projects/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr merge
+me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr merge
 
-
-
-Output -------------------------------------------------------------------- +
-------------------------------------------------------------------
 Draft: Feature/XY-1234 Ipsum
 -------------------------------------------------------------------
 
@@ -434,16 +483,18 @@ Merge request:
 
   https://myapp.gitlab.com/my/project/merge_requests/6
 
-    👍  2    👎  0        Resolved threads: 2/2        Draft: yes        Can be merged: ✅
+   🏷  [Accepted] [My Team]                                          (↣ main)
 
-Merge request is a Work in Progress
-Do you want to resolve draft status? [y/N] y
+   👍  2   👎  0     Resolved threads: 2/2     Draft: yes     Can be merged: 
+
+Merge request is a draft (work in progress)
+Do you want to resolve draft status? [y/N] y
 OK
-Do you want to merge 'feature/xy-1234-ipsum'? [y/N] y
+Do you want to merge 'feature/xy-1234-ipsum'? [y/N] y
 OK
-Do you want to checkout 'develop' and pull changes? [y/N] y
-Switched to branch 'develop'
-Your branch is up to date with 'origin/develop'.
+Do you want to checkout 'main' and pull changes? [y/N] y
+Switched to branch 'main'
+Your branch is up to date with 'origin/main'.
 From myapp.gitlab.com:me/my/project
  - [deleted]         (none)     -> origin/feature/xy-1234-ipsum
 remote: Enumerating objects: 1, done.
@@ -451,10 +502,55 @@ remote: Counting objects: 100% (1/1), done.
 remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
 remote: 
 Unpacking objects: 100% (1/1), 263 bytes | 263.00 KiB/s, done.
-   c17b3a1..9545ecd  develop    -> origin/develop
+   c17b3a1..9545ecd  main    -> origin/main
 Updating c17b3a1..9545ecd
 Fast-forward
 
-Do you want to delete local branch 'feature/xy-1234-ipsum' [y/N] y
+Do you want to delete local branch 'feature/xy-1234-ipsum'? [y/N] y
 Deleted branch feature/xy-1234-ipsum (was e9642b7).
-
+ + +------------------------------------------------------------------------------------------------------------------------ + +## `git mr menu` + +
+me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr menu
+
+
## Menu
+
+* Some Project: [Feature/XY-1234 Ipsum](https://myapp.gitlab.com/some/project/-/merge_requests/12)
+* Other Project: [Feature/XY-1234 Quisque sed](https://myapp.gitlab.com/other/project/-/merge_requests/34)
+* Third Project: [Feature/XY-1234 Nunc vestibulum](https://myapp.gitlab.com/third/project/-/merge_requests/56)
+
+---------------------------------------------------------------------------------
+
+ + +------------------------------------------------------------------------------------------------------------------------ + +
+me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr menu status
+
+
## Menu
+
+* Some Project: [Feature/XY-1234 Ipsum](https://myapp.gitlab.com/some/project/-/merge_requests/12)
+
+   🏷  [Review] [My Team]                                            (↣ main)
+
+   👍  1   👎  1     Resolved threads: 0/1     Draft: yes     Can be merged: ❌
+
+* Other Project: [Feature/XY-1234 Quisque sed](https://myapp.gitlab.com/other/project/-/merge_requests/34)
+
+   🏷  [Testing] [My Team]                                         (↣ master)
+
+   👍  2   👎  0     Resolved threads: 1/2     Draft: yes     Can be merged: 
+
+* Third Project: [Feature/XY-1234 Nunc vestibulum](https://myapp.gitlab.com/third/project/-/merge_requests/56)
+
+   🏷  [Accepted] [My Team]                                    (↣ epic/stuff)
+
+   👍  2   👎  0     Resolved threads: 2/2     Draft: yes     Can be merged: 
+
+---------------------------------------------------------------------------------
+
diff --git a/git-mr b/git-mr index 840cb4c..6796d93 100755 --- a/git-mr +++ b/git-mr @@ -1817,7 +1817,7 @@ function mr_merge # delete local branch - if [ "$(confirm "Do you want to delete local branch '$source_branch'")" != "yes" ]; then echo; return; fi + if [ "$(confirm "Do you want to delete local branch '$source_branch'?")" != "yes" ]; then echo; return; fi echo "git branch -d $source_branch" git branch -d "$source_branch" @@ -1950,95 +1950,107 @@ function mr_hook function usage { - cat << EOF - -SYNOPSIS + local b; b="$(printf '\e[1m')" + local u; u="$(printf '\e[4m')" + local r; r="$(printf '\e[0m')" - mr [OPTIONS] [ISSUE_CODE] [BASE_BRANCH] - mr [OPTIONS] open [ISSUE_CODE] [BASE_BRANCH] - mr [OPTIONS] update [BASE_BRANCH] - mr [OPTIONS] merge - - mr [OPTIONS] menu [update [--all] | status] [ISSUE_CODE] + cat << EOF +${b}NAME${r} + ${u}git-mr${r} - Manage a Gitlab merge request description, with link to Jira ticket and current branch commit list - mr [OPTIONS] undraft +${b}SYNOPSIS${r} + ${u}git${r} ${u}mr${r} [OPTION...] [BRANCH] + ${u}git${r} ${u}mr${r} [OPTION...] open [BRANCH] + ${u}git${r} ${u}mr${r} [OPTION...] status [BRANCH] + ${u}git${r} ${u}mr${r} [OPTION...] update [BRANCH] + ${u}git${r} ${u}mr${r} [OPTION...] merge [BRANCH] - mr [OPTIONS] ip [ISSUE_CODE] - mr [OPTIONS] cr [ISSUE_CODE] - mr [OPTIONS] qa [ISSUE_CODE] + ${u}git${r} ${u}mr${r} [OPTION...] menu [SEARCH_TERM] + ${u}git${r} ${u}mr${r} [OPTION...] menu update [--all] [SEARCH_TERM] + ${u}git${r} ${u}mr${r} [OPTION...] menu status [SEARCH_TERM] - mr [OPTIONS] hook + ${u}git${r} ${u}mr${r} [OPTION...] (ip|cr|qa) [BRANCH] + ${u}git${r} ${u}mr${r} [OPTION...] undraft [BRANCH] - mr base - mr code + ${u}git${r} ${u}mr${r} hook -OPTIONS + ${u}git${r} ${u}mr${r} base + ${u}git${r} ${u}mr${r} code - -t | --target TARGET_BRANCH Force target branch. - -c | --code ISSUE_CODE Force issue code. +${b}ARGUMENTS${r} + BRANCH + Force merge request source branch. + Defaults to current branch. - -v Verbose output (displays called API URLs) - -y Bypass confirmation prompts ("yes") - -e Use full commit messages in description ("extended", for \`git mr update\`) - -a | --all Update all merge requests (\`git mr menu update\`) + SEARCH_TERM + Term searched in merge requests titles to build menu. + Defaults to Jira issue code guessed from branch name. -INSTALLATION +${b}OPTIONS${r} - Add the git-mr directory to your PATH + -c, --code ISSUE_CODE + Force issue code. - PATH="\${PATH}:/path/to/git-mr" + -t, --target TARGET_BRANCH + Force target branch. - OR + -v + Verbose output (displays called API URLs). - Define it as a git alias: + -y + Bypass confirmation prompts ("yes"). - git config --global alias.mr '!bash /path/to/git-mr/git-mr' + -e + Use full commit messages in description ("extended", for \`git mr [open|update]\`). + You can also set GIT_MR_EXTENDED=1 in your environment variables to always use extended commit descriptions. - or edit your ~/.gitconfig directly: + -n + Add new section in description for new commits (for \`git mr update\`) - [alias] - mr = "!bash /path/to/git-mr/git-mr" + -a, --all + Update all merge requests (for \`git mr menu update\`). - Ensure jq is installed to be able to update or merge. + -h + Show this help. -CONFIGURATION +${b}CONFIGURATION${r} - You need to configure the following environment variables: + You need to configure the following environment variables: - export JIRA_USER="user.name@mycompany.com" - export JIRA_INSTANCE="mycompany.atlassian.net" - export JIRA_TOKEN="abcdefghijklmnopqrstuvwx" - export JIRA_CODE_PATTERN="[A-Z]{2,3}-[0-9]+" + export JIRA_USER="user.name@mycompany.com" + export JIRA_INSTANCE="mycompany.atlassian.net" + export JIRA_TOKEN="abcdefghijklmnopqrstuvwx" + export JIRA_CODE_PATTERN="[A-Z]{2,3}-[0-9]+" - export GITLAB_DOMAIN="myapp.gitlab.com" - export GITLAB_TOKEN="Zyxwvutsrqponmlkjihg" + export GITLAB_DOMAIN="myapp.gitlab.com" + export GITLAB_TOKEN="Zyxwvutsrqponmlkjihg" - To create a Jira API Token, go to: https://id.atlassian.com/manage-profile/security/api-tokens - (Account Settings -> Security -> API Token -> Create and manage API tokens) + To create a Jira API Token, go to: https://id.atlassian.com/manage-profile/security/api-tokens + (Account Settings -> Security -> API Token -> Create and manage API tokens) - To create a Gitlab API Token, go to: https://myapp.gitlab.com/profile/personal_access_tokens
- (Settings -> Access Tokens) + To create a Gitlab API Token, go to: https://myapp.gitlab.com/-/profile/personal_access_tokens?name=Git-MR+Access+token&scopes=api + (Settings -> Access Tokens) - Optional configuration variables: + Optional configuration variables: - # Default labels for new merge requests - export GITLAB_DEFAULT_LABELS="Review,My Team" + # Default labels for new merge requests + export GITLAB_DEFAULT_LABELS="Review,My Team" - # Check "Delete source branch" by default (defaults to 1) - export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 + # Check "Delete source branch" by default (defaults to 1) + export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 - # Network timeout (in seconds, defaults to 5) - export GIT_MR_TIMEOUT=5 + # Network timeout (in seconds, defaults to 5) + export GIT_MR_TIMEOUT=5 - # Gitlab status labels (comma-separated, without spaces in between) - export GITLAB_OK_LABELS="Validated,Accepted" # Labels removed on IP, CR or QA steps - export GITLAB_CR_LABELS="Review" # Labels set on CR step - export GITLAB_QA_LABELS="Testing" # Labels set on QA step + # Gitlab status labels (comma-separated, without spaces in between) + export GITLAB_OK_LABELS="Validated,Accepted" # Labels removed on IP, CR or QA steps + export GITLAB_CR_LABELS="Review" # Labels set on CR step + export GITLAB_QA_LABELS="Testing" # Labels set on QA step - # Jira status IDs - export JIRA_IP_ID="xx" # "In Progress" status ID - export JIRA_CR_ID="xx" # "Code Review" status ID - export JIRA_QA_ID="xx" # "Quality Assurance" status ID + # Jira status IDs + export JIRA_IP_ID="xx" # "In Progress" status ID + export JIRA_CR_ID="xx" # "Code Review" status ID + export JIRA_QA_ID="xx" # "Quality Assurance" status ID EOF } @@ -2081,6 +2093,8 @@ while [[ $# -gt 0 ]]; do -e|-E) GIT_MR_EXTENDED=1 ;; -n|-N) GIT_MR_UPDATE_NEW_SECTION=1 ;; + -h) usage; exit 0; ;; + *) args+=("${1}") ;; esac shift @@ -2100,13 +2114,13 @@ case $1 in menu) mr_menu "${@:2}" ;; - undraft) gitlab_undraft "${@:2}" ;; - p|ip|IP) mr_ip "${@:2}" ;; r|cr|CR) mr_cr "${@:2}" ;; q|qa|QA) mr_qa "${@:2}" ;; - hook) mr_hook "${@:2}" ;; + undraft) gitlab_undraft "${@:2}" ;; + + hook) mr_hook ;; # Plumbing base) git_base_branch ;; From 44bb642832b9b503cbbe079a742e1d3b0a648cfa Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 11 Jan 2023 18:08:53 +0100 Subject: [PATCH 15/88] Fix git-mr hook when in a submodule --- git-mr | 6 +++--- test/git-mr.bats | 35 +++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/git-mr b/git-mr index 6796d93..227d726 100755 --- a/git-mr +++ b/git-mr @@ -1936,15 +1936,15 @@ function mr_qa function mr_hook { - local git_dir; git_dir=$(git rev-parse --show-toplevel) + local git_dir; git_dir=$(git rev-parse --git-dir) local git_mr_dir; git_mr_dir="$(dirname "${BASH_SOURCE[0]}")" - [ ! -d "${git_dir}/.git/hooks" ] && mkdir "${git_dir}/.git/hooks" + [ ! -d "${git_dir}/hooks" ] && mkdir "${git_dir}/hooks" find "${git_mr_dir}/hooks" -type f -print0 | while read -d $'\0' hook; do local hook_name; hook_name="$(basename $hook)" echo "Linking hook: ${hook_name}" - ln -sf "$hook" "${git_dir}/.git/hooks/${hook_name}" + ln -sf "$hook" "${git_dir}/hooks/${hook_name}" done } diff --git a/test/git-mr.bats b/test/git-mr.bats index 51ab537..1dff3ca 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -587,16 +587,39 @@ setup() { # Merge request top-level functions @test "Provides pre-commit-msg hook" { - run git-mr hook >&3 + # standard .git directory + + run git commit --allow-empty -m "Test message 1" + assert_output "[feature/AB-123-test-feature $(git rev-parse --short HEAD)] Test message 1" + + run git-mr hook assert [ -f ".git/hooks/prepare-commit-msg" ] - git commit --allow-empty -m "Some message" - csha=$(git rev-parse --short HEAD) + run git commit --allow-empty -m "Test message 2" + assert_line "Prefixing message with issue code: AB-123" + assert_line "[feature/AB-123-test-feature $(git rev-parse --short HEAD)] AB-123 Test message 2" - run git log --oneline --no-decorate -n1 + git reset --hard HEAD~2 - assert_output "${csha} AB-123 Some message" + # submodule - git reset --hard HEAD~1 + cd "${BATS_TEST_DIRNAME}/data" || exit + git init subrepo + cd subrepo + git commit --allow-empty -m "Sub commit" + cd ../repo + git -c protocol.file.allow=always submodule add ../subrepo sub + cd sub + git switch -c feature/XY-345-test + + run git commit --allow-empty -m "Sub message 1" + assert_output "[feature/XY-345-test $(git rev-parse --short HEAD)] Sub message 1" + + run git-mr hook + assert [ -f "../.git/modules/sub/hooks/prepare-commit-msg" ] + + run git commit --allow-empty -m "Sub message 2" + assert_line "Prefixing message with issue code: XY-345" + assert_line "[feature/XY-345-test $(git rev-parse --short HEAD)] XY-345 Sub message 2" } From 44ce4f054d71bcf34b1277d58ac2451204c5a5cd Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 12 Jan 2023 02:14:52 +0100 Subject: [PATCH 16/88] Fix base determination when no local ancestor branch is found --- git-mr | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/git-mr b/git-mr index 227d726..3dcb59a 100755 --- a/git-mr +++ b/git-mr @@ -29,8 +29,11 @@ function git_base_branch head -n1) # keep only first decoration # First possible merge base - if [ -z "$base_branch" ]; then - base_branch=$(git show-branch --merge-base | head -n1) + if ! git show-ref -q --heads "$base_branch"; then + local remote; remote=$(git remote | head -n1) + local remote_default; remote_default=$(git symbolic-ref "refs/remotes/${remote}/HEAD" -- 2>/dev/null) + local default; default=${remote_default#"refs/remotes/${remote}/"} + base_branch=$(git show-branch --merge-base "$branch" "$default" | head -n1) fi echo_debug "Base branch: $base_branch" From 2a2aea45e52db89fde8d74f94112708dd7ffc496 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 12 Jan 2023 21:16:06 +0100 Subject: [PATCH 17/88] Fix extended descriptions when commit body does not end with newline --- git-mr | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/git-mr b/git-mr index 3dcb59a..ed8832d 100755 --- a/git-mr +++ b/git-mr @@ -83,7 +83,8 @@ function git_commits_extended local format="${prefix}%h %s${suffix}%n%b${end}" git log --reverse --no-decorate --format="${format}" "${target_branch}".."${source_branch}" | - grep -v "^${end}" # remove trailing blank line + grep -v "^${end}" | # remove trailing blank line + sed -r "s/${end}$//g" # remove trailing body end for bodies without trailing blank line } function git_commit_extended @@ -98,7 +99,8 @@ function git_commit_extended local format="${prefix}%h %s${suffix}%n%b${end}" git show -s --format="${format}" "${revision}" | - grep -v "^${end}" # remove trailing blank line + grep -v "^${end}" | # remove trailing blank line + sed -r "s/${end}$//g" # remove trailing body end for bodies without trailing blank line } function git_titlize_branch From de43403694a9bfe17c1171ad987d0a6d61526847 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 12 Jan 2023 01:23:54 +0100 Subject: [PATCH 18/88] Display adjustments --- git-mr | 93 +++++++++++++++++++++++++++++------------------- test/git-mr.bats | 50 ++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 37 deletions(-) diff --git a/git-mr b/git-mr index ed8832d..7109171 100755 --- a/git-mr +++ b/git-mr @@ -935,6 +935,18 @@ function mr_title markdown_link "${issue_key} ${issue_title}" "$issue_url" } +function mr_commit_list +{ + local source_branch=${1:-$(git_current_branch)} + local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} + + if [[ $GIT_MR_EXTENDED -eq 1 ]]; then + markdown_indent_list_items "$(git_commits_extended "$source_branch" "$target_branch")" + else + markdown_list "$(git_commits "$source_branch" "$target_branch")" + fi +} + function mr_description { local source_branch=${1:-$(git_current_branch)} @@ -943,15 +955,13 @@ function mr_description local title; title=$(mr_title "$source_branch" "$issue_code") || exit $? - local commits - local description - if [[ $GIT_MR_EXTENDED -eq 1 ]]; then - commits=$(git_commits_extended "$source_branch" "$target_branch") - description=$(markdown_indent_list_items "$commits") - else - commits=$(git_commits "$source_branch" "$target_branch") - description=$(markdown_list "$commits") - fi + mr_print_description "$title" "$(mr_commit_list "$source_branch" "$target_branch")" +} + +function mr_print_description +{ + local title=$1 + local commit_list=$2 cat << EOF $(markdown_title "$title") @@ -959,7 +969,7 @@ $(markdown_title "$title") ## Commits -$description +$commit_list EOF } @@ -979,12 +989,8 @@ function mr_actions local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") if [ ! -z "${mr_url}" ]; then - cat << EOF -Merge request: - - ${mr_url} -EOF - mr_print_status "${mr_iid}" "$mr_detail" + echo -e "Merge request:\n\n $(colorize "${mr_url}" "lightgray")" + mr_show_status "${mr_iid}" "$mr_detail" return fi @@ -1040,13 +1046,26 @@ function mr_format_labels sed 's/^\s*//' | sed 's/\s*$//' # remove leading and trailing spaces } -function mr_print_status +function mr_show_status { local mr_iid=$1 + local merge_request; merge_request=${2:-$(gitlab_merge_request "$mr_iid")} - [ ! -z "$mr_iid" ] || exit_error 0 "mr_iid not provided" + local mr_url; mr_url=$(echo "$merge_request" | jq -r '.web_url') + local project_url; project_url=$(gitlab_extract_project_url "$mr_url") + + local threads; threads=${3:-$(gitlab_merge_request_threads "$project_url" "$mr_iid")} + + mr_print_status "$merge_request" "$threads" +} + +function mr_print_status +{ + local merge_request=$1 + local threads=$2 + + [ -n "$merge_request" ] || exit_error 0 "merge_request not provided" - local merge_request; merge_request=${2:-$(gitlab_merge_request "$mr_iid")} local mr_url; mr_url=$(echo "$merge_request" | jq -r '.web_url') local project_url; project_url=$(gitlab_extract_project_url "$mr_url") @@ -1071,7 +1090,6 @@ function mr_print_status else downvotes=$(colorize "$downvotes" "bold"); fi # Threads - local threads; threads=$(gitlab_merge_request_threads "$project_url" "$mr_iid") local thread_count; thread_count="$(echo "$threads" | grep -c 'unresolved:' || true)" local resolved_count; resolved_count="$(echo "$threads" | grep -c 'unresolved:false' || true)" @@ -1257,9 +1275,15 @@ function mr_menu_contents function mr_menu_status { - local menu_items=$1 + local issue_code=$1 + local menu_items=$2 - echo "$GIT_MR_MENU_START" + local mr_count; mr_count=$(echo "$menu_items" | wc -l) + + echo + echo "-------------------------------------------------------------------" + echo "${issue_code} (${mr_count} merge request$([[ $mr_count -gt 1 ]] && echo 's'))" + echo "-------------------------------------------------------------------" echo while IFS=$'\n' read -r menu_item; do @@ -1269,24 +1293,17 @@ function mr_menu_status local web_url; web_url=$(echo "$menu_item" | jq -r '.web_url') title=$(gitlab_title_undraft "$title") - - local item_label - item_label=$(echo "${project_name}: $(markdown_link "${title}" "$web_url")") - - echo "* ${item_label}" - local project_url; project_url=$(gitlab_extract_project_url "$web_url") # Load existing merge request details # Do NOT use `gitlab_merge_request` merge_request=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid") - mr_print_status "${mr_iid}" "$merge_request" + echo "* $(colorize "${project_name}" "bold"): $(terminal_link "${web_url}" "${title}" )" + mr_show_status "${mr_iid}" "$merge_request" + echo done < <(echo "$menu_items") - - echo - echo "$GIT_MR_MENU_END" } function mr_menu_show @@ -1506,8 +1523,10 @@ function mr_open local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") - if [ ! -z "${mr_url}" ]; then - mr_print_status "${mr_iid}" + if [ -n "${mr_url}" ]; then + echo + echo -e "Merge request:\n\n $(colorize "${mr_url}" "lightgray")" + mr_show_status "${mr_iid}" open_in_browser "${mr_url}" return fi @@ -1816,7 +1835,7 @@ function mr_merge if [ "$(confirm "Do you want to checkout '$current_target' and pull changes?")" != "yes" ]; then echo; return; fi - echo "git checkout $current_target && git pull --rebase" + echo "$(colorize "git checkout $current_target && git pull --rebase" "lightgray")" git checkout "$current_target" && git pull --rebase echo @@ -1824,7 +1843,7 @@ function mr_merge if [ "$(confirm "Do you want to delete local branch '$source_branch'?")" != "yes" ]; then echo; return; fi - echo "git branch -d $source_branch" + echo "$(colorize "git branch -d $source_branch" "lightgray")" git branch -d "$source_branch" echo } @@ -1875,7 +1894,7 @@ function mr_menu mr_menu_update "$menu_items" fi ;; - status) mr_menu_status "$menu_items" ;; + status) mr_menu_status "$issue_code" "$menu_items" ;; esac } diff --git a/test/git-mr.bats b/test/git-mr.bats index 1dff3ca..4d5b626 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -437,6 +437,56 @@ setup() { )" } +@test "Prints MR status indicators" { + + TERM=xterm-mono # disable colors + + mr='{ + "title": "Draft: Feature/XY-1234 Lorem Ipsum", "web_url":"https://myapp.gitlab.com/my/project/merge_requests/6", + "labels":["Review","My Team"], "target_branch": "main", "upvotes": 1, "downvotes": 1, "merge_status": "cannot_be_merged" + }' + threads='1 unresolved:false note_id:1 +2 unresolved:true note_id:2' + + run mr_print_status "$mr" "$threads" + + assert_output --partial " + 🏷 [Review] [My Team] (↣ main) + + 👍 1 👎 1 Resolved threads: 1/2 Draft: yes Can be merged: ❌" + + # ------------------------------------------------------------------------------------------------------------------ + + mr='{ + "title": "Feature/XY-1234 Lorem Ipsum", "web_url":"https://myapp.gitlab.com/my/project/merge_requests/6", + "labels":["Testing","My Team"], "target_branch": "main", "upvotes": 2, "downvotes": 0, "merge_status": "can_be_merged" + }' + threads='1 unresolved:false note_id:1 +2 unresolved:false note_id:2' + + run mr_print_status "$mr" "$threads" + + assert_output --partial " + 🏷 [Testing] [My Team] (↣ main) + + 👍 2 👎 0 Resolved threads: 2/2 Can be merged: ✔" + + # ------------------------------------------------------------------------------------------------------------------ + + mr='{ + "title": "Feature/XY-1234 Lorem Ipsum", "web_url":"https://myapp.gitlab.com/my/project/merge_requests/6", + "labels":["Accepted","My Team"], "target_branch": "main", "upvotes": 2, "downvotes": 0, "state":"merged" + }' + threads= + + run mr_print_status "$mr" "$threads" + + assert_output --partial " + 🏷 [Accepted] [My Team] (↣ main) + + 👍 2 👎 0 Merged" +} + @test "Searches MRs across projects to build menu" { load "test_helper/gitlab-mock-menu.bash" From 199cd2b9b671d5572b18d0d90aa8d3097ba14f8e Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 12 Jan 2023 21:16:06 +0100 Subject: [PATCH 19/88] Add pipeline status in status indicators --- git-mr | 101 +++++++++++++++++++++++++++++++++++++++++------ test/git-mr.bats | 53 +++++++++++++++++-------- 2 files changed, 126 insertions(+), 28 deletions(-) diff --git a/git-mr b/git-mr index 7109171..2748e65 100755 --- a/git-mr +++ b/git-mr @@ -224,6 +224,16 @@ function echo_debug colorize "$1\n" "gray" >&2 } +function echo_spacer +{ + local count=$1 + local char=${2:-" "} + + for ((i=1; i <= count; i++)); do + echo -n "$char" + done +} + function confirm { local question=$1 @@ -681,6 +691,20 @@ function gitlab_extract_merge_status echo "$mr_detail" | jq -r '.merge_status' } +function gitlab_extract_pipeline_status +{ + local mr_detail=$1 + + echo "$mr_detail" | jq -r '.head_pipeline.status' +} + +function gitlab_extract_pipeline_url +{ + local mr_detail=$1 + + echo "$mr_detail" | jq -r '.head_pipeline.web_url' +} + function gitlab_extract_target_branch { local mr_detail=$1 @@ -1074,7 +1098,7 @@ function mr_print_status local labels_display; labels_display=$(mr_format_labels "$labels") local labels_count; labels_count=$(echo $labels | sed 's/[^,]//g' | wc -m) - local labels_str_len=$(( ${#labels} + $(($labels_count*2)) + 3 )) + local labels_str_len=$(( ${#labels} + $(($labels_count*2)) + 4 )) # 2 spaces + 2 for larger icon # Votes @@ -1118,6 +1142,28 @@ function mr_print_status then merge_status_icon="$(colorize "\U00002714" "lightgreen" "bold")"; # heavy check mark else merge_status_icon="$(colorize "\U0000274C" "lightred" "bold")"; fi # cross mark + # Pipeline status + local pipeline_status; pipeline_status="$(gitlab_extract_pipeline_status "$merge_request")" + local pipeline_url; pipeline_url="$(gitlab_extract_pipeline_url "$merge_request")" + local pipeline_icon + case "$pipeline_status" in + created|waiting_for_resource|preparing|pending|running) + pipeline_icon="$(colorize "⏱" "lightgray")" ;; + success) pipeline_icon="$(colorize "✔" "lightgreen" "bold")" ;; + failed) pipeline_icon="$(colorize "❌" "lightred" "bold")" ;; + canceled|skipped) pipeline_icon="$(colorize "➖" "lightgray")" ;; + manual) pipeline_icon="$(colorize "🔧" "lightgray")" ;; + scheduled) pipeline_icon="$(colorize "⏰" "lightgray")" ;; + null) pipeline_icon= ;; + *) pipeline_icon="$(colorize "?" "lightgray")" ;; + esac + local ci_str= + local ci_str_len=0 + if [ -n "$pipeline_icon" ]; then + ci_str="CI: $pipeline_icon" + ci_str_len=10 # 5 chars + 4 spaces + 1 for larger icon + fi + # Merge target local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") @@ -1128,31 +1174,64 @@ function mr_print_status local target_str_len=$(( ${#current_target} + 4 )) - # Spacer for right alignment of target branch - local display_width=73 - local labels_target_spacer=" " - local left_chars=$(( $display_width - $labels_str_len - $target_str_len )) - if [ "$left_chars" -gt 0 ]; then - labels_target_spacer=$(eval $(echo printf '" %0.s"' {1..${left_chars}})) + # Draft status + local draft_str= + local draft_str_len=0 + if gitlab_title_is_draft "$title"; then + draft_str="🚧 Draft" + draft_str_len=12 # 7 chars + 4 spaces + 1 for larger icon + fi + + # Spacers for CI & target branch indicators + # Spacers for draft & target branch indicators + local display_width=76 # not counting 3 leading spaces + local spacer_chars=$(( display_width - labels_str_len - target_str_len - draft_str_len )) + local spacer_chars_l=0 + local spacer_chars_r=0 + + if [[ $spacer_chars -gt 0 ]]; then + spacer_chars_l=$(( 43 - labels_str_len )) # 42: roughly at the same level as CI indicator + spacer_chars_r=$(( spacer_chars - spacer_chars_l )) + if [[ $spacer_chars_r -lt 0 ]]; then + spacer_chars_l=$(( spacer_chars_l + spacer_chars_r )) + spacer_chars_r=0 + fi fi # Display echo + + # 1st row ------------------------------------------------------------------ + # Labels echo -en " \U0001F3F7 ${labels_display}" - echo -en "$labels_target_spacer" + echo_spacer $spacer_chars_l + # Draft status + if [[ -n $draft_str ]]; then + echo -en " $(colorize "$draft_str" "orange") " + else + echo_spacer $(( 2 - spacer_chars_l - spacer_chars_r )) + fi + echo_spacer $spacer_chars_r + # Target echo -e "${target_display}\n" + + # 2nd row ------------------------------------------------------------------ + # Votes echo -en " \U0001F44D ${upvotes}" echo -en " \U0001F44E ${downvotes}" + # Threads if [ "$thread_count" -gt 0 ]; then echo -n " Resolved threads: ${threads_display}" else echo -n " " fi - if gitlab_title_is_draft "$title"; then - echo -en " Draft: $(colorize "yes" "orange")" + # Pipeline + if [ -n "$ci_str" ]; then + echo -en " $(terminal_link "$pipeline_url" "$ci_str") " else - echo -en " " + echo -n " " fi + # Merge status if [ "$merge_status" != "merged" ]; then echo -en " Can be merged: ${merge_status_icon}" else diff --git a/test/git-mr.bats b/test/git-mr.bats index 4d5b626..e21e2e1 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -244,6 +244,20 @@ setup() { assert_output "Some%20%27string%27%26%22stuff%22%20%28that%20needs%20%5Bto%5D%20be%29%20encoded%21" } +@test "Outputs spacers" { + run echo_spacer 3 + assert_output " " + + run echo_spacer 5 '-' + assert_output "-----" + + run echo_spacer 0 'x' + assert_output "" + + run echo_spacer -1 'x' + assert_output "" +} + @test "Asks for confirmation" { if [ "$(confirm "Do you want to resolve draft status?" <<< "yes")" = "yes" ]; then confirmed=1; else confirmed=0; fi assert_equal $confirmed 1 @@ -329,21 +343,24 @@ setup() { } @test "Extracts MR info from detail" { - mr_summary='{ + mr_detail='{ "title":"MR title", "description":"MR description", "merge_status":"can_be_merged", "target_branch":"main", - "labels":["aaa","bbb","ccc"] + "labels":["aaa","bbb","ccc"], + "head_pipeline": {"status":"success", "web_url":"https://example.net/ci"} }' - assert_equal "$(gitlab_extract_title "$mr_summary")" "MR title" - assert_equal "$(gitlab_extract_description "$mr_summary")" "MR description" - assert_equal "$(gitlab_extract_merge_status "$mr_summary")" 'can_be_merged' - assert_equal "$(gitlab_extract_target_branch "$mr_summary")" 'main' - assert_equal "$(gitlab_extract_labels "$mr_summary")" 'aaa,bbb,ccc' + assert_equal "$(gitlab_extract_title "$mr_detail")" "MR title" + assert_equal "$(gitlab_extract_description "$mr_detail")" "MR description" + assert_equal "$(gitlab_extract_merge_status "$mr_detail")" 'can_be_merged' + assert_equal "$(gitlab_extract_target_branch "$mr_detail")" 'main' + assert_equal "$(gitlab_extract_labels "$mr_detail")" 'aaa,bbb,ccc' + assert_equal "$(gitlab_extract_pipeline_status "$mr_detail")" 'success' + assert_equal "$(gitlab_extract_pipeline_url "$mr_detail")" 'https://example.net/ci' - mr_summary='{"title":"MR title","state":"merged"}' - assert_equal "$(gitlab_extract_merge_status "$mr_summary")" 'merged' + mr_detail='{"title":"MR title","state":"merged"}' + assert_equal "$(gitlab_extract_merge_status "$mr_detail")" 'merged' } @test "Extracts Gitlab project part from MR URL" { @@ -443,7 +460,8 @@ setup() { mr='{ "title": "Draft: Feature/XY-1234 Lorem Ipsum", "web_url":"https://myapp.gitlab.com/my/project/merge_requests/6", - "labels":["Review","My Team"], "target_branch": "main", "upvotes": 1, "downvotes": 1, "merge_status": "cannot_be_merged" + "labels":["Review","My Team"], "target_branch": "main", "upvotes": 1, "downvotes": 1, "merge_status": "cannot_be_merged", + "head_pipeline": {"status":"failed", "web_url":"https://example.net/ci/1"} }' threads='1 unresolved:false note_id:1 2 unresolved:true note_id:2' @@ -451,15 +469,16 @@ setup() { run mr_print_status "$mr" "$threads" assert_output --partial " - 🏷 [Review] [My Team] (↣ main) + 🏷 [Review] [My Team] 🚧 Draft (↣ main) - 👍 1 👎 1 Resolved threads: 1/2 Draft: yes Can be merged: ❌" + 👍 1 👎 1 Resolved threads: 1/2 CI: ❌ Can be merged: ❌" # ------------------------------------------------------------------------------------------------------------------ mr='{ "title": "Feature/XY-1234 Lorem Ipsum", "web_url":"https://myapp.gitlab.com/my/project/merge_requests/6", - "labels":["Testing","My Team"], "target_branch": "main", "upvotes": 2, "downvotes": 0, "merge_status": "can_be_merged" + "labels":["Testing","My Team"], "target_branch": "main", "upvotes": 2, "downvotes": 0, "merge_status": "can_be_merged", + "head_pipeline": {"status":"success", "web_url":"https://example.net/ci/1"} }' threads='1 unresolved:false note_id:1 2 unresolved:false note_id:2' @@ -467,9 +486,9 @@ setup() { run mr_print_status "$mr" "$threads" assert_output --partial " - 🏷 [Testing] [My Team] (↣ main) + 🏷 [Testing] [My Team] (↣ main) - 👍 2 👎 0 Resolved threads: 2/2 Can be merged: ✔" + 👍 2 👎 0 Resolved threads: 2/2 CI: ✔ Can be merged: ✔" # ------------------------------------------------------------------------------------------------------------------ @@ -482,9 +501,9 @@ setup() { run mr_print_status "$mr" "$threads" assert_output --partial " - 🏷 [Accepted] [My Team] (↣ main) + 🏷 [Accepted] [My Team] (↣ main) - 👍 2 👎 0 Merged" + 👍 2 👎 0 Merged" } @test "Searches MRs across projects to build menu" { From 54255167882bb9b0b7f36e28c1d1e4a14b609668 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 12 Jan 2023 22:57:55 +0100 Subject: [PATCH 20/88] Show "undrafted" merge request title --- git-mr | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/git-mr b/git-mr index 2748e65..8ddd8eb 100755 --- a/git-mr +++ b/git-mr @@ -874,7 +874,7 @@ function gitlab_undraft echo echo "-------------------------------------------------------------------" - echo "$mr_title" + gitlab_title_undraft "$mr_title" echo "-------------------------------------------------------------------" echo mr_actions "$source_branch" "$mr_summary" "$merge_request" @@ -1273,7 +1273,7 @@ function mr_update_labels # Print merge request status summary echo echo "-------------------------------------------------------------------" - echo "$mr_title" + gitlab_title_undraft "$mr_title" echo "-------------------------------------------------------------------" echo mr_actions "$source_branch" "$mr_summary" "$merge_request" @@ -1665,7 +1665,7 @@ function mr_status # Print merge request title & status echo echo "-------------------------------------------------------------------" - echo "$mr_title" + gitlab_title_undraft "$mr_title" echo "-------------------------------------------------------------------" echo mr_actions "$source_branch" "$mr_summary" "$merge_request" @@ -1758,7 +1758,7 @@ function mr_update # Print updated merge request description echo echo "-------------------------------------------------------------------" - echo "$mr_title" + gitlab_title_undraft "$mr_title" echo "-------------------------------------------------------------------" echo "$new_description_display" if [ "$new_commit_count" -gt 0 ]; then @@ -1859,7 +1859,7 @@ function mr_merge echo echo "-------------------------------------------------------------------" - echo "$title" + gitlab_title_undraft "$title" echo "-------------------------------------------------------------------" echo mr_actions "$source_branch" "$mr_summary" "$merge_request" From 0d476ab2e5052e6b9d719be9ed08e306e1909764 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 13 Jan 2023 19:37:17 +0100 Subject: [PATCH 21/88] Fix Jira transitions --- git-mr | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/git-mr b/git-mr index 8ddd8eb..5cd5df8 100755 --- a/git-mr +++ b/git-mr @@ -443,6 +443,7 @@ function jira_transition jira_request "issue/${issue_code}/transitions" "POST" "$request_data" || exit $? } + ################################################################################ # Gitlab functions @@ -1569,6 +1570,7 @@ function mr_menu_colorize done < <(echo "$mr_description") } + ################################################################################ # Merge request top-level functions @@ -1979,60 +1981,63 @@ function mr_menu function mr_ip { - [ ! -z "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" - [ ! -z "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" - [ ! -z "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" + [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" + [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" + [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" local source_branch=${1:-$(git_current_branch)} + local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} mr_update_labels "${source_branch}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS},${GITLAB_CR_LABELS}" "" - if [ ! -z "$ISSUE_CODE" ] \ - && [ ! -z "$JIRA_IP_ID" ] \ + if [ -n "$issue_code" ] \ + && [ -n "$JIRA_IP_ID" ] \ && [ "$(confirm "Do you want to update the Jira ticket status to \"In Progress\"?")" = "yes" ]; then echo -n "Updating Jira ticket status... " - jira_transition "$ISSUE_CODE" "$JIRA_IP_ID" && echo -e "OK\n" + jira_transition "$issue_code" "$JIRA_IP_ID" && echo -e "OK\n" fi if [ -z "$JIRA_IP_ID" ]; then echo_error "Set JIRA_IP_ID to be able to update Jira status\n"; fi } function mr_cr { - [ ! -z "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" - [ ! -z "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" - [ ! -z "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" + [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" + [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" + [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" local source_branch=${1:-$(git_current_branch)} + local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} mr_update_labels "${source_branch}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_CR_LABELS}" - if [ ! -z "$ISSUE_CODE" ] \ - && [ ! -z "$JIRA_CR_ID" ] \ + if [ -n "$issue_code" ] \ + && [ -n "$JIRA_CR_ID" ] \ && [ "$(confirm "Do you want to update the Jira ticket status to \"Code Review\"?")" = "yes" ]; then echo -n "Updating Jira ticket status... " - jira_transition "$ISSUE_CODE" "$JIRA_CR_ID" && echo -e "OK\n" + jira_transition "$issue_code" "$JIRA_CR_ID" && echo -e "OK\n" fi if [ -z "$JIRA_CR_ID" ]; then echo_error "Set JIRA_CR_ID to be able to update Jira status\n"; fi } function mr_qa { - [ ! -z "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" - [ ! -z "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" - [ ! -z "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" + [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" + [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" + [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" local source_branch=${1:-$(git_current_branch)} + local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} mr_update_labels "${source_branch}" "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS}" "${GITLAB_QA_LABELS}" - if [ ! -z "$ISSUE_CODE" ] \ - && [ ! -z "$JIRA_QA_ID" ] \ + if [ -n "$issue_code" ] \ + && [ -n "$JIRA_QA_ID" ] \ && [ "$(confirm "Do you want to update the Jira ticket status to \"Quality Assurance\"?")" = "yes" ]; then echo -n "Updating Jira ticket status... " - jira_transition "$ISSUE_CODE" "$JIRA_QA_ID" && echo -e "OK\n" + jira_transition "$issue_code" "$JIRA_QA_ID" && echo -e "OK\n" fi if [ -z "$JIRA_QA_ID" ]; then echo_error "Set JIRA_QA_ID to be able to update Jira status\n"; fi } From 728d88abdd5e7f33d3e9ae633788fa5320b450f1 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 13 Jan 2023 19:41:49 +0100 Subject: [PATCH 22/88] Suppress duplicate errors - issue code detection - Gitlab env --- git-mr | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/git-mr b/git-mr index 5cd5df8..2d38da1 100755 --- a/git-mr +++ b/git-mr @@ -455,8 +455,6 @@ function gitlab_check_env function gitlab_project_url { - gitlab_check_env - local remote_url local project_url @@ -907,7 +905,8 @@ function gitlab_undraft function guess_issue_code { - [ ! -z "$JIRA_CODE_PATTERN" ] || exit_error 0 "JIRA_CODE_PATTERN not set - unable to guess issue code" + [ -n "$git_mr_unguessable_issue_code" ] && return + [ -n "$JIRA_CODE_PATTERN" ] || exit_error 0 "JIRA_CODE_PATTERN not set - unable to guess issue code" local branch=${1:-$(git_current_branch)} @@ -1581,6 +1580,7 @@ function mr_print git_check_branches "$source_branch" "$target_branch" local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} + [ -z "$issue_code" ] && git_mr_unguessable_issue_code=1 cat << EOF @@ -1600,6 +1600,9 @@ function mr_open local target_branch=${GIT_MR_TARGET:-$(git_base_branch "$source_branch")} git_check_branches "$source_branch" "$target_branch" + local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} + [ -z "$issue_code" ] && git_mr_unguessable_issue_code=1 + local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") @@ -1612,9 +1615,7 @@ function mr_open return fi - ISSUE_CODE=${1:-$(guess_issue_code)} - - local description; description=$(mr_description "$source_branch" "$target_branch") + local description; description=$(mr_description "$source_branch" "$target_branch" "$issue_code") cat << EOF From 3be9d9276ee4723d01b96ee212a9d4eb7404a8fb Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 13 Jan 2023 19:52:33 +0100 Subject: [PATCH 23/88] Check remote branch existence before suggesting merge request creation Check remote branch existence before suggesting merge request creation --- git-mr | 60 ++++++++++++++++++++++++++++++++++++++++++++---- test/git-mr.bats | 32 ++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 4 deletions(-) diff --git a/git-mr b/git-mr index 2d38da1..bf695a4 100755 --- a/git-mr +++ b/git-mr @@ -30,10 +30,7 @@ function git_base_branch # First possible merge base if ! git show-ref -q --heads "$base_branch"; then - local remote; remote=$(git remote | head -n1) - local remote_default; remote_default=$(git symbolic-ref "refs/remotes/${remote}/HEAD" -- 2>/dev/null) - local default; default=${remote_default#"refs/remotes/${remote}/"} - base_branch=$(git show-branch --merge-base "$branch" "$default" | head -n1) + base_branch=$(git show-branch --merge-base "$branch" "$(git_default_branch)" | head -n1) fi echo_debug "Base branch: $base_branch" @@ -41,6 +38,40 @@ function git_base_branch echo "$base_branch" } +function git_remote +{ + git remote | head -n1 +} + +function git_branch_exists +{ + local branch=$1 + + git show-ref -q --heads "$branch" +} + +function git_default_branch +{ + local remote; remote=$(git_remote) + local default; default=$(git symbolic-ref "refs/remotes/${remote}/HEAD" -- 2>/dev/null) + + if [ -n "$default" ]; then + echo "${default#"refs/remotes/${remote}/"}" + return + fi + + if git_branch_exists "main"; then echo "main"; return; fi + if git_branch_exists "master"; then echo "master"; return; fi +} + +function git_remote_branch_exists +{ + local branch=$1 + local remote=${2:-$(git_remote)} + + [ -n "$(git ls-remote --heads "$remote" "$branch")" ] +} + function git_check_branches { local source_branch="$1" @@ -1018,7 +1049,18 @@ function mr_actions return fi + if ! git_remote_branch_exists "$source_branch"; then + echo_error "Branch '$source_branch' does not exist on remote" + return + fi + local target_branch=${GIT_MR_TARGET:-$(git_base_branch "$source_branch")} + + if ! git_remote_branch_exists "$target_branch"; then + echo_error "Target branch '$target_branch' does not exist on remote" + return + fi + local new_mr_url new_mr_url=$(gitlab_new_merge_request_url "${source_branch}" "${target_branch}") @@ -1626,6 +1668,16 @@ ${description} EOF + if ! git_remote_branch_exists "$source_branch"; then + echo_error "Branch '$source_branch' does not exist on remote" + return + fi + + if ! git_remote_branch_exists "$target_branch"; then + echo_error "Target branch '$target_branch' does not exist on remote" + return + fi + local new_mr_url; new_mr_url=$(gitlab_new_merge_request_url "${source_branch}" "${target_branch}") if [ ! -z "${new_mr_url}" ]; then diff --git a/test/git-mr.bats b/test/git-mr.bats index e21e2e1..3d41e64 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -36,6 +36,7 @@ setup_file() { git switch -c main git commit --allow-empty -m "Main 1" git commit --allow-empty -m "Main 2" + git branch feature/local git commit --allow-empty -m "Main 3" git switch -c epic/big-feature main @@ -131,6 +132,37 @@ setup() { assert_failure } +@test "Determines remote name" { + run git_remote + assert_output origin +} + +@test "Checks branch existence" { + run git_branch_exists feature/base + assert_success + + run git_branch_exists whatever + assert_failure +} + +@test "Determines default branch" { + run git_default_branch + assert_output "main" +} + +@test "Checks remote branch existence" { + run git_remote_branch_exists feature/base + assert_success + + run git_branch_exists feature/local + assert_success + run git_remote_branch_exists feature/local + assert_failure + + run git_remote_branch_exists feature/whatever + assert_failure +} + @test "Checks branch coherence" { run git_check_branches feature/base main assert_success From 5803c93e85faca4d6e2c181c58f7e3a944711f59 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 14 Jan 2023 20:49:32 +0100 Subject: [PATCH 24/88] Check source branch on mr status --- git-mr | 1 + 1 file changed, 1 insertion(+) diff --git a/git-mr b/git-mr index bf695a4..83f3111 100755 --- a/git-mr +++ b/git-mr @@ -1698,6 +1698,7 @@ function mr_status gitlab_check_env local source_branch=${1:-$(git_current_branch)} + git_check_branches "$source_branch" "-" # Search existing merge request From e9e98d53ba57342a24d96274562dffbf1ee77cce Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 13 Jan 2023 20:40:24 +0100 Subject: [PATCH 25/88] Fix GIT_MR_MENU_END constant Use historical value for compatibility (added dash was a blunder) --- git-mr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-mr b/git-mr index 83f3111..43ba083 100755 --- a/git-mr +++ b/git-mr @@ -2225,7 +2225,7 @@ GITLAB_DRAFT_PREFIXES=("WIP" "Draft") MD_BOLD=${MD_BOLD="**"} # Markdown bold MD_BR=${MD_BR=" "} # Markdown line break GIT_MR_MENU_START=${GIT_MR_MENU_START:-"## Menu"} -GIT_MR_MENU_END=${GIT_MR_MENU_END:-"---------------------------------------------------------------------------------"} +GIT_MR_MENU_END=${GIT_MR_MENU_END:-"--------------------------------------------------------------------------------"} ################################################################################ From 616f1c28f514691e44666ee51bb356c3718ac8bb Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 14 Jan 2023 20:35:16 +0100 Subject: [PATCH 26/88] Fix terminal links formatting --- git-mr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/git-mr b/git-mr index 43ba083..733b5a7 100755 --- a/git-mr +++ b/git-mr @@ -236,8 +236,8 @@ function terminal_link local href=$1 local text=$2 - if which tput > /dev/null 2>&1 && [ ! -z "$TERM" ] && [ "$(tput -T"$TERM" colors)" -ge 8 ]; then - printf "\e]8;;${href}\e\\${text}\e]8;;\e\\" + if which tput > /dev/null 2>&1 && [ -n "$TERM" ] && [ "$(tput -T"$TERM" colors)" -ge 8 ]; then + printf "\e]8;;%s\e\\%s\e]8;;\e\\" "$href" "$text" else echo -n "$text" fi From 1789c236f0061bd1c14b96847cd9e9a2cee1237a Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 13 Jan 2023 22:00:51 +0100 Subject: [PATCH 27/88] Refactor merge request summary extraction --- git-mr | 28 +++++------ test/git-mr.bats | 49 +++++++++++++++---- test/test_helper/gitlab-mock-mr-extended.bash | 4 +- test/test_helper/gitlab-mock-mr.bash | 4 +- 4 files changed, 57 insertions(+), 28 deletions(-) diff --git a/git-mr b/git-mr index 733b5a7..59d67d4 100755 --- a/git-mr +++ b/git-mr @@ -620,7 +620,7 @@ function gitlab_new_merge_request_url echo "$gitlab_mr_url" } -function gitlab_merge_requests_for_branch +function gitlab_merge_request_summary { gitlab_check_env @@ -633,7 +633,7 @@ function gitlab_merge_requests_for_branch return fi - echo "$result" + echo "$result" | jq '.[0]' } function gitlab_merge_requests_search @@ -688,13 +688,13 @@ function gitlab_merge_request function gitlab_extract_iid { local mr_summary=$1 - echo "$mr_summary" | jq -r '.[0].iid' + echo "$mr_summary" | jq -r '.iid' } function gitlab_extract_url { local mr_summary=$1 - echo "$mr_summary" | jq -r '.[0].web_url' + echo "$mr_summary" | jq -r '.web_url' } function gitlab_extract_title @@ -887,7 +887,7 @@ function gitlab_undraft # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") @@ -1037,7 +1037,7 @@ function mr_actions local mr_detail=${3} if [ -z "$mr_summary" ]; then - mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? + mr_summary=$(gitlab_merge_request_summary "$source_branch") || exit $? fi local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") @@ -1117,7 +1117,7 @@ function mr_show_status local mr_iid=$1 local merge_request; merge_request=${2:-$(gitlab_merge_request "$mr_iid")} - local mr_url; mr_url=$(echo "$merge_request" | jq -r '.web_url') + local mr_url; mr_url=$(gitlab_extract_url "$merge_request") local project_url; project_url=$(gitlab_extract_project_url "$mr_url") local threads; threads=${3:-$(gitlab_merge_request_threads "$project_url" "$mr_iid")} @@ -1132,7 +1132,7 @@ function mr_print_status [ -n "$merge_request" ] || exit_error 0 "merge_request not provided" - local mr_url; mr_url=$(echo "$merge_request" | jq -r '.web_url') + local mr_url; mr_url=$(gitlab_extract_url "$merge_request") local project_url; project_url=$(gitlab_extract_project_url "$mr_url") # Labels @@ -1296,7 +1296,7 @@ function mr_update_labels # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") @@ -1443,7 +1443,7 @@ function mr_menu_update local current_branch current_branch=$(git_current_branch) - local current_mr_summary; current_mr_summary=$(gitlab_merge_requests_for_branch "$current_branch") || exit $? + local current_mr_summary; current_mr_summary=$(gitlab_merge_request_summary "$current_branch") || exit $? local current_mr_iid; current_mr_iid=$(gitlab_extract_iid "$current_mr_summary") local current_mr_url; current_mr_url=$(gitlab_extract_url "$current_mr_summary") @@ -1645,7 +1645,7 @@ function mr_open local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} [ -z "$issue_code" ] && git_mr_unguessable_issue_code=1 - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") @@ -1702,7 +1702,7 @@ function mr_status # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") @@ -1736,7 +1736,7 @@ function mr_update # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") @@ -1895,7 +1895,7 @@ function mr_merge # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_requests_for_branch "$source_branch") || exit $? + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") || exit $? local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") local project_url; project_url=$(gitlab_extract_project_url "$mr_url") diff --git a/test/git-mr.bats b/test/git-mr.bats index 3d41e64..fc8fbed 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -364,17 +364,46 @@ setup() { ################################################################################ # Gitlab functions -@test "Extracts MR info from list" { - mr_summary='[{"iid":123,"web_url":"https://gitlab.com/mr/123"},{}]' +@test "Extracts MR info from merge request summary" { - run gitlab_extract_iid "$mr_summary" - assert_output 123 - - run gitlab_extract_url "$mr_summary" - assert_output "https://gitlab.com/mr/123" -} - -@test "Extracts MR info from detail" { + GITLAB_DOMAIN="example.com" + GITLAB_TOKEN="example" + function gitlab_project_request { + case "$1" in + "merge_requests?state=opened&view=simple&source_branch=feature/xy-1234-lorem-ipsum") + echo '[{ + "id": 1234, "iid": 123, "project_id": 12, + "title": "Draft: Feature/XY-1234 Lorem Ipsum", + "web_url": "https://gitlab.com/mr/123" + },{}]' + ;; + "merge_requests?state=opened&view=simple&source_branch=feature/nope") + echo '[]'; + ;; + *) return ;; + esac + } + + mr_summary=$(gitlab_merge_request_summary "feature/xy-1234-lorem-ipsum") + + run gitlab_extract_iid "$mr_summary"; assert_output 123 + run gitlab_extract_url "$mr_summary"; assert_output "https://gitlab.com/mr/123" + run gitlab_extract_title "$mr_summary"; assert_output "Draft: Feature/XY-1234 Lorem Ipsum" + + mr_summary=$(gitlab_merge_request_summary "feature/nope") + + run gitlab_extract_iid "$mr_summary"; assert_output '' + run gitlab_extract_url "$mr_summary"; assert_output '' + run gitlab_extract_title "$mr_summary"; assert_output '' + + mr_summary=$(gitlab_merge_request_summary "nope") + + run gitlab_extract_iid "$mr_summary"; assert_output '' + run gitlab_extract_url "$mr_summary"; assert_output '' + run gitlab_extract_title "$mr_summary"; assert_output '' +} + +@test "Extracts MR info from merge request detail" { mr_detail='{ "title":"MR title", "description":"MR description", diff --git a/test/test_helper/gitlab-mock-mr-extended.bash b/test/test_helper/gitlab-mock-mr-extended.bash index 619d834..38bf8d0 100644 --- a/test/test_helper/gitlab-mock-mr-extended.bash +++ b/test/test_helper/gitlab-mock-mr-extended.bash @@ -1,8 +1,8 @@ GITLAB_DOMAIN="example.com" GITLAB_TOKEN="example" -function gitlab_merge_requests_for_branch { - echo '[{"iid":1,"web_url":"https://example.com/some/project/-/merge_requests/1"}]' +function gitlab_merge_request_summary { + echo '{"iid":1,"web_url":"https://example.com/some/project/-/merge_requests/1"}' } function gitlab_merge_request { diff --git a/test/test_helper/gitlab-mock-mr.bash b/test/test_helper/gitlab-mock-mr.bash index e45d0c7..69c4acd 100644 --- a/test/test_helper/gitlab-mock-mr.bash +++ b/test/test_helper/gitlab-mock-mr.bash @@ -1,8 +1,8 @@ GITLAB_DOMAIN="example.com" GITLAB_TOKEN="example" -function gitlab_merge_requests_for_branch { - echo '[{"iid":1,"web_url":"https://example.com/some/project/-/merge_requests/1"}]' +function gitlab_merge_request_summary { + echo '{"iid":1,"web_url":"https://example.com/some/project/-/merge_requests/1"}' } function gitlab_merge_request { From 485d6dca966954e038528362de7eae65788707af Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 13 Jan 2023 20:23:26 +0100 Subject: [PATCH 28/88] MR menu output formatting adjustments - title bar - status - update menu updated count --- git-mr | 170 +++++++++++++++++++++++++++++++++-------------- test/git-mr.bats | 131 ++++++++++++++++++++++++++++++------ 2 files changed, 231 insertions(+), 70 deletions(-) diff --git a/git-mr b/git-mr index 59d67d4..262ad35 100755 --- a/git-mr +++ b/git-mr @@ -282,6 +282,13 @@ function confirm esac } +function clear_screen +{ + if which tput > /dev/null 2>&1 && [ -n "$TERM" ]; then + tput -x clear + fi +} + function jq_build { local key=${1} @@ -1394,17 +1401,29 @@ function mr_menu_contents echo "$GIT_MR_MENU_END" } -function mr_menu_status +function mr_menu_print_title { local issue_code=$1 local menu_items=$2 + local current_index=$3 + local search_url; search_url="https://${GITLAB_DOMAIN}/dashboard/merge_requests?scope=all&state=all&search=$(urlencode "$issue_code")&in=title&sort=created_asc" local mr_count; mr_count=$(echo "$menu_items" | wc -l) + echo "================================================================================" + [ -z "$current_index" ] && + echo " $(terminal_link "$search_url" "$issue_code") (${mr_count} merge request$([[ $mr_count -gt 1 ]] && echo 's'))" || + echo " $(terminal_link "$search_url" "$issue_code") (merge request ${current_index}/${mr_count})" + echo "================================================================================" +} + +function mr_menu_status +{ + local issue_code=$1 + local menu_items=$2 + echo - echo "-------------------------------------------------------------------" - echo "${issue_code} (${mr_count} merge request$([[ $mr_count -gt 1 ]] && echo 's'))" - echo "-------------------------------------------------------------------" + mr_menu_print_title "$issue_code" "$menu_items" echo while IFS=$'\n' read -r menu_item; do @@ -1429,9 +1448,13 @@ function mr_menu_status function mr_menu_show { - local menu_items=$1 + local issue_code=$1 + local menu_items=$2 echo + mr_menu_print_title "$issue_code" "$menu_items" + echo + mr_menu_contents "$menu_items" } @@ -1439,35 +1462,29 @@ function mr_menu_update { local menu_items=$1 - # Look for existing merge request - local current_branch - current_branch=$(git_current_branch) + local current_branch; current_branch=$(git_current_branch) - local current_mr_summary; current_mr_summary=$(gitlab_merge_request_summary "$current_branch") || exit $? - local current_mr_iid; current_mr_iid=$(gitlab_extract_iid "$current_mr_summary") - local current_mr_url; current_mr_url=$(gitlab_extract_url "$current_mr_summary") - - if [ -z "${current_mr_iid}" ] || [ -z "${current_mr_url}" ]; then + # Search existing merge request + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$current_branch") + if [ -z "$mr_summary" ]; then echo_error "Merge request not found" echo mr_menu_contents "$menu_items" return fi + local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + # Load existing merge request details - local merge_request; merge_request=$(gitlab_merge_request "$current_mr_iid") + local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") local mr_description; mr_description=$(gitlab_extract_description "$merge_request") + local mr_title; mr_title=$(gitlab_extract_title "$merge_request") - local mr_menu_content; - mr_menu_content=$(mr_menu_contents "$menu_items" "$current_mr_url") - - local updated_description; - updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" + local mr_menu_content; mr_menu_content=$(mr_menu_contents "$menu_items" "$mr_url") + local updated_description; updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" - echo - mr_menu_colorize "$updated_description" "$current_mr_url" - echo - echo '--------------------------------------------------------------------------------' + mr_menu_print_description "$updated_description" "$mr_url" "$mr_title" local mr_update_data='{}' if [ "$(confirm "Do you want to update the menu in the merge request description?")" = "yes" ]; then @@ -1476,17 +1493,20 @@ function mr_menu_update if [ "$mr_update_data" != "{}" ]; then echo -n "Updating merge request..." local result - result=$(gitlab_merge_request_update "$current_mr_iid" "$mr_update_data") + result=$(gitlab_merge_request_update "$mr_iid" "$mr_update_data") if [ ! -z "$result" ]; then echo -e "OK\n"; fi fi } function mr_menu_update_all { - local menu_items=$1 + local issue_code=$1 + local menu_items=$2 local mr_iid + local mr_title local mr_url + local project_name local project_url local merge_request local mr_description @@ -1498,10 +1518,13 @@ function mr_menu_update_all # Use array instead of looping over variable content with `read` to leave standard input open for `confirm` readarray menu_array < <(echo "$menu_items") + local i=1 updated_count=0 for menu_item in "${menu_array[@]}"; do mr_iid=$(echo "$menu_item" | jq -r '.iid') mr_url=$(echo "$menu_item" | jq -r '.web_url') + mr_title=$(echo "$menu_item" | jq -r '.title') + project_name=$(echo "$menu_item" | jq -r '.project_name') # Beware, `gitlab_merge_request` and `gitlab_merge_request_update` use 'gitlab_project_request', which is project-specific # Here, we can expect other target projects here. @@ -1516,30 +1539,48 @@ function mr_menu_update_all mr_menu_content=$(mr_menu_contents "$menu_items" "$mr_url") updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" - echo - mr_menu_colorize "$updated_description" "$mr_url" - echo - echo '--------------------------------------------------------------------------------' - echo - echo "Merge request:" - echo - echo " ${mr_url}" - echo + clear_screen + mr_menu_print_title "$issue_code" "$menu_items" "$i" + mr_menu_print_description "$updated_description" "$mr_url" "$mr_title" "$project_name" mr_update_data='{}' - if [ "$(confirm "Do you want to update the menu in the merge request description?")" = "yes" ]; then mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? fi - if [ "$mr_update_data" != "{}" ]; then echo -n "Updating merge request..." # Do NOT use `gitlab_merge_request_update` result=$(gitlab_request "projects/${project_url}/merge_requests/${mr_iid}" "PUT" "${mr_update_data}") - if [ ! -z "$result" ]; then echo -e "OK\n"; fi + if [ -n "$result" ]; then + ((updated_count += 1)) + echo -e "OK\n" + fi + else + echo fi + ((i += 1)) done - echo + + [[ $updated_count -gt 0 ]] && + echo "${updated_count} merge request$([[ $updated_count -gt 1 ]] && echo 's') updated" +} + +function mr_menu_start_line +{ + local mr_description=$1 + + echo "$mr_description" | grep -n "$GIT_MR_MENU_START" | head -n1 | cut -d: -f1 +} + +function mr_menu_end_line +{ + local mr_description=$1 + local menu_start=${2:-1} + + local menu_end + menu_end=$(echo "$mr_description" | tail -n +"$(( menu_start + 1 ))" | grep -n -- "$GIT_MR_MENU_END" | cut -d: -f1 | head -n 1) + + echo $(( menu_start + menu_end )) } function mr_menu_replace_description @@ -1547,8 +1588,8 @@ function mr_menu_replace_description local mr_description=$1 local menu_content=$2 - local menu_start; menu_start=$(echo "$mr_description" | grep -n "$GIT_MR_MENU_START" | head -n1 | cut -f1 -d:) - local menu_end; menu_end=$(echo "$mr_description" | grep -n -- "$GIT_MR_MENU_END" | cut -f1 -d: | head -n 1) + local menu_start; menu_start=$(mr_menu_start_line "$mr_description") + local menu_end; menu_end=$(mr_menu_end_line "$mr_description" "$menu_start") local has_menu=0 if [ -n "$menu_start" ] && [ -n "$menu_end" ] && [ "$menu_start" -gt "0" ] && [ "$menu_end" -gt "$menu_start" ]; then @@ -1590,9 +1631,8 @@ function mr_menu_colorize { local mr_description=$1 local current_mr_url=$2 - - local menu_start; menu_start=$(echo "$mr_description" | grep -n "$GIT_MR_MENU_START" | head -n1 | cut -f1 -d:) - local menu_end; menu_end=$(echo "$mr_description" | grep -n -- "$GIT_MR_MENU_END" | cut -f1 -d: | head -n 1) + local menu_start=$3 + local menu_end=$4 # Iterate over description lines and colorize menu lines i=1 @@ -1611,6 +1651,37 @@ function mr_menu_colorize done < <(echo "$mr_description") } +function mr_menu_print_description +{ + local mr_description=$1 + local mr_url=$2 + local mr_title=$3 + local project_name=$4 + + local menu_start; menu_start=$(mr_menu_start_line "$mr_description") + local menu_end; menu_end=$(mr_menu_end_line "$mr_description" "$menu_start") + + echo + echo "--------------------------------------------------------------------------------" + echo -n " " + [[ -n $project_name ]] && echo -n "$(colorize "$project_name" "bold"): " + echo "$(terminal_link "$mr_url" "$(gitlab_title_undraft "$mr_title")")" + echo "--------------------------------------------------------------------------------" + echo + + mr_menu_colorize "$mr_description" "$mr_url" "$menu_start" "$menu_end" | + head -n$((menu_end + GIT_MR_MENU_UPDATE_CONTEXT_LINES)) # truncate description after menu + + local desc_len; desc_len=$(echo "$mr_description" | wc -l) + if [[ $((desc_len - menu_end)) -gt $GIT_MR_MENU_UPDATE_CONTEXT_LINES ]]; then + echo + echo "[...]" + fi + + echo + echo "--------------------------------------------------------------------------------" +} + ################################################################################ # Merge request top-level functions @@ -2021,14 +2092,10 @@ function mr_menu fi case "$git_mr_menu_mode" in - show) mr_menu_show "$menu_items" ;; - update) - if [ "$git_mr_menu_update_all" = "1" ]; then - mr_menu_update_all "$menu_items" - else - mr_menu_update "$menu_items" - fi - ;; + show) mr_menu_show "$issue_code" "$menu_items" ;; + update) if [ "$git_mr_menu_update_all" = "1" ] + then mr_menu_update_all "$issue_code" "$menu_items" + else mr_menu_update "$menu_items"; fi ;; status) mr_menu_status "$issue_code" "$menu_items" ;; esac } @@ -2226,6 +2293,7 @@ MD_BOLD=${MD_BOLD="**"} # Markdown bold MD_BR=${MD_BR=" "} # Markdown line break GIT_MR_MENU_START=${GIT_MR_MENU_START:-"## Menu"} GIT_MR_MENU_END=${GIT_MR_MENU_END:-"--------------------------------------------------------------------------------"} +GIT_MR_MENU_UPDATE_CONTEXT_LINES=${GIT_MR_MENU_UPDATE_CONTEXT_LINES:-15} ################################################################################ diff --git a/test/git-mr.bats b/test/git-mr.bats index fc8fbed..5885e38 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -567,25 +567,6 @@ setup() { 👍 2 👎 0 Merged" } -@test "Searches MRs across projects to build menu" { - load "test_helper/gitlab-mock-menu.bash" - - run mr_menu - - assert_output "$(cat <<- EOF - - ## Menu - - * Project C: [MR 31 title](https://example.net/31) - * Project A: [MR 11 title](https://example.net/11) - * Project B: [MR 21 title](https://example.net/21) - * Project D: [MR 41 title](https://example.net/21) - - --------------------------------------------------------------------------------- - EOF - )" -} - @test "Updates MR description with new commits in new section" { load "test_helper/gitlab-mock-mr.bash" @@ -713,6 +694,118 @@ setup() { assert_output "toto,tata,plop,pouet" } +################################################################################ +# Merge request menu utility functions + +@test "Searches MRs across projects to build menu" { + load "test_helper/gitlab-mock-menu.bash" + + TERM=xterm-mono # disable colors + + run mr_menu + + assert_output "$(cat <<- EOF + + ================================================================================ + AB-123 (4 merge requests) + ================================================================================ + + ## Menu + + * Project C: [MR 31 title](https://example.net/31) + * Project A: [MR 11 title](https://example.net/11) + * Project B: [MR 21 title](https://example.net/21) + * Project D: [MR 41 title](https://example.net/21) + + -------------------------------------------------------------------------------- + EOF + )" +} + +@test "Replaces menu in MR descriptions" { + + mr_description="# [AB-123 Test feature](https://example.net/AB-123) + +This is an example. + +-------------------------------------------------------------------------------- + +## Menu + +* Old Menu item 1 + +-------------------------------------------------------------------------------- + +## Commits + +* Lorem +* Ipsum + +--------------------------------------------------------------------------------" + + menu_content="## Menu + +* New Menu item 1 +* New Menu item 2 + +--------------------------------------------------------------------------------" + + run mr_menu_replace_description "$mr_description" "$menu_content" + assert_output "# [AB-123 Test feature](https://example.net/AB-123) + +This is an example. + +-------------------------------------------------------------------------------- + +## Menu + +* New Menu item 1 +* New Menu item 2 + +-------------------------------------------------------------------------------- + +## Commits + +* Lorem +* Ipsum + +--------------------------------------------------------------------------------" + + + mr_description="# [AB-123 Test feature](https://example.net/AB-123) + +This is an example without menu. + +## Commits + +* Lorem +* Ipsum" + + menu_content="## Menu + +* New Menu item 1 +* New Menu item 2 + +--------------------------------------------------------------------------------" + + run mr_menu_replace_description "$mr_description" "$menu_content" + assert_output "# [AB-123 Test feature](https://example.net/AB-123) + +## Menu + +* New Menu item 1 +* New Menu item 2 + +-------------------------------------------------------------------------------- + +This is an example without menu. + +## Commits + +* Lorem +* Ipsum" +} + ################################################################################ # Merge request top-level functions From cc8b31a1c3faab2073dfa7659345d3dfdcc5e50d Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 14 Jan 2023 01:21:55 +0100 Subject: [PATCH 29/88] Add read-only mode mainly for dev purposes --- git-mr | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/git-mr b/git-mr index 262ad35..aeaf17d 100755 --- a/git-mr +++ b/git-mr @@ -372,6 +372,15 @@ function open_in_browser echo } +function git_mr_readonly +{ + [ -z "$GIT_MR_READONLY" ] && return 1 + + [ -n "$1" ] && echo "$(colorize "🚫 Read-only 🚫" "gray")" >&2 + + return 0 +} + ################################################################################ # Markdown formatting @@ -450,6 +459,8 @@ function jira_request echo_debug "Jira - ${request_verb} ${request_url} ${request_data}" + [ "$request_verb" != "GET" ] && git_mr_readonly && return 0 + curl -Ss \ -X "${request_verb}" \ -H "Authorization: Basic ${auth_token}" \ @@ -540,6 +551,8 @@ function gitlab_project_request echo_debug "GitLab - ${request_verb} ${gitlab_project_url}/${request_url} ${request_data}" + [ "$request_verb" != "GET" ] && git_mr_readonly && echo '{}' && return 0 + result=$(curl -Ss \ -X "${request_verb}" \ -H "Private-Token: ${GITLAB_TOKEN}" \ @@ -565,6 +578,8 @@ function gitlab_request echo_debug "GitLab - ${request_verb} ${gitlab_base_url}/${request_url} ${request_data}" + [ "$request_verb" != "GET" ] && git_mr_readonly && echo '{}' && return 0 + result=$(curl -Ss \ -X "${request_verb}" \ -H "Private-Token: ${GITLAB_TOKEN}" \ @@ -888,6 +903,7 @@ function gitlab_title_undraft function gitlab_undraft { + git_mr_readonly show gitlab_check_env local source_branch=${1:-$(git_current_branch)} @@ -1460,6 +1476,8 @@ function mr_menu_show function mr_menu_update { + git_mr_readonly show + local menu_items=$1 local current_branch; current_branch=$(git_current_branch) @@ -1500,6 +1518,8 @@ function mr_menu_update function mr_menu_update_all { + git_mr_readonly show + local issue_code=$1 local menu_items=$2 @@ -1800,6 +1820,7 @@ function mr_status function mr_update { + git_mr_readonly show gitlab_check_env local source_branch=${1:-$(git_current_branch)} @@ -1960,6 +1981,7 @@ function mr_update function mr_merge { + git_mr_readonly show gitlab_check_env local source_branch=${1:-$(git_current_branch)} @@ -2042,7 +2064,8 @@ function mr_merge if [ "$(confirm "Do you want to checkout '$current_target' and pull changes?")" != "yes" ]; then echo; return; fi echo "$(colorize "git checkout $current_target && git pull --rebase" "lightgray")" - git checkout "$current_target" && git pull --rebase + git_mr_readonly || + (git checkout "$current_target" && git pull --rebase) echo # delete local branch @@ -2050,7 +2073,8 @@ function mr_merge if [ "$(confirm "Do you want to delete local branch '$source_branch'?")" != "yes" ]; then echo; return; fi echo "$(colorize "git branch -d $source_branch" "lightgray")" - git branch -d "$source_branch" + git_mr_readonly || + git branch -d "$source_branch" echo } @@ -2102,6 +2126,8 @@ function mr_menu function mr_ip { + git_mr_readonly show + [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" @@ -2123,6 +2149,8 @@ function mr_ip function mr_cr { + git_mr_readonly show + [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" @@ -2144,6 +2172,8 @@ function mr_cr function mr_qa { + git_mr_readonly show + [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" @@ -2165,6 +2195,8 @@ function mr_qa function mr_hook { + git_mr_readonly show + local git_dir; git_dir=$(git rev-parse --git-dir) local git_mr_dir; git_mr_dir="$(dirname "${BASH_SOURCE[0]}")" @@ -2173,7 +2205,8 @@ function mr_hook find "${git_mr_dir}/hooks" -type f -print0 | while read -d $'\0' hook; do local hook_name; hook_name="$(basename $hook)" echo "Linking hook: ${hook_name}" - ln -sf "$hook" "${git_dir}/hooks/${hook_name}" + git_mr_readonly || + ln -sf "$hook" "${git_dir}/hooks/${hook_name}" done } From 435db780734c0fd62906fb974529e2eb38c330ba Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 14 Jan 2023 01:44:41 +0100 Subject: [PATCH 30/88] Misc. bash stuff & formatting --- git-mr | 592 ++++++++---------- test/git-mr.bats | 8 +- test/test_helper/gitlab-mock-menu.bash | 4 +- test/test_helper/gitlab-mock-mr-extended.bash | 6 +- test/test_helper/gitlab-mock-mr.bash | 6 +- test/test_helper/jira-mock.bash | 2 +- 6 files changed, 258 insertions(+), 360 deletions(-) diff --git a/git-mr b/git-mr index aeaf17d..032cde9 100755 --- a/git-mr +++ b/git-mr @@ -3,16 +3,14 @@ ################################################################################ # Git functions -function git_current_branch -{ +git_current_branch() { # `git branch --show-current` is available starting from Git 2.22 # fallback to `git rev-parse --abbrev-ref HEAD` if first command fails - (git branch --show-current 2>/dev/null) || \ - git rev-parse --abbrev-ref HEAD + (git branch --show-current 2>/dev/null) || + git rev-parse --abbrev-ref HEAD } -function git_base_branch -{ +git_base_branch() { local branch=${1:-$(git_current_branch)} [ -z "$branch" ] && exit 3 # Not on any branch @@ -38,20 +36,17 @@ function git_base_branch echo "$base_branch" } -function git_remote -{ +git_remote() { git remote | head -n1 } -function git_branch_exists -{ +git_branch_exists() { local branch=$1 git show-ref -q --heads "$branch" } -function git_default_branch -{ +git_default_branch() { local remote; remote=$(git_remote) local default; default=$(git symbolic-ref "refs/remotes/${remote}/HEAD" -- 2>/dev/null) @@ -64,16 +59,14 @@ function git_default_branch if git_branch_exists "master"; then echo "master"; return; fi } -function git_remote_branch_exists -{ +git_remote_branch_exists() { local branch=$1 local remote=${2:-$(git_remote)} [ -n "$(git ls-remote --heads "$remote" "$branch")" ] } -function git_check_branches -{ +git_check_branches() { local source_branch="$1" local target_branch="$2" @@ -81,7 +74,7 @@ function git_check_branches exit_error 3 "Not on any branch" [ "$source_branch" == "main" ] || - [ "$source_branch" == "master" ] && + [ "$source_branch" == "master" ] && exit_error 3 "On default branch" git show-ref -q --heads "$source_branch" || @@ -93,16 +86,14 @@ function git_check_branches return 0 } -function git_commits -{ +git_commits() { local source_branch=${1:-$(git_current_branch)} local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} git log --oneline --reverse --no-decorate "heads/${target_branch}..heads/${source_branch}" } -function git_commits_extended -{ +git_commits_extended() { local source_branch=${1:-$(git_current_branch)} local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} @@ -118,8 +109,7 @@ function git_commits_extended sed -r "s/${end}$//g" # remove trailing body end for bodies without trailing blank line } -function git_commit_extended -{ +git_commit_extended() { local revision=${1:-HEAD} local prefix="* ${MD_BOLD}" @@ -134,8 +124,7 @@ function git_commit_extended sed -r "s/${end}$//g" # remove trailing body end for bodies without trailing blank line } -function git_titlize_branch -{ +git_titlize_branch() { local branch=${1:-$(git_current_branch)} # Split prefix, issue id & label parts @@ -151,7 +140,7 @@ function git_titlize_branch # Split prefix & label parts branch_split_pattern="^([^\/]*\/?)(.*)$" prefix=$(echo "$branch" | sed -r "s/$branch_split_pattern/\1/") - label=$( echo "$branch" | sed -r "s/$branch_split_pattern/\2/") + label=$(echo "$branch" | sed -r "s/$branch_split_pattern/\2/") issue_id= else issue_id="$issue_id " # add space @@ -174,13 +163,12 @@ function git_titlize_branch ################################################################################ # Misc. utilities -function exit_error -{ - local code=$1 - local msg="$2" +exit_error() { + local code=$1 + local msg="$2" - echo_error "$msg" - exit "$code" + echo_error "$msg" + exit "$code" } # https://gist.github.com/cdown/1163649#gistcomment-1639097 @@ -201,11 +189,10 @@ urlencode() { LC_ALL="$oLC_ALL" } -function colorize -{ +colorize() { local input=$1 - if which tput > /dev/null 2>&1 && [ ! -z "$TERM" ] && [ "$(tput -T"$TERM" colors)" -ge 8 ]; then + if which tput > /dev/null 2>&1 && [ -n "$TERM" ] && [ "$(tput -T"$TERM" colors)" -ge 8 ]; then local bold='\e[1m'; local nobold='\e[21m' @@ -231,8 +218,7 @@ function colorize } # https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda -function terminal_link -{ +terminal_link() { local href=$1 local text=$2 @@ -243,30 +229,26 @@ function terminal_link fi } -function echo_error -{ +echo_error() { colorize "$1\n" "orange" >&2 } -function echo_debug -{ - if [ -z "$GIT_MR_VERBOSE" ]; then return; fi +echo_debug() { + [ -z "$GIT_MR_VERBOSE" ] && return 0 colorize "$1\n" "gray" >&2 } -function echo_spacer -{ +echo_spacer() { local count=$1 local char=${2:-" "} for ((i=1; i <= count; i++)); do - echo -n "$char" + echo -n "$char" done } -function confirm -{ +confirm() { local question=$1 if [ "$GIT_MR_YES" = "1" ]; then @@ -275,6 +257,7 @@ function confirm return fi + local response read -r -p "$(colorize "$question" "lightcyan" "bold") [y/N] " response case "$response" in [yY][eE][sS]|[yY]) echo "yes" ;; @@ -282,44 +265,40 @@ function confirm esac } -function clear_screen -{ +clear_screen() { if which tput > /dev/null 2>&1 && [ -n "$TERM" ]; then tput -x clear fi } -function jq_build -{ +jq_build() { local key=${1} local value=${2} local initial_data=${3:-"{}"} - is_obj=$(echo "$value" | grep '^\{.*\}$') - is_num=$(echo "$value" | grep '^[0-9]*$') + local is_obj; is_obj=$(echo "$value" | grep '^\{.*\}$') + local is_num; is_num=$(echo "$value" | grep '^[0-9]*$') - local current_object; + local current_object - if [ ! -z "$is_obj" ] || [ ! -z "$is_num" ]; then - current_object="$(jq --null-input --compact-output --argjson value "$value" "{\"${key}\": \$value}")" + if [ -n "$is_obj" ] || [ -n "$is_num" ]; then + current_object="$(jq --null-input --compact-output --argjson value "$value" "{\"${key}\": \$value}")" else - current_object="$(jq --null-input --compact-output --arg value "$value" "{\"${key}\": \$value}")" + current_object="$(jq --null-input --compact-output --arg value "$value" "{\"${key}\": \$value}")" fi jq --null-input --compact-output \ - --argjson initial_data "$initial_data" \ - --argjson current_object "$current_object" \ - '$initial_data + $current_object' + --argjson initial_data "$initial_data" \ + --argjson current_object "$current_object" \ + '$initial_data + $current_object' } # escape regex special characters for literal usage -function regex_escape -{ +regex_escape() { echo "${1}" | sed -e 's/[]\/$*.^[]/\\&/g' } -function replace_labels -{ +replace_labels() { local labels=$1 local to_remove=$2 local to_add=$3 @@ -334,11 +313,11 @@ function replace_labels to_add=$( echo "$to_add" | tr "," "\n") # remove - [ ! -z "$to_remove" ] && labels=$(echo "$labels" | grep -v "$to_remove") - [ ! -z "$to_add" ] && labels=$(echo "$labels" | grep -v "$to_add") + [ -n "$to_remove" ] && labels=$(echo "$labels" | grep -v "$to_remove") + [ -n "$to_add" ] && labels=$(echo "$labels" | grep -v "$to_add") # add - [ ! -z "$to_add" ] && labels=$(echo -e "${labels}\n${to_add}") + [ -n "$to_add" ] && labels=$(echo -e "${labels}\n${to_add}") # implode labels=$(echo "$labels" | tr "\n" "," | sed 's/^,//' | sed 's/,$//') @@ -348,12 +327,11 @@ function replace_labels echo "$labels" } -function open_in_browser -{ +open_in_browser() { local url=$1 if [ -z "$url" ]; then - return; + return fi local open_command @@ -361,9 +339,9 @@ function open_in_browser elif [[ "$OSTYPE" == "darwin"* ]]; then open_command='open'; fi - if [ ! -z "$open_command" ] && [ -x "$(command -v $open_command)" ]; then + if [ -n "$open_command" ] && [ -x "$(command -v $open_command)" ]; then $open_command "${url}" > /dev/null 2>&1 - return; + return fi echo_error "Unable to open browser" @@ -372,8 +350,7 @@ function open_in_browser echo } -function git_mr_readonly -{ +git_mr_readonly() { [ -z "$GIT_MR_READONLY" ] && return 1 [ -n "$1" ] && echo "$(colorize "🚫 Read-only 🚫" "gray")" >&2 @@ -385,8 +362,7 @@ function git_mr_readonly ################################################################################ # Markdown formatting -function markdown_title -{ +markdown_title() { local label=$1 local level=${2:-1} @@ -397,8 +373,7 @@ function markdown_title echo " ${label}" } -function markdown_link -{ +markdown_link() { local label=$1 local url=$2 @@ -410,8 +385,7 @@ function markdown_link echo "[$label]($url)" } -function markdown_list -{ +markdown_list() { local content=$1 local prefix="* ${MD_BOLD}" @@ -420,8 +394,7 @@ function markdown_list echo "$content" | sed "s/.*/${prefix}&${suffix}/" } -function markdown_indent_list_items -{ +markdown_indent_list_items() { local content=$1 local list_prefix_pattern @@ -438,15 +411,13 @@ function markdown_indent_list_items ################################################################################ # Jira functions -function jira_check_env -{ - [ ! -z "$JIRA_USER" ] || exit_error 21 "JIRA_USER is not set" - [ ! -z "$JIRA_TOKEN" ] || exit_error 21 "JIRA_TOKEN is not set" - [ ! -z "$JIRA_INSTANCE" ] || exit_error 21 "JIRA_INSTANCE is not set" +jira_check_env() { + [ -n "$JIRA_USER" ] || exit_error 21 "JIRA_USER is not set" + [ -n "$JIRA_TOKEN" ] || exit_error 21 "JIRA_TOKEN is not set" + [ -n "$JIRA_INSTANCE" ] || exit_error 21 "JIRA_INSTANCE is not set" } -function jira_request -{ +jira_request() { jira_check_env local request_url=$1 @@ -470,21 +441,19 @@ function jira_request "${jira_base_url}/${request_url}" || exit_error 20 "Jira request error" } -function jira_ticket_data -{ +jira_ticket_data() { jira_check_env - local issue_code=$1; [ ! -z "$issue_code" ] || exit_error 0 "issue_code required" + local issue_code=$1; [ -n "$issue_code" ] || exit_error 0 "issue_code required" jira_request "issue/${issue_code}?fields=summary" || exit $? } -function jira_transition -{ +jira_transition() { jira_check_env - local issue_code=$1; [ ! -z "$issue_code" ] || exit_error 0 "issue_code required" - local transition_id=$2; [ ! -z "$transition_id" ] || exit_error 0 "transition_id required" + local issue_code=$1; [ -n "$issue_code" ] || exit_error 0 "issue_code required" + local transition_id=$2; [ -n "$transition_id" ] || exit_error 0 "transition_id required" local transition; transition=$(jq_build "id" "$transition_id") || exit $? local request_data; request_data=$(jq_build "transition" "$transition") || exit $? @@ -496,35 +465,34 @@ function jira_transition ################################################################################ # Gitlab functions -function gitlab_check_env -{ - [ ! -z "$GITLAB_DOMAIN" ] || exit_error 11 "GITLAB_DOMAIN is not set" - [ ! -z "$GITLAB_TOKEN" ] || exit_error 11 "GITLAB_TOKEN is not set" +gitlab_check_env() { + [ -n "$GITLAB_DOMAIN" ] || exit_error 11 "GITLAB_DOMAIN is not set" + [ -n "$GITLAB_TOKEN" ] || exit_error 11 "GITLAB_TOKEN is not set" } -function gitlab_project_url -{ +gitlab_project_url() { local remote_url local project_url remote_url=$(git remote get-url --push origin | grep "${GITLAB_DOMAIN}") if [[ "$remote_url" = git* ]]; then - project_url=$(echo $remote_url | sed "s/git\@${GITLAB_DOMAIN}:\(.*\).git/\1/") + project_url=$(echo "$remote_url" | sed "s/git\@${GITLAB_DOMAIN}:\(.*\).git/\1/") fi if [[ "$remote_url" = https* ]]; then - project_url=$(echo $remote_url | sed "s/https:\/\/${GITLAB_DOMAIN}\/\(.*\).git/\1/") + project_url=$(echo "$remote_url" | sed "s/https:\/\/${GITLAB_DOMAIN}\/\(.*\).git/\1/") fi if [ -z "$project_url" ]; then local remote; remote=$(git remote get-url --push origin) local domain; domain=$(echo "$remote" | sed 's/.*@\(.*\):.*/\1/') + local message read -r -d '' message < Date: Sat, 14 Jan 2023 19:18:26 +0100 Subject: [PATCH 31/88] Refactor - move label utility functions --- git-mr | 138 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 71 insertions(+), 67 deletions(-) diff --git a/git-mr b/git-mr index 032cde9..2f5f936 100755 --- a/git-mr +++ b/git-mr @@ -298,35 +298,6 @@ regex_escape() { echo "${1}" | sed -e 's/[]\/$*.^[]/\\&/g' } -replace_labels() { - local labels=$1 - local to_remove=$2 - local to_add=$3 - - echo_debug "replace_labels - original labels : $labels" - echo_debug "replace_labels - labels to remove : $to_remove" - echo_debug "replace_labels - labels to add : $to_add" - - # split - labels=$( echo "$labels" | tr "," "\n") - to_remove=$( echo "$to_remove" | tr "," "\n") - to_add=$( echo "$to_add" | tr "," "\n") - - # remove - [ -n "$to_remove" ] && labels=$(echo "$labels" | grep -v "$to_remove") - [ -n "$to_add" ] && labels=$(echo "$labels" | grep -v "$to_add") - - # add - [ -n "$to_add" ] && labels=$(echo -e "${labels}\n${to_add}") - - # implode - labels=$(echo "$labels" | tr "\n" "," | sed 's/^,//' | sed 's/,$//') - - echo_debug "replace_labels - result : $labels" - - echo "$labels" -} - open_in_browser() { local url=$1 @@ -1034,44 +1005,6 @@ To create a new merge request: EOF } -is_status_label() { - local label=$1 - - local system_labels; system_labels=$(echo "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" | - sed 's/,,/,/g' | - sed 's/^,//' | sed 's/,$//' | - tr "," "\n") - - local match; match="$( echo "$label" | grep "$system_labels")" || return - local reverse; reverse=$(echo "$system_labels" | grep "$match") || return - # reverse-match is important, we don't want "Jean-Pierre BACRI Team" to match "CR" label - - echo "$match" -} - -mr_format_labels() { - local labels=$1 - - local labels_array; IFS=',' read -ra labels_array <<<"$labels" - - local status_labels=() - local other_labels=() - - for label in "${labels_array[@]}"; do - if [ -n "$(is_status_label "$label")" ]; then - status_labels+=("$(colorize "[$label]" "lightpurple" "bold")") - else - other_labels+=("[$label]") - fi - done - - local status_labels_str; status_labels_str="$(printf "%s " "${status_labels[@]}")" - local other_labels_str; other_labels_str="$(printf "%s " "${other_labels[@]}")" - - echo "${status_labels_str}${other_labels_str}" | - sed 's/^\s*//' | sed 's/\s*$//' # remove leading and trailing spaces -} - mr_show_status() { local mr_iid=$1 local merge_request; merge_request=${2:-$(gitlab_merge_request "$mr_iid")} @@ -1240,6 +1173,77 @@ mr_print_status() { echo -e "\n" } + +################################################################################ +# Merge request labels utility functions + +replace_labels() { + local labels=$1 + local to_remove=$2 + local to_add=$3 + + echo_debug "replace_labels - original labels : $labels" + echo_debug "replace_labels - labels to remove : $to_remove" + echo_debug "replace_labels - labels to add : $to_add" + + # split + labels=$( echo "$labels" | tr "," "\n") + to_remove=$( echo "$to_remove" | tr "," "\n") + to_add=$( echo "$to_add" | tr "," "\n") + + # remove + [ -n "$to_remove" ] && labels=$(echo "$labels" | grep -v "$to_remove") + [ -n "$to_add" ] && labels=$(echo "$labels" | grep -v "$to_add") + + # add + [ -n "$to_add" ] && labels=$(echo -e "${labels}\n${to_add}") + + # implode + labels=$(echo "$labels" | tr "\n" "," | sed 's/^,//' | sed 's/,$//') + + echo_debug "replace_labels - result : $labels" + + echo "$labels" +} + +is_status_label() { + local label=$1 + + local system_labels; system_labels=$(echo "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" | + sed 's/,,/,/g' | + sed 's/^,//' | sed 's/,$//' | + tr "," "\n") + + local match; match="$( echo "$label" | grep "$system_labels")" || return + local reverse; reverse=$(echo "$system_labels" | grep "$match") || return + # reverse-match is important, we don't want "Jean-Pierre BACRI Team" to match "CR" label + + echo "$match" +} + +mr_format_labels() { + local labels=$1 + + local labels_array; IFS=',' read -ra labels_array <<<"$labels" + + local status_labels=() + local other_labels=() + + for label in "${labels_array[@]}"; do + if [ -n "$(is_status_label "$label")" ]; then + status_labels+=("$(colorize "[$label]" "lightpurple" "bold")") + else + other_labels+=("[$label]") + fi + done + + local status_labels_str; status_labels_str="$(printf "%s " "${status_labels[@]}")" + local other_labels_str; other_labels_str="$(printf "%s " "${other_labels[@]}")" + + echo "${status_labels_str}${other_labels_str}" | + sed 's/^\s*//' | sed 's/\s*$//' # remove leading and trailing spaces +} + mr_update_labels() { local source_branch=${1:-$(git_current_branch)} From fee85e5f6a7ed1146547d81f184dc37fdd0de709 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 14 Jan 2023 19:37:29 +0100 Subject: [PATCH 32/88] Refactor status block display extract: - mr_status_block() - mr_print_title() remove: - mr_actions() fix refactor --- git-mr | 260 ++++++++---------- test/git-mr.bats | 16 +- test/test_helper/gitlab-mock-mr-extended.bash | 2 +- test/test_helper/gitlab-mock-mr.bash | 2 +- 4 files changed, 129 insertions(+), 151 deletions(-) diff --git a/git-mr b/git-mr index 2f5f936..08c9dff 100755 --- a/git-mr +++ b/git-mr @@ -551,7 +551,16 @@ gitlab_new_merge_request_url() { [ -z "$project_url" ] && return local source_branch=${1:-$(git_current_branch)} + if ! git_remote_branch_exists "$source_branch"; then + echo_error "Branch '$source_branch' does not exist on remote" + return + fi + local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} + if ! git_remote_branch_exists "$target_branch"; then + echo_error "Target branch '$target_branch' does not exist on remote" + return + fi local gitlab_mr_url="https://${GITLAB_DOMAIN}/${project_url}/-/merge_requests/new" @@ -825,28 +834,20 @@ gitlab_undraft() { local source_branch=${1:-$(git_current_branch)} # Search existing merge request - - local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") || exit $? - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") - - if [ -z "${mr_iid}" ] || [ -z "${mr_url}" ]; then + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") + if [ -z "$mr_summary" ]; then echo_error "Merge request not found" mr_print "$source_branch" return fi - # Load existing merge request details - - local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - local mr_title; mr_title=$(gitlab_extract_title "$merge_request") + local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + local mr_title; mr_title=$(gitlab_extract_title "$mr_summary") + # Print merge request status summary echo - echo "-------------------------------------------------------------------" - gitlab_title_undraft "$mr_title" - echo "-------------------------------------------------------------------" - echo - mr_actions "$source_branch" "$mr_summary" "$merge_request" + mr_status_block "$mr_iid" + echo "--------------------------------------------------------------------------------" echo if ! gitlab_title_is_draft "$mr_title"; then @@ -865,8 +866,6 @@ gitlab_undraft() { if [ -n "$result" ]; then echo -e "OK\n"; fi fi - - echo } @@ -963,58 +962,46 @@ ${commit_list} EOF } -mr_actions() { - local source_branch=${1:-$(git_current_branch)} - - local mr_summary=${2} - local mr_detail=${3} - - if [ -z "$mr_summary" ]; then - mr_summary=$(gitlab_merge_request_summary "$source_branch") || exit $? - fi - - local mr_iid; mr_iid=$(gitlab_extract_iid "${mr_summary}") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") - - if [ -n "${mr_url}" ]; then - echo -e "Merge request:\n\n $(colorize "${mr_url}" "lightgray")" - mr_show_status "${mr_iid}" "$mr_detail" - return - fi - - if ! git_remote_branch_exists "$source_branch"; then - echo_error "Branch '$source_branch' does not exist on remote" - return - fi +mr_status_block() { + local mr_iid=$1 + local merge_request; merge_request=${2:-$(gitlab_merge_request "$mr_iid")} - local target_branch=${GIT_MR_TARGET:-$(git_base_branch "$source_branch")} + local mr_title=${3:-$(gitlab_extract_title "$merge_request")} + local mr_url=${4:-$(gitlab_extract_url "$merge_request")} - if ! git_remote_branch_exists "$target_branch"; then - echo_error "Target branch '$target_branch' does not exist on remote" - return + local mr_threads=$5 + if [ -z "$mr_threads" ]; then + local mr_url; mr_url=$(gitlab_extract_url "$merge_request") + local project_url; project_url=$(gitlab_extract_project_url "$mr_url") + mr_threads=$(gitlab_merge_request_threads "$project_url" "$mr_iid") fi - local new_mr_url - new_mr_url=$(gitlab_new_merge_request_url "${source_branch}" "${target_branch}") - - cat < Date: Sat, 14 Jan 2023 21:31:44 +0100 Subject: [PATCH 33/88] Check remote branch existence before updating MR target --- git-mr | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/git-mr b/git-mr index 08c9dff..7d839f5 100755 --- a/git-mr +++ b/git-mr @@ -1845,7 +1845,11 @@ mr_update() { if [ "$target_branch" != "$current_target" ]; then update_prompt=1 if [ "$(confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?")" = "yes" ]; then - mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit $? + if git_remote_branch_exists "$target_branch"; then + mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit $? + else + echo_error "Target branch '$target_branch' does not exist on remote" + fi fi fi From d8b6585d9533f80658b708128d7d2d76f27d45e6 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sun, 15 Jan 2023 00:23:06 +0100 Subject: [PATCH 34/88] Refactor confirm prompt Refactor confirm prompt --- git-mr | 36 ++++++++++++++++++------------------ test/git-mr.bats | 26 ++++++++++++++------------ 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/git-mr b/git-mr index 7d839f5..33508f7 100755 --- a/git-mr +++ b/git-mr @@ -251,18 +251,18 @@ echo_spacer() { confirm() { local question=$1 - if [ "$GIT_MR_YES" = "1" ]; then + if [[ $GIT_MR_YES -eq 1 ]]; then echo_error "$(colorize "$question" "cyan") -> yes" - echo "yes" - return + return 0 fi local response read -r -p "$(colorize "$question" "lightcyan" "bold") [y/N] " response case "$response" in - [yY][eE][sS]|[yY]) echo "yes" ;; - *) echo "no" ;; + [yY][eE][sS]|[yY]) return 0 ;; esac + + return 1 } clear_screen() { @@ -858,7 +858,7 @@ gitlab_undraft() { local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") - if [ "$(confirm "Do you want to resolve draft status?")" = "yes" ]; then + if confirm "Do you want to resolve draft status?"; then echo -n "Resolving draft status... " mr_data=$(jq_build "title" "$undraft_title") || exit $? @@ -1264,7 +1264,7 @@ mr_update_labels() { echo local new_labels; new_labels=$(replace_labels "$labels" "$to_remove" "$to_add") - if [ "$(confirm "Do you want to update the merge request labels to \"$new_labels\"?")" = "yes" ]; then + if confirm "Do you want to update the merge request labels to \"$new_labels\"?"; then echo -n "Updating merge request labels... " mr_data=$(jq_build "labels" "$new_labels") || exit $? @@ -1413,7 +1413,7 @@ mr_menu_update() { mr_menu_print_description "$updated_description" "$mr_url" "$mr_title" local mr_update_data='{}' - if [ "$(confirm "Do you want to update the menu in the merge request description?")" = "yes" ]; then + if confirm "Do you want to update the menu in the merge request description?"; then mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? fi if [ "$mr_update_data" != "{}" ]; then @@ -1472,7 +1472,7 @@ mr_menu_update_all() { mr_menu_print_description "$updated_description" "$mr_url" "$mr_title" "$project_name" mr_update_data='{}' - if [ "$(confirm "Do you want to update the menu in the merge request description?")" = "yes" ]; then + if confirm "Do you want to update the menu in the merge request description?"; then mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? fi if [ "$mr_update_data" != "{}" ]; then @@ -1823,7 +1823,7 @@ mr_update() { if [ $((updated_commit_count + new_commit_count)) -gt 0 ]; then update_prompt=1 - if [ "$(confirm "Do you want to update the merge request description?")" = "yes" ]; then + if confirm "Do you want to update the merge request description?"; then local new_description; new_description=$(echo -e "${new_description_content}") local newLines="" @@ -1844,7 +1844,7 @@ mr_update() { if [ "$target_branch" != "$current_target" ]; then update_prompt=1 - if [ "$(confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?")" = "yes" ]; then + if confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?"; then if git_remote_branch_exists "$target_branch"; then mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit $? else @@ -1924,7 +1924,7 @@ mr_merge() { if gitlab_title_is_draft "$mr_title"; then echo_error "Merge request is a draft (work in progress)" - if [ "$(confirm "Do you want to resolve draft status?")" != "yes" ]; then echo_error; return; fi + if ! confirm "Do you want to resolve draft status?"; then echo_error; return; fi echo -n "Resolving draft status... " local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") @@ -1937,7 +1937,7 @@ mr_merge() { # Merge - if [ "$(confirm "Do you want to merge '$source_branch' into '$current_target'?")" != "yes" ]; then echo; return; fi + if ! confirm "Do you want to merge '$source_branch' into '$current_target'?"; then echo; return; fi echo -n "Merging '$source_branch'... " local result; result=$(gitlab_merge_request_merge "${mr_iid}") @@ -1946,7 +1946,7 @@ mr_merge() { # checkout target branch - if [ "$(confirm "Do you want to checkout '$current_target' and pull changes?")" != "yes" ]; then echo; return; fi + if ! confirm "Do you want to checkout '$current_target' and pull changes?"; then echo; return; fi echo "$(colorize "git checkout $current_target && git pull --rebase" "lightgray")" git_mr_readonly || @@ -1955,7 +1955,7 @@ mr_merge() { # delete local branch - if [ "$(confirm "Do you want to delete local branch '$source_branch'?")" != "yes" ]; then echo; return; fi + if ! confirm "Do you want to delete local branch '$source_branch'?"; then echo; return; fi echo "$(colorize "git branch -d $source_branch" "lightgray")" git_mr_readonly || @@ -2022,7 +2022,7 @@ mr_ip() { if [ -n "$issue_code" ] && [ -n "$JIRA_IP_ID" ] && - [ "$(confirm "Do you want to update the Jira ticket status to \"In Progress\"?")" = "yes" ]; then + confirm "Do you want to update the Jira ticket status to \"In Progress\"?"; then echo -n "Updating Jira ticket status... " jira_transition "$issue_code" "$JIRA_IP_ID" && echo -e "OK\n" @@ -2044,7 +2044,7 @@ mr_cr() { if [ -n "$issue_code" ] && [ -n "$JIRA_CR_ID" ] && - [ "$(confirm "Do you want to update the Jira ticket status to \"Code Review\"?")" = "yes" ]; then + confirm "Do you want to update the Jira ticket status to \"Code Review\"?"; then echo -n "Updating Jira ticket status... " jira_transition "$issue_code" "$JIRA_CR_ID" && echo -e "OK\n" @@ -2066,7 +2066,7 @@ mr_qa() { if [ -n "$issue_code" ] && [ -n "$JIRA_QA_ID" ] && - [ "$(confirm "Do you want to update the Jira ticket status to \"Quality Assurance\"?")" = "yes" ]; then + confirm "Do you want to update the Jira ticket status to \"Quality Assurance\"?"; then echo -n "Updating Jira ticket status... " jira_transition "$issue_code" "$JIRA_QA_ID" && echo -e "OK\n" diff --git a/test/git-mr.bats b/test/git-mr.bats index fac3dd4..cf5ca85 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -291,21 +291,23 @@ setup() { } @test "Asks for confirmation" { - if [ "$(confirm "Do you want to resolve draft status?" <<< "yes")" = "yes" ]; then confirmed=1; else confirmed=0; fi - assert_equal $confirmed 1 - - if [ "$(confirm "Do you want to resolve draft status?" <<< "y")" = "yes" ]; then confirmed=1; else confirmed=0; fi - assert_equal $confirmed 1 - - if [ "$(confirm "Do you want to resolve draft status?" <<< "no")" = "yes" ]; then confirmed=1; else confirmed=0; fi - assert_equal $confirmed 0 + run confirm "Are you sure?" <<< "yes" + assert_success + run confirm "Are you sure?" <<< "y" + assert_success - if [ "$(confirm "Do you want to resolve draft status?" <<< "n")" = "yes" ]; then confirmed=1; else confirmed=0; fi - assert_equal $confirmed 0 + run confirm "Are you sure?" <<< "no" + assert_failure + run confirm "Are you sure?" <<< "n" + assert_failure + run confirm "Are you sure?" <<< "whatever" + assert_failure GIT_MR_YES=1 - if [ "$(confirm "Do you want to resolve draft status?" <<< "n")" = "yes" ]; then confirmed=1; else confirmed=0; fi - assert_equal $confirmed 1 + run confirm "Are you sure?" <<< "whatever" + assert_success + run confirm "Are you sure?" + assert_success } @test "Builds json" { From 1c58b789faf7b70be09132ffe59eb1d9ced681c7 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 12 Jan 2023 22:09:59 +0100 Subject: [PATCH 35/88] Documentation Documentation --- README.md | 307 ++++++---------------------------- doc/generate-sample-output.sh | 300 +++++++++++++++++++++++++++++++++ doc/git-mr-e.png | Bin 0 -> 48122 bytes doc/git-mr-menu-status.png | Bin 0 -> 72965 bytes doc/git-mr-menu.png | Bin 0 -> 37037 bytes doc/git-mr-merge.png | Bin 0 -> 121219 bytes doc/git-mr-status.png | Bin 0 -> 27568 bytes doc/git-mr-update.png | Bin 0 -> 102985 bytes doc/git-mr.png | Bin 0 -> 40622 bytes git-mr | 40 ++--- git-mr-completion.bash | 10 +- 11 files changed, 379 insertions(+), 278 deletions(-) create mode 100755 doc/generate-sample-output.sh create mode 100644 doc/git-mr-e.png create mode 100644 doc/git-mr-menu-status.png create mode 100644 doc/git-mr-menu.png create mode 100644 doc/git-mr-merge.png create mode 100644 doc/git-mr-status.png create mode 100644 doc/git-mr-update.png create mode 100644 doc/git-mr.png diff --git a/README.md b/README.md index 498aa38..0260bcc 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,10 @@ Prepares a merge request description, with link to Jira ticket and current branc * [Synopsis](#synopsis) * [Installation](#installation) -* [Configuration](#configuration) -* [Usage](#usage) - + [`git mr`](#git-mr-1) + + [Command installation](#command-installation) + + [Configuration](#configuration) +* [Commands](#commands) + + [`git mr`](#git-mr-2) + [`git mr open`](#git-mr-open) + [`git mr status`](#git-mr-status) + [`git mr update`](#git-mr-update) @@ -20,12 +21,11 @@ Prepares a merge request description, with link to Jira ticket and current branc + [`git mr undraft`](#git-mr-undraft) + [`git mr merge`](#git-mr-merge) + [`git mr hook`](#git-mr-hook) -* [Hooks](#hooks) - + [`prepare-commit-msg`](#prepare-commit-msg) -* [Plumbing](#plumbing) +* [Plumbing commands](#plumbing-commands) + [`git mr base`](#git-mr-base) + [`git mr code`](#git-mr-code) -* [Sample output](#sample-output) +* [Hooks](#hooks) + + [`prepare-commit-msg`](#prepare-commit-msg) ---------------------------------------------------------------- @@ -62,33 +62,35 @@ Prepares a merge request description, with link to Jira ticket and current branc ### Options -* `-c|--code` `ISSUE_CODE` +* `-c`, `--code` `ISSUE_CODE` Force issue code. -* `-t|--target` `TARGET_BRANCH` +* `-t`, `--target` `TARGET_BRANCH` Force target branch. -* `-v` - Verbose output (displays called API URLs). -* `-y` - Bypass confirmation prompts (always answer "yes"). -* `-e` +* `-e`, `--extended` Use full commit messages in description ("extended", for `git mr [open|update]`). You can also set `GIT_MR_EXTENDED=1` in your environment variables to always use extended commit descriptions. -* `-n` +* `-y`, `--yes` + Bypass confirmation prompts (always answer "yes"). +* `-n`, `--new-section` Add new section in description for new commits (for `git mr update`) -* `-a`|`--all` +* `-a`, `--all` Update all merge requests (for `git mr menu update`). +* `-v`, `--verbose` + Verbose output (displays called API URLs). * `-h` Show help page. ## Installation -### Dependencies +### Command installation + +#### Dependencies * `bash`, `git` and usual command-line utilities: `grep`, `sed`, `curl`, `head`, `tail`, `tr`. * [**`jq`**](https://stedolan.github.io/jq/) is required and needs to be in PATH. -### git-mr +#### git-mr * Add the `git-mr` directory to your `PATH`
in one of your shell startup scripts: @@ -109,7 +111,7 @@ _OR_ mr = "!bash /path/to/git-mr/git-mr" ``` -### Completion +#### Completion Completion is available in `git-mr-completion.bash`. Source it in one of your shell startup scripts: ```bash @@ -117,7 +119,7 @@ Completion is available in `git-mr-completion.bash`. Source it in one of your sh ``` -## Configuration +### Configuration You need to configure the following environment variables: ```bash @@ -143,25 +145,25 @@ Other optional configuration variables: # Default labels for new merge requests export GITLAB_DEFAULT_LABELS="Review,My Team" -# Check "Delete source branch" by default (defaults to 1) -export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 - -# Network timeout (in seconds, defaults to 5) -export GIT_MR_TIMEOUT=5 - # Gitlab status labels (comma-separated, without spaces in between) -export GITLAB_OK_LABELS="Validated,Accepted" # Labels removed on IP, CR or QA steps export GITLAB_CR_LABELS="Review" # Labels set on CR step export GITLAB_QA_LABELS="Testing" # Labels set on QA step +export GITLAB_OK_LABELS="Validated,Accepted" # Labels removed on IP, CR or QA steps # Jira status IDs export JIRA_IP_ID="xx" # "In progress" status ID export JIRA_CR_ID="xx" # "Code review" status ID export JIRA_QA_ID="xx" # "Quality Assurance" status ID + +# Check "Delete source branch" by default (defaults to 1) +export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 + +# Network timeout (in seconds, defaults to 5) +export GIT_MR_TIMEOUT=5 ``` -## Usage +## Commands ### `git mr` @@ -181,6 +183,10 @@ If a merge request based on the current branch is found on Gitlab, its URL will Otherwise, a link to create a new merge request will be provided. Default labels and "Delete source branch" status can be configured with the `GITLAB_DEFAULT_LABELS` and `GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH` environment variables. +![git mr](doc/git-mr.png) + +![git mr -e](doc/git-mr-e.png) + ---------------------------------------------------------------- ### `git mr open` @@ -201,6 +207,8 @@ Similar to `git mr`, but will open browser directly. Displays a quick summary of the merge request, with useful indicators (tags, target branch, votes, open threads, draft status, ...) +![git mr status](doc/git-mr-status.png) + ---------------------------------------------------------------- ### `git mr update` @@ -217,30 +225,20 @@ If some commits were changed (after a rebase) or added, you will be prompted if You can also update the source branch if it is different from the current one. +![git mr update](doc/git-mr-update.png) + ---------------------------------------------------------------- ### `git mr menu`
-git mr [OPTION...] menu                   [ISSUE_CODE] 
-git mr [OPTION...] menu up|update [--all] [ISSUE_CODE] 
-git mr [OPTION...] menu st|status         [ISSUE_CODE] 
+git mr [OPTION...] menu                   [SEARCH_TERM] 
+git mr [OPTION...] menu up|update [--all] [SEARCH_TERM] 
+git mr [OPTION...] menu st|status         [SEARCH_TERM] 
 
Searches for all (non-closed) merge requests with the current issue code in the title, and generates a menu. -Sample: -```markdown -## Menu - -* Some Project: [Feature/XY-1234 Ipsum](https://myapp.gitlab.com/some/project/-/merge_requests/12) -* Other Project: [Feature/XY-1234 Quisque sed](https://myapp.gitlab.com/other/project/-/merge_requests/34) -* Third Project: [Feature/XY-1234 Nunc vestibulum](https://myapp.gitlab.com/third/project/-/merge_requests/56) - --------------------------------------------------------------------------------- - -``` - * `git mr menu`
Prints the markdown menu @@ -252,6 +250,10 @@ Sample: * `git mr menu st|status`
Prints the menu and status indicators for every related merge request +![git mr menu](doc/git-mr-menu.png) + +![git mr menu-status](doc/git-mr-menu-status.png) + ---------------------------------------------------------------- ### `git mr ip|cr|qa` @@ -312,6 +314,8 @@ and if applicable, will prompt you to: * trigger the merge * checkout local target branch, update it and delete local merged branch +![git mr merge](doc/git-mr-merge.png) + ---------------------------------------------------------------- ### `git mr hook` @@ -324,19 +328,7 @@ Adds the `prepare-commit-msg` Git hook to your current repository. ---------------------------------------------------------------- - -## Hooks - -The following hooks are provided for convenience: - -### `prepare-commit-msg` - -Ensures your commit messages are prefixed with the code of related issue. - ----------------------------------------------------------------- - - -## Plumbing +## Plumbing commands These "plumbing" commands can be useful in other scripts or git aliases. @@ -352,205 +344,10 @@ Outputs guessed issue code. ---------------------------------------------------------------- +## Hooks -## Sample output - -## `git mr` - -
-me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr
-
-
--------------------------------------------------------------------------------
-# [XY-1234 Ipsum consectetur adipiscing](https://mycompany.atlassian.net/browse/XY-1234)
-
-## Commits
-
-* **78330c9 In vulputate quam ac ultrices volutpat**  
-* **0010a6a Curabitur vel purus sed tortor finibus posuere**  
-* **3621817 Aenean sed sem hendrerit ex egestas**  
-
---------------------------------------------------------------------------------
-
-To create a new merge request:
-
-  https://myapp.gitlab.com/my/project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature/xy-1234-ipsum&merge_request%5Btarget_branch%5D=develop
-
- ------------------------------------------------------------------------------------------------------------------------- - -
-me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr -e
-
-
--------------------------------------------------------------------------------
-# [XY-1234 Ipsum consectetur adipiscing](https://mycompany.atlassian.net/browse/XY-1234)
-
-## Commits
-
-* **78330c9 In vulputate quam ac ultrices volutpat**  
-  Some commit description  
-* **0010a6a Curabitur vel purus sed tortor finibus posuere**  
-  Extended description  
-  - stuff  
-  - other stuff  
-* **3621817 Aenean sed sem hendrerit ex egestas**  
-
---------------------------------------------------------------------------------
-
-To create a new merge request:
-
-  https://myapp.gitlab.com/my/project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature/xy-1234-ipsum&merge_request%5Btarget_branch%5D=develop
-
- ------------------------------------------------------------------------------------------------------------------------- - -## `git mr status` - -
-me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr status
-
-
-------------------------------------------------------------------
-Draft: Feature/XY-1234 Ipsum
--------------------------------------------------------------------
-
-Merge request:
-
-  https://myapp.gitlab.com/my/project/merge_requests/6
-
-   🏷  [Review] [My Team]                                            (↣ main)
-
-   👍  1   👎  1     Resolved threads: 0/1     Draft: yes     Can be merged: ❌
-
- ------------------------------------------------------------------------------------------------------------------------- - -## `git mr update` - -
-me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr update -n
-
-
-------------------------------------------------------------------
-Draft: Feature/XY-1234 Ipsum
--------------------------------------------------------------------
-# [XY-1234 Ipsum consectetur adipiscing](https://mycompany.atlassian.net/browse/XY-1234)
-
-Vivamus venenatis tortor et neque sollicitudin, eget suscipit est malesuada
-
-## Commits
-
-* **78330c9 In vulputate quam ac ultrices volutpat**  
-  In vulputate quam  
-  ac ultrices volutpat  
-* **0010a6a Curabitur vel purus sed tortor finibus posuere**  
-  Curabitur vel
-* **aac348f Aenean sed sem hendrerit ex egestas tincidunt**  
-  Hendrerit ex egestas  
-  egestas sed  
-
-## Update
-
-* **e9642b7 Ut consectetur leo ut leo commodo porttitor**  
-
---------------------------------------------------------------------------------
-
-  updated commits: 1
-      new commits: 1
-
-Do you want to update the merge request description? [y/N] y
-OK
---------------------------------------------------------------------------------
-
-Merge request:
-
-  https://myapp.gitlab.com/my/project/merge_requests/6
-
-   🏷  [Testing] [My Team]                                           (↣ main)
-
-   👍  2   👎  0     Resolved threads: 1/2     Draft: yes     Can be merged: 
-
- ------------------------------------------------------------------------------------------------------------------------- - -## `git mr merge` - -
-me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr merge
-
-
-------------------------------------------------------------------
-Draft: Feature/XY-1234 Ipsum
--------------------------------------------------------------------
-
-Merge request:
-
-  https://myapp.gitlab.com/my/project/merge_requests/6
-
-   🏷  [Accepted] [My Team]                                          (↣ main)
-
-   👍  2   👎  0     Resolved threads: 2/2     Draft: yes     Can be merged: 
-
-Merge request is a draft (work in progress)
-Do you want to resolve draft status? [y/N] y
-OK
-Do you want to merge 'feature/xy-1234-ipsum'? [y/N] y
-OK
-Do you want to checkout 'main' and pull changes? [y/N] y
-Switched to branch 'main'
-Your branch is up to date with 'origin/main'.
-From myapp.gitlab.com:me/my/project
- - [deleted]         (none)     -> origin/feature/xy-1234-ipsum
-remote: Enumerating objects: 1, done.
-remote: Counting objects: 100% (1/1), done.
-remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
-remote: 
-Unpacking objects: 100% (1/1), 263 bytes | 263.00 KiB/s, done.
-   c17b3a1..9545ecd  main    -> origin/main
-Updating c17b3a1..9545ecd
-Fast-forward
-
-Do you want to delete local branch 'feature/xy-1234-ipsum'? [y/N] y
-Deleted branch feature/xy-1234-ipsum (was e9642b7).
-
- ------------------------------------------------------------------------------------------------------------------------- - -## `git mr menu` - -
-me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr menu
-
-
## Menu
-
-* Some Project: [Feature/XY-1234 Ipsum](https://myapp.gitlab.com/some/project/-/merge_requests/12)
-* Other Project: [Feature/XY-1234 Quisque sed](https://myapp.gitlab.com/other/project/-/merge_requests/34)
-* Third Project: [Feature/XY-1234 Nunc vestibulum](https://myapp.gitlab.com/third/project/-/merge_requests/56)
-
----------------------------------------------------------------------------------
-
- - ------------------------------------------------------------------------------------------------------------------------- - -
-me@mystation:~/my-project (feature/xy-1234-ipsum) ↔ ✔ $ git mr menu status
-
-
## Menu
-
-* Some Project: [Feature/XY-1234 Ipsum](https://myapp.gitlab.com/some/project/-/merge_requests/12)
-
-   🏷  [Review] [My Team]                                            (↣ main)
-
-   👍  1   👎  1     Resolved threads: 0/1     Draft: yes     Can be merged: ❌
-
-* Other Project: [Feature/XY-1234 Quisque sed](https://myapp.gitlab.com/other/project/-/merge_requests/34)
-
-   🏷  [Testing] [My Team]                                         (↣ master)
-
-   👍  2   👎  0     Resolved threads: 1/2     Draft: yes     Can be merged: 
-
-* Third Project: [Feature/XY-1234 Nunc vestibulum](https://myapp.gitlab.com/third/project/-/merge_requests/56)
-
-   🏷  [Accepted] [My Team]                                    (↣ epic/stuff)
+The following hooks are provided for convenience:
 
-   👍  2   👎  0     Resolved threads: 2/2     Draft: yes     Can be merged: 
+### `prepare-commit-msg`
 
----------------------------------------------------------------------------------
-
+Ensures your commit messages are prefixed with the code of related issue. diff --git a/doc/generate-sample-output.sh b/doc/generate-sample-output.sh new file mode 100755 index 0000000..2e9f320 --- /dev/null +++ b/doc/generate-sample-output.sh @@ -0,0 +1,300 @@ +#!/usr/bin/env bash + +cat << EOF + +################################################################################ +# # +# git-mr output examples # +# # +################################################################################ + +EOF + +pushd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null +. ../git-mr + + +GITLAB_OK_LABELS="Accepted" +GITLAB_QA_LABELS="Testing" +GITLAB_CR_LABELS="Review" + +issue_code="XY-1234" + +ticket_title="${issue_code} Lorem Ipsum" +ticket_url="https://mycompany.atlassian.net/browse/${issue_code}" +ticket_link="$(markdown_link "$ticket_title" "$ticket_url")" + +mr_title="Feature/${issue_code} Lorem Ipsum" +mr_url="https://myapp.gitlab.com/my/project/merge_requests/6" +new_mr_url="https://myapp.gitlab.com/my/project/merge_requests/new?..." +search_url="https://myapp.gitlab.com/dashboard/merge_requests?scope=all&state=all&search=$(urlencode "$issue_code")&in=title&sort=created_asc" + +# ---------------------------------------------------------------------------------------------------------------------- + +fake_prompt() { + local cmd=$1 + local branch=${2:-"feature/xy-1234-lorem-ipsum"} + + colorize "\n___________________________________________________________________________________________\n\n\n" "gray" + echo "$(colorize "me@mystation" "green"):$(colorize "~/my-project" "lightblue") $(colorize "($branch)" "purple") $(colorize "↔ ✔" "green") $ $cmd" +} + +c_same() { + colorize "$1" "lightblue" +} +c_updated() { + colorize "$1" "orange" +} +c_new() { + colorize "$1" "green" +} +c_question() { + colorize "$1" "lightcyan" "bold" +} + +# ---------------------------------------------------------------------------------------------------------------------- + +sample_mr() { + fake_prompt "git mr" + cat < origin/feature/xy-1234-lorem-ipsum +remote: Enumerating objects: 1, done. +remote: Counting objects: 100% (1/1), done. +remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 +remote: +Unpacking objects: 100% (1/1), 263 bytes | 263.00 KiB/s, done. + c17b3a1..9545ecd main -> origin/main +Updating c17b3a1..9545ecd +Fast-forward + +$(c_question "Do you want to delete local branch 'feature/xy-1234-lorem-ipsum'?") [y/N] y +$(colorize "git branch -d feature/xy-1234-lorem-ipsum" "lightgray") +Deleted branch feature/xy-1234-lorem-ipsum (was e9642b7). + +EOF +} + +sample_mr_menu() { + fake_prompt "git mr menu" + + cat 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

V46X7r3k?vr{A(eefMc78-Gk_VNS2q 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/git-mr-menu-status.png b/doc/git-mr-menu-status.png new file mode 100644 index 0000000000000000000000000000000000000000..49f51f6bc32711b16e9460c3257c7f91f7d0618a GIT binary patch literal 72965 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

;+d0!HRr=_r6k70{z30AY$>BtIG<=g% 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

+P}E{z-0PfeSDKk?5S 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

~OJPm3nbP?-|en|A^_vK4#oY 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 Qx35cFSVpKyK+pgG1D0n0UjP6A literal 0 HcmV?d00001 diff --git a/doc/git-mr-status.png b/doc/git-mr-status.png new file mode 100644 index 0000000000000000000000000000000000000000..01469f735bc848f8dc2d23139f52a6e9960a3640 GIT binary patch literal 27568 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 P;QAyhsU%S=W)kv027dxI literal 0 HcmV?d00001 diff --git a/doc/git-mr-update.png b/doc/git-mr-update.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3163026876ac7e4483c9644e978387dcb0924f GIT binary patch literal 102985 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 literal 0 HcmV?d00001 diff --git a/doc/git-mr.png b/doc/git-mr.png new file mode 100644 index 0000000000000000000000000000000000000000..f9aa541d9349d624f789160eb4742bb9d84b26a0 GIT binary patch literal 40622 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≫zIo;-Zh& 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 Date: Wed, 18 Jan 2023 15:51:47 +0100 Subject: [PATCH 36/88] Add `--force` option for `git mr merge` doc --- README.md | 2 ++ git-mr | 15 ++++++++++++--- git-mr-completion.bash | 7 +++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0260bcc..5124cca 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,8 @@ Prepares a merge request description, with link to Jira ticket and current branc Bypass confirmation prompts (always answer "yes"). * `-n`, `--new-section` Add new section in description for new commits (for `git mr update`) +* `-f`, `--force` + Force merge even if there are unresolved threads (for `git mr merge`) * `-a`, `--all` Update all merge requests (for `git mr menu update`). * `-v`, `--verbose` diff --git a/git-mr b/git-mr index 236454e..879ce14 100755 --- a/git-mr +++ b/git-mr @@ -1917,9 +1917,14 @@ mr_merge() { unresolved_thread_count=$(gitlab_merge_request_threads "$project_url" "$mr_iid" | grep -c 'unresolved:true') if [ "$unresolved_thread_count" -gt 0 ]; then - echo_error "There are $unresolved_thread_count unresolved threads. Please resolve them before merging." - echo_error - return + if [[ $GIT_MR_FORCE -eq 1 ]]; then + echo_error "There are $unresolved_thread_count unresolved threads. Merging anyway." + echo_error + else + echo_error "There are $unresolved_thread_count unresolved threads. Please resolve them before merging or use the --force option." + echo_error + return + fi fi if gitlab_title_is_draft "$mr_title"; then @@ -2146,6 +2151,9 @@ ${b}OPTIONS${r} -n, --new-section Add new section in description for new commits (for \`git mr update\`) + -f, --force + Force merge even if there are unresolved threads (for \`git mr merge\`) + -a, --all Update all merge requests (for \`git mr menu update\`). @@ -2234,6 +2242,7 @@ while [[ $# -gt 0 ]]; do -e|-E|--extended) GIT_MR_EXTENDED=1 ;; -y|-Y|--yes) GIT_MR_YES=1 ;; -n|-N|--new-section) GIT_MR_UPDATE_NEW_SECTION=1 ;; + -f|-F|--force) GIT_MR_FORCE=1 ;; -v|-V|--verbose) GIT_MR_VERBOSE=1 ;; -h) usage; exit 0; ;; diff --git a/git-mr-completion.bash b/git-mr-completion.bash index d42a83d..60fe56f 100644 --- a/git-mr-completion.bash +++ b/git-mr-completion.bash @@ -5,6 +5,7 @@ _git_mr() { local isMenuStatus local isMenuUpdate local isMenuUpdateAll + local isMerge local isUpdate # Parse current command words to get context @@ -20,6 +21,7 @@ _git_mr() { [[ "$w" == "--all" ]] && isMenuUpdateAll=1 fi else + [[ "$w" == "merge" ]] && isMerge=1 [[ "$w" == "update" ]] && isUpdate=1 fi done @@ -44,12 +46,17 @@ _git_mr() { case "$cur" in --*) __gitcomp "--code --target --verbose --extended --yes" + [[ -n $isMerge ]] && + __gitcomp_nl_append "--force" [[ -n $isUpdate ]] && __gitcomp_nl_append "--new-section" return ;; -*) __gitcomp "-c --code -t --target -v --verbose -e --extended -y --yes" + [[ -n $isMerge ]] && + __gitcomp_nl_append "-f" && + __gitcomp_nl_append "--force" [[ -n $isUpdate ]] && __gitcomp_nl_append "-n" && __gitcomp_nl_append "--new-section" From 090728f7990ca7af08c50409641eb3be3e35535f Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 18 Jan 2023 16:20:20 +0100 Subject: [PATCH 37/88] Fix link to first unresolved thread when there are multiple ones --- git-mr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-mr b/git-mr index 879ce14..19a351d 100755 --- a/git-mr +++ b/git-mr @@ -1048,7 +1048,7 @@ mr_print_status() { if [ "$resolved_count" -lt "$thread_count" ]; then local first_unresolved_note_id - first_unresolved_note_id=$(echo "$threads" | grep 'unresolved:true' | cut -f 3 | cut -d ':' -f 2) + first_unresolved_note_id=$(echo "$threads" | grep 'unresolved:true' | cut -f 3 | cut -d ':' -f 2 | head -n 1) local note_url="${mr_url}#note_${first_unresolved_note_id}" threads_display=$(terminal_link "$note_url" "$threads_display") fi From 7a4aeefc799581768d2420213840654041229daf Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 21 Jan 2023 21:45:13 +0100 Subject: [PATCH 38/88] Fix UTF-8 in tests (Git bash on Windows) --- test/git-mr.bats | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/git-mr.bats b/test/git-mr.bats index cf5ca85..5b1c21f 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -17,6 +17,8 @@ git-mr() { } setup_file() { + export LANG=C.UTF-8 # ensure tests handle UTF-8 properly + export JIRA_CODE_PATTERN="[A-Z]{2,3}-[0-9]+" export JIRA_INSTANCE= export JIRA_USER= From 370c3cac8d835d6903ebd16876732e4e88c50b1b Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sun, 22 Jan 2023 22:06:27 +0100 Subject: [PATCH 39/88] Additional tests & refactor --- git-mr | 110 ++-- test/git-mr.bats | 491 ++++++++++++++---- test/test_helper/gitlab-mock-menu.bash | 39 +- test/test_helper/gitlab-mock-mr-extended.bash | 51 +- test/test_helper/gitlab-mock-mr.bash | 43 +- 5 files changed, 534 insertions(+), 200 deletions(-) diff --git a/git-mr b/git-mr index 19a351d..785e06f 100755 --- a/git-mr +++ b/git-mr @@ -18,13 +18,18 @@ git_base_branch() { git show-ref -q --heads "$branch" || exit 3 # Branch does not exist # Nearest branch in commit history - local base_branch; base_branch=$( \ - git log --oneline --decorate "${branch}" \ - --simplify-by-decoration --decorate-refs='refs/heads/*' | # select only commits with a local branch - head -n2 | tail -n1 | # select closest decoration before current HEAD - sed 's/[a-f0-9]\+ (\([^)]*\)) .*/\1/' | # filters out everything but decorations - sed -e 's/, /\n/g' | # splits decorations - head -n1) # keep only first decoration + local base_branch + local refs_logs; refs_logs=$(git log --oneline --decorate "${branch}" \ + --simplify-by-decoration --decorate-refs='refs/heads/*') # select only commits with a local branch + + if [[ $(echo "$refs_logs" | wc -l) -gt 1 ]]; then + base_branch=$( \ + echo "$refs_logs" | + head -n2 | tail -n1 | # select closest decoration before current HEAD + sed 's/[a-f0-9]\+ (\([^)]*\)) .*/\1/' | # filters out everything but decorations + sed -e 's/, /\n/g' | # splits decorations + head -n1) # keep only first decoration + fi # First possible merge base if ! git show-ref -q --heads "$base_branch"; then @@ -47,10 +52,18 @@ git_branch_exists() { } git_default_branch() { - local remote; remote=$(git_remote) + local remote; remote=$(gitlab_remote || git_remote) local default; default=$(git symbolic-ref "refs/remotes/${remote}/HEAD" -- 2>/dev/null) if [ -n "$default" ]; then + + local local_tracking + local_tracking=$(git branch -vv | grep "${default#"refs/remotes/"}" | sed 's/^[* ]*//' | cut -d' ' -f1) + + # local branch tracking default remote with a different name + [[ -n $local_tracking ]] && echo "$local_tracking" && return + + # short local name of remote default echo "${default#"refs/remotes/${remote}/"}" return fi @@ -61,7 +74,7 @@ git_default_branch() { git_remote_branch_exists() { local branch=$1 - local remote=${2:-$(git_remote)} + local remote=${2:-$(gitlab_remote)} [ -n "$(git ls-remote --heads "$remote" "$branch")" ] } @@ -234,7 +247,7 @@ echo_error() { } echo_debug() { - [ -z "$GIT_MR_VERBOSE" ] && return 0 + [[ $GIT_MR_VERBOSE -ne 1 ]] && return 0 colorize "$1\n" "gray" >&2 } @@ -308,6 +321,7 @@ open_in_browser() { local open_command if [[ "$OSTYPE" == "linux-gnu"* ]]; then open_command='xdg-open'; elif [[ "$OSTYPE" == "darwin"* ]]; then open_command='open'; + elif [[ "$OSTYPE" == "msys"* ]]; then open_command='explorer'; fi if [ -n "$open_command" ] && [ -x "$(command -v $open_command)" ]; then @@ -322,7 +336,7 @@ open_in_browser() { } git_mr_readonly() { - [ -z "$GIT_MR_READONLY" ] && return 1 + [[ $GIT_MR_READONLY -ne 1 ]] && return 1 [ -n "$1" ] && echo "$(colorize "🚫 Read-only 🚫" "gray")" >&2 @@ -441,31 +455,46 @@ gitlab_check_env() { [ -n "$GITLAB_TOKEN" ] || exit_error 11 "GITLAB_TOKEN is not set" } +gitlab_remote() { + local remote remote_url + + for remote in $(git remote); do + remote_url=$(git remote get-url --push "$remote" | grep "${GITLAB_DOMAIN}" || true) + [[ -n "$remote_url" ]] && echo "$remote" && return 0 + done + + return 1 +} + gitlab_project_url() { + local remote local remote_url local project_url - remote_url=$(git remote get-url --push origin | grep "${GITLAB_DOMAIN}") + remote=$(gitlab_remote) + [[ -n $remote ]] && + remote_url=$(git remote get-url --push "$remote" | grep "${GITLAB_DOMAIN}") if [[ "$remote_url" = git* ]]; then project_url=$(echo "$remote_url" | sed "s/git\@${GITLAB_DOMAIN}:\(.*\).git/\1/") - fi - - if [[ "$remote_url" = https* ]]; then + elif [[ "$remote_url" = https* ]]; then project_url=$(echo "$remote_url" | sed "s/https:\/\/${GITLAB_DOMAIN}\/\(.*\).git/\1/") fi - if [ -z "$project_url" ]; then - local remote; remote=$(git remote get-url --push origin) - local domain; domain=$(echo "$remote" | sed 's/.*@\(.*\):.*/\1/') - local message - read -r -d '' message < .git/refs/remotes/gitlab/HEAD git switch -c epic/big-feature main git commit --allow-empty -m "Epic 1" @@ -48,21 +51,20 @@ setup_file() { git switch -c feature/base git commit --allow-empty -m "Feature base - 1" - git tag fbc1 - git push origin feature/base # remote branch should not be considered as base + git push -u fs-local feature/base # remote branch should not be considered as base git commit --allow-empty -m "Feature base - 2" -m "This is my second commit" - git tag fbc2 + git tag base-tag # tag should not be considered as base git commit --allow-empty -m "Feature base - 3" -m "This is my third commit" -m "With an extended description" - git tag fbc3 git switch -c feature/AB-123-test-feature git commit --allow-empty -m "Feature test - 1" - git tag f1c1 - git push origin feature/AB-123-test-feature # remote branch should not be considered as base + git push fs-local feature/AB-123-test-feature # remote branch should not be considered as base + git push -u gitlab feature/AB-123-test-feature # remote branch should not be considered as base git commit --allow-empty -m "Feature test - 2" -m "This is my second commit" - git tag f1c2 + git tag feature-tag # tag should not be considered as base git commit --allow-empty -m "Feature test - 3" -m "This is my third commit" -m "With an extended description" - git tag f1c3 + + git remote set-url --push gitlab "git@${GITLAB_DOMAIN}:my/project.git" cd .. } @@ -81,6 +83,30 @@ setup() { git switch feature/AB-123-test-feature } +################################################################################ +# Wrappers & utilities + +git() { + command git \ + -c init.defaultBranch=main \ + -c user.email=test@example.com \ + -c user.name=Test \ + -c init.templatedir= \ + "$@" +} + +git-mr() { + "${BATS_TEST_DIRNAME}"/../git-mr "$@" +} + +short_sha() { + git log --all --oneline | grep "$1" | cut -d ' ' -f 1 +} + +full_sha() { + git rev-parse "$(short_sha "$1")" +} + ################################################################################ # Git functions @@ -125,6 +151,10 @@ setup() { run git-mr base assert_output "feature/base" + git switch feature/old + run git-mr base + assert_output "$(full_sha "Main 2")" + git checkout -f "$(git rev-parse HEAD)" run git-mr base assert_failure @@ -136,7 +166,7 @@ setup() { @test "Determines remote name" { run git_remote - assert_output origin + assert_output fs-local } @test "Checks branch existence" { @@ -148,21 +178,40 @@ setup() { } @test "Determines default branch" { + # Consider local branch tracking gitlab remote default + run git_default_branch + assert_output "main" + + # fallback + export GITLAB_DOMAIN="test.example.net" run git_default_branch assert_output "main" } @test "Checks remote branch existence" { + # Local-only branch + run git_remote_branch_exists feature/local + assert_failure + run git_remote_branch_exists feature/local fs-local + assert_failure + + # Only on fs-local remote (gitlab remote considered by default) run git_remote_branch_exists feature/base + assert_failure + run git_remote_branch_exists feature/base fs-local assert_success - run git_branch_exists feature/local + # On both remotes + run git_remote_branch_exists feature/AB-123-test-feature + assert_success + run git_remote_branch_exists feature/AB-123-test-feature fs-local assert_success - run git_remote_branch_exists feature/local - assert_failure + # Non-existent branch run git_remote_branch_exists feature/whatever assert_failure + run git_remote_branch_exists feature/whatever fs-local + assert_failure } @test "Checks branch coherence" { @@ -192,60 +241,60 @@ setup() { } @test "Lists current branch commits" { - - cb1sha=$(git rev-parse --short fbc1) - cb2sha=$(git rev-parse --short fbc2) - cb3sha=$(git rev-parse --short fbc3) - - cf1sha=$(git rev-parse --short f1c1) - cf2sha=$(git rev-parse --short f1c2) - cf3sha=$(git rev-parse --short f1c3) - + testSha1=$(short_sha "Feature test - 1") + testSha2=$(short_sha "Feature test - 2") + testSha3=$(short_sha "Feature test - 3") + baseSha1=$(short_sha "Feature base - 1") + baseSha2=$(short_sha "Feature base - 2") + baseSha3=$(short_sha "Feature base - 3") + + # Commits of current branch run git_commits assert_output "$(cat <<- EOF - ${cf1sha} Feature test - 1 - ${cf2sha} Feature test - 2 - ${cf3sha} Feature test - 3 + ${testSha1} Feature test - 1 + ${testSha2} Feature test - 2 + ${testSha3} Feature test - 3 EOF )" git switch main + # Commits of specified branch run git_commits "feature/base" assert_output "$(cat <<- EOF - ${cb1sha} Feature base - 1 - ${cb2sha} Feature base - 2 - ${cb3sha} Feature base - 3 + ${baseSha1} Feature base - 1 + ${baseSha2} Feature base - 2 + ${baseSha3} Feature base - 3 EOF )" run git_commits "feature/AB-123-test-feature" "epic/big-feature" assert_output "$(cat <<- EOF - ${cb1sha} Feature base - 1 - ${cb2sha} Feature base - 2 - ${cb3sha} Feature base - 3 - ${cf1sha} Feature test - 1 - ${cf2sha} Feature test - 2 - ${cf3sha} Feature test - 3 + ${baseSha1} Feature base - 1 + ${baseSha2} Feature base - 2 + ${baseSha3} Feature base - 3 + ${testSha1} Feature test - 1 + ${testSha2} Feature test - 2 + ${testSha3} Feature test - 3 EOF )" } @test "Lists current branch commits with commit body" { - c1sha=$(git rev-parse --short f1c1) - c2sha=$(git rev-parse --short f1c2) - c3sha=$(git rev-parse --short f1c3) + sha1=$(short_sha "Feature test - 1") + sha2=$(short_sha "Feature test - 2") + sha3=$(short_sha "Feature test - 3") run git_commits_extended assert_output "$(cat <<- EOF - * **${c1sha} Feature test - 1**.. - * **${c2sha} Feature test - 2**.. + * **${sha1} Feature test - 1**.. + * **${sha2} Feature test - 2**.. This is my second commit - * **${c3sha} Feature test - 3**.. + * **${sha3} Feature test - 3**.. This is my third commit With an extended description @@ -254,12 +303,12 @@ setup() { } @test "Shows commit with commit body" { - c2sha=$(git rev-parse --short f1c2) + sha2=$(short_sha "Feature test - 2") - run git_commit_extended "$c2sha" + run git_commit_extended "$sha2" assert_output "$(cat <<- EOF - * **${c2sha} Feature test - 2**.. + * **${sha2} Feature test - 2**.. This is my second commit EOF )" @@ -273,11 +322,38 @@ setup() { ################################################################################ # Misc. utilities +@test "Exits with error" { + TERM=xterm-mono # disable colors + + run exit_error 3 "Nope!" + assert_failure + assert_output --partial "Nope!" +} + @test "Encodes URL arguments" { run urlencode "Some 'string'&\"stuff\" (that needs [to] be) encoded!" assert_output "Some%20%27string%27%26%22stuff%22%20%28that%20needs%20%5Bto%5D%20be%29%20encoded%21" } +@test "Outputs conditionally depending on verbosity" { + TERM=xterm-mono # disable colors + + GIT_MR_VERBOSE=1 + run echo_debug "Some debug output" + assert_success + assert_output --partial "Some debug output" + + GIT_MR_VERBOSE=0 + run echo_debug "Some debug output" + assert_success + assert_output "" + + GIT_MR_VERBOSE= + run echo_debug "Some debug output" + assert_success + assert_output "" +} + @test "Outputs spacers" { run echo_spacer 3 assert_output " " @@ -325,12 +401,50 @@ setup() { assert_output '\[\] \\\/ \$ \* \. \^ \[\]' } +@test "Has read-only mode" { + TERM=xterm-mono # disable colors + + GIT_MR_READONLY=1 + run git_mr_readonly + assert_success + run git_mr_readonly show + assert_success + assert_output "🚫 Read-only 🚫" + + GIT_MR_READONLY=0 + run git_mr_readonly + assert_failure + run git_mr_readonly show + assert_failure + assert_output "" + + GIT_MR_READONLY= + run git_mr_readonly + assert_failure + run git_mr_readonly show + assert_failure + assert_output "" + + export GIT_MR_READONLY=1 + JIRA_USER="whatever" + JIRA_TOKEN="whatever" + JIRA_INSTANCE="whatever" + run jira_request "whatever" "POST" "{}" + assert_success + + run gitlab_request "whatever" "POST" "{}" + assert_success +} + ################################################################################ # Markdown formatting @test "Formats markdown titles" { run markdown_title "This is a title" assert_output "# This is a title" + + run markdown_title "This is a level 2 title" 2 + assert_output "## This is a level 2 title" } @test "Formats markdown links" { @@ -339,11 +453,18 @@ setup() { } @test "Formats markdown lists" { - input=$(echo -e "one\ntwo\nthree") - expected=$(echo -e "* **one**..\n* **two**..\n* **three**..") - - run markdown_list "$input" - assert_output "$expected" + run markdown_list "$(cat <<- EOF + one + two + three + EOF + )" + assert_output "$(cat <<- EOF + * **one**.. + * **two**.. + * **three**.. + EOF + )" } @test "Formats markdown list descriptions" { @@ -368,17 +489,120 @@ setup() { ################################################################################ # Gitlab functions -@test "Extracts MR info from merge request summary" { +@test "Determines Gitlab remote" { + # Default tests setup + run gitlab_remote + assert_success + assert_output "gitlab" + + GITLAB_DOMAIN="test.example.net" + + git remote add other1 "git@other-domain.net:other1.git" + git remote add other2 "https://other-domain.net/other2.git" + run gitlab_remote + assert_failure + + # SSH URL + git remote add gitlab1 "git@${GITLAB_DOMAIN}:my/project.git" + run gitlab_remote + assert_success + assert_output "gitlab1" + git remote remove gitlab1 + + # HTTPS URL + git remote add gitlab2 "https://${GITLAB_DOMAIN}/my/project.git" + run gitlab_remote + assert_success + assert_output "gitlab2" + git remote remove gitlab2 + + git remote remove other1 + git remote remove other2 +} + +@test "Determines Gitlab project URL" { + TERM=xterm-mono # disable colors + + GITLAB_DOMAIN="test.example.net" + + run gitlab_project_url + assert_failure + assert_output --partial "$(cat <<- EOF + Unable to determine Gitlab project URL, check GITLAB_DOMAIN configuration + fs-local: ../remote + current: GITLAB_DOMAIN="test.example.net" + Suggestion: GITLAB_DOMAIN="../remote" + EOF + )" + + # SSH URL + git remote add remote1 "git@${GITLAB_DOMAIN}:my/project.git" + run gitlab_project_url + assert_success + assert_output --partial "my/project" + git remote remove remote1 + + # HTTPS URL + git remote add gitlab1 "https://${GITLAB_DOMAIN}/my/project.git" + run gitlab_project_url + assert_success + assert_output --partial "my/project" + git remote remove gitlab1 +} + +@test "Sends Gitlab project API requests" { + gitlab_request() { + echo "gitlab_request('$1' '${2:-"GET"}' '$3')" + } + + run gitlab_project_request 'test' 'POST' '{"test":1}' + assert_success + assert_output "gitlab_request('projects/my%2Fproject/test' 'POST' '{\"test\":1}')" +} + +@test "Warns for Gitlab API request errors" { + TERM=xterm-mono # disable colors + + run gitlab_check_error '{"error":"failed"}' + assert_output "\nGitlab error:\n {\"error\":\"failed\"}\n +ko" + + run gitlab_check_error '{"message":"failed"}' + assert_output "\nGitlab error:\n {\"message\":\"failed\"}\n +ko" +} + +@test "Determines new merge request URL" { + GITLAB_DEFAULT_LABELS="Label A,Label C" + gitlab_project_request() { + [[ $1 = "labels" ]] && + echo '[{"id":1,"name":"Label A"},{"id":2,"name":"Label B"},{"id":3,"name":"Label C"}]' + } + + run gitlab_new_merge_request_url + assert_output --partial "Target branch 'feature/base' does not exist on remote" + + # bypass remote branch existence check + git_remote_branch_exists() { return 0; } + + run gitlab_new_merge_request_url + expected="https://${GITLAB_DOMAIN}/my/project/-/merge_requests/new" + expected="${expected}?merge_request%5Bsource_branch%5D=feature/AB-123-test-feature" + expected="${expected}&merge_request%5Btarget_branch%5D=feature/base" + expected="${expected}&merge_request%5Blabel_ids%5D%5B%5D=1&merge_request%5Blabel_ids%5D%5B%5D=3" + expected="${expected}&merge_request%5Bforce_remove_source_branch%5D=1" + expected="${expected}&merge_request%5Btitle%5D=Draft%3A%20Feature%2FAB-123%20Test%20feature" + assert_output "$expected" +} - GITLAB_DOMAIN="example.com" - GITLAB_TOKEN="example" +@test "Extracts MR info from merge request summary" { gitlab_project_request() { case "$1" in "merge_requests?state=opened&view=simple&source_branch=feature/xy-1234-lorem-ipsum") echo '[{ "id": 1234, "iid": 123, "project_id": 12, "title": "Draft: Feature/XY-1234 Lorem Ipsum", - "web_url": "https://gitlab.com/mr/123" + "web_url": "https://gitlab.example.net/mr/123" },{}]' ;; "merge_requests?state=opened&view=simple&source_branch=feature/nope") @@ -391,7 +615,7 @@ setup() { mr_summary=$(gitlab_merge_request_summary "feature/xy-1234-lorem-ipsum") run gitlab_extract_iid "$mr_summary"; assert_output 123 - run gitlab_extract_url "$mr_summary"; assert_output "https://gitlab.com/mr/123" + run gitlab_extract_url "$mr_summary"; assert_output "https://gitlab.example.net/mr/123" run gitlab_extract_title "$mr_summary"; assert_output "Draft: Feature/XY-1234 Lorem Ipsum" mr_summary=$(gitlab_merge_request_summary "feature/nope") @@ -419,23 +643,55 @@ setup() { assert_equal "$(gitlab_extract_title "$mr_detail")" "MR title" assert_equal "$(gitlab_extract_description "$mr_detail")" "MR description" assert_equal "$(gitlab_extract_merge_status "$mr_detail")" 'can_be_merged' - assert_equal "$(gitlab_extract_target_branch "$mr_detail")" 'main' - assert_equal "$(gitlab_extract_labels "$mr_detail")" 'aaa,b b,c-c' assert_equal "$(gitlab_extract_pipeline_status "$mr_detail")" 'success' assert_equal "$(gitlab_extract_pipeline_url "$mr_detail")" 'https://example.net/ci' + assert_equal "$(gitlab_extract_target_branch "$mr_detail")" 'main' + assert_equal "$(gitlab_extract_labels "$mr_detail")" 'aaa,b b,c-c' mr_detail='{"title":"MR title","state":"merged"}' assert_equal "$(gitlab_extract_merge_status "$mr_detail")" 'merged' } @test "Extracts Gitlab project part from MR URL" { - GITLAB_DOMAIN="example.com" - mr_url="https://example.com/some/project/-/merge_requests/123" + mr_url="https://gitlab.example.net/some/project/-/merge_requests/123" run gitlab_extract_project_url "$mr_url" assert_output "some%2Fproject" } +@test "Extracts Gitlab merge request threads" { + gitlab_request() { + [[ $1 = "projects/test/merge_requests/123/discussions?per_page=100&page=1" ]] && + echo '[ + {"id": "n1","notes": [{"id": 11},{"id": 12,"resolvable": false}]}, + {"id": "n2","notes": [{"id": 21},{"id": 22,"resolvable": true, "resolved": false}]}, + {"id": "n3","notes": [{"id": 31},{"id": 32,"resolvable": true, "resolved": true}]} + ]' + } + + run gitlab_merge_request_threads "test" "123" + assert_output "$(cat <<- EOF + n2 unresolved:true note_id:22 + n3 unresolved:false note_id:null + EOF + )" +} + +@test "Fetches default Gitlab label ids" { + GITLAB_DEFAULT_LABELS="Label A,Label C" + gitlab_project_request() { + [[ $1 = "labels" ]] && + echo '[{"id":1,"name":"Label A"},{"id":2,"name":"Label B"},{"id":3,"name":"Label C"}]' + } + + run gitlab_default_label_ids + assert_output "$(cat <<- EOF + 1 + 3 + EOF + )" +} + @test "Handles draft MR titles" { run gitlab_title_is_draft "WIP: My MR" assert_success @@ -479,9 +735,9 @@ setup() { @test "Generates MR description from commits" { load "test_helper/jira-mock.bash" - c1sha=$(git rev-parse --short f1c1) - c2sha=$(git rev-parse --short f1c2) - c3sha=$(git rev-parse --short f1c3) + c1sha=$(short_sha "Feature test - 1") + c2sha=$(short_sha "Feature test - 2") + c3sha=$(short_sha "Feature test - 3") GIT_MR_EXTENDED= run mr_description @@ -524,51 +780,66 @@ setup() { TERM=xterm-mono # disable colors mr='{ - "title": "Draft: Feature/XY-1234 Lorem Ipsum", "web_url":"https://myapp.gitlab.com/my/project/merge_requests/6", + "title": "Draft: Feature/XY-1234 Lorem Ipsum", "web_url":"https://gitlab.example.net/my/project/merge_requests/6", "labels":["Review","My Team"], "target_branch": "main", "upvotes": 1, "downvotes": 1, "merge_status": "cannot_be_merged", "head_pipeline": {"status":"failed", "web_url":"https://example.net/ci/1"} }' threads='1 unresolved:false note_id:1 2 unresolved:true note_id:2' - run mr_print_status "$mr" "$threads" + run mr_status_block "1" "$mr" "" "" "$threads" + assert_output "$(cat <<- EOF + -------------------------------------------------------------------------------- + Feature/XY-1234 Lorem Ipsum + -------------------------------------------------------------------------------- - assert_output --partial " - 🏷 [Review] [My Team] 🚧 Draft (↣ main) + 🏷 [Review] [My Team] 🚧 Draft (↣ main) - 👍 1 👎 1 Resolved threads: 1/2 CI: ❌ Can be merged: ❌" + 👍 1 👎 1 Resolved threads: 1/2 CI: ❌ Can be merged: ❌ + EOF + )" # ------------------------------------------------------------------------------------------------------------------ mr='{ - "title": "Feature/XY-1234 Lorem Ipsum", "web_url":"https://myapp.gitlab.com/my/project/merge_requests/6", + "title": "Feature/XY-1234 Lorem Ipsum", "web_url":"https://gitlab.example.net/my/project/merge_requests/6", "labels":["Testing","My Team"], "target_branch": "main", "upvotes": 2, "downvotes": 0, "merge_status": "can_be_merged", "head_pipeline": {"status":"success", "web_url":"https://example.net/ci/1"} }' threads='1 unresolved:false note_id:1 2 unresolved:false note_id:2' - run mr_print_status "$mr" "$threads" + run mr_status_block "1" "$mr" "" "" "$threads" + assert_output "$(cat <<- EOF + -------------------------------------------------------------------------------- + Feature/XY-1234 Lorem Ipsum + -------------------------------------------------------------------------------- - assert_output --partial " - 🏷 [Testing] [My Team] (↣ main) + 🏷 [Testing] [My Team] (↣ main) - 👍 2 👎 0 Resolved threads: 2/2 CI: ✔ Can be merged: ✔" + 👍 2 👎 0 Resolved threads: 2/2 CI: ✔ Can be merged: ✔ + EOF + )" # ------------------------------------------------------------------------------------------------------------------ mr='{ - "title": "Feature/XY-1234 Lorem Ipsum", "web_url":"https://myapp.gitlab.com/my/project/merge_requests/6", + "title": "Feature/XY-1234 Lorem Ipsum", "web_url":"https://gitlab.example.net/my/project/merge_requests/6", "labels":["Accepted","My Team"], "target_branch": "main", "upvotes": 2, "downvotes": 0, "state":"merged" }' - threads= + threads="\n" - run mr_print_status "$mr" "$threads" + run mr_status_block "1" "$mr" "" "" "$threads" + assert_output "$(cat <<- EOF + -------------------------------------------------------------------------------- + Feature/XY-1234 Lorem Ipsum + -------------------------------------------------------------------------------- - assert_output --partial " - 🏷 [Accepted] [My Team] (↣ main) + 🏷 [Accepted] [My Team] (↣ main) - 👍 2 👎 0 Merged" + 👍 2 👎 0 Merged + EOF + )" } @test "Updates MR description with new commits in new section" { @@ -578,9 +849,9 @@ setup() { GIT_MR_EXTENDED= GIT_MR_UPDATE_NEW_SECTION=1 - c1sha=$(git rev-parse --short f1c1) - c2sha=$(git rev-parse --short f1c2) - c3sha=$(git rev-parse --short f1c3) + c1sha=$(short_sha "Feature test - 1") + c2sha=$(short_sha "Feature test - 2") + c3sha=$(short_sha "Feature test - 3") # Amend last commit git reset --hard HEAD~1 @@ -635,9 +906,9 @@ setup() { GIT_MR_EXTENDED=1 GIT_MR_UPDATE_NEW_SECTION= - c1sha=$(git rev-parse --short f1c1) - c2sha=$(git rev-parse --short f1c2) - c3sha=$(git rev-parse --short f1c3) + c1sha=$(short_sha "Feature test - 1") + c2sha=$(short_sha "Feature test - 2") + c3sha=$(short_sha "Feature test - 3") # Amend last commit git reset --hard HEAD~1 @@ -702,6 +973,29 @@ setup() { assert_output "toto,tata,plop,pouet" } +@test "Identifies workflow-specific labels" { + GITLAB_CR_LABELS="cr1,cr2" + GITLAB_QA_LABELS="qa1,qa2" + GITLAB_OK_LABELS="ok1,ok2" + + run is_status_label "cr1"; assert_output "cr1" + run is_status_label "cr2"; assert_output "cr2" + run is_status_label "qa1"; assert_output "qa1" + run is_status_label "qa2"; assert_output "qa2" + run is_status_label "ok1"; assert_output "ok1" + run is_status_label "ok2"; assert_output "ok2" + + run is_status_label "test"; assert_output "" + run is_status_label "zcr12"; assert_output "" + run is_status_label "zqa12"; assert_output "" + run is_status_label "zok12"; assert_output "" +} + +@test "Formats labels" { + run mr_format_labels "abc-1,def-2" + assert_output "[abc-1] [def-2]" +} + ################################################################################ # Merge request menu utility functions @@ -715,7 +1009,7 @@ setup() { assert_output "$(cat <<- EOF ================================================================================ - AB-123 (4 merge requests) + AB-123 (3 merge requests) ================================================================================ ## Menu @@ -723,7 +1017,6 @@ setup() { * Project C: [MR 31 title](https://example.net/31) * Project A: [MR 11 title](https://example.net/11) * Project B: [MR 21 title](https://example.net/21) - * Project D: [MR 41 title](https://example.net/21) -------------------------------------------------------------------------------- EOF diff --git a/test/test_helper/gitlab-mock-menu.bash b/test/test_helper/gitlab-mock-menu.bash index 48a129e..d802a61 100644 --- a/test/test_helper/gitlab-mock-menu.bash +++ b/test/test_helper/gitlab-mock-menu.bash @@ -1,16 +1,29 @@ -GITLAB_DOMAIN="example.com" -GITLAB_TOKEN="example" -gitlab_merge_requests_search() { - echo '{"iid": 31,"title":"MR 31 title","web_url":"https://example.net/31","state":"opened","project_id": 3} - {"iid": 11,"title":"MR 11 title","web_url":"https://example.net/11","state":"opened","project_id": 1} - {"iid": 21,"title":"MR 21 title","web_url":"https://example.net/21","state":"opened","project_id": 2} - {"iid": 41,"title":"MR 41 title","web_url":"https://example.net/21","state":"closed","project_id": 4}' -} +gitlab_request() { + case "$1" in + "merge_requests?scope=all&state=all&view=simple&search=AB-123"*) + echo '[ + {"iid": 31,"title":"MR 31 title","web_url":"https://example.net/31","state":"opened","project_id": 3}, + {"iid": 11,"title":"MR 11 title","web_url":"https://example.net/11","state":"opened","project_id": 1}, + {"iid": 21,"title":"MR 21 title","web_url":"https://example.net/21","state":"opened","project_id": 2}, + {"iid": 41,"title":"MR 41 title","web_url":"https://example.net/21","state":"closed","project_id": 4} + ]' + return 0 + ;; + + "projects?"*) + echo '[ + {"id":1,"name":"Project A"}, + {"id":2,"name":"Project B"}, + {"id":3,"name":"Project C"}, + {"id":4,"name":"Project D"} + ]' + return 0 + ;; -gitlab_projects() { - echo '[{"id":1,"name":"Project A"}, - {"id":2,"name":"Project B"}, - {"id":3,"name":"Project C"}, - {"id":4,"name":"Project D"}]' + *) + echo "$1" > mr-menu-gitlab_request.log + return 1 + ;; + esac } diff --git a/test/test_helper/gitlab-mock-mr-extended.bash b/test/test_helper/gitlab-mock-mr-extended.bash index 8128204..02409f9 100644 --- a/test/test_helper/gitlab-mock-mr-extended.bash +++ b/test/test_helper/gitlab-mock-mr-extended.bash @@ -1,27 +1,36 @@ -GITLAB_DOMAIN="example.com" -GITLAB_TOKEN="example" -gitlab_merge_request_summary() { - echo '{"iid":1,"web_url":"https://example.com/some/project/-/merge_requests/1"}' -} +gitlab_request() { + case "$1" in + "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") + echo '[{"iid":1,"web_url":"https://gitlab.example.net/some/project/-/merge_requests/1"}]' + return 0 + ;; + + "projects/my%2Fproject/merge_requests/1") + local oldDesc + oldDesc="[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" + oldDesc="${oldDesc}$(echo "\n\n## Commits")" + oldDesc="${oldDesc}$(echo "\n\n* **${c1sha} Feature test - 1**..")" + oldDesc="${oldDesc}$(echo "\n* **${c2sha} Feature test - 2**..")" + oldDesc="${oldDesc}$(echo "\n This is my second commit..")" + oldDesc="${oldDesc}$(echo "\n* **${c3sha} Feature test - 3**..")" + oldDesc="${oldDesc}$(echo "\n This is my third commit..")" + oldDesc="${oldDesc}$(echo "\n ")" + oldDesc="${oldDesc}$(echo "\n With an extended description")" -gitlab_merge_request() { - local oldDesc - oldDesc="[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" - oldDesc="${oldDesc}$(echo "\n\n## Commits")" - oldDesc="${oldDesc}$(echo "\n\n* **${c1sha} Feature test - 1**..")" - oldDesc="${oldDesc}$(echo "\n* **${c2sha} Feature test - 2**..")" - oldDesc="${oldDesc}$(echo "\n This is my second commit..")" - oldDesc="${oldDesc}$(echo "\n* **${c3sha} Feature test - 3**..")" - oldDesc="${oldDesc}$(echo "\n This is my third commit..")" - oldDesc="${oldDesc}$(echo "\n ")" - oldDesc="${oldDesc}$(echo "\n With an extended description")" + echo '{ + "iid":1, "web_url":"https://gitlab.example.net/some/project/-/merge_requests/1", + "title":"My MR", "target_branch":"feature/base", + "description":"'"$oldDesc"'" + }' + return 0 + ;; - echo '{ - "iid":1, "web_url":"https://example.com/some/project/-/merge_requests/1", - "title":"My MR", "target_branch":"feature/base", - "description":"'"$oldDesc"'" - }' + *) + echo "$1" >> mr-extended-gitlab_request.log + return 1 + ;; + esac } mr_show_status() { diff --git a/test/test_helper/gitlab-mock-mr.bash b/test/test_helper/gitlab-mock-mr.bash index b93cbd4..1ade793 100644 --- a/test/test_helper/gitlab-mock-mr.bash +++ b/test/test_helper/gitlab-mock-mr.bash @@ -1,23 +1,32 @@ -GITLAB_DOMAIN="example.com" -GITLAB_TOKEN="example" -gitlab_merge_request_summary() { - echo '{"iid":1,"web_url":"https://example.com/some/project/-/merge_requests/1"}' -} +gitlab_request() { + case "$1" in + "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") + echo '[{"iid":1,"web_url":"https://gitlab.example.net/some/project/-/merge_requests/1"}]' + return 0 + ;; + + "projects/my%2Fproject/merge_requests/1") + local oldDesc + oldDesc="[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" + oldDesc="${oldDesc}$(echo "\n\n## Commits")" + oldDesc="${oldDesc}$(echo "\n\n* **${c1sha} Feature test - 1**..")" + oldDesc="${oldDesc}$(echo "\n* **${c2sha} Feature test - 2**..")" + oldDesc="${oldDesc}$(echo "\n* **${c3sha} Feature test - 3**")" -gitlab_merge_request() { - local oldDesc - oldDesc="[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" - oldDesc="${oldDesc}$(echo "\n\n## Commits")" - oldDesc="${oldDesc}$(echo "\n\n* **${c1sha} Feature test - 1**..")" - oldDesc="${oldDesc}$(echo "\n* **${c2sha} Feature test - 2**..")" - oldDesc="${oldDesc}$(echo "\n* **${c3sha} Feature test - 3**")" + echo '{ + "iid":1, "web_url":"https://gitlab.example.net/some/project/-/merge_requests/1", + "title":"My MR", "target_branch":"feature/base", + "description":"'"$oldDesc"'" + }' + return 0 + ;; - echo '{ - "iid":1, "web_url":"https://example.com/some/project/-/merge_requests/1", - "title":"My MR", "target_branch":"feature/base", - "description":"'"$oldDesc"'" - }' + *) + echo "$1" > mr-gitlab_request.log + return 1 + ;; + esac } mr_show_status() { From b98f21a243d44b55c13eb0b226aa542a9354e88c Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 23 Jan 2023 20:04:54 +0100 Subject: [PATCH 40/88] Show plain MR URLs without terminal link support --- doc/generate-sample-output.sh | 23 +++++++++++++---------- git-mr | 14 +++++++++++++- test/git-mr.bats | 18 ++++++++++++++++++ 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/doc/generate-sample-output.sh b/doc/generate-sample-output.sh index 2e9f320..95cf9f1 100755 --- a/doc/generate-sample-output.sh +++ b/doc/generate-sample-output.sh @@ -271,19 +271,22 @@ sample_mr_menu_status() { $(terminal_link "$search_url" "$issue_code") (3 merge requests) ================================================================================ -* $(colorize "Some Project" "bold"): $(terminal_link "https://myapp.gitlab.com/some/project/-/merge_requests/12" "Feature/XY-1234 Lorem Ipsum") -$(mr_print_status "$mr1" "$threads1") - - -* $(colorize "Other Project" "bold"): $(terminal_link "https://myapp.gitlab.com/other/project/-/merge_requests/34" "Feature/XY-1234 Quisque sed") -$(mr_print_status "$mr2" "$threads2") - +EOF -* $(colorize "Third Project" "bold"): $(terminal_link "https://myapp.gitlab.com/third/project/-/merge_requests/56" "Feature/XY-1234 Nunc vestibulum") -$(mr_print_status "$mr3" "$threads3") + echo "* $(colorize "Some Project" "bold"): $(terminal_link "https://myapp.gitlab.com/some/project/-/merge_requests/12" "Feature/XY-1234 Lorem Ipsum")" + has_links || echo " ⇒ https://myapp.gitlab.com/some/project/-/merge_requests/12" + mr_print_status "$mr1" "$threads1" + echo + echo "* $(colorize "Other Project" "bold"): $(terminal_link "https://myapp.gitlab.com/other/project/-/merge_requests/34" "Feature/XY-1234 Quisque sed")" + has_links || echo " ⇒ https://myapp.gitlab.com/some/project/-/merge_requests/34" + mr_print_status "$mr2" "$threads2" + echo -EOF + echo "* $(colorize "Third Project" "bold"): $(terminal_link "https://myapp.gitlab.com/third/project/-/merge_requests/56" "Feature/XY-1234 Nunc vestibulum")" + has_links || echo " ⇒ https://myapp.gitlab.com/some/project/-/merge_requests/56" + mr_print_status "$mr3" "$threads3" + echo } # ---------------------------------------------------------------------------------------------------------------------- diff --git a/git-mr b/git-mr index 785e06f..800c50c 100755 --- a/git-mr +++ b/git-mr @@ -230,12 +230,22 @@ colorize() { fi } +has_links() { + if [[ $GIT_MR_NO_TERMINAL_LINK -ne 1 ]] && + which tput > /dev/null 2>&1 && + [ -n "$TERM" ] && + [ "$(tput -T"$TERM" colors)" -ge 8 ];then + return 0 + fi + return 1 +} + # https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda terminal_link() { local href=$1 local text=$2 - if which tput > /dev/null 2>&1 && [ -n "$TERM" ] && [ "$(tput -T"$TERM" colors)" -ge 8 ]; then + if has_links; then printf "\e]8;;%s\e\\%s\e]8;;\e\\" "$href" "$text" else echo -n "$text" @@ -996,6 +1006,7 @@ mr_print_title() { echo "--------------------------------------------------------------------------------" echo " $(terminal_link "$mr_url" "$(gitlab_title_undraft "$mr_title")")" + has_links || echo " ⇒ $mr_url" echo "--------------------------------------------------------------------------------" } @@ -1377,6 +1388,7 @@ mr_menu_status() { local merge_request; merge_request=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid") echo "* $(colorize "$project_name" "bold"): $(terminal_link "$web_url" "$title")" + has_links || echo " ⇒ $web_url" mr_show_status "$mr_iid" "$merge_request" echo done < <(echo "$menu_items") diff --git a/test/git-mr.bats b/test/git-mr.bats index 7d5e733..d4eb62d 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -335,6 +335,19 @@ full_sha() { assert_output "Some%20%27string%27%26%22stuff%22%20%28that%20needs%20%5Bto%5D%20be%29%20encoded%21" } +@test "Checks terminal link support (sort of)" { + TERM=xterm-256color + GIT_MR_NO_TERMINAL_LINK= + run has_links; assert_success + + GIT_MR_NO_TERMINAL_LINK=1 + run has_links; assert_failure + + GIT_MR_NO_TERMINAL_LINK= + TERM=xterm-mono # disable colors + run has_links; assert_failure +} + @test "Outputs conditionally depending on verbosity" { TERM=xterm-mono # disable colors @@ -791,6 +804,7 @@ ko" assert_output "$(cat <<- EOF -------------------------------------------------------------------------------- Feature/XY-1234 Lorem Ipsum + ⇒ https://gitlab.example.net/my/project/merge_requests/6 -------------------------------------------------------------------------------- 🏷 [Review] [My Team] 🚧 Draft (↣ main) @@ -813,6 +827,7 @@ ko" assert_output "$(cat <<- EOF -------------------------------------------------------------------------------- Feature/XY-1234 Lorem Ipsum + ⇒ https://gitlab.example.net/my/project/merge_requests/6 -------------------------------------------------------------------------------- 🏷 [Testing] [My Team] (↣ main) @@ -833,6 +848,7 @@ ko" assert_output "$(cat <<- EOF -------------------------------------------------------------------------------- Feature/XY-1234 Lorem Ipsum + ⇒ https://gitlab.example.net/my/project/merge_requests/6 -------------------------------------------------------------------------------- 🏷 [Accepted] [My Team] (↣ main) @@ -871,6 +887,7 @@ ko" -------------------------------------------------------------------------------- My MR + ⇒ https://gitlab.example.net/some/project/-/merge_requests/1 -------------------------------------------------------------------------------- [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) @@ -929,6 +946,7 @@ ko" -------------------------------------------------------------------------------- My MR + ⇒ https://gitlab.example.net/some/project/-/merge_requests/1 -------------------------------------------------------------------------------- [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) From 8314ed4bffa69eac60772387e390c8d8ab440c43 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 28 Jan 2023 20:09:09 +0100 Subject: [PATCH 41/88] Shellcheck adjustments --- git-mr | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/git-mr b/git-mr index 800c50c..08ac1ae 100755 --- a/git-mr +++ b/git-mr @@ -1,4 +1,7 @@ #!/usr/bin/env bash +# shellcheck disable=SC2001,SC2005 +# SC2001: Ignore bash ${variable//search/replace} substitutions suggestions +# SC2005: Ignore useless echo warnings (colorize and other formatting functions don't output a new line) ################################################################################ # Git functions @@ -194,7 +197,7 @@ urlencode() { for (( i = 0; i < length; i++ )); do local c="${1:i:1}" case $c in - [a-zA-Z0-9.~_-]) printf "$c" ;; + [a-zA-Z0-9.~_-]) printf "%s" "$c" ;; *) printf '%%%02X' "'$c" ;; esac done @@ -202,6 +205,7 @@ urlencode() { LC_ALL="$oLC_ALL" } +# shellcheck disable=SC2034 # Ignore unused color variables colorize() { local input=$1 @@ -1099,10 +1103,8 @@ mr_print_status() { *) pipeline_icon="$(colorize "?" "lightgray")" ;; esac local ci_str= - local ci_str_len=0 if [ -n "$pipeline_icon" ]; then ci_str="CI: $pipeline_icon" - ci_str_len=10 # 5 chars + 4 spaces + 1 for larger icon fi # Merge target @@ -1222,9 +1224,11 @@ is_status_label() { sed 's/^,//' | sed 's/,$//' | tr "," "\n") - local match; match="$( echo "$label" | grep "$system_labels")" || return - local reverse; reverse=$(echo "$system_labels" | grep "$match") || return + local match + match="$( echo "$label" | grep "$system_labels")" || return + # reverse-match is important, we don't want "Jean-Pierre BACRI Team" to match "CR" label + (echo "$system_labels" | grep "$match" > /dev/null) || return echo "$match" } @@ -1503,14 +1507,14 @@ mr_menu_update_all() { result=$(gitlab_request "projects/${project_url}/merge_requests/${mr_iid}" "PUT" "${mr_update_data}") if [ -n "$result" ]; then ((updated_count += 1)) - echo -e "OK\n" + echo -e "OK\n" fi else echo fi ((i += 1)) done - + [[ $updated_count -gt 0 ]] && echo "${updated_count} merge request$([[ $updated_count -gt 1 ]] && echo 's') updated" } @@ -1763,8 +1767,13 @@ mr_update() { grep -Po '^[^0-9a-fA-F]*[0-9a-fA-F]{7,}\s' | sed -r 's/^[^0-9a-fA-F]*([0-9a-fA-F]{7,})\s/\1/g') - local current_commits_array; current_commits_array=($(echo "$current_commits" | tr "\n" " ")) - local old_commits_array; old_commits_array=($(echo "$old_commits" | tr "\n" " ")) + local old_commits_array current_commits_array oIFS + oIFS=$IFS; IFS=$'\n' + # shellcheck disable=SC2206 + current_commits_array=($current_commits) + # shellcheck disable=SC2206 + old_commits_array=($old_commits) + IFS=$oIFS local updated_commit_count=0 local new_commit= @@ -1802,7 +1811,7 @@ mr_update() { new_commit="$(echo "$commit_messages" | grep "$curr")" new_commit_messages_display+=("$(echo "$new_commit" | sed "s/$curr/$(colorize "$curr" "$newColor")/")") - new_commit_messages_content+=("$(echo "$new_commit")") + new_commit_messages_content+=("$new_commit") fi done @@ -1823,9 +1832,10 @@ mr_update() { echo "## Update" echo fi - [[ $GIT_MR_EXTENDED -eq 1 ]] && - markdown_indent_list_items "$new_commit_messages_display_str" || - markdown_list "$new_commit_messages_display_str" + + if [[ $GIT_MR_EXTENDED -eq 1 ]]; then + markdown_indent_list_items "$new_commit_messages_display_str"; else + markdown_list "$new_commit_messages_display_str"; fi fi echo From d74e9b76e71cb0fd7c9654c16d08c95ed4319c68 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 28 Jan 2023 19:18:57 +0100 Subject: [PATCH 42/88] Tweak Github actions aaa --- .github/workflows/test.yml | 23 -------------------- .github/workflows/tests.yml | 43 +++++++++++++++++++++++++++++++++++++ README.md | 2 +- 3 files changed, 44 insertions(+), 24 deletions(-) delete mode 100644 .github/workflows/test.yml create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index ebca895..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Tests - -on: [push, pull_request] - -jobs: - - build: - name: build - runs-on: ubuntu-latest - steps: - - - name: Setup BATS - uses: mig4/setup-bats@v1 - with: - bats-version: 1.8.2 - - - name: Check out code - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Test - run: bats ./test diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..10026d7 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,43 @@ +name: Tests + +on: [push, pull_request] + +jobs: + + shellcheck: + name: ShellCheck + runs-on: ubuntu-22.04 + steps: + - name: Check out code + uses: actions/checkout@v3 + - name: Run ShellCheck + run: | + sudo apt-get update -y + sudo apt-get install shellcheck + LC_ALL=C.UTF-8 shellcheck git-mr + + test: + name: Test + strategy: + matrix: + os: ['ubuntu-20.04', 'ubuntu-22.04', 'windows-2019', 'macos-12'] + runs-on: ${{ matrix.os }} + steps: + + - name: Show versions + run: | + bash --version + git --version + + - name: Setup BATS + uses: mig4/setup-bats@v1 + with: + bats-version: 1.8.2 + + - name: Check out code + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Run tests on ${{ matrix.os }} + run: bash -c "bats --print-output-on-failure --formatter tap ./test" diff --git a/README.md b/README.md index 5124cca..ae2585c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # git-mr -[![Tests](https://github.com/Djuuu/git-mr/actions/workflows/test.yml/badge.svg)](https://github.com/Djuuu/git-mr/actions/workflows/test.yml) +[![Tests](https://github.com/Djuuu/git-mr/actions/workflows/tests.yml/badge.svg)](https://github.com/Djuuu/git-mr/actions/workflows/tests.yml) [![License](https://img.shields.io/badge/license-Beerware%20%F0%9F%8D%BA-yellow)](https://web.archive.org/web/20160322002352/http://www.cs.trincoll.edu/hfoss/wiki/Chris_Fei:_Beerware_License) Prepares a merge request description, with link to Jira ticket and current branch commit list. From 9b0a6d7476fdf34235c6181ed95eaf5f6783898c Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sun, 29 Jan 2023 18:23:43 +0100 Subject: [PATCH 43/88] Compatibility adjustments - sed regex - terminal support detection - check bash version - wc output discrepancies --- git-mr | 54 ++++++++++++++++++++++++++++-------------------- test/git-mr.bats | 35 +++++++++++++++---------------- 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/git-mr b/git-mr index 08ac1ae..bebe282 100755 --- a/git-mr +++ b/git-mr @@ -28,10 +28,10 @@ git_base_branch() { if [[ $(echo "$refs_logs" | wc -l) -gt 1 ]]; then base_branch=$( \ echo "$refs_logs" | - head -n2 | tail -n1 | # select closest decoration before current HEAD - sed 's/[a-f0-9]\+ (\([^)]*\)) .*/\1/' | # filters out everything but decorations - sed -e 's/, /\n/g' | # splits decorations - head -n1) # keep only first decoration + head -n2 | tail -n1 | # select closest decoration before current HEAD + sed 's/[a-f0-9]* (\([^)]*\)) .*/\1/' | # filters out everything but decorations + sed -e 's/, /\n/g' | # splits decorations + head -n1) # keep only first decoration fi # First possible merge base @@ -205,12 +205,34 @@ urlencode() { LC_ALL="$oLC_ALL" } +has_terminal_colors() { + if which tput > /dev/null 2>&1 && + [ -n "$TERM" ] && + [ "$(tput -T"$TERM" colors)" -ge 8 ]; then + return 0 + fi + return 1 +} + +has_colors() { + if [[ $GIT_MR_NO_COLORS -ne 1 ]] && has_terminal_colors; then + return 0 + fi + return 1 +} + +has_links() { + if [[ $GIT_MR_NO_TERMINAL_LINK -ne 1 ]] && has_terminal_colors; then + return 0 + fi + return 1 +} + # shellcheck disable=SC2034 # Ignore unused color variables colorize() { local input=$1 - if which tput > /dev/null 2>&1 && [ -n "$TERM" ] && [ "$(tput -T"$TERM" colors)" -ge 8 ]; then - + if has_colors; then local bold='\e[1m'; local nobold='\e[21m' local red='\e[31m'; local lightred='\e[91m' @@ -228,22 +250,11 @@ colorize() { done echo -en "$input" echo -en "$reset" - else echo "$input" fi } -has_links() { - if [[ $GIT_MR_NO_TERMINAL_LINK -ne 1 ]] && - which tput > /dev/null 2>&1 && - [ -n "$TERM" ] && - [ "$(tput -T"$TERM" colors)" -ge 8 ];then - return 0 - fi - return 1 -} - # https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda terminal_link() { local href=$1 @@ -1361,7 +1372,7 @@ mr_menu_print_title() { local current_index=$3 local search_url; search_url="https://${GITLAB_DOMAIN}/dashboard/merge_requests?scope=all&state=all&search=$(urlencode "$issue_code")&in=title&sort=created_asc" - local mr_count; mr_count=$(echo "$menu_items" | wc -l) + local mr_count; mr_count=$(echo "$menu_items" | wc -l | tr -d ' ') echo "================================================================================" [ -z "$current_index" ] && @@ -2259,9 +2270,8 @@ GIT_MR_MENU_UPDATE_CONTEXT_LINES=${GIT_MR_MENU_UPDATE_CONTEXT_LINES:-15} git rev-parse > /dev/null 2>&1 || exit_error 1 "Not a git repository" -if [ ! -x "$(command -v jq)" ]; then - exit_error 2 "Git-MR requires jq [https://stedolan.github.io/jq/]" -fi +[[ ! -x "$(command -v jq)" ]] && exit_error 2 "Git-MR requires jq [https://stedolan.github.io/jq/]" +[[ "${BASH_VERSINFO:-0}" -lt 4 ]] && exit_error 2 "Your bash version is too old: $BASH_VERSION" # Parse options @@ -2319,7 +2329,7 @@ esac # Error code reference: # # 1 Not a git repository -# 2 jq is not installed +# 2 Dependency missing (jq is not installed, bash is too old) # 3 Git branch error # # 10 Gitlab request error diff --git a/test/git-mr.bats b/test/git-mr.bats index d4eb62d..53b4344 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -9,6 +9,9 @@ load "test_helper/bats-assert/load" setup_file() { export LANG=C.UTF-8 # ensure tests handle UTF-8 properly + export GIT_MR_NO_COLORS=1 + export GIT_MR_NO_TERMINAL_LINK=1 + export JIRA_CODE_PATTERN="[A-Z]{2,3}-[0-9]+" export JIRA_INSTANCE= export JIRA_USER= @@ -323,8 +326,6 @@ full_sha() { # Misc. utilities @test "Exits with error" { - TERM=xterm-mono # disable colors - run exit_error 3 "Nope!" assert_failure assert_output --partial "Nope!" @@ -335,6 +336,19 @@ full_sha() { assert_output "Some%20%27string%27%26%22stuff%22%20%28that%20needs%20%5Bto%5D%20be%29%20encoded%21" } +@test "Checks terminal color support" { + TERM=xterm-256color + GIT_MR_NO_COLORS= + run has_colors; assert_success + + GIT_MR_NO_COLORS=1 + run has_colors; assert_failure + + GIT_MR_NO_COLORS= + TERM=ansi-mono # disable colors + run has_colors; assert_failure +} + @test "Checks terminal link support (sort of)" { TERM=xterm-256color GIT_MR_NO_TERMINAL_LINK= @@ -344,13 +358,11 @@ full_sha() { run has_links; assert_failure GIT_MR_NO_TERMINAL_LINK= - TERM=xterm-mono # disable colors + TERM=ansi-mono # disable colors run has_links; assert_failure } @test "Outputs conditionally depending on verbosity" { - TERM=xterm-mono # disable colors - GIT_MR_VERBOSE=1 run echo_debug "Some debug output" assert_success @@ -415,8 +427,6 @@ full_sha() { } @test "Has read-only mode" { - TERM=xterm-mono # disable colors - GIT_MR_READONLY=1 run git_mr_readonly assert_success @@ -534,8 +544,6 @@ full_sha() { } @test "Determines Gitlab project URL" { - TERM=xterm-mono # disable colors - GITLAB_DOMAIN="test.example.net" run gitlab_project_url @@ -574,8 +582,6 @@ full_sha() { } @test "Warns for Gitlab API request errors" { - TERM=xterm-mono # disable colors - run gitlab_check_error '{"error":"failed"}' assert_output "\nGitlab error:\n {\"error\":\"failed\"}\n ko" @@ -789,9 +795,6 @@ ko" } @test "Prints MR status indicators" { - - TERM=xterm-mono # disable colors - mr='{ "title": "Draft: Feature/XY-1234 Lorem Ipsum", "web_url":"https://gitlab.example.net/my/project/merge_requests/6", "labels":["Review","My Team"], "target_branch": "main", "upvotes": 1, "downvotes": 1, "merge_status": "cannot_be_merged", @@ -861,7 +864,6 @@ ko" @test "Updates MR description with new commits in new section" { load "test_helper/gitlab-mock-mr.bash" - TERM=xterm-mono # disable colors GIT_MR_EXTENDED= GIT_MR_UPDATE_NEW_SECTION=1 @@ -919,7 +921,6 @@ ko" @test "Updates MR description with new commits with extended description" { load "test_helper/gitlab-mock-mr-extended.bash" - TERM=xterm-mono # disable colors GIT_MR_EXTENDED=1 GIT_MR_UPDATE_NEW_SECTION= @@ -1020,8 +1021,6 @@ ko" @test "Searches MRs across projects to build menu" { load "test_helper/gitlab-mock-menu.bash" - TERM=xterm-mono # disable colors - run mr_menu assert_output "$(cat <<- EOF From 224f4b3624a1a8461731915cab1a23fa98f81d77 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sun, 29 Jan 2023 18:29:00 +0100 Subject: [PATCH 44/88] Wrapper functions for sed & grep Mac provides BSD sed & grep. git-mr expects GNU versions for some perl regexes. --- git-mr | 18 ++++++++++++++++++ test/git-mr.bats | 10 ++++++++++ 2 files changed, 28 insertions(+) diff --git a/git-mr b/git-mr index bebe282..d694e2c 100755 --- a/git-mr +++ b/git-mr @@ -179,6 +179,24 @@ git_titlize_branch() { ################################################################################ # Misc. utilities +# sed wrapper (use gsed if available on Mac) +sed() { + if type gsed >/dev/null 2>&1; then + gsed "$@" + else + command sed "$@" + fi +} + +# grep wrapper (use ggrep if available on Mac) +grep() { + if type ggrep >/dev/null 2>&1; then + ggrep "$@" + else + command grep "$@" + fi +} + exit_error() { local code=$1 local msg="$2" diff --git a/test/git-mr.bats b/test/git-mr.bats index 53b4344..a446351 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -119,6 +119,16 @@ full_sha() { assert_failure } +@test "Uses GNU commands" { + run sed --version + assert_success + assert_output --partial "GNU sed" + + run grep --version + assert_success + assert_output --partial "GNU grep" +} + @test "Determines current branch" { git switch main run git_current_branch From 14c474e1b1ae2a9c6390f67e4ee952415dcd0422 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sun, 29 Jan 2023 18:39:57 +0100 Subject: [PATCH 45/88] macOS tests and documentation --- .github/workflows/tests.yml | 38 ++++++++++++++++++++++++++++++++++++- README.md | 9 +++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 10026d7..51d5e81 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,9 +20,45 @@ jobs: name: Test strategy: matrix: - os: ['ubuntu-20.04', 'ubuntu-22.04', 'windows-2019', 'macos-12'] + os: + - ubuntu-20.04 + - ubuntu-22.04 + - windows-2019 runs-on: ${{ matrix.os }} steps: + - name: Show versions + run: | + bash --version + git --version + + - name: Setup BATS + uses: mig4/setup-bats@v1 + with: + bats-version: 1.8.2 + + - name: Check out code + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Run tests on ${{ matrix.os }} + run: bash -c "bats --print-output-on-failure --formatter tap ./test" + + test-mac: + name: Test (Mac) + strategy: + matrix: + os: + - macos-11 + - macos-12 + runs-on: ${{ matrix.os }} + steps: + - name: Install dependencies + run: | + brew install \ + bash \ + gnu-sed \ + grep - name: Show versions run: | diff --git a/README.md b/README.md index ae2585c..fa64286 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,15 @@ Prepares a merge request description, with link to Jira ticket and current branc * `bash`, `git` and usual command-line utilities: `grep`, `sed`, `curl`, `head`, `tail`, `tr`. * [**`jq`**](https://stedolan.github.io/jq/) is required and needs to be in PATH. +**Note for macOS users:** +> macOS usually comes with a pretty outdated version of Bash (3.x) and the BSD versions of `grep` and `sed`. +> You will need to install a more recent versions of bash (>=4.x) and the GNU versions of `sed` and `grep`. +> These are available on Homebrew: +> ```shell +> brew install bash gnu-sed grep +> ``` +> git-mr detects these versions, so no additional path adjustments should be necessary. + #### git-mr * Add the `git-mr` directory to your `PATH`
From 6ed48609d9343debf26ff4f67b8c5ca993b8292c Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 1 Feb 2023 23:59:43 +0100 Subject: [PATCH 46/88] Colorize labels depending on status --- doc/git-mr-menu-status.png | Bin 72965 -> 72820 bytes doc/git-mr-merge.png | Bin 121219 -> 121062 bytes doc/git-mr-status.png | Bin 27568 -> 27566 bytes git-mr | 32 +++++++++++++++++++++++++++----- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/doc/git-mr-menu-status.png b/doc/git-mr-menu-status.png index 49f51f6bc32711b16e9460c3257c7f91f7d0618a..0b08d09e1a4fad0f9a17a0f0d5f9f42572007f82 100644 GIT binary patch delta 55818 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

&(9ic4m`AwTeX{=hi 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 literal 121219 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

~OJPm3nbP?-|en|A^_vK4#oY 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 Qx35cFSVpKyK+pgG1D0n0UjP6A diff --git a/doc/git-mr-status.png b/doc/git-mr-status.png index 01469f735bc848f8dc2d23139f52a6e9960a3640..3fccca8c12c30baa96bca66d9f493c2951534ac4 100644 GIT binary patch literal 27566 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 literal 27568 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 P;QAyhsU%S=W)kv027dxI diff --git a/git-mr b/git-mr index d694e2c..875f5be 100755 --- a/git-mr +++ b/git-mr @@ -1248,20 +1248,33 @@ replace_labels() { is_status_label() { local label=$1 - local system_labels; system_labels=$(echo "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" | + local status_labels=${2:-"${GITLAB_OK_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}"} + status_labels=$(echo "$status_labels" | sed 's/,,/,/g' | sed 's/^,//' | sed 's/,$//' | tr "," "\n") local match - match="$( echo "$label" | grep "$system_labels")" || return + match="$( echo "$label" | grep "$status_labels")" || return # reverse-match is important, we don't want "Jean-Pierre BACRI Team" to match "CR" label - (echo "$system_labels" | grep "$match" > /dev/null) || return + (echo "$status_labels" | grep "$match" > /dev/null) || return echo "$match" } +is_status_cr_label() { + is_status_label "$1" "$GITLAB_CR_LABELS" +} + +is_status_qa_label() { + is_status_label "$1" "$GITLAB_QA_LABELS" +} + +is_status_ok_label() { + is_status_label "$1" "$GITLAB_OK_LABELS" +} + mr_format_labels() { local labels=$1 @@ -1271,8 +1284,15 @@ mr_format_labels() { local other_labels=() for label in "${labels_array[@]}"; do - if [ -n "$(is_status_label "$label")" ]; then - status_labels+=("$(colorize "[$label]" "lightpurple" "bold")") + if [ -n "$(is_status_cr_label "$label")" ]; then + # shellcheck disable=SC2086 # Allow splitting of terminal color + status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_CR_LABEL_COLOR:-lightblue bold})") + elif [ -n "$(is_status_qa_label "$label")" ]; then + # shellcheck disable=SC2086 # Allow splitting of terminal color + status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_QA_LABEL_COLOR:-lightpurple bold})") + elif [ -n "$(is_status_ok_label "$label")" ]; then + # shellcheck disable=SC2086 # Allow splitting of terminal color + status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_OK_LABEL_COLOR:-lightgreen})") else other_labels+=("[$label]") fi @@ -2314,6 +2334,8 @@ done set -- "${args[@]}" + + # Run case $1 in From 629032822272ddb85709e0a7717ddaf5a610219b Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 2 Feb 2023 01:26:38 +0100 Subject: [PATCH 47/88] Add git mr accept + refactor transitions + test --- README.md | 18 +++- git-mr | 100 ++++++++++++++---- git-mr-completion.bash | 3 +- test/git-mr.bats | 68 ++++++++++++ test/test_helper/gitlab-mock-menu.bash | 2 - test/test_helper/gitlab-mock-mr-extended.bash | 2 - test/test_helper/gitlab-mock-mr.bash | 2 - .../gitlab-mock-toggle-status.bash | 43 ++++++++ 8 files changed, 207 insertions(+), 31 deletions(-) create mode 100644 test/test_helper/gitlab-mock-toggle-status.bash diff --git a/README.md b/README.md index fa64286..7905c38 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Prepares a merge request description, with link to Jira ticket and current branc + [`git mr status`](#git-mr-status) + [`git mr update`](#git-mr-update) + [`git mr menu`](#git-mr-menu) - + [`git mr ip|cr|qa`](#git-mr-ipcrqa) + + [`git mr ip|cr|qa|accept`](#git-mr-ipcrqaaccept) + [`git mr undraft`](#git-mr-undraft) + [`git mr merge`](#git-mr-merge) + [`git mr hook`](#git-mr-hook) @@ -42,7 +42,7 @@ Prepares a merge request description, with link to Jira ticket and current branc git mr [OPTIONS] menu update [--all] [SEARCH_TERM] git mr [OPTIONS] menu status [SEARCH_TERM] -git mr [OPTIONS] (ip|cr|qa) [BRANCH] +git mr [OPTIONS] (ip|cr|qa|accept) [BRANCH] git mr [OPTIONS] undraft [BRANCH] git mr hook @@ -165,6 +165,7 @@ export GITLAB_OK_LABELS="Validated,Accepted" # Labels removed on IP, CR or QA st export JIRA_IP_ID="xx" # "In progress" status ID export JIRA_CR_ID="xx" # "Code review" status ID export JIRA_QA_ID="xx" # "Quality Assurance" status ID +export JIRA_OK_ID="xx" # "Accepted" status ID # Check "Delete source branch" by default (defaults to 1) export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 @@ -267,10 +268,10 @@ Searches for all (non-closed) merge requests with the current issue code in the ---------------------------------------------------------------- -### `git mr ip|cr|qa` +### `git mr ip|cr|qa|accept`

-git mr [OPTION...] ip|cr|qa [BRANCH]
+git mr [OPTION...] ip|cr|qa|accept [BRANCH]
 
This will: @@ -282,6 +283,7 @@ This will: - `JIRA_IP_ID` - `JIRA_CR_ID` - `JIRA_QA_ID` + - `JIRA_OK_ID` #### `git mr ip` _("in progress")_ * removes Gitlab labels defined in `GITLAB_CR_LABELS`, `GITLAB_QA_LABELS` and `GITLAB_OK_LABELS` @@ -297,6 +299,12 @@ This will: * adds Gitlab labels defined in `GITLAB_QA_LABELS` * sets Jira ticket to status ID defined in `JIRA_QA_ID` +#### `git mr accept` _("accepted")_ +* removes Gitlab labels defined in `GITLAB_CR_LABELS`, and `GITLAB_QA_LABELS` +* adds Gitlab labels defined in `GITLAB_OK_LABELS` +* removes Gitlab draft status +* sets Jira ticket to status ID defined in `JIRA_OK_ID` + ---------------------------------------------------------------- ### `git mr undraft` @@ -305,7 +313,7 @@ This will: git mr [OPTION...] undraft [BRANCH] -This will resolve the Gitlab _Work in Progress_ status. +This will resolve the Gitlab _Draft_ (_Work in Progress_) status. ---------------------------------------------------------------- diff --git a/git-mr b/git-mr index 875f5be..75cc651 100755 --- a/git-mr +++ b/git-mr @@ -1306,7 +1306,7 @@ mr_format_labels() { } mr_update_labels() { - local source_branch=${1:-$(git_current_branch)} + local mr_iid=$1 # strip leading & trailing label commas local to_remove; to_remove=$(echo -e "$2" | sed 's/^,*//' | sed 's/,*$//') @@ -1317,16 +1317,6 @@ mr_update_labels() { return fi - # Search existing merge request - local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -z "$mr_summary" ]; then - echo_error "Merge request not found" - mr_print "$source_branch" - return - fi - - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - # Load existing merge request details local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") || exit $? local labels; labels=$(gitlab_extract_labels "$merge_request") @@ -2104,7 +2094,16 @@ mr_ip() { local source_branch=${1:-$(git_current_branch)} local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} - mr_update_labels "${source_branch}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS},${GITLAB_CR_LABELS}" "" + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") + if [ -z "$mr_summary" ]; then + echo_error "Merge request not found" + mr_print "$source_branch" + return + fi + + local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + + mr_update_labels "${mr_iid}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS},${GITLAB_CR_LABELS}" "" if [ -n "$issue_code" ] && [ -n "$JIRA_IP_ID" ] && @@ -2126,7 +2125,16 @@ mr_cr() { local source_branch=${1:-$(git_current_branch)} local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} - mr_update_labels "${source_branch}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_CR_LABELS}" + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") + if [ -z "$mr_summary" ]; then + echo_error "Merge request not found" + mr_print "$source_branch" + return + fi + + local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + + mr_update_labels "${mr_iid}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_CR_LABELS}" if [ -n "$issue_code" ] && [ -n "$JIRA_CR_ID" ] && @@ -2148,7 +2156,16 @@ mr_qa() { local source_branch=${1:-$(git_current_branch)} local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} - mr_update_labels "${source_branch}" "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS}" "${GITLAB_QA_LABELS}" + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") + if [ -z "$mr_summary" ]; then + echo_error "Merge request not found" + mr_print "$source_branch" + return + fi + + local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + + mr_update_labels "${mr_iid}" "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS}" "${GITLAB_QA_LABELS}" if [ -n "$issue_code" ] && [ -n "$JIRA_QA_ID" ] && @@ -2160,6 +2177,49 @@ mr_qa() { if [ -z "$JIRA_QA_ID" ]; then echo_error "Set JIRA_QA_ID to be able to update Jira status\n"; fi } +mr_accept() { + git_mr_readonly show + + [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" + [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" + [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" + + local source_branch=${1:-$(git_current_branch)} + local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} + + local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") + if [ -z "$mr_summary" ]; then + echo_error "Merge request not found" + mr_print "$source_branch" + return + fi + + local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + + mr_update_labels "${mr_iid}" "${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_OK_LABELS}" + + local mr_title; mr_title=$(gitlab_extract_title "$mr_summary") + if gitlab_title_is_draft "$mr_title"; then + if confirm "Do you want to resolve draft status?"; then + echo -n "Resolving draft status... " + local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") + + mr_data=$(jq_build "title" "$undraft_title") || exit $? + local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") + + if [ -n "$result" ]; then echo -e "OK\n"; fi + fi + fi + + if [ -n "$issue_code" ] && + [ -n "$JIRA_OK_ID" ] && + confirm "Do you want to update the Jira ticket status to \"Accepted\"?"; then + echo -n "Updating Jira ticket status... " + jira_transition "$issue_code" "$JIRA_OK_ID" && echo -e "OK\n" + fi + if [ -z "$JIRA_OK_ID" ]; then echo_error "Set JIRA_OK_ID to be able to update Jira status\n"; fi +} + mr_hook() { git_mr_readonly show @@ -2197,8 +2257,8 @@ ${b}SYNOPSIS${r} ${u}git${r} ${u}mr${r} [OPTION...] menu update [--all] [SEARCH_TERM] ${u}git${r} ${u}mr${r} [OPTION...] menu status [SEARCH_TERM] - ${u}git${r} ${u}mr${r} [OPTION...] (ip|cr|qa) [BRANCH] - ${u}git${r} ${u}mr${r} [OPTION...] undraft [BRANCH] + ${u}git${r} ${u}mr${r} [OPTION...] (ip|cr|qa|accept) [BRANCH] + ${u}git${r} ${u}mr${r} [OPTION...] undraft [BRANCH] ${u}git${r} ${u}mr${r} hook @@ -2276,6 +2336,7 @@ ${b}CONFIGURATION${r} export JIRA_IP_ID="xx" # "In Progress" status ID export JIRA_CR_ID="xx" # "Code Review" status ID export JIRA_QA_ID="xx" # "Quality Assurance" status ID + export JIRA_OK_ID="xx" # "Accepted" status ID # Check "Delete source branch" by default (defaults to 1) export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 @@ -2348,9 +2409,10 @@ case $1 in menu) mr_menu "${@:2}" ;; - p|ip|IP) mr_ip "${@:2}" ;; - r|cr|CR) mr_cr "${@:2}" ;; - q|qa|QA) mr_qa "${@:2}" ;; + p|ip|IP) mr_ip "${@:2}" ;; + r|cr|CR) mr_cr "${@:2}" ;; + q|qa|QA) mr_qa "${@:2}" ;; + a|ac|accept) mr_accept "${@:2}" ;; undraft) gitlab_undraft "${@:2}" ;; diff --git a/git-mr-completion.bash b/git-mr-completion.bash index 60fe56f..4d2fe2b 100644 --- a/git-mr-completion.bash +++ b/git-mr-completion.bash @@ -11,7 +11,7 @@ _git_mr() { # Parse current command words to get context for w in "${words[@]}"; do case "$w" in - open|status|update|merge|menu|ip|cr|qa|undraft|hook|base|code|help) isAnyAction=1 ;; + open|status|update|merge|menu|ip|cr|qa|accept|undraft|hook|base|code|help) isAnyAction=1 ;; esac [[ $w == "menu" ]] && isMenu=1 if [[ -n "$isMenu" ]]; then @@ -73,6 +73,7 @@ _git_mr() { ip cr qa + accept undraft hook base diff --git a/test/git-mr.bats b/test/git-mr.bats index a446351..d7134a9 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1134,6 +1134,74 @@ This is an example without menu. * Ipsum" } +################################################################################ +# Status change functions + +@test "Toggles MR labels & Jira ticket status" { + load "test_helper/gitlab-mock-toggle-status.bash" + + GIT_MR_YES=1 + + GIT_MR_MOCK_LABELS='"Review","Testing","Accepted","My Team"' + run mr_ip + assert_output "$(cat <<- EOF + + -------------------------------------------------------------------------------- + + Do you want to update the merge request labels to "My Team"? -> yes + Updating merge request labels... OK + + Do you want to update the Jira ticket status to "In Progress"? -> yes + Updating Jira ticket status... OK + EOF + )" + + GIT_MR_MOCK_LABELS='"Testing","Accepted","My Team"' + run mr_cr + assert_output "$(cat <<- EOF + + -------------------------------------------------------------------------------- + + Do you want to update the merge request labels to "My Team,Review"? -> yes + Updating merge request labels... OK + + Do you want to update the Jira ticket status to "Code Review"? -> yes + Updating Jira ticket status... OK + EOF + )" + + GIT_MR_MOCK_LABELS='"Review","Accepted","My Team"' + run mr_qa + assert_output "$(cat <<- EOF + + -------------------------------------------------------------------------------- + + Do you want to update the merge request labels to "My Team,Testing"? -> yes + Updating merge request labels... OK + + Do you want to update the Jira ticket status to "Quality Assurance"? -> yes + Updating Jira ticket status... OK + EOF + )" + + GIT_MR_MOCK_LABELS='"Review","Testing","My Team"' + run mr_accept + assert_output "$(cat <<- EOF + + -------------------------------------------------------------------------------- + + Do you want to update the merge request labels to "My Team,Accepted"? -> yes + Updating merge request labels... OK + + Do you want to resolve draft status? -> yes + Resolving draft status... OK + + Do you want to update the Jira ticket status to "Accepted"? -> yes + Updating Jira ticket status... OK + EOF + )" +} + ################################################################################ # Merge request top-level functions diff --git a/test/test_helper/gitlab-mock-menu.bash b/test/test_helper/gitlab-mock-menu.bash index d802a61..aad7052 100644 --- a/test/test_helper/gitlab-mock-menu.bash +++ b/test/test_helper/gitlab-mock-menu.bash @@ -8,7 +8,6 @@ gitlab_request() { {"iid": 21,"title":"MR 21 title","web_url":"https://example.net/21","state":"opened","project_id": 2}, {"iid": 41,"title":"MR 41 title","web_url":"https://example.net/21","state":"closed","project_id": 4} ]' - return 0 ;; "projects?"*) @@ -18,7 +17,6 @@ gitlab_request() { {"id":3,"name":"Project C"}, {"id":4,"name":"Project D"} ]' - return 0 ;; *) diff --git a/test/test_helper/gitlab-mock-mr-extended.bash b/test/test_helper/gitlab-mock-mr-extended.bash index 02409f9..75973fd 100644 --- a/test/test_helper/gitlab-mock-mr-extended.bash +++ b/test/test_helper/gitlab-mock-mr-extended.bash @@ -3,7 +3,6 @@ gitlab_request() { case "$1" in "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") echo '[{"iid":1,"web_url":"https://gitlab.example.net/some/project/-/merge_requests/1"}]' - return 0 ;; "projects/my%2Fproject/merge_requests/1") @@ -23,7 +22,6 @@ gitlab_request() { "title":"My MR", "target_branch":"feature/base", "description":"'"$oldDesc"'" }' - return 0 ;; *) diff --git a/test/test_helper/gitlab-mock-mr.bash b/test/test_helper/gitlab-mock-mr.bash index 1ade793..74a2dff 100644 --- a/test/test_helper/gitlab-mock-mr.bash +++ b/test/test_helper/gitlab-mock-mr.bash @@ -3,7 +3,6 @@ gitlab_request() { case "$1" in "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") echo '[{"iid":1,"web_url":"https://gitlab.example.net/some/project/-/merge_requests/1"}]' - return 0 ;; "projects/my%2Fproject/merge_requests/1") @@ -19,7 +18,6 @@ gitlab_request() { "title":"My MR", "target_branch":"feature/base", "description":"'"$oldDesc"'" }' - return 0 ;; *) diff --git a/test/test_helper/gitlab-mock-toggle-status.bash b/test/test_helper/gitlab-mock-toggle-status.bash new file mode 100644 index 0000000..7daaeaa --- /dev/null +++ b/test/test_helper/gitlab-mock-toggle-status.bash @@ -0,0 +1,43 @@ +GITLAB_CR_LABELS="Review" +GITLAB_QA_LABELS="Testing" +GITLAB_OK_LABELS="Accepted" + +JIRA_INSTANCE="mycompany.example.net" +JIRA_USER="me" +JIRA_TOKEN="hcnoiuyrsqgl" +JIRA_IP_ID="110" +JIRA_CR_ID="120" +JIRA_QA_ID="130" +JIRA_OK_ID="140" + +mr_status_block() { + return 0 +} + +gitlab_request() { + case "$1" in + "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") + echo '[{"iid":1, "title":"Draft: My MR"}]' + ;; + + "projects/my%2Fproject/merge_requests/1") + echo '{"iid":1, "title":"Draft: My MR", "labels":['"$GIT_MR_MOCK_LABELS"']}' + ;; + + *) + echo "$1" > mr-accept-gitlab_request.log + return 1 + ;; + esac +} + +jira_request() { + case "$1" in + "issue/AB-123/transitions") + ;; + *) + echo "$1" > mr-accept-jira_request.log + return 1 + ;; + esac +} From b7bf1d3013eea9ca2726e242f170b0ad7f391039 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 2 Feb 2023 02:05:23 +0100 Subject: [PATCH 48/88] Fix formatting errors when colors are disabled --- git-mr | 2 +- test/git-mr.bats | 42 ++++++++++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/git-mr b/git-mr index 75cc651..c800f4e 100755 --- a/git-mr +++ b/git-mr @@ -269,7 +269,7 @@ colorize() { echo -en "$input" echo -en "$reset" else - echo "$input" + echo -en "$input" fi } diff --git a/test/git-mr.bats b/test/git-mr.bats index d7134a9..6420635 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -234,23 +234,23 @@ full_sha() { run git_check_branches "" main assert_failure - assert_output --partial "Not on any branch" + assert_output "Not on any branch" run git_check_branches test main assert_failure - assert_output --partial "Branch 'test' does not exist" + assert_output "Branch 'test' does not exist" run git_check_branches main epic/big-feature assert_failure - assert_output --partial "On default branch" + assert_output "On default branch" run git_check_branches master epic/big-feature assert_failure - assert_output --partial "On default branch" + assert_output "On default branch" run git_check_branches feature/base "" assert_failure - assert_output --partial "Unable to determine target branch" + assert_output "Unable to determine target branch" } @test "Lists current branch commits" { @@ -338,7 +338,7 @@ full_sha() { @test "Exits with error" { run exit_error 3 "Nope!" assert_failure - assert_output --partial "Nope!" + assert_output "Nope!" } @test "Encodes URL arguments" { @@ -376,7 +376,7 @@ full_sha() { GIT_MR_VERBOSE=1 run echo_debug "Some debug output" assert_success - assert_output --partial "Some debug output" + assert_output "Some debug output" GIT_MR_VERBOSE=0 run echo_debug "Some debug output" @@ -558,7 +558,7 @@ full_sha() { run gitlab_project_url assert_failure - assert_output --partial "$(cat <<- EOF + assert_output "$(cat <<- EOF Unable to determine Gitlab project URL, check GITLAB_DOMAIN configuration fs-local: ../remote current: GITLAB_DOMAIN="test.example.net" @@ -570,14 +570,14 @@ full_sha() { git remote add remote1 "git@${GITLAB_DOMAIN}:my/project.git" run gitlab_project_url assert_success - assert_output --partial "my/project" + assert_output "my/project" git remote remove remote1 # HTTPS URL git remote add gitlab1 "https://${GITLAB_DOMAIN}/my/project.git" run gitlab_project_url assert_success - assert_output --partial "my/project" + assert_output "my/project" git remote remove gitlab1 } @@ -593,12 +593,22 @@ full_sha() { @test "Warns for Gitlab API request errors" { run gitlab_check_error '{"error":"failed"}' - assert_output "\nGitlab error:\n {\"error\":\"failed\"}\n -ko" + assert_output "$(cat <<- EOF + + Gitlab error: + {"error":"failed"} + ko + EOF + )" run gitlab_check_error '{"message":"failed"}' - assert_output "\nGitlab error:\n {\"message\":\"failed\"}\n -ko" + assert_output "$(cat <<- EOF + + Gitlab error: + {"message":"failed"} + ko + EOF + )" } @test "Determines new merge request URL" { @@ -609,7 +619,7 @@ ko" } run gitlab_new_merge_request_url - assert_output --partial "Target branch 'feature/base' does not exist on remote" + assert_output "Target branch 'feature/base' does not exist on remote" # bypass remote branch existence check git_remote_branch_exists() { return 0; } @@ -751,7 +761,7 @@ ko" git switch feature/base run git-mr code - assert_output --partial "Unable to guess issue code" + assert_output "Unable to guess issue code" } @test "Generates MR title from Jira issue title" { From c823e5b31c1b1bee809384c5aa735478e8c4581d Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 2 Feb 2023 09:31:48 +0100 Subject: [PATCH 49/88] Fix grep warning --- git-mr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-mr b/git-mr index c800f4e..2466c89 100755 --- a/git-mr +++ b/git-mr @@ -332,7 +332,7 @@ jq_build() { local value=${2} local initial_data=${3:-"{}"} - local is_obj; is_obj=$(echo "$value" | grep '^\{.*\}$') + local is_obj; is_obj=$(echo "$value" | grep '^{.*}$') local is_num; is_num=$(echo "$value" | grep '^[0-9]*$') local current_object From 6be113ce4eb51fac3450b88677edb468c1330c2c Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 3 Feb 2023 21:16:54 +0100 Subject: [PATCH 50/88] List available Jira transitions when conf is missing --- README.md | 20 ++--- git-mr | 84 ++++++++++++------- test/git-mr.bats | 15 +++- .../gitlab-mock-toggle-status.bash | 16 +++- 4 files changed, 90 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 7905c38..cd546a7 100644 --- a/README.md +++ b/README.md @@ -161,11 +161,11 @@ export GITLAB_CR_LABELS="Review" # Labels set on CR step export GITLAB_QA_LABELS="Testing" # Labels set on QA step export GITLAB_OK_LABELS="Validated,Accepted" # Labels removed on IP, CR or QA steps -# Jira status IDs -export JIRA_IP_ID="xx" # "In progress" status ID -export JIRA_CR_ID="xx" # "Code review" status ID -export JIRA_QA_ID="xx" # "Quality Assurance" status ID -export JIRA_OK_ID="xx" # "Accepted" status ID +# Jira status - transition IDs +export JIRA_IP_ID="xx" # "In progress" transition ID +export JIRA_CR_ID="xx" # "Code review" transition ID +export JIRA_QA_ID="xx" # "Quality Assurance" transition ID +export JIRA_OK_ID="xx" # "Accepted" transition ID # Check "Delete source branch" by default (defaults to 1) export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 @@ -279,7 +279,7 @@ This will: - `GITLAB_CR_LABELS` - `GITLAB_QA_LABELS` - `GITLAB_OK_LABELS` -* set Jira ticket to status ID defined in: +* transition Jira ticket using ID defined in: - `JIRA_IP_ID` - `JIRA_CR_ID` - `JIRA_QA_ID` @@ -287,23 +287,23 @@ This will: #### `git mr ip` _("in progress")_ * removes Gitlab labels defined in `GITLAB_CR_LABELS`, `GITLAB_QA_LABELS` and `GITLAB_OK_LABELS` -* sets Jira ticket to status ID defined in `JIRA_IP_ID` +* transitions Jira ticket using `JIRA_IP_ID` #### `git mr cr` _("code review")_ * removes Gitlab labels defined in `GITLAB_QA_LABELS`, and `GITLAB_OK_LABELS` * adds Gitlab labels defined in `GITLAB_CR_LABELS` -* sets Jira ticket to status ID defined in `JIRA_CR_ID` +* transitions Jira ticket using `JIRA_CR_ID` #### `git mr qa` _("quality assurance")_ * removes Gitlab labels defined in `GITLAB_CR_LABELS`, and `GITLAB_OK_LABELS` * adds Gitlab labels defined in `GITLAB_QA_LABELS` -* sets Jira ticket to status ID defined in `JIRA_QA_ID` +* transitions Jira ticket using `JIRA_QA_ID` #### `git mr accept` _("accepted")_ * removes Gitlab labels defined in `GITLAB_CR_LABELS`, and `GITLAB_QA_LABELS` * adds Gitlab labels defined in `GITLAB_OK_LABELS` * removes Gitlab draft status -* sets Jira ticket to status ID defined in `JIRA_OK_ID` +* transitions Jira ticket using `JIRA_OK_ID` ---------------------------------------------------------------- diff --git a/git-mr b/git-mr index 2466c89..183036b 100755 --- a/git-mr +++ b/git-mr @@ -477,6 +477,21 @@ jira_ticket_data() { jira_request "issue/${issue_code}?fields=summary" || exit $? } +jira_show_transitions() { + local issue_code=${1:-${GIT_MR_CODE:-$(guess_issue_code "$(git_current_branch)")}} + + echo "Available Jira transitions:" + echo + jira_request "issue/${issue_code}/transitions" | + jq -r '.transitions[] | [ + "", .id, + "\"" + .name + "\"" + (" " * (23 - (.name | length))), + "-> " + (.to | .name + (" " * (23 - (.name | length)))), + "[" + .to.statusCategory.name + "]" + ] | @tsv' | + sed 's/\r//g' +} + jira_transition() { jira_check_env @@ -2105,14 +2120,15 @@ mr_ip() { mr_update_labels "${mr_iid}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS},${GITLAB_CR_LABELS}" "" - if [ -n "$issue_code" ] && - [ -n "$JIRA_IP_ID" ] && - confirm "Do you want to update the Jira ticket status to \"In Progress\"?"; then - echo -n "Updating Jira ticket status... " - - jira_transition "$issue_code" "$JIRA_IP_ID" && echo -e "OK\n" + if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"In Progress\"?"; then + if [ -n "$JIRA_IP_ID" ]; then + echo -n "Updating Jira ticket status... " + jira_transition "$issue_code" "$JIRA_IP_ID" && echo -e "OK\n" + else + echo_error "\nSet JIRA_IP_ID to be able to update Jira status\n" + jira_show_transitions "$issue_code" + fi fi - if [ -z "$JIRA_IP_ID" ]; then echo_error "Set JIRA_IP_ID to be able to update Jira status\n"; fi } mr_cr() { @@ -2136,14 +2152,15 @@ mr_cr() { mr_update_labels "${mr_iid}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_CR_LABELS}" - if [ -n "$issue_code" ] && - [ -n "$JIRA_CR_ID" ] && - confirm "Do you want to update the Jira ticket status to \"Code Review\"?"; then - echo -n "Updating Jira ticket status... " - - jira_transition "$issue_code" "$JIRA_CR_ID" && echo -e "OK\n" + if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"Code Review\"?"; then + if [ -n "$JIRA_CR_ID" ]; then + echo -n "Updating Jira ticket status... " + jira_transition "$issue_code" "$JIRA_CR_ID" && echo -e "OK\n" + else + echo_error "\nSet JIRA_CR_ID to be able to update Jira status\n" + jira_show_transitions "$issue_code" + fi fi - if [ -z "$JIRA_CR_ID" ]; then echo_error "Set JIRA_CR_ID to be able to update Jira status\n"; fi } mr_qa() { @@ -2167,14 +2184,15 @@ mr_qa() { mr_update_labels "${mr_iid}" "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS}" "${GITLAB_QA_LABELS}" - if [ -n "$issue_code" ] && - [ -n "$JIRA_QA_ID" ] && - confirm "Do you want to update the Jira ticket status to \"Quality Assurance\"?"; then - echo -n "Updating Jira ticket status... " - - jira_transition "$issue_code" "$JIRA_QA_ID" && echo -e "OK\n" + if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"Quality Assurance\"?"; then + if [ -n "$JIRA_QA_ID" ]; then + echo -n "Updating Jira ticket status... " + jira_transition "$issue_code" "$JIRA_QA_ID" && echo -e "OK\n" + else + echo_error "\nSet JIRA_QA_ID to be able to update Jira status\n" + jira_show_transitions "$issue_code" + fi fi - if [ -z "$JIRA_QA_ID" ]; then echo_error "Set JIRA_QA_ID to be able to update Jira status\n"; fi } mr_accept() { @@ -2211,13 +2229,15 @@ mr_accept() { fi fi - if [ -n "$issue_code" ] && - [ -n "$JIRA_OK_ID" ] && - confirm "Do you want to update the Jira ticket status to \"Accepted\"?"; then - echo -n "Updating Jira ticket status... " - jira_transition "$issue_code" "$JIRA_OK_ID" && echo -e "OK\n" + if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"Accepted\"?"; then + if [ -n "$JIRA_OK_ID" ]; then + echo -n "Updating Jira ticket status... " + jira_transition "$issue_code" "$JIRA_OK_ID" && echo -e "OK\n" + else + echo_error "\nSet JIRA_OK_ID to be able to update Jira status\n" + jira_show_transitions "$issue_code" + fi fi - if [ -z "$JIRA_OK_ID" ]; then echo_error "Set JIRA_OK_ID to be able to update Jira status\n"; fi } mr_hook() { @@ -2332,11 +2352,11 @@ ${b}CONFIGURATION${r} export GITLAB_QA_LABELS="Testing" # Labels set on QA step export GITLAB_OK_LABELS="Validated,Accepted" # Labels removed on IP, CR or QA steps - # Jira status IDs - export JIRA_IP_ID="xx" # "In Progress" status ID - export JIRA_CR_ID="xx" # "Code Review" status ID - export JIRA_QA_ID="xx" # "Quality Assurance" status ID - export JIRA_OK_ID="xx" # "Accepted" status ID + # Jira status - transition IDs + export JIRA_IP_ID="xx" # "In Progress" transition ID + export JIRA_CR_ID="xx" # "Code Review" transition ID + export JIRA_QA_ID="xx" # "Quality Assurance" transition ID + export JIRA_OK_ID="xx" # "Accepted" transition ID # Check "Delete source branch" by default (defaults to 1) export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 diff --git a/test/git-mr.bats b/test/git-mr.bats index 6420635..aeb1b3c 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1196,7 +1196,8 @@ This is an example without menu. GIT_MR_MOCK_LABELS='"Review","Testing","My Team"' run mr_accept - assert_output "$(cat <<- EOF + tab=$'\t' + assert_output "$(cat <<-EOF -------------------------------------------------------------------------------- @@ -1207,7 +1208,17 @@ This is an example without menu. Resolving draft status... OK Do you want to update the Jira ticket status to "Accepted"? -> yes - Updating Jira ticket status... OK + + Set JIRA_OK_ID to be able to update Jira status + + Available Jira transitions: + + ${tab}1${tab}"TODO" ${tab}-> TODO ${tab}[To Do] + ${tab}2${tab}"In Progress" ${tab}-> In Progress ${tab}[In Progress] + ${tab}3${tab}"Code Review" ${tab}-> Code Review ${tab}[In Progress] + ${tab}4${tab}"QA" ${tab}-> QA ${tab}[In Progress] + ${tab}5${tab}"Ready to go" ${tab}-> Ready to go ${tab}[In Progress] + ${tab}6${tab}"Delivered" ${tab}-> Delivered ${tab}[Done] EOF )" } diff --git a/test/test_helper/gitlab-mock-toggle-status.bash b/test/test_helper/gitlab-mock-toggle-status.bash index 7daaeaa..a1adefa 100644 --- a/test/test_helper/gitlab-mock-toggle-status.bash +++ b/test/test_helper/gitlab-mock-toggle-status.bash @@ -8,7 +8,7 @@ JIRA_TOKEN="hcnoiuyrsqgl" JIRA_IP_ID="110" JIRA_CR_ID="120" JIRA_QA_ID="130" -JIRA_OK_ID="140" +JIRA_OK_ID= mr_status_block() { return 0 @@ -34,7 +34,21 @@ gitlab_request() { jira_request() { case "$1" in "issue/AB-123/transitions") + + if [[ "$2" = "POST" ]]; then + return 0; + fi + + echo '{"transitions": [ + {"id":"1", "name":"TODO", "to":{"id":"1", "name":"TODO", "statusCategory":{"name":"To Do"}}}, + {"id":"2", "name":"In Progress", "to":{"id":"2", "name":"In Progress", "statusCategory":{"name":"In Progress"}}}, + {"id":"3", "name":"Code Review", "to":{"id":"3", "name":"Code Review", "statusCategory":{"name":"In Progress"}}}, + {"id":"4", "name":"QA", "to":{"id":"4", "name":"QA", "statusCategory":{"name":"In Progress"}}}, + {"id":"5", "name":"Ready to go", "to":{"id":"5", "name":"Ready to go", "statusCategory":{"name":"In Progress"}}}, + {"id":"6", "name":"Delivered", "to":{"id":"6", "name":"Delivered", "statusCategory":{"name":"Done"}}} + ]}' ;; + *) echo "$1" > mr-accept-jira_request.log return 1 From 41e0381fc0aecbe0ef1d51d08e1e28f8fb1e307e Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 3 Feb 2023 22:59:06 +0100 Subject: [PATCH 51/88] Introduce Gitlab "in progress" labels For coherence with other steps --- README.md | 15 ++++++---- doc/generate-sample-output.sh | 7 +++-- git-mr | 26 +++++++++++------ test/git-mr.bats | 29 ++++++++++++------- .../gitlab-mock-toggle-status.bash | 3 +- 5 files changed, 51 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index cd546a7..006dfb1 100644 --- a/README.md +++ b/README.md @@ -157,9 +157,10 @@ Other optional configuration variables: export GITLAB_DEFAULT_LABELS="Review,My Team" # Gitlab status labels (comma-separated, without spaces in between) -export GITLAB_CR_LABELS="Review" # Labels set on CR step -export GITLAB_QA_LABELS="Testing" # Labels set on QA step -export GITLAB_OK_LABELS="Validated,Accepted" # Labels removed on IP, CR or QA steps +export GITLAB_IP_LABELS="WIP" # Label(s) set on IP step +export GITLAB_CR_LABELS="Review" # Label(s) set on CR step +export GITLAB_QA_LABELS="Testing" # Label(s) set on QA step +export GITLAB_OK_LABELS="Accepted" # Label(s) set on Accepted step # Jira status - transition IDs export JIRA_IP_ID="xx" # "In progress" transition ID @@ -276,6 +277,7 @@ Searches for all (non-closed) merge requests with the current issue code in the This will: * Set Gitlab labels according to: + - `GITLAB_IP_LABELS` - `GITLAB_CR_LABELS` - `GITLAB_QA_LABELS` - `GITLAB_OK_LABELS` @@ -287,20 +289,21 @@ This will: #### `git mr ip` _("in progress")_ * removes Gitlab labels defined in `GITLAB_CR_LABELS`, `GITLAB_QA_LABELS` and `GITLAB_OK_LABELS` +* adds Gitlab labels defined in `GITLAB_IP_LABELS` * transitions Jira ticket using `JIRA_IP_ID` #### `git mr cr` _("code review")_ -* removes Gitlab labels defined in `GITLAB_QA_LABELS`, and `GITLAB_OK_LABELS` +* removes Gitlab labels defined in `GITLAB_IP_LABELS`, `GITLAB_QA_LABELS`, and `GITLAB_OK_LABELS` * adds Gitlab labels defined in `GITLAB_CR_LABELS` * transitions Jira ticket using `JIRA_CR_ID` #### `git mr qa` _("quality assurance")_ -* removes Gitlab labels defined in `GITLAB_CR_LABELS`, and `GITLAB_OK_LABELS` +* removes Gitlab labels defined in `GITLAB_IP_LABELS`, `GITLAB_CR_LABELS`, and `GITLAB_OK_LABELS` * adds Gitlab labels defined in `GITLAB_QA_LABELS` * transitions Jira ticket using `JIRA_QA_ID` #### `git mr accept` _("accepted")_ -* removes Gitlab labels defined in `GITLAB_CR_LABELS`, and `GITLAB_QA_LABELS` +* removes Gitlab labels defined in `GITLAB_IP_LABELS`, `GITLAB_CR_LABELS`, and `GITLAB_QA_LABELS` * adds Gitlab labels defined in `GITLAB_OK_LABELS` * removes Gitlab draft status * transitions Jira ticket using `JIRA_OK_ID` diff --git a/doc/generate-sample-output.sh b/doc/generate-sample-output.sh index 95cf9f1..e64d242 100755 --- a/doc/generate-sample-output.sh +++ b/doc/generate-sample-output.sh @@ -14,9 +14,10 @@ pushd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null . ../git-mr -GITLAB_OK_LABELS="Accepted" -GITLAB_QA_LABELS="Testing" +GITLAB_IP_LABELS="WIP" GITLAB_CR_LABELS="Review" +GITLAB_QA_LABELS="Testing" +GITLAB_OK_LABELS="Accepted" issue_code="XY-1234" @@ -99,7 +100,7 @@ sample_mr_status() { local mr='{ "title": "Draft: '"$mr_title"'", "web_url":"'"$mr_url"'", - "labels":["Review","My Team"], "target_branch": "main", + "labels":["WIP","My Team"], "target_branch": "main", "upvotes": 1, "downvotes": 1, "merge_status": "cannot_be_merged", "head_pipeline": {"status":"failed", "web_url":"https://myapp.gitlab.com/my/project/pipelines/6"} }' diff --git a/git-mr b/git-mr index 183036b..b92d7e2 100755 --- a/git-mr +++ b/git-mr @@ -1263,7 +1263,7 @@ replace_labels() { is_status_label() { local label=$1 - local status_labels=${2:-"${GITLAB_OK_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}"} + local status_labels=${2:-"${GITLAB_IP_LABELS},${GITLAB_OK_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}"} status_labels=$(echo "$status_labels" | sed 's/,,/,/g' | sed 's/^,//' | sed 's/,$//' | @@ -1278,6 +1278,10 @@ is_status_label() { echo "$match" } +is_status_ip_label() { + is_status_label "$1" "$GITLAB_IP_LABELS" +} + is_status_cr_label() { is_status_label "$1" "$GITLAB_CR_LABELS" } @@ -1299,7 +1303,10 @@ mr_format_labels() { local other_labels=() for label in "${labels_array[@]}"; do - if [ -n "$(is_status_cr_label "$label")" ]; then + if [ -n "$(is_status_ip_label "$label")" ]; then + # shellcheck disable=SC2086 # Allow splitting of terminal color + status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_IP_LABEL_COLOR:-orange})") + elif [ -n "$(is_status_cr_label "$label")" ]; then # shellcheck disable=SC2086 # Allow splitting of terminal color status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_CR_LABEL_COLOR:-lightblue bold})") elif [ -n "$(is_status_qa_label "$label")" ]; then @@ -2118,7 +2125,7 @@ mr_ip() { local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - mr_update_labels "${mr_iid}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS},${GITLAB_CR_LABELS}" "" + mr_update_labels "${mr_iid}" "${GITLAB_CR_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" "${GITLAB_IP_LABELS}" if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"In Progress\"?"; then if [ -n "$JIRA_IP_ID" ]; then @@ -2150,7 +2157,7 @@ mr_cr() { local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - mr_update_labels "${mr_iid}" "${GITLAB_OK_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_CR_LABELS}" + mr_update_labels "${mr_iid}" "${GITLAB_IP_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" "${GITLAB_CR_LABELS}" if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"Code Review\"?"; then if [ -n "$JIRA_CR_ID" ]; then @@ -2182,7 +2189,7 @@ mr_qa() { local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - mr_update_labels "${mr_iid}" "${GITLAB_OK_LABELS},${GITLAB_CR_LABELS}" "${GITLAB_QA_LABELS}" + mr_update_labels "${mr_iid}" "${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_OK_LABELS}" "${GITLAB_QA_LABELS}" if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"Quality Assurance\"?"; then if [ -n "$JIRA_QA_ID" ]; then @@ -2214,7 +2221,7 @@ mr_accept() { local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - mr_update_labels "${mr_iid}" "${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_OK_LABELS}" + mr_update_labels "${mr_iid}" "${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_OK_LABELS}" local mr_title; mr_title=$(gitlab_extract_title "$mr_summary") if gitlab_title_is_draft "$mr_title"; then @@ -2348,9 +2355,10 @@ ${b}CONFIGURATION${r} export GITLAB_DEFAULT_LABELS="Review,My Team" # Gitlab status labels (comma-separated, without spaces in between) - export GITLAB_CR_LABELS="Review" # Labels set on CR step - export GITLAB_QA_LABELS="Testing" # Labels set on QA step - export GITLAB_OK_LABELS="Validated,Accepted" # Labels removed on IP, CR or QA steps + export GITLAB_IP_LABELS="WIP" # Label(s) set on IP step + export GITLAB_CR_LABELS="Review" # Label(s) set on CR step + export GITLAB_QA_LABELS="Testing" # Label(s) set on QA step + export GITLAB_OK_LABELS="Validated" # Label(s) set on Accepted step # Jira status - transition IDs export JIRA_IP_ID="xx" # "In Progress" transition ID diff --git a/test/git-mr.bats b/test/git-mr.bats index aeb1b3c..14e351c 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1013,16 +1013,24 @@ full_sha() { } @test "Identifies workflow-specific labels" { + GITLAB_IP_LABELS="wip1,wip2" GITLAB_CR_LABELS="cr1,cr2" GITLAB_QA_LABELS="qa1,qa2" GITLAB_OK_LABELS="ok1,ok2" - run is_status_label "cr1"; assert_output "cr1" - run is_status_label "cr2"; assert_output "cr2" - run is_status_label "qa1"; assert_output "qa1" - run is_status_label "qa2"; assert_output "qa2" - run is_status_label "ok1"; assert_output "ok1" - run is_status_label "ok2"; assert_output "ok2" + run is_status_label "wip1"; assert_output "wip1" + run is_status_label "wip2"; assert_output "wip2" + run is_status_label "cr1"; assert_output "cr1" + run is_status_label "cr2"; assert_output "cr2" + run is_status_label "qa1"; assert_output "qa1" + run is_status_label "qa2"; assert_output "qa2" + run is_status_label "ok1"; assert_output "ok1" + run is_status_label "ok2"; assert_output "ok2" + + run is_status_ip_label "wip1"; assert_output "wip1"; run is_status_ip_label "cr1"; assert_output "" + run is_status_cr_label "cr1"; assert_output "cr1"; run is_status_cr_label "qa1"; assert_output "" + run is_status_qa_label "qa1"; assert_output "qa1"; run is_status_qa_label "ok1"; assert_output "" + run is_status_ok_label "ok1"; assert_output "ok1"; run is_status_ok_label "wip1"; assert_output "" run is_status_label "test"; assert_output "" run is_status_label "zcr12"; assert_output "" @@ -1158,7 +1166,7 @@ This is an example without menu. -------------------------------------------------------------------------------- - Do you want to update the merge request labels to "My Team"? -> yes + Do you want to update the merge request labels to "My Team,WIP"? -> yes Updating merge request labels... OK Do you want to update the Jira ticket status to "In Progress"? -> yes @@ -1166,7 +1174,7 @@ This is an example without menu. EOF )" - GIT_MR_MOCK_LABELS='"Testing","Accepted","My Team"' + GIT_MR_MOCK_LABELS='"WIP","Testing","Accepted","My Team"' run mr_cr assert_output "$(cat <<- EOF @@ -1180,7 +1188,7 @@ This is an example without menu. EOF )" - GIT_MR_MOCK_LABELS='"Review","Accepted","My Team"' + GIT_MR_MOCK_LABELS='"WIP","Review","Accepted","My Team"' run mr_qa assert_output "$(cat <<- EOF @@ -1194,7 +1202,8 @@ This is an example without menu. EOF )" - GIT_MR_MOCK_LABELS='"Review","Testing","My Team"' + GIT_MR_MOCK_LABELS='"WIP","Review","Testing","My Team"' + JIRA_OK_ID= # no Jira transition run mr_accept tab=$'\t' assert_output "$(cat <<-EOF diff --git a/test/test_helper/gitlab-mock-toggle-status.bash b/test/test_helper/gitlab-mock-toggle-status.bash index a1adefa..d92e836 100644 --- a/test/test_helper/gitlab-mock-toggle-status.bash +++ b/test/test_helper/gitlab-mock-toggle-status.bash @@ -1,3 +1,4 @@ +GITLAB_IP_LABELS="WIP" GITLAB_CR_LABELS="Review" GITLAB_QA_LABELS="Testing" GITLAB_OK_LABELS="Accepted" @@ -8,7 +9,7 @@ JIRA_TOKEN="hcnoiuyrsqgl" JIRA_IP_ID="110" JIRA_CR_ID="120" JIRA_QA_ID="130" -JIRA_OK_ID= +JIRA_OK_ID="140" mr_status_block() { return 0 From 90f6a4ecfe7c531fe000a66b8ff763b2b2986ffc Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 3 Feb 2023 23:00:02 +0100 Subject: [PATCH 52/88] Allow empty Gitlab labels --- git-mr | 16 ---------------- test/git-mr.bats | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/git-mr b/git-mr index b92d7e2..16703c5 100755 --- a/git-mr +++ b/git-mr @@ -2109,10 +2109,6 @@ mr_menu() { mr_ip() { git_mr_readonly show - [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" - [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" - [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" - local source_branch=${1:-$(git_current_branch)} local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} @@ -2141,10 +2137,6 @@ mr_ip() { mr_cr() { git_mr_readonly show - [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" - [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" - [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" - local source_branch=${1:-$(git_current_branch)} local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} @@ -2173,10 +2165,6 @@ mr_cr() { mr_qa() { git_mr_readonly show - [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" - [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" - [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" - local source_branch=${1:-$(git_current_branch)} local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} @@ -2205,10 +2193,6 @@ mr_qa() { mr_accept() { git_mr_readonly show - [ -n "$GITLAB_CR_LABELS" ] || echo_error "GITLAB_CR_LABELS is not set" - [ -n "$GITLAB_QA_LABELS" ] || echo_error "GITLAB_QA_LABELS is not set" - [ -n "$GITLAB_OK_LABELS" ] || echo_error "GITLAB_OK_LABELS is not set" - local source_branch=${1:-$(git_current_branch)} local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} diff --git a/test/git-mr.bats b/test/git-mr.bats index 14e351c..519c3ff 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1160,6 +1160,22 @@ This is an example without menu. GIT_MR_YES=1 + GITLAB_IP_LABELS="" # labels can be empty for a given step + GIT_MR_MOCK_LABELS='"Review","Testing","Accepted","My Team"' + run mr_ip + assert_output "$(cat <<- EOF + + -------------------------------------------------------------------------------- + + Do you want to update the merge request labels to "My Team"? -> yes + Updating merge request labels... OK + + Do you want to update the Jira ticket status to "In Progress"? -> yes + Updating Jira ticket status... OK + EOF + )" + + GITLAB_IP_LABELS="WIP" GIT_MR_MOCK_LABELS='"Review","Testing","Accepted","My Team"' run mr_ip assert_output "$(cat <<- EOF From 4700fbcadfcc462e6e139f9e3b71fec5545844e8 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 3 Feb 2023 23:00:42 +0100 Subject: [PATCH 53/88] Don't update labels if unchanged --- git-mr | 17 ++++++++++++++++- test/git-mr.bats | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/git-mr b/git-mr index 16703c5..89c1af7 100755 --- a/git-mr +++ b/git-mr @@ -1260,6 +1260,20 @@ replace_labels() { echo "$labels" } +labels_differ() { + local old_labels=$1 + local new_labels=$2 + + [[ $old_labels = "$new_labels" ]] && return 1 + + local old_sorted; old_sorted=$(echo "$old_labels" | tr "," "\n" | grep . | sort -u | tr "\n" ",") + local new_sorted; new_sorted=$(echo "$new_labels" | tr "," "\n" | grep . | sort -u | tr "\n" ",") + + [[ $old_sorted = "$new_sorted" ]] && return 1 + + return 0 +} + is_status_label() { local label=$1 @@ -1350,7 +1364,8 @@ mr_update_labels() { echo local new_labels; new_labels=$(replace_labels "$labels" "$to_remove" "$to_add") - if confirm "Do you want to update the merge request labels to \"$new_labels\"?"; then + if labels_differ "$labels" "$new_labels" && + confirm "Do you want to update the merge request labels to \"$new_labels\"?"; then echo -n "Updating merge request labels... " mr_data=$(jq_build "labels" "$new_labels") || exit $? diff --git a/test/git-mr.bats b/test/git-mr.bats index 519c3ff..b5504f8 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1012,6 +1012,30 @@ full_sha() { assert_output "toto,tata,plop,pouet" } +@test "Compares labels" { + run labels_differ; assert_failure + run labels_differ "aaa" "aaa"; assert_failure + run labels_differ "aaa,bbb" "aaa,bbb"; assert_failure + + run labels_differ "aaa,bbb" ""; assert_success + run labels_differ "aaa,bbb" "aaa,bbb,ccc"; assert_success + run labels_differ "aaa,ccc" "aaa,bbb,ccc"; assert_success + run labels_differ "aaa,bbb,ccc" "aaa,bbb"; assert_success + run labels_differ "aaa,bbb,ccc" "aaa,ccc"; assert_success + run labels_differ "" "aaa,bbb,ccc"; assert_success + + run labels_differ "aaa,bbb,ccc" "aaa,bbb,ccc"; assert_failure + run labels_differ "aaa,bbb,ccc" "aaa,ccc,bbb"; assert_failure + run labels_differ "aaa,bbb,ccc" "bbb,aaa,ccc"; assert_failure + run labels_differ "aaa,bbb,ccc" "bbb,ccc,aaa"; assert_failure + run labels_differ "aaa,bbb,ccc" "ccc,aaa,bbb"; assert_failure + run labels_differ "aaa,bbb,ccc" "ccc,bbb,aaa"; assert_failure + + run labels_differ "aaa,bbb,ccc" "ccc,bbb,aaa,ccc"; assert_failure + + run labels_differ "aaa,bbb,ccc" ",,ccc,bbb,aaa,,ccc"; assert_failure +} + @test "Identifies workflow-specific labels" { GITLAB_IP_LABELS="wip1,wip2" GITLAB_CR_LABELS="cr1,cr2" @@ -1218,6 +1242,17 @@ This is an example without menu. EOF )" + GIT_MR_MOCK_LABELS='"Testing","My Team"' # no label change + run mr_qa + assert_output "$(cat <<- EOF + + -------------------------------------------------------------------------------- + + Do you want to update the Jira ticket status to "Quality Assurance"? -> yes + Updating Jira ticket status... OK + EOF + )" + GIT_MR_MOCK_LABELS='"WIP","Review","Testing","My Team"' JIRA_OK_ID= # no Jira transition run mr_accept From f36d703370c35843bb772c362c58f815f370964e Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 4 Feb 2023 04:43:16 +0100 Subject: [PATCH 54/88] Refactor status transitions --- git-mr | 232 ++++++++---------- test/git-mr.bats | 156 ++++++++---- ...tatus.bash => gitlab-mock-transition.bash} | 0 3 files changed, 206 insertions(+), 182 deletions(-) rename test/test_helper/{gitlab-mock-toggle-status.bash => gitlab-mock-transition.bash} (100%) diff --git a/git-mr b/git-mr index 89c1af7..58973d5 100755 --- a/git-mr +++ b/git-mr @@ -481,7 +481,6 @@ jira_show_transitions() { local issue_code=${1:-${GIT_MR_CODE:-$(guess_issue_code "$(git_current_branch)")}} echo "Available Jira transitions:" - echo jira_request "issue/${issue_code}/transitions" | jq -r '.transitions[] | [ "", .id, @@ -1236,10 +1235,6 @@ replace_labels() { local to_remove=$2 local to_add=$3 - echo_debug "replace_labels - original labels : $labels" - echo_debug "replace_labels - labels to remove : $to_remove" - echo_debug "replace_labels - labels to add : $to_add" - # split labels=$( echo "$labels" | tr "," "\n") to_remove=$( echo "$to_remove" | tr "," "\n") @@ -1255,8 +1250,6 @@ replace_labels() { # implode labels=$(echo "$labels" | tr "\n" "," | sed 's/^,//' | sed 's/,$//') - echo_debug "replace_labels - result : $labels" - echo "$labels" } @@ -1341,28 +1334,23 @@ mr_format_labels() { sed 's/^\s*//' | sed 's/\s*$//' # remove leading and trailing spaces } + +################################################################################ +# Merge request transition utility functions + mr_update_labels() { local mr_iid=$1 + local labels=$2 # strip leading & trailing label commas - local to_remove; to_remove=$(echo -e "$2" | sed 's/^,*//' | sed 's/,*$//') - local to_add; to_add=$(echo -e "$3" | sed 's/^,*//' | sed 's/,*$//') + local to_remove; to_remove=$(echo -e "$3" | sed 's/^,*//' | sed 's/,*$//') + local to_add; to_add=$(echo -e "$4" | sed 's/^,*//' | sed 's/,*$//') if [ -z "$to_remove" ] && [ -z "$to_add" ]; then echo_error "No label to add or remove" return fi - # Load existing merge request details - local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") || exit $? - local labels; labels=$(gitlab_extract_labels "$merge_request") - - # Print merge request status summary - echo - mr_status_block "$mr_iid" "$merge_request" - echo "--------------------------------------------------------------------------------" - echo - local new_labels; new_labels=$(replace_labels "$labels" "$to_remove" "$to_add") if labels_differ "$labels" "$new_labels" && confirm "Do you want to update the merge request labels to \"$new_labels\"?"; then @@ -1375,6 +1363,50 @@ mr_update_labels() { fi } +mr_gitlab_undraft() { + local mr_iid=$1 + local mr_summary=$2 + + local mr_title; mr_title=$(gitlab_extract_title "$mr_summary") + + gitlab_title_is_draft "$mr_title" || + return 0 + + confirm "Do you want to resolve draft status?" || + return 0 + + echo -n "Resolving draft status... " + + local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") + mr_data=$(jq_build "title" "$undraft_title") || exit $? + + local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") + [[ -n $result ]] && echo -e "OK\n" +} + +mr_jira_transition() { + local issue_code=$1 + local jira_target_status=$2 + local jira_transition_id_var=$3 + + local jira_transition_id=${!jira_transition_id_var} + + [[ -n $issue_code ]] || + return 0 + + confirm "Do you want to update the Jira ticket status to \"${jira_target_status}\"?" || + return 0 + + if [[ -z $jira_transition_id ]]; then + echo_error "Set ${jira_transition_id_var} to be able to update Jira status." + jira_show_transitions "$issue_code" + return 0 + fi + + echo -n "Updating Jira ticket status... " + jira_transition "$issue_code" "$jira_transition_id" && echo -e "OK\n" +} + ################################################################################ # Merge request menu utility functions @@ -2121,129 +2153,71 @@ mr_menu() { esac } -mr_ip() { +mr_transition() { git_mr_readonly show - local source_branch=${1:-$(git_current_branch)} - local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} - - local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -z "$mr_summary" ]; then - echo_error "Merge request not found" - mr_print "$source_branch" - return - fi - - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - - mr_update_labels "${mr_iid}" "${GITLAB_CR_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" "${GITLAB_IP_LABELS}" - - if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"In Progress\"?"; then - if [ -n "$JIRA_IP_ID" ]; then - echo -n "Updating Jira ticket status... " - jira_transition "$issue_code" "$JIRA_IP_ID" && echo -e "OK\n" - else - echo_error "\nSet JIRA_IP_ID to be able to update Jira status\n" - jira_show_transitions "$issue_code" - fi - fi -} - -mr_cr() { - git_mr_readonly show + local transition=${1} + local source_branch=${2:-$(git_current_branch)} - local source_branch=${1:-$(git_current_branch)} - local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} - - local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -z "$mr_summary" ]; then - echo_error "Merge request not found" - mr_print "$source_branch" - return - fi - - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - - mr_update_labels "${mr_iid}" "${GITLAB_IP_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" "${GITLAB_CR_LABELS}" - - if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"Code Review\"?"; then - if [ -n "$JIRA_CR_ID" ]; then - echo -n "Updating Jira ticket status... " - jira_transition "$issue_code" "$JIRA_CR_ID" && echo -e "OK\n" - else - echo_error "\nSet JIRA_CR_ID to be able to update Jira status\n" - jira_show_transitions "$issue_code" - fi - fi -} - -mr_qa() { - git_mr_readonly show - - local source_branch=${1:-$(git_current_branch)} local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -z "$mr_summary" ]; then + if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" - return + return 1 fi local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - mr_update_labels "${mr_iid}" "${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_OK_LABELS}" "${GITLAB_QA_LABELS}" - - if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"Quality Assurance\"?"; then - if [ -n "$JIRA_QA_ID" ]; then - echo -n "Updating Jira ticket status... " - jira_transition "$issue_code" "$JIRA_QA_ID" && echo -e "OK\n" - else - echo_error "\nSet JIRA_QA_ID to be able to update Jira status\n" - jira_show_transitions "$issue_code" - fi - fi -} - -mr_accept() { - git_mr_readonly show - - local source_branch=${1:-$(git_current_branch)} - local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} - - local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -z "$mr_summary" ]; then - echo_error "Merge request not found" - mr_print "$source_branch" - return - fi - - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") + # Load existing merge request details + local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") || exit $? + local labels; labels=$(gitlab_extract_labels "$merge_request") - mr_update_labels "${mr_iid}" "${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" "${GITLAB_OK_LABELS}" + # Print merge request status summary + echo + mr_status_block "$mr_iid" "$merge_request" + echo "--------------------------------------------------------------------------------" + echo - local mr_title; mr_title=$(gitlab_extract_title "$mr_summary") - if gitlab_title_is_draft "$mr_title"; then - if confirm "Do you want to resolve draft status?"; then - echo -n "Resolving draft status... " - local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") + local name labels_to_add labels_to_remove jira_transition_var + case "$transition" in + IP) + name="In Progress" + labels_to_add="${GITLAB_IP_LABELS}" + labels_to_remove="${GITLAB_CR_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" + jira_transition_var="JIRA_IP_ID" + ;; + CR) + name="Code Review" + labels_to_add="${GITLAB_CR_LABELS}" + labels_to_remove="${GITLAB_IP_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" + jira_transition_var="JIRA_CR_ID" + ;; + QA) + name="Quality Assurance" + labels_to_add="${GITLAB_QA_LABELS}" + labels_to_remove="${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_OK_LABELS}" + jira_transition_var="JIRA_QA_ID" + ;; + OK) + name="Accepted" + labels_to_add="${GITLAB_OK_LABELS}" + labels_to_remove="${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" + jira_transition_var="JIRA_OK_ID" + ;; + *) + echo_error "Invalid transition" + return 1 + ;; + esac - mr_data=$(jq_build "title" "$undraft_title") || exit $? - local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") + mr_update_labels "$mr_iid" "$labels" "$labels_to_remove" "$labels_to_add" - if [ -n "$result" ]; then echo -e "OK\n"; fi - fi - fi + [[ $transition = "OK" ]] && + mr_gitlab_undraft "$mr_iid" "$mr_summary" - if [ -n "$issue_code" ] && confirm "Do you want to update the Jira ticket status to \"Accepted\"?"; then - if [ -n "$JIRA_OK_ID" ]; then - echo -n "Updating Jira ticket status... " - jira_transition "$issue_code" "$JIRA_OK_ID" && echo -e "OK\n" - else - echo_error "\nSet JIRA_OK_ID to be able to update Jira status\n" - jira_show_transitions "$issue_code" - fi - fi + mr_jira_transition "$issue_code" "$name" "$jira_transition_var" } mr_hook() { @@ -2436,10 +2410,10 @@ case $1 in menu) mr_menu "${@:2}" ;; - p|ip|IP) mr_ip "${@:2}" ;; - r|cr|CR) mr_cr "${@:2}" ;; - q|qa|QA) mr_qa "${@:2}" ;; - a|ac|accept) mr_accept "${@:2}" ;; + p|ip|IP) mr_transition "IP" "${@:2}" ;; + r|cr|CR) mr_transition "CR" "${@:2}" ;; + q|qa|QA) mr_transition "QA" "${@:2}" ;; + a|ac|accept) mr_transition "OK" "${@:2}" ;; undraft) gitlab_undraft "${@:2}" ;; diff --git a/test/git-mr.bats b/test/git-mr.bats index b5504f8..0afbe66 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1180,99 +1180,149 @@ This is an example without menu. # Status change functions @test "Toggles MR labels & Jira ticket status" { - load "test_helper/gitlab-mock-toggle-status.bash" + load "test_helper/gitlab-mock-transition.bash" - GIT_MR_YES=1 + labels_output() { + cat <<- EOF - GITLAB_IP_LABELS="" # labels can be empty for a given step - GIT_MR_MOCK_LABELS='"Review","Testing","Accepted","My Team"' - run mr_ip - assert_output "$(cat <<- EOF + Do you want to update the merge request labels to "${1}"? -> yes + Updating merge request labels... OK + EOF + } - -------------------------------------------------------------------------------- + jira_output() { + cat <<- EOF + + Do you want to update the Jira ticket status to "${1}"? -> yes + Updating Jira ticket status... OK + EOF + } + + undraft_output() { + cat <<- EOF + + Do you want to resolve draft status? -> yes + Resolving draft status... OK + EOF + } + + separator=$'\n'"--------------------------------------------------------------------------------" + tab=$'\t' + + GIT_MR_YES=1 - Do you want to update the merge request labels to "My Team"? -> yes - Updating merge request labels... OK + # In Progress ------------------------------------------------------------------ - Do you want to update the Jira ticket status to "In Progress"? -> yes - Updating Jira ticket status... OK + GIT_MR_MOCK_LABELS='"Review","Testing","Accepted","My Team"' + + GITLAB_IP_LABELS="" # labels can be empty + run mr_transition "IP" + assert_output "$(cat <<-EOF + ${separator} + $(labels_output "My Team") + $(jira_output "In Progress") EOF )" GITLAB_IP_LABELS="WIP" - GIT_MR_MOCK_LABELS='"Review","Testing","Accepted","My Team"' - run mr_ip + run mr_transition "IP" assert_output "$(cat <<- EOF + ${separator} + $(labels_output "My Team,WIP") + $(jira_output "In Progress") + EOF + )" - -------------------------------------------------------------------------------- + # Code Review ------------------------------------------------------------------ - Do you want to update the merge request labels to "My Team,WIP"? -> yes - Updating merge request labels... OK + GIT_MR_MOCK_LABELS='"WIP","Testing","Accepted","My Team"' - Do you want to update the Jira ticket status to "In Progress"? -> yes - Updating Jira ticket status... OK + GITLAB_CR_LABELS="" # labels can be empty + run mr_transition "CR" + assert_output "$(cat <<- EOF + ${separator} + $(labels_output "My Team") + $(jira_output "Code Review") EOF )" - GIT_MR_MOCK_LABELS='"WIP","Testing","Accepted","My Team"' - run mr_cr + GITLAB_CR_LABELS="Review" + run mr_transition "CR" assert_output "$(cat <<- EOF + ${separator} + $(labels_output "My Team,Review") + $(jira_output "Code Review") + EOF + )" - -------------------------------------------------------------------------------- + # Quality Assurance ------------------------------------------------------------ - Do you want to update the merge request labels to "My Team,Review"? -> yes - Updating merge request labels... OK + GIT_MR_MOCK_LABELS='"WIP","Review","Accepted","My Team"' - Do you want to update the Jira ticket status to "Code Review"? -> yes - Updating Jira ticket status... OK + GITLAB_QA_LABELS="" # labels can be empty + run mr_transition "QA" + assert_output "$(cat <<- EOF + ${separator} + $(labels_output "My Team") + $(jira_output "Quality Assurance") EOF )" - GIT_MR_MOCK_LABELS='"WIP","Review","Accepted","My Team"' - run mr_qa + GITLAB_QA_LABELS="Testing" + run mr_transition "QA" assert_output "$(cat <<- EOF + ${separator} + $(labels_output "My Team,Testing") + $(jira_output "Quality Assurance") + EOF + )" - -------------------------------------------------------------------------------- + # Accepted --------------------------------------------------------------------- - Do you want to update the merge request labels to "My Team,Testing"? -> yes - Updating merge request labels... OK + GIT_MR_MOCK_LABELS='"WIP","Review","Testing","My Team"' - Do you want to update the Jira ticket status to "Quality Assurance"? -> yes - Updating Jira ticket status... OK + GITLAB_OK_LABELS="" # labels can be empty + run mr_transition "OK" + assert_output "$(cat <<-EOF + ${separator} + $(labels_output "My Team") + $(undraft_output) + $(jira_output "Accepted") EOF )" - GIT_MR_MOCK_LABELS='"Testing","My Team"' # no label change - run mr_qa - assert_output "$(cat <<- EOF + GITLAB_OK_LABELS="Accepted" + run mr_transition "OK" + assert_output "$(cat <<-EOF + ${separator} + $(labels_output "My Team,Accepted") + $(undraft_output) + $(jira_output "Accepted") + EOF + )" - -------------------------------------------------------------------------------- + # No label change -------------------------------------------------------------- - Do you want to update the Jira ticket status to "Quality Assurance"? -> yes - Updating Jira ticket status... OK + GIT_MR_MOCK_LABELS='"Testing","My Team"' # no label change + run mr_transition "QA" + assert_output "$(cat <<- EOF + ${separator} + $(jira_output "Quality Assurance") EOF )" - GIT_MR_MOCK_LABELS='"WIP","Review","Testing","My Team"' + # No Jira transition ----------------------------------------------------------- + JIRA_OK_ID= # no Jira transition - run mr_accept - tab=$'\t' + run mr_transition "OK" assert_output "$(cat <<-EOF - - -------------------------------------------------------------------------------- - - Do you want to update the merge request labels to "My Team,Accepted"? -> yes - Updating merge request labels... OK - - Do you want to resolve draft status? -> yes - Resolving draft status... OK + ${separator} + $(labels_output "My Team,Accepted") + $(undraft_output) Do you want to update the Jira ticket status to "Accepted"? -> yes - - Set JIRA_OK_ID to be able to update Jira status - + Set JIRA_OK_ID to be able to update Jira status. Available Jira transitions: - ${tab}1${tab}"TODO" ${tab}-> TODO ${tab}[To Do] ${tab}2${tab}"In Progress" ${tab}-> In Progress ${tab}[In Progress] ${tab}3${tab}"Code Review" ${tab}-> Code Review ${tab}[In Progress] diff --git a/test/test_helper/gitlab-mock-toggle-status.bash b/test/test_helper/gitlab-mock-transition.bash similarity index 100% rename from test/test_helper/gitlab-mock-toggle-status.bash rename to test/test_helper/gitlab-mock-transition.bash From 870e8bc81b3c5b3a800d994580a1b6c9a3fe7b5c Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 4 Feb 2023 15:21:20 +0100 Subject: [PATCH 55/88] Code style - conditions syntax style - conditions st --- git-mr | 269 +++++++++---------- hooks/prepare-commit-msg | 6 +- test/git-mr.bats | 6 +- test/test_helper/gitlab-mock-transition.bash | 2 +- 4 files changed, 132 insertions(+), 151 deletions(-) diff --git a/git-mr b/git-mr index 58973d5..86a383d 100755 --- a/git-mr +++ b/git-mr @@ -16,9 +16,9 @@ git_current_branch() { git_base_branch() { local branch=${1:-$(git_current_branch)} - [ -z "$branch" ] && exit 3 # Not on any branch - [ "$branch" == "main" ] || [ "$branch" == "master" ] && exit 3 # On default branch - git show-ref -q --heads "$branch" || exit 3 # Branch does not exist + [[ -z $branch ]] && exit 3 # Not on any branch + [[ "$branch" == "main" || "$branch" == "master" ]] && exit 3 # On default branch + git show-ref -q --heads "$branch" || exit 3 # Branch does not exist # Nearest branch in commit history local base_branch @@ -58,7 +58,7 @@ git_default_branch() { local remote; remote=$(gitlab_remote || git_remote) local default; default=$(git symbolic-ref "refs/remotes/${remote}/HEAD" -- 2>/dev/null) - if [ -n "$default" ]; then + if [[ -n $default ]]; then local local_tracking local_tracking=$(git branch -vv | grep "${default#"refs/remotes/"}" | sed 's/^[* ]*//' | cut -d' ' -f1) @@ -71,15 +71,15 @@ git_default_branch() { return fi - if git_branch_exists "main"; then echo "main"; return; fi - if git_branch_exists "master"; then echo "master"; return; fi + git_branch_exists "main" && echo "main" && return + git_branch_exists "master" && echo "master" && return } git_remote_branch_exists() { local branch=$1 local remote=${2:-$(gitlab_remote)} - [ -n "$(git ls-remote --heads "$remote" "$branch")" ] + [[ -n "$(git ls-remote --heads "$remote" "$branch")" ]] } git_check_branches() { @@ -89,8 +89,8 @@ git_check_branches() { [ -z "$source_branch" ] && exit_error 3 "Not on any branch" - [ "$source_branch" == "main" ] || - [ "$source_branch" == "master" ] && + [[ $source_branch == "main" ]] || + [[ $source_branch == "master" ]] && exit_error 3 "On default branch" git show-ref -q --heads "$source_branch" || @@ -152,7 +152,7 @@ git_titlize_branch() { local label; label=$( echo "$branch" | sed -r "s/$branch_split_pattern/\3/") # ex: 'my-branch-name' # When Jira code pattern is not matched - if [ "$prefix" = "$issue_id" ]; then + if [[ $prefix == "$issue_id" ]]; then # Split prefix & label parts branch_split_pattern="^([^\/]*\/?)(.*)$" prefix=$(echo "$branch" | sed -r "s/$branch_split_pattern/\1/") @@ -163,7 +163,7 @@ git_titlize_branch() { fi # When Jira code pattern and prefix are not matched - if [ -z "$label" ]; then + if [[ -z $label ]]; then label="$prefix" prefix= fi @@ -224,26 +224,17 @@ urlencode() { } has_terminal_colors() { - if which tput > /dev/null 2>&1 && - [ -n "$TERM" ] && - [ "$(tput -T"$TERM" colors)" -ge 8 ]; then - return 0 - fi - return 1 + which tput > /dev/null 2>&1 && + [[ -n $TERM ]] && + [[ "$(tput -T"$TERM" colors)" -ge 8 ]] } has_colors() { - if [[ $GIT_MR_NO_COLORS -ne 1 ]] && has_terminal_colors; then - return 0 - fi - return 1 + [[ $GIT_MR_NO_COLORS -ne 1 ]] && has_terminal_colors } has_links() { - if [[ $GIT_MR_NO_TERMINAL_LINK -ne 1 ]] && has_terminal_colors; then - return 0 - fi - return 1 + [[ $GIT_MR_NO_TERMINAL_LINK -ne 1 ]] && has_terminal_colors } # shellcheck disable=SC2034 # Ignore unused color variables @@ -322,9 +313,9 @@ confirm() { } clear_screen() { - if which tput > /dev/null 2>&1 && [ -n "$TERM" ]; then + which tput > /dev/null 2>&1 && + [[ -n $TERM ]] && tput -x clear - fi } jq_build() { @@ -337,7 +328,7 @@ jq_build() { local current_object - if [ -n "$is_obj" ] || [ -n "$is_num" ]; then + if [[ -n $is_obj || -n $is_num ]]; then current_object="$(jq --null-input --compact-output --argjson value "$value" "{\"${key}\": \$value}")" else current_object="$(jq --null-input --compact-output --arg value "$value" "{\"${key}\": \$value}")" @@ -367,7 +358,7 @@ open_in_browser() { elif [[ "$OSTYPE" == "msys"* ]]; then open_command='explorer'; fi - if [ -n "$open_command" ] && [ -x "$(command -v $open_command)" ]; then + if [[ -n $open_command && -x "$(command -v $open_command)" ]]; then $open_command "${url}" > /dev/null 2>&1 return fi @@ -381,7 +372,8 @@ open_in_browser() { git_mr_readonly() { [[ $GIT_MR_READONLY -ne 1 ]] && return 1 - [ -n "$1" ] && echo "$(colorize "🚫 Read-only 🚫" "gray")" >&2 + [[ -n $1 ]] && + echo "$(colorize "🚫 Read-only 🚫" "gray")" >&2 return 0 } @@ -405,7 +397,7 @@ markdown_link() { local label=$1 local url=$2 - if [ -z "$url" ]; then + if [[ -z $url ]]; then echo "[$label]" return fi @@ -440,9 +432,9 @@ markdown_indent_list_items() { # Jira functions jira_check_env() { - [ -n "$JIRA_USER" ] || exit_error 21 "JIRA_USER is not set" - [ -n "$JIRA_TOKEN" ] || exit_error 21 "JIRA_TOKEN is not set" - [ -n "$JIRA_INSTANCE" ] || exit_error 21 "JIRA_INSTANCE is not set" + [[ -n $JIRA_USER ]] || exit_error 21 "JIRA_USER is not set" + [[ -n $JIRA_TOKEN ]] || exit_error 21 "JIRA_TOKEN is not set" + [[ -n $JIRA_INSTANCE ]] || exit_error 21 "JIRA_INSTANCE is not set" } jira_request() { @@ -458,7 +450,7 @@ jira_request() { echo_debug "Jira - ${request_verb} ${request_url} ${request_data}" - [ "$request_verb" != "GET" ] && git_mr_readonly && return 0 + [[ $request_verb != "GET" ]] && git_mr_readonly && return 0 curl -Ss \ -X "${request_verb}" \ @@ -472,7 +464,7 @@ jira_request() { jira_ticket_data() { jira_check_env - local issue_code=$1; [ -n "$issue_code" ] || exit_error 0 "issue_code required" + local issue_code=$1; [[ -n $issue_code ]] || exit_error 0 "issue_code required" jira_request "issue/${issue_code}?fields=summary" || exit $? } @@ -494,8 +486,8 @@ jira_show_transitions() { jira_transition() { jira_check_env - local issue_code=$1; [ -n "$issue_code" ] || exit_error 0 "issue_code required" - local transition_id=$2; [ -n "$transition_id" ] || exit_error 0 "transition_id required" + local issue_code=$1; [[ -n $issue_code ]] || exit_error 0 "issue_code required" + local transition_id=$2; [[ -n $transition_id ]] || exit_error 0 "transition_id required" local transition; transition=$(jq_build "id" "$transition_id") || exit $? local request_data; request_data=$(jq_build "transition" "$transition") || exit $? @@ -508,8 +500,8 @@ jira_transition() { # Gitlab functions gitlab_check_env() { - [ -n "$GITLAB_DOMAIN" ] || exit_error 11 "GITLAB_DOMAIN is not set" - [ -n "$GITLAB_TOKEN" ] || exit_error 11 "GITLAB_TOKEN is not set" + [[ -n $GITLAB_DOMAIN ]] || exit_error 11 "GITLAB_DOMAIN is not set" + [[ -n $GITLAB_TOKEN ]] || exit_error 11 "GITLAB_TOKEN is not set" } gitlab_remote() { @@ -532,9 +524,9 @@ gitlab_project_url() { [[ -n $remote ]] && remote_url=$(git remote get-url --push "$remote" | grep "${GITLAB_DOMAIN}") - if [[ "$remote_url" = git* ]]; then + if [[ "$remote_url" == git* ]]; then project_url=$(echo "$remote_url" | sed "s/git\@${GITLAB_DOMAIN}:\(.*\).git/\1/") - elif [[ "$remote_url" = https* ]]; then + elif [[ "$remote_url" == https* ]]; then project_url=$(echo "$remote_url" | sed "s/https:\/\/${GITLAB_DOMAIN}\/\(.*\).git/\1/") fi @@ -580,7 +572,7 @@ gitlab_request() { echo_debug "GitLab - ${request_verb} ${gitlab_base_url}/${request_url} ${request_data}" - [ "$request_verb" != "GET" ] && git_mr_readonly && echo '{}' && return 0 + [[ $request_verb != "GET" ]] && git_mr_readonly && echo '{}' && return 0 local result result=$(curl -Ss \ @@ -602,7 +594,7 @@ gitlab_check_error() { local hasErrorMessage hasErrorMessage=$(echo "$result" | jq 'if type=="object" then (has("error") or has("message")) else false end') - if [ "$hasErrorMessage" = 'true' ]; then + if [[ $hasErrorMessage == 'true' ]]; then echo_error "\nGitlab error:\n ${result}" echo "ko" @@ -639,7 +631,7 @@ gitlab_new_merge_request_url() { done # other options - if [ "${GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH:-1}" -eq 1 ]; then + if [[ "${GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH:-1}" -eq 1 ]]; then gitlab_mr_url="${gitlab_mr_url}&$(urlencode "merge_request[force_remove_source_branch]")=1" fi @@ -671,7 +663,7 @@ gitlab_merge_request_summary() { gitlab_merge_requests_search() { gitlab_check_env - local search_term=$1; [ -n "$search_term" ] || exit_error 0 "search_term required" + local search_term=$1; [[ -n $search_term ]] || exit_error 0 "search_term required" local result result=$(gitlab_request "merge_requests?scope=all&state=all&view=simple&search=$(urlencode "$search_term")&in=title&order_by=created_at&sort=asc") || exit $? @@ -737,7 +729,7 @@ gitlab_extract_description() { gitlab_extract_merge_status() { local mr_detail=$1 - if [ "$(echo "$mr_detail" | jq -r '.state')" = "merged" ]; then + if [[ "$(echo "$mr_detail" | jq -r '.state')" == "merged" ]]; then echo "merged" return fi @@ -794,13 +786,13 @@ gitlab_merge_request_threads() { local page=1 local notes_page_count=${per_page} - while [ "$notes_page_count" -eq "$per_page" ]; do + while [[ $notes_page_count -eq "$per_page" ]]; do # fetch page local notes_page notes_page=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid/discussions?per_page=${per_page}&page=${page}") - if [ "$notes_page" != "[]" ]; then + if [[ $notes_page != "[]" ]]; then local thread_summaries_page thread_summaries_page=$(echo "$notes_page" | jq -r ' @@ -816,7 +808,7 @@ gitlab_merge_request_threads() { sed 's/\r//g') # append page - if [ -z "$thread_summaries" ]; then + if [[ -z $thread_summaries ]]; then thread_summaries="$thread_summaries_page" else thread_summaries=$(echo -e "${thread_summaries}\n${thread_summaries_page}") @@ -845,20 +837,17 @@ gitlab_default_label_ids() { local default_labels oIFS oIFS="$IFS"; IFS=','; read -ra default_labels <<<"$GITLAB_DEFAULT_LABELS"; IFS="$oIFS"; unset oIFS for label in "${default_labels[@]}"; do - local label_id; label_id=$(echo "$gitlab_labels" | jq -r '.[] | select(.name == "'"$label"'") | .id') - - if [ -n "$label_id" ]; then + [[ -n $label_id ]] && echo "$label_id" - fi done } gitlab_merge_request_update() { gitlab_check_env - local mr_iid=$1; if [ -z "$mr_iid" ]; then echo_error "No mr_iid provided"; return; fi - local mr_data=$2; if [ -z "$mr_data" ]; then echo_error "No data provided"; return; fi + local mr_iid=$1; if [[ -z $mr_iid ]]; then echo_error "No mr_iid provided"; return; fi + local mr_data=$2; if [[ -z $mr_data ]]; then echo_error "No data provided"; return; fi gitlab_project_request "merge_requests/${mr_iid}" "PUT" "${mr_data}" } @@ -866,7 +855,7 @@ gitlab_merge_request_update() { gitlab_merge_request_merge() { gitlab_check_env - local mr_iid=$1; if [ -z "$mr_iid" ]; then echo_error "No mr_iid provided"; return; fi + local mr_iid=$1; if [[ -z $mr_iid ]]; then echo_error "No mr_iid provided"; return; fi gitlab_project_request "merge_requests/${mr_iid}/merge?should_remove_source_branch=${GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH:-1}" "PUT" } @@ -902,7 +891,7 @@ gitlab_undraft() { # Search existing merge request local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -z "$mr_summary" ]; then + if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" return @@ -931,7 +920,7 @@ gitlab_undraft() { mr_data=$(jq_build "title" "$undraft_title") || exit $? local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") - if [ -n "$result" ]; then echo -e "OK\n"; fi + [[ -n $result ]] && echo -e "OK\n" fi } @@ -949,7 +938,7 @@ guess_issue_code() { grep -Eo "$JIRA_CODE_PATTERN" | tail -n1) - if [ -z "$issue_code" ]; then + if [[ -z $issue_code ]]; then echo_error "Unable to guess issue code" return fi @@ -963,7 +952,7 @@ mr_title() { local source_branch=${1:-$(git_current_branch)} local issue_code=${2:-${GIT_MR_CODE:-$(guess_issue_code "$source_branch")}} - if [ -z "$issue_code" ]; then + if [[ -z $issue_code ]]; then git_titlize_branch "$source_branch" return fi @@ -973,16 +962,14 @@ mr_title() { local issue_key; issue_key=$(echo "$issue_content" | jq -r '.key // empty') local issue_title; issue_title=$(echo "$issue_content" | jq -r '.fields.summary // empty') - if [ -z "$issue_key" ]; then + [[ -z $issue_key ]] && issue_key=${issue_code^^} - fi - if [ -z "$issue_title" ]; then + if [[ -z $issue_title ]]; then echo_error "Unable to get issue title from Jira" echo_error " issue_code: $issue_code" - if [ -n "$issue_content" ]; then + [[ -n $issue_content ]] && echo_error " $issue_content" - fi echo "$issue_key" return @@ -1037,7 +1024,7 @@ mr_status_block() { local mr_url=${4:-$(gitlab_extract_url "$merge_request")} local mr_threads=$5 - if [ -z "$mr_threads" ]; then + if [[ -z $mr_threads ]]; then local mr_url; mr_url=$(gitlab_extract_url "$merge_request") local project_url; project_url=$(gitlab_extract_project_url "$mr_url") mr_threads=$(gitlab_merge_request_threads "$project_url" "$mr_iid") @@ -1063,7 +1050,7 @@ mr_show_status() { local merge_request; merge_request=${2:-$(gitlab_merge_request "$mr_iid")} local mr_threads=$3 - if [ -z "$mr_threads" ]; then + if [[ -z $mr_threads ]]; then local mr_url; mr_url=$(gitlab_extract_url "$merge_request") local project_url; project_url=$(gitlab_extract_project_url "$mr_url") mr_threads=$(gitlab_merge_request_threads "$project_url" "$mr_iid") @@ -1076,7 +1063,7 @@ mr_print_status() { local merge_request=$1 local threads=$2 - [ -n "$merge_request" ] || exit_error 0 "merge_request not provided" + [[ -n $merge_request ]] || exit_error 0 "merge_request not provided" local mr_url; mr_url=$(gitlab_extract_url "$merge_request") local project_url; project_url=$(gitlab_extract_project_url "$mr_url") @@ -1093,11 +1080,11 @@ mr_print_status() { local upvotes; upvotes=$(echo "$merge_request" | jq -r '.upvotes') local downvotes; downvotes=$(echo "$merge_request" | jq -r '.downvotes') - if [ "$upvotes" -gt 1 ]; then upvotes=$(colorize "$upvotes" "bold" "lightgreen") - elif [ "$upvotes" -gt 0 ]; then upvotes=$(colorize "$upvotes" "bold" "lightyellow") + if [[ $upvotes -gt 1 ]]; then upvotes=$(colorize "$upvotes" "bold" "lightgreen") + elif [[ $upvotes -gt 0 ]]; then upvotes=$(colorize "$upvotes" "bold" "lightyellow") else upvotes=$(colorize "$upvotes" "bold"); fi - if [ "$downvotes" -gt 0 ]; + if [[ $downvotes -gt 0 ]]; then downvotes=$(colorize "$downvotes" "bold" "lightred") else downvotes=$(colorize "$downvotes" "bold"); fi @@ -1108,13 +1095,13 @@ mr_print_status() { local thread_count_display thread_count_display=$(colorize "$thread_count" "bold") - local resolved_count_display; if [ "$resolved_count" -lt "$thread_count" ]; + local resolved_count_display; if [[ $resolved_count -lt "$thread_count" ]]; then resolved_count_display=$(colorize "$resolved_count" "bold" "lightred") else resolved_count_display=$(colorize "$resolved_count" "bold" "lightgreen"); fi local threads_display="${resolved_count_display}/${thread_count_display}" - if [ "$resolved_count" -lt "$thread_count" ]; then + if [[ $resolved_count -lt "$thread_count" ]]; then local first_unresolved_note_id first_unresolved_note_id=$(echo "$threads" | grep 'unresolved:true' | cut -f 3 | cut -d ':' -f 2 | head -n 1) local note_url="${mr_url}#note_${first_unresolved_note_id}" @@ -1126,7 +1113,7 @@ mr_print_status() { # Merge status local merge_status; merge_status=$(gitlab_extract_merge_status "$merge_request") - local merge_status_icon; if [ "$merge_status" = "merged" ] || [ "$merge_status" = "can_be_merged" ]; + local merge_status_icon; if [[ $merge_status == "merged" || $merge_status == "can_be_merged" ]]; then merge_status_icon="$(colorize "\U00002714" "lightgreen" "bold")"; # heavy check mark else merge_status_icon="$(colorize "\U0000274C" "lightred" "bold")"; fi # cross mark @@ -1146,9 +1133,8 @@ mr_print_status() { *) pipeline_icon="$(colorize "?" "lightgray")" ;; esac local ci_str= - if [ -n "$pipeline_icon" ]; then + [[ -n $pipeline_icon ]] && ci_str="CI: $pipeline_icon" - fi # Merge target local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") @@ -1206,19 +1192,19 @@ mr_print_status() { echo -en " \U0001F44D ${upvotes}" echo -en " \U0001F44E ${downvotes}" # Threads - if [ "$thread_count" -gt 0 ]; then + if [[ $thread_count -gt 0 ]]; then echo -n " Resolved threads: ${threads_display}" else echo -n " " fi # Pipeline - if [ -n "$ci_str" ]; then + if [[ -n $ci_str ]]; then echo -en " $(terminal_link "$pipeline_url" "$ci_str") " else echo -n " " fi # Merge status - if [ "$merge_status" != "merged" ]; then + if [[ $merge_status != "merged" ]]; then echo -en " Can be merged: ${merge_status_icon}" else echo -en " $(colorize "Merged" "lightgreen")" @@ -1241,11 +1227,11 @@ replace_labels() { to_add=$( echo "$to_add" | tr "," "\n") # remove - [ -n "$to_remove" ] && labels=$(echo "$labels" | grep -v "$to_remove") - [ -n "$to_add" ] && labels=$(echo "$labels" | grep -v "$to_add") + [[ -n $to_remove ]] && labels=$(echo "$labels" | grep -v "$to_remove") + [[ -n $to_add ]] && labels=$(echo "$labels" | grep -v "$to_add") # add - [ -n "$to_add" ] && labels=$(echo -e "${labels}\n${to_add}") + [[ -n $to_add ]] && labels=$(echo -e "${labels}\n${to_add}") # implode labels=$(echo "$labels" | tr "\n" "," | sed 's/^,//' | sed 's/,$//') @@ -1257,12 +1243,12 @@ labels_differ() { local old_labels=$1 local new_labels=$2 - [[ $old_labels = "$new_labels" ]] && return 1 + [[ $old_labels == "$new_labels" ]] && return 1 local old_sorted; old_sorted=$(echo "$old_labels" | tr "," "\n" | grep . | sort -u | tr "\n" ",") local new_sorted; new_sorted=$(echo "$new_labels" | tr "," "\n" | grep . | sort -u | tr "\n" ",") - [[ $old_sorted = "$new_sorted" ]] && return 1 + [[ $old_sorted == "$new_sorted" ]] && return 1 return 0 } @@ -1310,16 +1296,16 @@ mr_format_labels() { local other_labels=() for label in "${labels_array[@]}"; do - if [ -n "$(is_status_ip_label "$label")" ]; then + if [[ -n "$(is_status_ip_label "$label")" ]]; then # shellcheck disable=SC2086 # Allow splitting of terminal color status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_IP_LABEL_COLOR:-orange})") - elif [ -n "$(is_status_cr_label "$label")" ]; then + elif [[ -n "$(is_status_cr_label "$label")" ]]; then # shellcheck disable=SC2086 # Allow splitting of terminal color status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_CR_LABEL_COLOR:-lightblue bold})") - elif [ -n "$(is_status_qa_label "$label")" ]; then + elif [[ -n "$(is_status_qa_label "$label")" ]]; then # shellcheck disable=SC2086 # Allow splitting of terminal color status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_QA_LABEL_COLOR:-lightpurple bold})") - elif [ -n "$(is_status_ok_label "$label")" ]; then + elif [[ -n "$(is_status_ok_label "$label")" ]]; then # shellcheck disable=SC2086 # Allow splitting of terminal color status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_OK_LABEL_COLOR:-lightgreen})") else @@ -1346,7 +1332,7 @@ mr_update_labels() { local to_remove; to_remove=$(echo -e "$3" | sed 's/^,*//' | sed 's/,*$//') local to_add; to_add=$(echo -e "$4" | sed 's/^,*//' | sed 's/,*$//') - if [ -z "$to_remove" ] && [ -z "$to_add" ]; then + if [[ -z $to_remove && -z $to_add ]]; then echo_error "No label to add or remove" return fi @@ -1359,7 +1345,7 @@ mr_update_labels() { mr_data=$(jq_build "labels" "$new_labels") || exit $? local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") - if [ -n "$result" ]; then echo -e "OK\n"; fi + [[ -n $result ]] && echo -e "OK\n" fi } @@ -1369,11 +1355,9 @@ mr_gitlab_undraft() { local mr_title; mr_title=$(gitlab_extract_title "$mr_summary") - gitlab_title_is_draft "$mr_title" || - return 0 + gitlab_title_is_draft "$mr_title" || return 0 - confirm "Do you want to resolve draft status?" || - return 0 + confirm "Do you want to resolve draft status?" || return 0 echo -n "Resolving draft status... " @@ -1391,11 +1375,9 @@ mr_jira_transition() { local jira_transition_id=${!jira_transition_id_var} - [[ -n $issue_code ]] || - return 0 + [[ -n $issue_code ]] || return 0 - confirm "Do you want to update the Jira ticket status to \"${jira_target_status}\"?" || - return 0 + confirm "Do you want to update the Jira ticket status to \"${jira_target_status}\"?" || return 0 if [[ -z $jira_transition_id ]]; then echo_error "Set ${jira_transition_id_var} to be able to update Jira status." @@ -1452,9 +1434,8 @@ mr_menu_contents() { local item_label; item_label="${project_name}: $(markdown_link "${title}" "$web_url")" local wrap='' - if [ "$current_mr_url" == "$web_url" ]; then + [[ $current_mr_url == "$web_url" ]] && wrap='**' # Markdown bold - fi echo "* ${wrap}${item_label}${wrap}" done < <(echo "$menu_items") @@ -1472,7 +1453,7 @@ mr_menu_print_title() { local mr_count; mr_count=$(echo "$menu_items" | wc -l | tr -d ' ') echo "================================================================================" - [ -z "$current_index" ] && + [[ -z $current_index ]] && echo " $(terminal_link "$search_url" "$issue_code") (${mr_count} merge request$([[ $mr_count -gt 1 ]] && echo 's'))" || echo " $(terminal_link "$search_url" "$issue_code") (merge request ${current_index}/${mr_count})" echo "================================================================================" @@ -1526,7 +1507,7 @@ mr_menu_update() { # Search existing merge request local mr_summary; mr_summary=$(gitlab_merge_request_summary "$current_branch") - if [ -z "$mr_summary" ]; then + if [[ -z $mr_summary ]]; then echo_error "Merge request not found" echo mr_menu_contents "$menu_items" @@ -1550,11 +1531,10 @@ mr_menu_update() { if confirm "Do you want to update the menu in the merge request description?"; then mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? fi - if [ "$mr_update_data" != "{}" ]; then + if [[ $mr_update_data != "{}" ]]; then echo -n "Updating merge request..." - local result - result=$(gitlab_merge_request_update "$mr_iid" "$mr_update_data") - if [ -n "$result" ]; then echo -e "OK\n"; fi + local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_update_data") + [[ -n $result ]] && echo -e "OK\n" fi } @@ -1609,14 +1589,13 @@ mr_menu_update_all() { if confirm "Do you want to update the menu in the merge request description?"; then mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? fi - if [ "$mr_update_data" != "{}" ]; then + if [[ $mr_update_data != "{}" ]]; then echo -n "Updating merge request..." # Do NOT use `gitlab_merge_request_update` result=$(gitlab_request "projects/${project_url}/merge_requests/${mr_iid}" "PUT" "${mr_update_data}") - if [ -n "$result" ]; then - ((updated_count += 1)) + [[ -n $result ]] && + ((updated_count += 1)) && echo -e "OK\n" - fi else echo fi @@ -1651,20 +1630,20 @@ mr_menu_replace_description() { local menu_end; menu_end=$(mr_menu_end_line "$mr_description" "$menu_start") local has_menu=0 - if [ -n "$menu_start" ] && [ -n "$menu_end" ] && [ "$menu_start" -gt "0" ] && [ "$menu_end" -gt "$menu_start" ]; then + [[ -n $menu_start && -n $menu_end ]] && + [[ $menu_start -gt 0 && $menu_end -gt "$menu_start" ]] && has_menu=1 - fi # Iterate over description lines and insert/replace menu local i=1 mr_description_line while IFS=$'\n' read -r mr_description_line; do - if [ "$has_menu" = "1" ]; then - if [ "$i" -lt "$menu_start" ] || [ "$i" -gt "$menu_end" ]; then + if [[ $has_menu -eq 1 ]]; then + if [[ $i -lt "$menu_start" || $i -gt "$menu_end" ]]; then # output non-menu line echo "$mr_description_line" else # replace menu once - if [ "$i" -eq "$menu_end" ]; then + if [[ $i -eq "$menu_end" ]]; then echo_debug "Replacing menu" echo "$menu_content" fi @@ -1673,7 +1652,7 @@ mr_menu_replace_description() { # output non-menu line echo "$mr_description_line" # insert menu once - if [ "$i" -eq "2" ]; then + if [[ $i -eq "2" ]]; then echo_debug "Inserting menu" echo "$menu_content" echo @@ -1692,7 +1671,7 @@ mr_menu_colorize() { # Iterate over description lines and colorize menu lines local i=1 mr_description_line while IFS=$'\n' read -r mr_description_line; do - if [ "$i" -lt "$menu_start" ] || [ "$i" -gt "$menu_end" ]; then + if [[ $i -lt "$menu_start" || $i -gt "$menu_end" ]]; then # output non-menu line echo -e "$(colorize "$mr_description_line" "lightgray")" else @@ -1755,7 +1734,7 @@ $(mr_description "$source_branch" "$target_branch" "$issue_code") EOF local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -n "$mr_summary" ]; then + if [[ -n $mr_summary ]]; then # Print merge request status summary mr_status_block "$(gitlab_extract_iid "$mr_summary")" else @@ -1792,7 +1771,7 @@ $description EOF local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -n "$mr_summary" ]; then + if [[ -n $mr_summary ]]; then open_in_browser "$(gitlab_extract_url "$mr_summary")" # Print merge request status summary @@ -1823,7 +1802,7 @@ mr_status() { # Search existing merge request local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -z "$mr_summary" ]; then + if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" return @@ -1851,7 +1830,7 @@ mr_update() { # Search existing merge request local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -z "$mr_summary" ]; then + if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" "$target_branch" return @@ -1901,8 +1880,8 @@ mr_update() { local curr=${current_commits_array[$i]} local old=${old_commits_array[$i]} - if [ -n "$old" ]; then - if [ "$old" = "$curr" ]; then + if [[ -n $old ]]; then + if [[ $old == "$curr" ]]; then # same sha-1 - only decorate new_description_display=$(echo "$new_description_display" | sed "s/$old/$(colorize "$curr" "$sameColor")/") new_description_content=$(echo "$new_description_content" | sed "s/$old/$curr/") @@ -1934,7 +1913,7 @@ mr_update() { mr_print_title "$mr_title" "$mr_url" echo echo "$new_description_display" - if [ "$new_commit_count" -gt 0 ]; then + if [[ $new_commit_count -gt 0 ]]; then if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then echo echo "## Update" @@ -1955,20 +1934,20 @@ mr_update() { # Propose update if changes are detected - if [ ! -x "$(command -v jq)" ]; then + if [[ ! -x "$(command -v jq)" ]]; then echo_error "Please install jq to be able to update merge request" else local mr_update_data='{}' update_prompt - if [ $((updated_commit_count + new_commit_count)) -gt 0 ]; then + if [[ $((updated_commit_count + new_commit_count)) -gt 0 ]]; then update_prompt=1 if confirm "Do you want to update the merge request description?"; then local new_description; new_description=$(echo -e "${new_description_content}") local newLines="" - if [ "$new_commit_count" -gt 0 ]; then + if [[ $new_commit_count -gt 0 ]]; then if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then new_description=$(echo -e "${new_description}\n\n## Update") newLines="\n" @@ -1982,7 +1961,7 @@ mr_update() { fi fi - if [ "$target_branch" != "$current_target" ]; then + if [[ $target_branch != "$current_target" ]]; then update_prompt=1 if confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?"; then if git_remote_branch_exists "$target_branch"; then @@ -1993,16 +1972,16 @@ mr_update() { fi fi - if [ "$mr_update_data" != "{}" ]; then + if [[ $mr_update_data != "{}" ]]; then echo -n "Updating merge request..." local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_update_data") - if [ -n "$result" ]; then echo -e "OK\n"; fi + [[ -n $result ]] && echo -e "OK\n" # reload merge request details merge_request=$(gitlab_merge_request "$mr_iid") else - [ -n "$update_prompt" ] && echo + [[ -n $update_prompt ]] && echo fi fi @@ -2018,7 +1997,7 @@ mr_merge() { # Search existing merge request local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") - if [ -z "$mr_summary" ]; then + if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" return @@ -2041,12 +2020,12 @@ mr_merge() { echo # test merge status - if [ "$merge_status" = "merged" ]; then + if [[ $merge_status == "merged" ]]; then echo_error "Merge request is already merged." echo_error return fi - if [ "$merge_status" != "can_be_merged" ]; then + if [[ $merge_status != "can_be_merged" ]]; then echo_error "Merge request can not be merged. You probably need to rebase the branch and resolve conflicts." echo_error return @@ -2056,7 +2035,7 @@ mr_merge() { local unresolved_thread_count unresolved_thread_count=$(gitlab_merge_request_threads "$project_url" "$mr_iid" | grep -c 'unresolved:true') - if [ "$unresolved_thread_count" -gt 0 ]; then + if [[ $unresolved_thread_count -gt 0 ]]; then if [[ $GIT_MR_FORCE -eq 1 ]]; then echo_error "There are $unresolved_thread_count unresolved threads. Merging anyway." echo_error @@ -2076,8 +2055,9 @@ mr_merge() { local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit $? local result; result=$(gitlab_merge_request_update "${mr_iid}" "${mr_data}") - if [ -n "$result" ]; then echo -e "OK\n"; - else echo_error; return; fi + [[ -n $result ]] && echo -e "OK\n" + + [[ -n $result ]] || { echo_error; return; } # interrupt on error fi # Merge @@ -2086,8 +2066,9 @@ mr_merge() { echo -n "Merging '$source_branch'... " local result; result=$(gitlab_merge_request_merge "${mr_iid}") - if [ -z "$result" ]; then echo; return; - else echo -e "OK\n"; fi + [[ -n $result ]] && echo -e "OK\n" + + [[ -n $result ]] || { echo_error; return; } # interrupt on error # checkout target branch @@ -2139,14 +2120,14 @@ mr_menu() { # All non-closed merge requests for issue code local menu_items; menu_items=$(mr_menu_merge_requests "$issue_code") - if [ -z "$menu_items" ]; then + if [[ -z $menu_items ]]; then echo_error "No merge requests found for '$issue_code'." return fi case "$git_mr_menu_mode" in show) mr_menu_show "$issue_code" "$menu_items" ;; - update) if [ "$git_mr_menu_update_all" = "1" ] + update) if [[ $git_mr_menu_update_all -eq 1 ]] then mr_menu_update_all "$issue_code" "$menu_items" else mr_menu_update "$menu_items"; fi ;; status) mr_menu_status "$issue_code" "$menu_items" ;; @@ -2214,7 +2195,7 @@ mr_transition() { mr_update_labels "$mr_iid" "$labels" "$labels_to_remove" "$labels_to_add" - [[ $transition = "OK" ]] && + [[ $transition == "OK" ]] && mr_gitlab_undraft "$mr_iid" "$mr_summary" mr_jira_transition "$issue_code" "$name" "$jira_transition_var" @@ -2368,7 +2349,7 @@ GIT_MR_MENU_UPDATE_CONTEXT_LINES=${GIT_MR_MENU_UPDATE_CONTEXT_LINES:-15} # Init -git rev-parse > /dev/null 2>&1 || exit_error 1 "Not a git repository" +git rev-parse > /dev/null 2>&1 || exit_error 1 "Not a git repository" [[ ! -x "$(command -v jq)" ]] && exit_error 2 "Git-MR requires jq [https://stedolan.github.io/jq/]" [[ "${BASH_VERSINFO:-0}" -lt 4 ]] && exit_error 2 "Your bash version is too old: $BASH_VERSION" diff --git a/hooks/prepare-commit-msg b/hooks/prepare-commit-msg index 02744c7..3ce61b2 100755 --- a/hooks/prepare-commit-msg +++ b/hooks/prepare-commit-msg @@ -9,9 +9,9 @@ jira_code_pattern="${JIRA_CODE_PATTERN:-$default_pattern}" current_branch=$(git rev-parse --abbrev-ref HEAD) issue_code=$(echo "${current_branch}" | grep -Eo "$jira_code_pattern" | tail -n1) -[ ! -z "$issue_code" ] || exit 0 # No issue code detected +[ -n "$issue_code" ] || exit 0 # No issue code detected -current_msg=$(cat $1) +current_msg=$(cat "$1") msg_code=$(echo "${current_msg}" | grep -iEo "$jira_code_pattern" | tail -n1) [ -z "$msg_code" ] || exit 0 # existing issue code in message @@ -20,4 +20,4 @@ if case "$current_msg" in "fixup! "*) ;; *) false;; esac; then fi echo "Prefixing message with issue code: $issue_code" >&2 -sed -i.bak -e "1s/^/$issue_code /" $1 +sed -i.bak -e "1s/^/$issue_code /" "$1" diff --git a/test/git-mr.bats b/test/git-mr.bats index 0afbe66..bb8859e 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -614,7 +614,7 @@ full_sha() { @test "Determines new merge request URL" { GITLAB_DEFAULT_LABELS="Label A,Label C" gitlab_project_request() { - [[ $1 = "labels" ]] && + [[ $1 == "labels" ]] && echo '[{"id":1,"name":"Label A"},{"id":2,"name":"Label B"},{"id":3,"name":"Label C"}]' } @@ -700,7 +700,7 @@ full_sha() { @test "Extracts Gitlab merge request threads" { gitlab_request() { - [[ $1 = "projects/test/merge_requests/123/discussions?per_page=100&page=1" ]] && + [[ $1 == "projects/test/merge_requests/123/discussions?per_page=100&page=1" ]] && echo '[ {"id": "n1","notes": [{"id": 11},{"id": 12,"resolvable": false}]}, {"id": "n2","notes": [{"id": 21},{"id": 22,"resolvable": true, "resolved": false}]}, @@ -719,7 +719,7 @@ full_sha() { @test "Fetches default Gitlab label ids" { GITLAB_DEFAULT_LABELS="Label A,Label C" gitlab_project_request() { - [[ $1 = "labels" ]] && + [[ $1 == "labels" ]] && echo '[{"id":1,"name":"Label A"},{"id":2,"name":"Label B"},{"id":3,"name":"Label C"}]' } diff --git a/test/test_helper/gitlab-mock-transition.bash b/test/test_helper/gitlab-mock-transition.bash index d92e836..003abc6 100644 --- a/test/test_helper/gitlab-mock-transition.bash +++ b/test/test_helper/gitlab-mock-transition.bash @@ -36,7 +36,7 @@ jira_request() { case "$1" in "issue/AB-123/transitions") - if [[ "$2" = "POST" ]]; then + if [[ "$2" == "POST" ]]; then return 0; fi From 69e65fcbbda6246a4c2d020562ff340a995824ba Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 4 Feb 2023 15:41:44 +0100 Subject: [PATCH 56/88] Code style - flip conditions Fliop cond --- git-mr | 94 +++++++++++++++++++----------------------------- test/git-mr.bats | 18 +++++----- 2 files changed, 46 insertions(+), 66 deletions(-) diff --git a/git-mr b/git-mr index 86a383d..ca509d5 100755 --- a/git-mr +++ b/git-mr @@ -16,8 +16,8 @@ git_current_branch() { git_base_branch() { local branch=${1:-$(git_current_branch)} - [[ -z $branch ]] && exit 3 # Not on any branch - [[ "$branch" == "main" || "$branch" == "master" ]] && exit 3 # On default branch + [[ -n $branch ]] || exit 3 # Not on any branch + [[ "$branch" != "main" && "$branch" != "master" ]] || exit 3 # On default branch git show-ref -q --heads "$branch" || exit 3 # Branch does not exist # Nearest branch in commit history @@ -86,17 +86,16 @@ git_check_branches() { local source_branch="$1" local target_branch="$2" - [ -z "$source_branch" ] && + [[ -n $source_branch ]] || exit_error 3 "Not on any branch" - [[ $source_branch == "main" ]] || - [[ $source_branch == "master" ]] && + [[ $source_branch != "main" && $source_branch != "master" ]] || exit_error 3 "On default branch" git show-ref -q --heads "$source_branch" || exit_error 3 "Branch '$source_branch' does not exist" - [ -z "$target_branch" ] && + [[ -n $target_branch ]] || exit_error 3 "Unable to determine target branch" return 0 @@ -281,7 +280,7 @@ echo_error() { } echo_debug() { - [[ $GIT_MR_VERBOSE -ne 1 ]] && return 0 + [[ $GIT_MR_VERBOSE -eq 1 ]] || return 0 colorize "$1\n" "gray" >&2 } @@ -348,9 +347,7 @@ regex_escape() { open_in_browser() { local url=$1 - if [ -z "$url" ]; then - return - fi + [[ -n $url ]] || return local open_command if [[ "$OSTYPE" == "linux-gnu"* ]]; then open_command='xdg-open'; @@ -370,7 +367,7 @@ open_in_browser() { } git_mr_readonly() { - [[ $GIT_MR_READONLY -ne 1 ]] && return 1 + [[ $GIT_MR_READONLY -eq 1 ]] || return 1 [[ -n $1 ]] && echo "$(colorize "🚫 Read-only 🚫" "gray")" >&2 @@ -583,7 +580,7 @@ gitlab_request() { --max-time "${GIT_MR_TIMEOUT:-5}" \ "${gitlab_base_url}/${request_url}") || exit_error 10 "Gitlab request error" - [ -n "$(gitlab_check_error "$result")" ] && return + [[ -z "$(gitlab_check_error "$result")" ]] || return echo "$result" } @@ -606,7 +603,7 @@ gitlab_new_merge_request_url() { local project_url; project_url=$(gitlab_project_url) || exit $? - [ -z "$project_url" ] && return + [[ -n $project_url ]] || return local source_branch=${1:-$(git_current_branch)} if ! git_remote_branch_exists "$source_branch"; then @@ -653,9 +650,7 @@ gitlab_merge_request_summary() { local result result=$(gitlab_project_request "merge_requests?state=opened&view=simple&source_branch=${source_branch}") || exit $? - if [ -z "$result" ] || [ "$result" = "[]" ]; then - return - fi + [[ -n $result && $result != "[]" ]] || return echo "$result" | jq '.[0]' } @@ -667,15 +662,10 @@ gitlab_merge_requests_search() { local result result=$(gitlab_request "merge_requests?scope=all&state=all&view=simple&search=$(urlencode "$search_term")&in=title&order_by=created_at&sort=asc") || exit $? - - if [ -z "$result" ] || [ "$result" = "[]" ]; then - return - fi + [[ -n $result && $result != "[]" ]] || return result=$(echo "$result" | jq -c 'map(select(.state != "closed") | {iid: .iid, title: .title, web_url: .web_url, state: .state, project_id: .project_id}) | .[]') - if [ -z "$result" ] || [ "$result" = "[]" ]; then - return - fi + [[ -n $result && $result != "[]" ]] || return echo "$result" } @@ -684,14 +674,10 @@ gitlab_projects() { local result result=$(gitlab_request "projects?simple=true&archived=false&order_by=last_activity_at&per_page=100") || exit $? - if [ -z "$result" ] || [ "$result" = "[]" ]; then - return - fi + [[ -n $result && $result != "[]" ]] || return result=$(echo "$result" | jq 'map({id: .id, name: .name, path_with_namespace: .path_with_namespace})') - if [ -z "$result" ] || [ "$result" = "[]" ]; then - return - fi + [[ -n $result && $result != "[]" ]] || return echo "$result" } @@ -699,9 +685,7 @@ gitlab_projects() { gitlab_merge_request() { gitlab_check_env - local mr_iid=$1 - - [ -z "$mr_iid" ] && return + local mr_iid=$1; [[ -n $mr_iid ]] || return gitlab_project_request "merge_requests/$mr_iid" } @@ -778,8 +762,8 @@ gitlab_merge_request_threads() { local project_url=$1 local mr_iid=$2 - [ -z "$project_url" ] && return - [ -z "$mr_iid" ] && return + [[ -n $project_url ]] || return + [[ -n $mr_iid ]] || return local thread_summaries local per_page=100 @@ -846,8 +830,8 @@ gitlab_default_label_ids() { gitlab_merge_request_update() { gitlab_check_env - local mr_iid=$1; if [[ -z $mr_iid ]]; then echo_error "No mr_iid provided"; return; fi - local mr_data=$2; if [[ -z $mr_data ]]; then echo_error "No data provided"; return; fi + local mr_iid=$1; [[ -n $mr_iid ]] || { echo_error "No mr_iid provided"; return; } + local mr_data=$2; [[ -n $mr_data ]] || { echo_error "No data provided"; return; } gitlab_project_request "merge_requests/${mr_iid}" "PUT" "${mr_data}" } @@ -855,7 +839,7 @@ gitlab_merge_request_update() { gitlab_merge_request_merge() { gitlab_check_env - local mr_iid=$1; if [[ -z $mr_iid ]]; then echo_error "No mr_iid provided"; return; fi + local mr_iid=$1; [[ -n $mr_iid ]] || { echo_error "No mr_iid provided"; return; } gitlab_project_request "merge_requests/${mr_iid}/merge?should_remove_source_branch=${GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH:-1}" "PUT" } @@ -929,8 +913,8 @@ gitlab_undraft() { # Merge request utility functions guess_issue_code() { - [ -n "$git_mr_unguessable_issue_code" ] && return - [ -n "$JIRA_CODE_PATTERN" ] || exit_error 0 "JIRA_CODE_PATTERN not set - unable to guess issue code" + [[ -z $git_mr_unguessable_issue_code ]] || return + [[ -n $JIRA_CODE_PATTERN ]] || exit_error 0 "JIRA_CODE_PATTERN not set - unable to guess issue code" local branch=${1:-$(git_current_branch)} @@ -1397,9 +1381,7 @@ mr_menu_merge_requests() { local issue_code=${1:-${GIT_MR_CODE:-$(guess_issue_code)}} local mr_summaries; mr_summaries=$(gitlab_merge_requests_search "$issue_code") || exit $? - if [ -z "$mr_summaries" ]; then - return - fi + [[ -n $mr_summaries ]] || return # Load project names into bash associative array declare -A project_arr @@ -1724,7 +1706,7 @@ mr_print() { git_check_branches "$source_branch" "$target_branch" local issue_code=${GIT_MR_CODE:-$(guess_issue_code "$source_branch")} - [ -z "$issue_code" ] && git_mr_unguessable_issue_code=1 + [[ -n $issue_code ]] || git_mr_unguessable_issue_code=1 cat < /dev/null 2>&1 || exit_error 1 "Not a git repository" -[[ ! -x "$(command -v jq)" ]] && exit_error 2 "Git-MR requires jq [https://stedolan.github.io/jq/]" -[[ "${BASH_VERSINFO:-0}" -lt 4 ]] && exit_error 2 "Your bash version is too old: $BASH_VERSION" +[[ -x "$(command -v jq)" ]] || exit_error 2 "Git-MR requires jq [https://stedolan.github.io/jq/]" +[[ "${BASH_VERSINFO:-0}" -ge 4 ]] || exit_error 2 "Your bash version is too old: $BASH_VERSION" # Parse options diff --git a/test/git-mr.bats b/test/git-mr.bats index bb8859e..69516bd 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -657,17 +657,17 @@ full_sha() { run gitlab_extract_url "$mr_summary"; assert_output "https://gitlab.example.net/mr/123" run gitlab_extract_title "$mr_summary"; assert_output "Draft: Feature/XY-1234 Lorem Ipsum" - mr_summary=$(gitlab_merge_request_summary "feature/nope") - - run gitlab_extract_iid "$mr_summary"; assert_output '' - run gitlab_extract_url "$mr_summary"; assert_output '' - run gitlab_extract_title "$mr_summary"; assert_output '' + run gitlab_merge_request_summary "feature/nope" + assert_failure + assert_output "" - mr_summary=$(gitlab_merge_request_summary "nope") + run gitlab_merge_request_summary "nope" + assert_failure + assert_output "" - run gitlab_extract_iid "$mr_summary"; assert_output '' - run gitlab_extract_url "$mr_summary"; assert_output '' - run gitlab_extract_title "$mr_summary"; assert_output '' + run gitlab_extract_iid ""; assert_output '' + run gitlab_extract_url ""; assert_output '' + run gitlab_extract_title ""; assert_output '' } @test "Extracts MR info from merge request detail" { From 5701b7fcb003868549841841415eb9f852e4caad Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 4 Feb 2023 15:25:28 +0100 Subject: [PATCH 57/88] Missing local variables local var --- git-mr | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/git-mr b/git-mr index ca509d5..1bdd32d 100755 --- a/git-mr +++ b/git-mr @@ -901,9 +901,9 @@ gitlab_undraft() { if confirm "Do you want to resolve draft status?"; then echo -n "Resolving draft status... " - mr_data=$(jq_build "title" "$undraft_title") || exit $? - local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") + local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit $? + local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") [[ -n $result ]] && echo -e "OK\n" fi } @@ -1326,7 +1326,7 @@ mr_update_labels() { confirm "Do you want to update the merge request labels to \"$new_labels\"?"; then echo -n "Updating merge request labels... " - mr_data=$(jq_build "labels" "$new_labels") || exit $? + local mr_data; mr_data=$(jq_build "labels" "$new_labels") || exit $? local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") [[ -n $result ]] && echo -e "OK\n" @@ -1346,7 +1346,7 @@ mr_gitlab_undraft() { echo -n "Resolving draft status... " local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") - mr_data=$(jq_build "title" "$undraft_title") || exit $? + local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit $? local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") [[ -n $result ]] && echo -e "OK\n" From 101d7861b05cd4466427e4d318e54c720ecacad4 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 4 Feb 2023 16:01:08 +0100 Subject: [PATCH 58/88] git_base_branch & git_check_branches - check against actual default branch --- git-mr | 12 +++++++----- test/git-mr.bats | 4 ---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/git-mr b/git-mr index 1bdd32d..94ee8b1 100755 --- a/git-mr +++ b/git-mr @@ -16,9 +16,11 @@ git_current_branch() { git_base_branch() { local branch=${1:-$(git_current_branch)} - [[ -n $branch ]] || exit 3 # Not on any branch - [[ "$branch" != "main" && "$branch" != "master" ]] || exit 3 # On default branch - git show-ref -q --heads "$branch" || exit 3 # Branch does not exist + local default_branch; default_branch=$(git_default_branch) + + [[ -n $branch ]] || exit 3 # Not on any branch + [[ $branch != "$default_branch" ]] || exit 3 # On default branch + git show-ref -q --heads "$branch" || exit 3 # Branch does not exist # Nearest branch in commit history local base_branch @@ -36,7 +38,7 @@ git_base_branch() { # First possible merge base if ! git show-ref -q --heads "$base_branch"; then - base_branch=$(git show-branch --merge-base "$branch" "$(git_default_branch)" | head -n1) + base_branch=$(git show-branch --merge-base "$branch" "$default_branch" | head -n1) fi echo_debug "Base branch: $base_branch" @@ -89,7 +91,7 @@ git_check_branches() { [[ -n $source_branch ]] || exit_error 3 "Not on any branch" - [[ $source_branch != "main" && $source_branch != "master" ]] || + [[ $source_branch != "$(git_default_branch)" ]] || exit_error 3 "On default branch" git show-ref -q --heads "$source_branch" || diff --git a/test/git-mr.bats b/test/git-mr.bats index 69516bd..7dd2826 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -244,10 +244,6 @@ full_sha() { assert_failure assert_output "On default branch" - run git_check_branches master epic/big-feature - assert_failure - assert_output "On default branch" - run git_check_branches feature/base "" assert_failure assert_output "Unable to determine target branch" From 510fcc9f72eaa64167ae7990563f3d6c666e8f5d Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 4 Feb 2023 16:29:27 +0100 Subject: [PATCH 59/88] Minor ShellCheck fixes --- git-mr | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/git-mr b/git-mr index 94ee8b1..6d57152 100755 --- a/git-mr +++ b/git-mr @@ -225,7 +225,7 @@ urlencode() { } has_terminal_colors() { - which tput > /dev/null 2>&1 && + command -v tput > /dev/null 2>&1 && [[ -n $TERM ]] && [[ "$(tput -T"$TERM" colors)" -ge 8 ]] } @@ -308,13 +308,12 @@ confirm() { read -r -p "$(colorize "$question" "lightcyan" "bold") [y/N] " response case "$response" in [yY][eE][sS]|[yY]) return 0 ;; + *) return 1 ;; esac - - return 1 } clear_screen() { - which tput > /dev/null 2>&1 && + command -v tput > /dev/null 2>&1 && [[ -n $TERM ]] && tput -x clear } @@ -357,7 +356,7 @@ open_in_browser() { elif [[ "$OSTYPE" == "msys"* ]]; then open_command='explorer'; fi - if [[ -n $open_command && -x "$(command -v $open_command)" ]]; then + if [[ -n $open_command && -x "$(command -v "$open_command")" ]]; then $open_command "${url}" > /dev/null 2>&1 return fi @@ -1162,14 +1161,14 @@ mr_print_status() { # 1st row ------------------------------------------------------------------ # Labels echo -en " \U0001F3F7 ${labels_display}" - echo_spacer $spacer_chars_l + echo_spacer "$spacer_chars_l" # Draft status if [[ -n $draft_str ]]; then echo -en " $(colorize "$draft_str" "orange") " else echo_spacer $((2 - spacer_chars_l - spacer_chars_r)) fi - echo_spacer $spacer_chars_r + echo_spacer "$spacer_chars_r" # Target echo -e "${target_display}\n" @@ -2113,6 +2112,7 @@ mr_menu() { then mr_menu_update_all "$issue_code" "$menu_items" else mr_menu_update "$menu_items"; fi ;; status) mr_menu_status "$issue_code" "$menu_items" ;; + *) return 1 ;; esac } From 61797798cbe0e766169d1550afa150c61f6fcfe5 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 4 Feb 2023 19:55:43 +0100 Subject: [PATCH 60/88] Tweak confirm output --- git-mr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-mr b/git-mr index 6d57152..f12b851 100755 --- a/git-mr +++ b/git-mr @@ -300,7 +300,7 @@ confirm() { local question=$1 if [[ $GIT_MR_YES -eq 1 ]]; then - echo_error "$(colorize "$question" "cyan") -> yes" + echo "$(colorize "${question}" "cyan" >&2) -> yes" >&2 return 0 fi From 6228dccd243a878dd9ee3bc16d249269d04f2cf9 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 4 Feb 2023 21:34:39 +0100 Subject: [PATCH 61/88] Complete mr_title tests --- test/git-mr.bats | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/git-mr.bats b/test/git-mr.bats index 7dd2826..87dbf87 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -326,6 +326,12 @@ full_sha() { @test "Makes title from branch" { run git_titlize_branch feature/AB-123-some_branch_title assert_output "Feature/AB-123 Some branch title" + + run git_titlize_branch AB-123-some_branch_title + assert_output "AB-123 Some branch title" + + run git_titlize_branch task/other_branch-title + assert_output "Task/Other branch title" } ################################################################################ @@ -765,6 +771,21 @@ full_sha() { run mr_title assert_output "[AB-123 This is an issue](https://mycompany.example.net/browse/AB-123)" + + run mr_title feature/without-code + assert_output "$(cat <<- EOF + Unable to guess issue code + Feature/Without code + EOF + )" # includes stderr + + run mr_title feature/CD-456-unknown-code 2>/dev/null + assert_output "$(cat <<- EOF + Unable to get issue title from Jira + issue_code: CD-456 + CD-456 + EOF + )" # includes stderr } @test "Generates MR description from commits" { From 3732bf4d63cd0a9a70c537f997b07fcb7624bb5c Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 4 Feb 2023 20:44:41 +0100 Subject: [PATCH 62/88] Error codes management --- git-mr | 207 ++++++++++++++++---------------- test/git-mr.bats | 26 ++-- test/test_helper/jira-mock.bash | 8 +- 3 files changed, 119 insertions(+), 122 deletions(-) diff --git a/git-mr b/git-mr index f12b851..1ee3483 100755 --- a/git-mr +++ b/git-mr @@ -18,9 +18,9 @@ git_base_branch() { local default_branch; default_branch=$(git_default_branch) - [[ -n $branch ]] || exit 3 # Not on any branch - [[ $branch != "$default_branch" ]] || exit 3 # On default branch - git show-ref -q --heads "$branch" || exit 3 # Branch does not exist + [[ -n $branch ]] || exit "$ERR_GIT" # Not on any branch + [[ $branch != "$default_branch" ]] || exit "$ERR_GIT" # On default branch + git show-ref -q --heads "$branch" || exit "$ERR_GIT" # Branch does not exist # Nearest branch in commit history local base_branch @@ -66,15 +66,15 @@ git_default_branch() { local_tracking=$(git branch -vv | grep "${default#"refs/remotes/"}" | sed 's/^[* ]*//' | cut -d' ' -f1) # local branch tracking default remote with a different name - [[ -n $local_tracking ]] && echo "$local_tracking" && return + [[ -n $local_tracking ]] && echo "$local_tracking" && return 0 # short local name of remote default echo "${default#"refs/remotes/${remote}/"}" - return + return 0 fi - git_branch_exists "main" && echo "main" && return - git_branch_exists "master" && echo "master" && return + git_branch_exists "main" && echo "main" && return 0 + git_branch_exists "master" && echo "master" && return 0 } git_remote_branch_exists() { @@ -89,16 +89,16 @@ git_check_branches() { local target_branch="$2" [[ -n $source_branch ]] || - exit_error 3 "Not on any branch" + exit_error "$ERR_GIT" "Not on any branch" [[ $source_branch != "$(git_default_branch)" ]] || - exit_error 3 "On default branch" + exit_error "$ERR_GIT" "On default branch" git show-ref -q --heads "$source_branch" || - exit_error 3 "Branch '$source_branch' does not exist" + exit_error "$ERR_GIT" "Branch '$source_branch' does not exist" [[ -n $target_branch ]] || - exit_error 3 "Unable to determine target branch" + exit_error "$ERR_GIT" "Unable to determine target branch" return 0 } @@ -348,7 +348,7 @@ regex_escape() { open_in_browser() { local url=$1 - [[ -n $url ]] || return + [[ -n $url ]] || return "$ERR_MR" local open_command if [[ "$OSTYPE" == "linux-gnu"* ]]; then open_command='xdg-open'; @@ -358,13 +358,14 @@ open_in_browser() { if [[ -n $open_command && -x "$(command -v "$open_command")" ]]; then $open_command "${url}" > /dev/null 2>&1 - return + return 0 fi echo_error "Unable to open browser" echo_error echo "${url}" echo + return "$ERR_MR" } git_mr_readonly() { @@ -397,7 +398,7 @@ markdown_link() { if [[ -z $url ]]; then echo "[$label]" - return + return 0 fi echo "[$label]($url)" @@ -430,9 +431,9 @@ markdown_indent_list_items() { # Jira functions jira_check_env() { - [[ -n $JIRA_USER ]] || exit_error 21 "JIRA_USER is not set" - [[ -n $JIRA_TOKEN ]] || exit_error 21 "JIRA_TOKEN is not set" - [[ -n $JIRA_INSTANCE ]] || exit_error 21 "JIRA_INSTANCE is not set" + [[ -n $JIRA_USER ]] || exit_error "$ERR_MR_ENV" "JIRA_USER is not set" + [[ -n $JIRA_TOKEN ]] || exit_error "$ERR_MR_ENV" "JIRA_TOKEN is not set" + [[ -n $JIRA_INSTANCE ]] || exit_error "$ERR_MR_ENV" "JIRA_INSTANCE is not set" } jira_request() { @@ -456,13 +457,13 @@ jira_request() { -H "Content-Type: application/json" \ --data "${request_data}" \ --max-time "${GIT_MR_TIMEOUT:-5}" \ - "${jira_base_url}/${request_url}" || exit_error 20 "Jira request error" + "${jira_base_url}/${request_url}" || exit_error "$ERR_JIRA_API" "Jira request error" } jira_ticket_data() { jira_check_env - local issue_code=$1; [[ -n $issue_code ]] || exit_error 0 "issue_code required" + local issue_code=$1; [[ -n $issue_code ]] || exit_error "$ERR_MR" "issue_code required" jira_request "issue/${issue_code}?fields=summary" || exit $? } @@ -484,11 +485,11 @@ jira_show_transitions() { jira_transition() { jira_check_env - local issue_code=$1; [[ -n $issue_code ]] || exit_error 0 "issue_code required" - local transition_id=$2; [[ -n $transition_id ]] || exit_error 0 "transition_id required" + local issue_code=$1; [[ -n $issue_code ]] || exit_error "$ERR_MR" "issue_code required" + local transition_id=$2; [[ -n $transition_id ]] || exit_error "$ERR_MR" "transition_id required" - local transition; transition=$(jq_build "id" "$transition_id") || exit $? - local request_data; request_data=$(jq_build "transition" "$transition") || exit $? + local transition; transition=$(jq_build "id" "$transition_id") || exit "$ERR_MR" + local request_data; request_data=$(jq_build "transition" "$transition") || exit "$ERR_MR" jira_request "issue/${issue_code}/transitions" "POST" "$request_data" || exit $? } @@ -498,8 +499,8 @@ jira_transition() { # Gitlab functions gitlab_check_env() { - [[ -n $GITLAB_DOMAIN ]] || exit_error 11 "GITLAB_DOMAIN is not set" - [[ -n $GITLAB_TOKEN ]] || exit_error 11 "GITLAB_TOKEN is not set" + [[ -n $GITLAB_DOMAIN ]] || exit_error "$ERR_MR_ENV" "GITLAB_DOMAIN is not set" + [[ -n $GITLAB_TOKEN ]] || exit_error "$ERR_MR_ENV" "GITLAB_TOKEN is not set" } gitlab_remote() { @@ -510,7 +511,7 @@ gitlab_remote() { [[ -n "$remote_url" ]] && echo "$remote" && return 0 done - return 1 + return "$ERR_GIT_REPO" } gitlab_project_url() { @@ -535,7 +536,7 @@ gitlab_project_url() { local suggested_domain suggested_domain=$(git remote get-url --push "$remote" | sed 's/.*@\(.*\):.*/\1/') - exit_error 12 "$(cat <<- EOF + exit_error "$ERR_GIT_REPO" "$(cat <<- EOF Unable to determine Gitlab project URL, check GITLAB_DOMAIN configuration ${remote}: ${remote_url} current: GITLAB_DOMAIN="${GITLAB_DOMAIN}" @@ -579,9 +580,9 @@ gitlab_request() { -H "Content-Type: application/json" \ --data "${request_data}" \ --max-time "${GIT_MR_TIMEOUT:-5}" \ - "${gitlab_base_url}/${request_url}") || exit_error 10 "Gitlab request error" + "${gitlab_base_url}/${request_url}") || exit_error "$ERR_GITLAB_API" "Gitlab request error" - [[ -z "$(gitlab_check_error "$result")" ]] || return + [[ -z "$(gitlab_check_error "$result")" ]] || return "$ERR_GITLAB" echo "$result" } @@ -604,18 +605,16 @@ gitlab_new_merge_request_url() { local project_url; project_url=$(gitlab_project_url) || exit $? - [[ -n $project_url ]] || return - local source_branch=${1:-$(git_current_branch)} if ! git_remote_branch_exists "$source_branch"; then echo_error "Branch '$source_branch' does not exist on remote" - return + return "$ERR_GITLAB" fi local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} if ! git_remote_branch_exists "$target_branch"; then echo_error "Target branch '$target_branch' does not exist on remote" - return + return "$ERR_GITLAB" fi local gitlab_mr_url="https://${GITLAB_DOMAIN}/${project_url}/-/merge_requests/new" @@ -651,7 +650,7 @@ gitlab_merge_request_summary() { local result result=$(gitlab_project_request "merge_requests?state=opened&view=simple&source_branch=${source_branch}") || exit $? - [[ -n $result && $result != "[]" ]] || return + [[ -n $result && $result != "[]" ]] || return "$ERR_GITLAB" echo "$result" | jq '.[0]' } @@ -659,14 +658,14 @@ gitlab_merge_request_summary() { gitlab_merge_requests_search() { gitlab_check_env - local search_term=$1; [[ -n $search_term ]] || exit_error 0 "search_term required" + local search_term=$1; [[ -n $search_term ]] || exit_error "$ERR_MR" "search_term required" local result result=$(gitlab_request "merge_requests?scope=all&state=all&view=simple&search=$(urlencode "$search_term")&in=title&order_by=created_at&sort=asc") || exit $? - [[ -n $result && $result != "[]" ]] || return + [[ -n $result && $result != "[]" ]] || return "$ERR_GITLAB" result=$(echo "$result" | jq -c 'map(select(.state != "closed") | {iid: .iid, title: .title, web_url: .web_url, state: .state, project_id: .project_id}) | .[]') - [[ -n $result && $result != "[]" ]] || return + [[ -n $result && $result != "[]" ]] || return "$ERR_GITLAB" echo "$result" } @@ -675,10 +674,10 @@ gitlab_projects() { local result result=$(gitlab_request "projects?simple=true&archived=false&order_by=last_activity_at&per_page=100") || exit $? - [[ -n $result && $result != "[]" ]] || return + [[ -n $result && $result != "[]" ]] || return "$ERR_GITLAB" result=$(echo "$result" | jq 'map({id: .id, name: .name, path_with_namespace: .path_with_namespace})') - [[ -n $result && $result != "[]" ]] || return + [[ -n $result && $result != "[]" ]] || return "$ERR_GITLAB" echo "$result" } @@ -686,7 +685,7 @@ gitlab_projects() { gitlab_merge_request() { gitlab_check_env - local mr_iid=$1; [[ -n $mr_iid ]] || return + local mr_iid=$1; [[ -n $mr_iid ]] || exit_error "$ERR_MR" "No mr_iid provided" gitlab_project_request "merge_requests/$mr_iid" } @@ -716,7 +715,7 @@ gitlab_extract_merge_status() { if [[ "$(echo "$mr_detail" | jq -r '.state')" == "merged" ]]; then echo "merged" - return + return 0 fi echo "$mr_detail" | jq -r '.merge_status' @@ -763,8 +762,8 @@ gitlab_merge_request_threads() { local project_url=$1 local mr_iid=$2 - [[ -n $project_url ]] || return - [[ -n $mr_iid ]] || return + [[ -n $project_url ]] || exit_error "$ERR_MR" "No project_url provided" + [[ -n $mr_iid ]] || exit_error "$ERR_MR" "No mr_iid provided" local thread_summaries local per_page=100 @@ -831,8 +830,8 @@ gitlab_default_label_ids() { gitlab_merge_request_update() { gitlab_check_env - local mr_iid=$1; [[ -n $mr_iid ]] || { echo_error "No mr_iid provided"; return; } - local mr_data=$2; [[ -n $mr_data ]] || { echo_error "No data provided"; return; } + local mr_iid=$1; [[ -n $mr_iid ]] || exit_error "$ERR_MR" "No mr_iid provided" + local mr_data=$2; [[ -n $mr_data ]] || exit_error "$ERR_MR" "No data provided" gitlab_project_request "merge_requests/${mr_iid}" "PUT" "${mr_data}" } @@ -840,7 +839,7 @@ gitlab_merge_request_update() { gitlab_merge_request_merge() { gitlab_check_env - local mr_iid=$1; [[ -n $mr_iid ]] || { echo_error "No mr_iid provided"; return; } + local mr_iid=$1; [[ -n $mr_iid ]] || exit_error "$ERR_MR" "No mr_iid provided" gitlab_project_request "merge_requests/${mr_iid}/merge?should_remove_source_branch=${GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH:-1}" "PUT" } @@ -879,7 +878,7 @@ gitlab_undraft() { if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" - return + return "$ERR_GITLAB" fi local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") @@ -894,7 +893,7 @@ gitlab_undraft() { if ! gitlab_title_is_draft "$mr_title"; then echo_error "Merge request is not a draft" echo_error - return + return 0 fi local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") @@ -902,7 +901,7 @@ gitlab_undraft() { if confirm "Do you want to resolve draft status?"; then echo -n "Resolving draft status... " - local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit $? + local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit "$ERR_MR" local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") [[ -n $result ]] && echo -e "OK\n" @@ -915,7 +914,7 @@ gitlab_undraft() { guess_issue_code() { [[ -z $git_mr_unguessable_issue_code ]] || return - [[ -n $JIRA_CODE_PATTERN ]] || exit_error 0 "JIRA_CODE_PATTERN not set - unable to guess issue code" + [[ -n $JIRA_CODE_PATTERN ]] || { echo_error "JIRA_CODE_PATTERN not set - unable to guess issue code"; return "$ERR_MR_ENV"; } local branch=${1:-$(git_current_branch)} @@ -925,7 +924,7 @@ guess_issue_code() { if [[ -z $issue_code ]]; then echo_error "Unable to guess issue code" - return + return 1 fi echo_debug "Issue code: $issue_code" @@ -939,7 +938,7 @@ mr_title() { if [[ -z $issue_code ]]; then git_titlize_branch "$source_branch" - return + return 0 fi local issue_content; issue_content=$(jira_ticket_data "$issue_code") @@ -957,7 +956,7 @@ mr_title() { echo_error " $issue_content" echo "$issue_key" - return + return 0 fi local issue_url="https://${JIRA_INSTANCE}/browse/${issue_key}" @@ -981,7 +980,7 @@ mr_description() { local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} local issue_code=${3:-${GIT_MR_CODE:-$(guess_issue_code "$source_branch")}} - local title; title=$(mr_title "$source_branch" "$issue_code") || exit $? + local title; title=$(mr_title "$source_branch" "$issue_code") mr_print_description "$title" "$(mr_commit_list "$source_branch" "$target_branch")" } @@ -1048,7 +1047,7 @@ mr_print_status() { local merge_request=$1 local threads=$2 - [[ -n $merge_request ]] || exit_error 0 "merge_request not provided" + [[ -n $merge_request ]] || exit_error "$ERR_MR" "merge_request not provided" local mr_url; mr_url=$(gitlab_extract_url "$merge_request") local project_url; project_url=$(gitlab_extract_project_url "$mr_url") @@ -1248,10 +1247,10 @@ is_status_label() { tr "," "\n") local match - match="$( echo "$label" | grep "$status_labels")" || return + match="$( echo "$label" | grep "$status_labels")" || return 1 # reverse-match is important, we don't want "Jean-Pierre BACRI Team" to match "CR" label - (echo "$status_labels" | grep "$match" > /dev/null) || return + (echo "$status_labels" | grep "$match" > /dev/null) || return 1 echo "$match" } @@ -1319,7 +1318,7 @@ mr_update_labels() { if [[ -z $to_remove && -z $to_add ]]; then echo_error "No label to add or remove" - return + return 0 fi local new_labels; new_labels=$(replace_labels "$labels" "$to_remove" "$to_add") @@ -1327,7 +1326,7 @@ mr_update_labels() { confirm "Do you want to update the merge request labels to \"$new_labels\"?"; then echo -n "Updating merge request labels... " - local mr_data; mr_data=$(jq_build "labels" "$new_labels") || exit $? + local mr_data; mr_data=$(jq_build "labels" "$new_labels") || exit "$ERR_MR" local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") [[ -n $result ]] && echo -e "OK\n" @@ -1347,7 +1346,7 @@ mr_gitlab_undraft() { echo -n "Resolving draft status... " local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") - local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit $? + local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit "$ERR_MR" local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") [[ -n $result ]] && echo -e "OK\n" @@ -1382,7 +1381,7 @@ mr_menu_merge_requests() { local issue_code=${1:-${GIT_MR_CODE:-$(guess_issue_code)}} local mr_summaries; mr_summaries=$(gitlab_merge_requests_search "$issue_code") || exit $? - [[ -n $mr_summaries ]] || return + [[ -n $mr_summaries ]] || return "$ERR_GITLAB" # Load project names into bash associative array declare -A project_arr @@ -1494,7 +1493,7 @@ mr_menu_update() { echo_error "Merge request not found" echo mr_menu_contents "$menu_items" - return + return "$ERR_GITLAB" fi local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") @@ -1512,7 +1511,7 @@ mr_menu_update() { local mr_update_data='{}' if confirm "Do you want to update the menu in the merge request description?"; then - mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? + mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit "$ERR_MR" fi if [[ $mr_update_data != "{}" ]]; then echo -n "Updating merge request..." @@ -1570,7 +1569,7 @@ mr_menu_update_all() { mr_update_data='{}' if confirm "Do you want to update the menu in the merge request description?"; then - mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit $? + mr_update_data=$(jq_build "description" "$updated_description" "$mr_update_data") || exit "$ERR_MR" fi if [[ $mr_update_data != "{}" ]]; then echo -n "Updating merge request..." @@ -1788,7 +1787,7 @@ mr_status() { if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" - return + return "$ERR_GITLAB" fi local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") @@ -1816,7 +1815,7 @@ mr_update() { if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" "$target_branch" - return + return "$ERR_GITLAB" fi local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") @@ -1940,7 +1939,7 @@ mr_update() { new_description=$(echo -e "${new_description}\n${newLines}$(markdown_list "$new_commit_messages_content_str")") fi new_description=$(echo -e "$new_description")$'\n' - mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit $? + mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit "$ERR_MR" fi fi @@ -1948,7 +1947,7 @@ mr_update() { update_prompt=1 if confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?"; then if git_remote_branch_exists "$target_branch"; then - mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit $? + mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit "$ERR_MR" else echo_error "Target branch '$target_branch' does not exist on remote" fi @@ -1983,7 +1982,7 @@ mr_merge() { if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" - return + return "$ERR_GITLAB" fi local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") @@ -2006,12 +2005,12 @@ mr_merge() { if [[ $merge_status == "merged" ]]; then echo_error "Merge request is already merged." echo_error - return + return 0 fi if [[ $merge_status != "can_be_merged" ]]; then echo_error "Merge request can not be merged. You probably need to rebase the branch and resolve conflicts." echo_error - return + return "$ERR_GITLAB" fi # test open threads @@ -2025,37 +2024,37 @@ mr_merge() { else echo_error "There are $unresolved_thread_count unresolved threads. Please resolve them before merging or use the --force option." echo_error - return + return "$ERR_USER" fi fi if gitlab_title_is_draft "$mr_title"; then echo_error "Merge request is a draft (work in progress)" - confirm "Do you want to resolve draft status?" || { echo_error; return; } + confirm "Do you want to resolve draft status?" || { echo_error; return 0; } echo -n "Resolving draft status... " local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") - local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit $? + local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit "$ERR_MR" local result; result=$(gitlab_merge_request_update "${mr_iid}" "${mr_data}") [[ -n $result ]] && echo -e "OK\n" - [[ -n $result ]] || { echo_error; return; } # interrupt on error + [[ -n $result ]] || { echo_error; return "$ERR_GITLAB"; } # interrupt on error fi # Merge - confirm "Do you want to merge '$source_branch' into '$current_target'?" || { echo; return; } + confirm "Do you want to merge '$source_branch' into '$current_target'?" || { echo; return 0; } echo -n "Merging '$source_branch'... " local result; result=$(gitlab_merge_request_merge "${mr_iid}") [[ -n $result ]] && echo -e "OK\n" - [[ -n $result ]] || { echo_error; return; } # interrupt on error + [[ -n $result ]] || { echo_error; return "$ERR_GITLAB"; } # interrupt on error # checkout target branch - confirm "Do you want to checkout '$current_target' and pull changes?" || { echo; return; } + confirm "Do you want to checkout '$current_target' and pull changes?" || { echo; return 0; } echo "$(colorize "git checkout $current_target && git pull --rebase" "lightgray")" git_mr_readonly || @@ -2064,7 +2063,7 @@ mr_merge() { # delete local branch - confirm "Do you want to delete local branch '$source_branch'?" || { echo; return; } + confirm "Do you want to delete local branch '$source_branch'?" || { echo; return 0; } echo "$(colorize "git branch -d $source_branch" "lightgray")" git_mr_readonly || @@ -2096,14 +2095,14 @@ mr_menu() { local source_branch; source_branch=$(git_current_branch) local issue_code=${GIT_MR_CODE:-${1:-$(guess_issue_code "$source_branch")}} - [[ -n $issue_code ]] || return + [[ -n $issue_code ]] || exit_error "$ERR_USER" "Issue code or search term required for menu." # All non-closed merge requests for issue code local menu_items; menu_items=$(mr_menu_merge_requests "$issue_code") if [[ -z $menu_items ]]; then echo_error "No merge requests found for '$issue_code'." - return + return "$ERR_GITLAB" fi case "$git_mr_menu_mode" in @@ -2112,7 +2111,7 @@ mr_menu() { then mr_menu_update_all "$issue_code" "$menu_items" else mr_menu_update "$menu_items"; fi ;; status) mr_menu_status "$issue_code" "$menu_items" ;; - *) return 1 ;; + *) return "$ERR_MR" ;; esac } @@ -2128,7 +2127,7 @@ mr_transition() { if [[ -z $mr_summary ]]; then echo_error "Merge request not found" mr_print "$source_branch" - return 1 + return "$ERR_GITLAB" fi local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") @@ -2171,7 +2170,7 @@ mr_transition() { ;; *) echo_error "Invalid transition" - return 1 + return "$ERR_JIRA" ;; esac @@ -2312,6 +2311,22 @@ EOF } +################################################################################ +# Error codes + +#ERR=1 # General error +ERR_USER=9 # User error +ERR_GIT=10 # Git error +ERR_GIT_REPO=11 # Git repository error +ERR_GITLAB=20 # Gitlab error +ERR_GITLAB_API=21 # Gitlab request error +ERR_JIRA=30 # Jira error +ERR_JIRA_API=31 # Jira request error +ERR_MR=90 # Git-MR error +ERR_MR_DEPS=91 # Dependency issue +ERR_MR_ENV=92 # Environment configuration issue + + ################################################################################ # Hardcoded constants GITLAB_DRAFT_PREFIX="Draft" @@ -2331,10 +2346,10 @@ GIT_MR_MENU_UPDATE_CONTEXT_LINES=${GIT_MR_MENU_UPDATE_CONTEXT_LINES:-15} # Init -git rev-parse > /dev/null 2>&1 || exit_error 1 "Not a git repository" +git rev-parse > /dev/null 2>&1 || exit_error "$ERR_GIT_REPO" "Not a git repository" -[[ -x "$(command -v jq)" ]] || exit_error 2 "Git-MR requires jq [https://stedolan.github.io/jq/]" -[[ "${BASH_VERSINFO:-0}" -ge 4 ]] || exit_error 2 "Your bash version is too old: $BASH_VERSION" +[[ -x "$(command -v jq)" ]] || exit_error "$ERR_MR_DEPS" "Git-MR requires jq [https://stedolan.github.io/jq/]" +[[ "${BASH_VERSINFO:-0}" -ge 4 ]] || exit_error "$ERR_MR_DEPS" "Your bash version is too old: $BASH_VERSION" # Parse options @@ -2359,8 +2374,6 @@ done set -- "${args[@]}" - - # Run case $1 in @@ -2389,19 +2402,3 @@ case $1 in *) mr_print "$@" ;; esac - - -################################################################################ -# Error code reference: -# -# 1 Not a git repository -# 2 Dependency missing (jq is not installed, bash is too old) -# 3 Git branch error -# -# 10 Gitlab request error -# 11 GITLAB_DOMAIN|GITLAB_TOKEN is not set -# 12 Unable to determine Gitlab project URL -# -# 20 Jira request error -# 21 JIRA_USER|JIRA_TOKEN|JIRA_INSTANCE is not set -# diff --git a/test/git-mr.bats b/test/git-mr.bats index 87dbf87..d1ca632 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -116,7 +116,7 @@ full_sha() { @test "Fails outside a Git repository" { cd /tmp run git-mr - assert_failure + assert_failure "$ERR_GIT_REPO" } @test "Uses GNU commands" { @@ -170,11 +170,11 @@ full_sha() { git checkout -f "$(git rev-parse HEAD)" run git-mr base - assert_failure + assert_failure "$ERR_GIT" git switch main run git-mr base - assert_failure + assert_failure "$ERR_GIT" } @test "Determines remote name" { @@ -233,19 +233,19 @@ full_sha() { assert_output "" run git_check_branches "" main - assert_failure + assert_failure "$ERR_GIT" assert_output "Not on any branch" run git_check_branches test main - assert_failure + assert_failure "$ERR_GIT" assert_output "Branch 'test' does not exist" run git_check_branches main epic/big-feature - assert_failure + assert_failure "$ERR_GIT" assert_output "On default branch" run git_check_branches feature/base "" - assert_failure + assert_failure "$ERR_GIT" assert_output "Unable to determine target branch" } @@ -338,8 +338,8 @@ full_sha() { # Misc. utilities @test "Exits with error" { - run exit_error 3 "Nope!" - assert_failure + run exit_error 99 "Nope!" + assert_failure 99 assert_output "Nope!" } @@ -535,7 +535,7 @@ full_sha() { git remote add other1 "git@other-domain.net:other1.git" git remote add other2 "https://other-domain.net/other2.git" run gitlab_remote - assert_failure + assert_failure "$ERR_GIT_REPO" # SSH URL git remote add gitlab1 "git@${GITLAB_DOMAIN}:my/project.git" @@ -559,7 +559,7 @@ full_sha() { GITLAB_DOMAIN="test.example.net" run gitlab_project_url - assert_failure + assert_failure "$ERR_GIT_REPO" assert_output "$(cat <<- EOF Unable to determine Gitlab project URL, check GITLAB_DOMAIN configuration fs-local: ../remote @@ -660,11 +660,11 @@ full_sha() { run gitlab_extract_title "$mr_summary"; assert_output "Draft: Feature/XY-1234 Lorem Ipsum" run gitlab_merge_request_summary "feature/nope" - assert_failure + assert_failure "$ERR_GITLAB" assert_output "" run gitlab_merge_request_summary "nope" - assert_failure + assert_failure "$ERR_GITLAB" assert_output "" run gitlab_extract_iid ""; assert_output '' diff --git a/test/test_helper/jira-mock.bash b/test/test_helper/jira-mock.bash index d83989c..9765994 100644 --- a/test/test_helper/jira-mock.bash +++ b/test/test_helper/jira-mock.bash @@ -1,8 +1,8 @@ JIRA_INSTANCE="mycompany.example.net" jira_ticket_data() { - echo '{ - "key":"AB-123", - "fields":{"summary":"This is an issue"} - }' + case $1 in + "AB-123") echo '{"key":"AB-123", "fields":{"summary":"This is an issue"}}' ;; + *) return 1 ;; + esac } From eb15d3957bbc339eafcb177dfde8a63e27c7ba97 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 6 Feb 2023 21:29:32 +0100 Subject: [PATCH 63/88] Fix status label determination & optimize formatting --- git-mr | 23 ++++---------- test/git-mr.bats | 82 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 70 insertions(+), 35 deletions(-) diff --git a/git-mr b/git-mr index 1ee3483..5beb359 100755 --- a/git-mr +++ b/git-mr @@ -1239,20 +1239,9 @@ labels_differ() { is_status_label() { local label=$1 + local status_labels=",${2-"${GITLAB_IP_LABELS},${GITLAB_OK_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}"}," - local status_labels=${2:-"${GITLAB_IP_LABELS},${GITLAB_OK_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}"} - status_labels=$(echo "$status_labels" | - sed 's/,,/,/g' | - sed 's/^,//' | sed 's/,$//' | - tr "," "\n") - - local match - match="$( echo "$label" | grep "$status_labels")" || return 1 - - # reverse-match is important, we don't want "Jean-Pierre BACRI Team" to match "CR" label - (echo "$status_labels" | grep "$match" > /dev/null) || return 1 - - echo "$match" + echo "$status_labels" | grep -q ",$label," } is_status_ip_label() { @@ -1280,16 +1269,16 @@ mr_format_labels() { local other_labels=() for label in "${labels_array[@]}"; do - if [[ -n "$(is_status_ip_label "$label")" ]]; then + if is_status_ip_label "$label"; then # shellcheck disable=SC2086 # Allow splitting of terminal color status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_IP_LABEL_COLOR:-orange})") - elif [[ -n "$(is_status_cr_label "$label")" ]]; then + elif is_status_cr_label "$label"; then # shellcheck disable=SC2086 # Allow splitting of terminal color status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_CR_LABEL_COLOR:-lightblue bold})") - elif [[ -n "$(is_status_qa_label "$label")" ]]; then + elif is_status_qa_label "$label"; then # shellcheck disable=SC2086 # Allow splitting of terminal color status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_QA_LABEL_COLOR:-lightpurple bold})") - elif [[ -n "$(is_status_ok_label "$label")" ]]; then + elif is_status_ok_label "$label"; then # shellcheck disable=SC2086 # Allow splitting of terminal color status_labels+=("$(colorize "[$label]" ${GIT_MR_STATUS_OK_LABEL_COLOR:-lightgreen})") else diff --git a/test/git-mr.bats b/test/git-mr.bats index d1ca632..062ce46 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1059,24 +1059,70 @@ full_sha() { GITLAB_QA_LABELS="qa1,qa2" GITLAB_OK_LABELS="ok1,ok2" - run is_status_label "wip1"; assert_output "wip1" - run is_status_label "wip2"; assert_output "wip2" - run is_status_label "cr1"; assert_output "cr1" - run is_status_label "cr2"; assert_output "cr2" - run is_status_label "qa1"; assert_output "qa1" - run is_status_label "qa2"; assert_output "qa2" - run is_status_label "ok1"; assert_output "ok1" - run is_status_label "ok2"; assert_output "ok2" - - run is_status_ip_label "wip1"; assert_output "wip1"; run is_status_ip_label "cr1"; assert_output "" - run is_status_cr_label "cr1"; assert_output "cr1"; run is_status_cr_label "qa1"; assert_output "" - run is_status_qa_label "qa1"; assert_output "qa1"; run is_status_qa_label "ok1"; assert_output "" - run is_status_ok_label "ok1"; assert_output "ok1"; run is_status_ok_label "wip1"; assert_output "" - - run is_status_label "test"; assert_output "" - run is_status_label "zcr12"; assert_output "" - run is_status_label "zqa12"; assert_output "" - run is_status_label "zok12"; assert_output "" + run is_status_label "wip1"; assert_success; run is_status_ip_label "wip1"; assert_success + run is_status_label "wip2"; assert_success; run is_status_ip_label "wip2"; assert_success + run is_status_label "cr1"; assert_success; run is_status_cr_label "cr1"; assert_success + run is_status_label "cr2"; assert_success; run is_status_cr_label "cr2"; assert_success + run is_status_label "qa1"; assert_success; run is_status_qa_label "qa1"; assert_success + run is_status_label "qa2"; assert_success; run is_status_qa_label "qa2"; assert_success + run is_status_label "ok1"; assert_success; run is_status_ok_label "ok1"; assert_success + run is_status_label "ok2"; assert_success; run is_status_ok_label "ok2"; assert_success + + run is_status_ip_label "cr1"; assert_failure + run is_status_cr_label "qa1"; assert_failure + run is_status_qa_label "ok1"; assert_failure + run is_status_ok_label "wip1"; assert_failure + + run is_status_label "test"; assert_failure + run is_status_label "zcr12"; assert_failure + run is_status_label "zqa12"; assert_failure + run is_status_label "zok12"; assert_failure + + # ---------------------- + + GITLAB_IP_LABELS="" + run is_status_label "wip1"; assert_failure; run is_status_ip_label "wip1"; assert_failure # + run is_status_label "cr1"; assert_success; run is_status_cr_label "cr1"; assert_success + run is_status_label "qa1"; assert_success; run is_status_qa_label "qa1"; assert_success + run is_status_label "ok1"; assert_success; run is_status_ok_label "ok1"; assert_success + + run is_status_ip_label "cr1"; assert_failure + run is_status_ip_label "qa1"; assert_failure + run is_status_ip_label "ok1"; assert_failure + GITLAB_IP_LABELS="wip1,wip2" + + GITLAB_CR_LABELS="" + run is_status_label "wip1"; assert_success; run is_status_ip_label "wip1"; assert_success + run is_status_label "cr1"; assert_failure; run is_status_cr_label "cr1"; assert_failure # + run is_status_label "qa1"; assert_success; run is_status_qa_label "qa1"; assert_success + run is_status_label "ok1"; assert_success; run is_status_ok_label "ok1"; assert_success + + run is_status_cr_label "wip1"; assert_failure + run is_status_cr_label "qa1"; assert_failure + run is_status_cr_label "ok1"; assert_failure + GITLAB_CR_LABELS="cr1,cr2" + + GITLAB_QA_LABELS="" + run is_status_label "wip1"; assert_success; run is_status_ip_label "wip1"; assert_success + run is_status_label "cr1"; assert_success; run is_status_cr_label "cr1"; assert_success + run is_status_label "qa1"; assert_failure; run is_status_qa_label "qa1"; assert_failure # + run is_status_label "ok1"; assert_success; run is_status_ok_label "ok1"; assert_success + + run is_status_qa_label "wip1"; assert_failure + run is_status_qa_label "cr1"; assert_failure + run is_status_qa_label "ok1"; assert_failure + GITLAB_QA_LABELS="qa1,qa2" + + GITLAB_OK_LABELS="" + run is_status_label "wip1"; assert_success; run is_status_ip_label "wip1"; assert_success + run is_status_label "cr1"; assert_success; run is_status_cr_label "cr1"; assert_success + run is_status_label "qa1"; assert_success; run is_status_qa_label "qa1"; assert_success + run is_status_label "ok1"; assert_failure; run is_status_ok_label "ok1"; assert_failure # + + run is_status_ok_label "wip1"; assert_failure + run is_status_ok_label "cr1"; assert_failure + run is_status_ok_label "qa1"; assert_failure + GITLAB_OK_LABELS="ok1,ok2" } @test "Formats labels" { From bc2f9b2286fcb816ef42c794a2dc25afb360e359 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 7 Feb 2023 09:32:10 +0100 Subject: [PATCH 64/88] Optimize jq calls --- git-mr | 205 ++++++++++++++++++++------------ test/git-mr.bats | 12 +- test/test_helper/jira-mock.bash | 1 + 3 files changed, 142 insertions(+), 76 deletions(-) diff --git a/git-mr b/git-mr index 5beb359..f371266 100755 --- a/git-mr +++ b/git-mr @@ -582,7 +582,9 @@ gitlab_request() { --max-time "${GIT_MR_TIMEOUT:-5}" \ "${gitlab_base_url}/${request_url}") || exit_error "$ERR_GITLAB_API" "Gitlab request error" - [[ -z "$(gitlab_check_error "$result")" ]] || return "$ERR_GITLAB" + if [[ $request_verb != "GET" ]]; then + [[ -z "$(gitlab_check_error "$result")" ]] || return "$ERR_GITLAB" + fi echo "$result" } @@ -664,7 +666,7 @@ gitlab_merge_requests_search() { result=$(gitlab_request "merge_requests?scope=all&state=all&view=simple&search=$(urlencode "$search_term")&in=title&order_by=created_at&sort=asc") || exit $? [[ -n $result && $result != "[]" ]] || return "$ERR_GITLAB" - result=$(echo "$result" | jq -c 'map(select(.state != "closed") | {iid: .iid, title: .title, web_url: .web_url, state: .state, project_id: .project_id}) | .[]') + result=$(echo "$result" | jq -c 'map(select(.state != "closed") | {iid: .iid, title: .title, web_url: .web_url, state: .state, project_id: .project_id})') [[ -n $result && $result != "[]" ]] || return "$ERR_GITLAB" echo "$result" @@ -814,17 +816,10 @@ gitlab_default_label_ids() { local gitlab_labels; gitlab_labels=$(gitlab_project_request "labels") - # split in multiple lines - gitlab_labels=$(echo "$gitlab_labels" | sed "s/},/},\n/g") - - # extact ids - local default_labels oIFS - oIFS="$IFS"; IFS=','; read -ra default_labels <<<"$GITLAB_DEFAULT_LABELS"; IFS="$oIFS"; unset oIFS - for label in "${default_labels[@]}"; do - local label_id; label_id=$(echo "$gitlab_labels" | jq -r '.[] | select(.name == "'"$label"'") | .id') - [[ -n $label_id ]] && - echo "$label_id" - done + echo "$GITLAB_DEFAULT_LABELS" | jq -R -r \ + --argjson gitlab_labels "$gitlab_labels" \ + 'split(",") | .[] | . as $name | $gitlab_labels | map(select(.name == $name) | .id) | .[]' | + tr -d '\r' } gitlab_merge_request_update() { @@ -881,8 +876,13 @@ gitlab_undraft() { return "$ERR_GITLAB" fi - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - local mr_title; mr_title=$(gitlab_extract_title "$mr_summary") + local mr_iid \ + mr_title + + eval "$(echo "$mr_summary" | jq -r ' + "mr_iid=" + (.iid | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" + ')" # Print merge request status summary echo @@ -943,8 +943,13 @@ mr_title() { local issue_content; issue_content=$(jira_ticket_data "$issue_code") - local issue_key; issue_key=$(echo "$issue_content" | jq -r '.key // empty') - local issue_title; issue_title=$(echo "$issue_content" | jq -r '.fields.summary // empty') + local issue_key \ + issue_title + + eval "$(echo "$issue_content" | jq -r ' + "issue_key=" + (.key // empty | @sh) + ";\n" + + "issue_title=" + (.fields.summary // empty | @sh) + ";\n" + ')" [[ -z $issue_key ]] && issue_key=${issue_code^^} @@ -1009,7 +1014,6 @@ mr_status_block() { local mr_threads=$5 if [[ -z $mr_threads ]]; then - local mr_url; mr_url=$(gitlab_extract_url "$merge_request") local project_url; project_url=$(gitlab_extract_project_url "$mr_url") mr_threads=$(gitlab_merge_request_threads "$project_url" "$mr_iid") fi @@ -1049,21 +1053,40 @@ mr_print_status() { [[ -n $merge_request ]] || exit_error "$ERR_MR" "merge_request not provided" - local mr_url; mr_url=$(gitlab_extract_url "$merge_request") + local mr_url \ + title \ + labels \ + labels_count \ + upvotes \ + downvotes \ + merge_status \ + pipeline_status \ + pipeline_url \ + current_target + + eval "$(echo "$merge_request" | jq -r ' + "mr_url=" + (.web_url | @sh) + ";\n" + + "title=" + (.title | @sh) + ";\n" + + "labels=" + (.labels | join(",") | @sh) + ";\n" + + "labels_count=" + (.labels | length | @sh) + ";\n" + + "upvotes=" + (.upvotes | @sh) + ";\n" + + "downvotes=" + (.downvotes | @sh) + ";\n" + + "state=" + (.state | @sh) + ";\n" + + "merge_status=" + (if .state == "merged" + then "merged" + else .merge_status end | @sh) + ";\n" + + "pipeline_status=" + (.head_pipeline.status | @sh) + ";\n" + + "pipeline_url=" + (.head_pipeline.web_url | @sh) + ";\n" + + "current_target=" + (.target_branch | @sh) + ";\n" + ')" + local project_url; project_url=$(gitlab_extract_project_url "$mr_url") # Labels - local labels; labels=$(gitlab_extract_labels "$merge_request") local labels_display; labels_display=$(mr_format_labels "$labels") - - local labels_count; labels_count=$(echo "$labels" | sed 's/[^,]//g' | wc -m) local labels_str_len=$((${#labels} + $((labels_count * 2)) + 4)) # 2 spaces + 2 for larger icon # Votes - - local upvotes; upvotes=$(echo "$merge_request" | jq -r '.upvotes') - local downvotes; downvotes=$(echo "$merge_request" | jq -r '.downvotes') - if [[ $upvotes -gt 1 ]]; then upvotes=$(colorize "$upvotes" "bold" "lightgreen") elif [[ $upvotes -gt 0 ]]; then upvotes=$(colorize "$upvotes" "bold" "lightyellow") else upvotes=$(colorize "$upvotes" "bold"); fi @@ -1092,18 +1115,12 @@ mr_print_status() { threads_display=$(terminal_link "$note_url" "$threads_display") fi - # Title - local title; title=$(gitlab_extract_title "$merge_request") - # Merge status - local merge_status; merge_status=$(gitlab_extract_merge_status "$merge_request") local merge_status_icon; if [[ $merge_status == "merged" || $merge_status == "can_be_merged" ]]; then merge_status_icon="$(colorize "\U00002714" "lightgreen" "bold")"; # heavy check mark else merge_status_icon="$(colorize "\U0000274C" "lightred" "bold")"; fi # cross mark # Pipeline status - local pipeline_status; pipeline_status="$(gitlab_extract_pipeline_status "$merge_request")" - local pipeline_url; pipeline_url="$(gitlab_extract_pipeline_url "$merge_request")" local pipeline_icon case "$pipeline_status" in created|waiting_for_resource|preparing|pending|running) @@ -1121,8 +1138,6 @@ mr_print_status() { ci_str="CI: $pipeline_icon" # Merge target - local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") - local target_display target_display="${target_display}$(colorize "(\U000021A3 " "gray")" target_display="${target_display}$(colorize "$current_target" "lightpurple")" @@ -1372,20 +1387,10 @@ mr_menu_merge_requests() { local mr_summaries; mr_summaries=$(gitlab_merge_requests_search "$issue_code") || exit $? [[ -n $mr_summaries ]] || return "$ERR_GITLAB" - # Load project names into bash associative array - declare -A project_arr - local id name - while IFS="=" read -r id name; do - project_arr[$id]="$name" - done < <(gitlab_projects | jq -r 'map((.id | tostring)+"="+.name) | .[]' | sed 's/\r//g') - # Enrich merge request summaries with project names - while IFS=$'\n' read -r mr_summary; do - local project_id; project_id=$(echo "$mr_summary" | jq -r '.project_id') - local project_name; project_name=${project_arr[$project_id]} - - echo "$mr_summary" | jq -c --arg project_name "$project_name" '. + {project_name: $project_name}' - done < <(echo "$mr_summaries") + echo "$mr_summaries" | jq -c \ + --argjson projects "$(gitlab_projects | jq 'map({(.id|tostring): .name}) | add')" \ + '.[] | . + { project_name: $projects[(.project_id|tostring)] }' } mr_menu_contents() { @@ -1396,9 +1401,15 @@ mr_menu_contents() { echo while IFS=$'\n' read -r menu_item; do - local project_name; project_name=$(echo "$menu_item" | jq -r '.project_name') - local title; title=$(echo "$menu_item" | jq -r '.title') - local web_url; web_url=$(echo "$menu_item" | jq -r '.web_url') + local project_name \ + title \ + web_url + + eval "$(echo "$menu_item" | jq -r ' + "project_name=" + (.project_name | @sh) + ";\n" + + "title=" + (.title | @sh) + ";\n" + + "web_url=" + (.web_url | @sh) + ";\n" + ')" title=$(gitlab_title_undraft "$title") @@ -1439,10 +1450,17 @@ mr_menu_status() { echo while IFS=$'\n' read -r menu_item; do - local mr_iid; mr_iid=$(echo "$menu_item" | jq -r '.iid') - local project_name; project_name=$(echo "$menu_item" | jq -r '.project_name') - local title; title=$(echo "$menu_item" | jq -r '.title') - local web_url; web_url=$(echo "$menu_item" | jq -r '.web_url') + local mr_iid \ + project_name \ + title \ + web_url + + eval "$(echo "$menu_item" | jq -r ' + "mr_iid=" + (.iid | @sh) + ";\n" + + "project_name=" + (.project_name | @sh) + ";\n" + + "title=" + (.title | @sh) + ";\n" + + "web_url=" + (.web_url | @sh) + ";\n" + ')" title=$(gitlab_title_undraft "$title") local project_url; project_url=$(gitlab_extract_project_url "$web_url") @@ -1485,13 +1503,24 @@ mr_menu_update() { return "$ERR_GITLAB" fi - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + local mr_iid \ + mr_url + + eval "$(echo "$mr_summary" | jq -r ' + "mr_iid=" + (.iid | @sh) + ";\n" + + "mr_url=" + (.web_url | @sh) + ";\n" + ')" # Load existing merge request details local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - local mr_description; mr_description=$(gitlab_extract_description "$merge_request") - local mr_title; mr_title=$(gitlab_extract_title "$merge_request") + + local mr_description \ + mr_title + + eval "$(echo "$merge_request" | jq -r ' + "mr_description=" + (.description | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" + ')" local mr_menu_content; mr_menu_content=$(mr_menu_contents "$menu_items" "$mr_url") local updated_description; updated_description="$(mr_menu_replace_description "$mr_description" "$mr_menu_content")" @@ -1534,10 +1563,12 @@ mr_menu_update_all() { local i=1 updated_count=0 for menu_item in "${menu_array[@]}"; do - mr_iid=$(echo "$menu_item" | jq -r '.iid') - mr_url=$(echo "$menu_item" | jq -r '.web_url') - mr_title=$(echo "$menu_item" | jq -r '.title') - project_name=$(echo "$menu_item" | jq -r '.project_name') + eval "$(echo "$menu_item" | jq -r ' + "mr_iid=" + (.iid | @sh) + ";\n" + + "mr_url=" + (.web_url | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" + + "project_name=" + (.project_name | @sh) + ";\n" + ')" # Beware, `gitlab_merge_request` and `gitlab_merge_request_update` use 'gitlab_project_request', which is project-specific # Here, we can expect other target projects here. @@ -1780,12 +1811,9 @@ mr_status() { fi local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") # Load existing merge request details local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - local mr_title; mr_title=$(gitlab_extract_title "$merge_request") - local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") # Print merge request title & status echo @@ -1807,14 +1835,26 @@ mr_update() { return "$ERR_GITLAB" fi - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + local mr_iid \ + mr_url + + eval "$(echo "$mr_summary" | jq -r ' + "mr_iid=" + (.iid | @sh) + ";\n" + + "mr_url=" + (.web_url | @sh) + ";\n" + ')" # Load existing merge request details local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - local mr_title; mr_title=$(gitlab_extract_title "$merge_request") - local mr_description; mr_description=$(gitlab_extract_description "$merge_request") - local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") + + local mr_title \ + mr_description \ + current_target + + eval "$(echo "$merge_request" | jq -r ' + "mr_title=" + (.title | @sh) + ";\n" + + "mr_description=" + (.description | @sh) + ";\n" + + "current_target=" + (.target_branch | @sh) + ";\n" + ')" # Init commit lists @@ -1974,15 +2014,30 @@ mr_merge() { return "$ERR_GITLAB" fi - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - local mr_title; mr_title=$(gitlab_extract_title "$mr_summary") - local mr_url; mr_url=$(gitlab_extract_url "$mr_summary") + local mr_iid \ + mr_title \ + mr_url + + eval "$(echo "$mr_summary" | jq -r ' + "mr_iid=" + (.iid | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" + + "mr_url=" + (.web_url | @sh) + ";\n" + ')" + local project_url; project_url=$(gitlab_extract_project_url "$mr_url") # Load existing merge request details local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - local merge_status; merge_status=$(gitlab_extract_merge_status "$merge_request") - local current_target; current_target=$(gitlab_extract_target_branch "$merge_request") + + local merge_status \ + current_target + + eval "$(echo "$merge_request" | jq -r ' + "merge_status=" + (if .state == "merged" + then "merged" + else .merge_status end | @sh) + ";\n" + + "current_target=" + (.target_branch | @sh) + ";\n" + ')" # Print merge request status summary echo diff --git a/test/git-mr.bats b/test/git-mr.bats index 062ce46..16ad1b9 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -722,13 +722,14 @@ full_sha() { GITLAB_DEFAULT_LABELS="Label A,Label C" gitlab_project_request() { [[ $1 == "labels" ]] && - echo '[{"id":1,"name":"Label A"},{"id":2,"name":"Label B"},{"id":3,"name":"Label C"}]' + echo '[{"id":1,"name":"Label A"},{"id":2,"name":"Label B"},{"id":3,"name":"Label C"}, {"id":4,"name":"Label C"}]' } run gitlab_default_label_ids assert_output "$(cat <<- EOF 1 3 + 4 EOF )" } @@ -786,6 +787,15 @@ full_sha() { CD-456 EOF )" # includes stderr + + run mr_title feature/EF-789-no-summary 2>/dev/null + assert_output "$(cat <<- EOF + Unable to get issue title from Jira + issue_code: EF-789 + {"key":"EF-789", "fields":{}} + EF-789 + EOF + )" # includes stderr } @test "Generates MR description from commits" { diff --git a/test/test_helper/jira-mock.bash b/test/test_helper/jira-mock.bash index 9765994..83406dd 100644 --- a/test/test_helper/jira-mock.bash +++ b/test/test_helper/jira-mock.bash @@ -3,6 +3,7 @@ JIRA_INSTANCE="mycompany.example.net" jira_ticket_data() { case $1 in "AB-123") echo '{"key":"AB-123", "fields":{"summary":"This is an issue"}}' ;; + "EF-789") echo '{"key":"EF-789", "fields":{}}' ;; *) return 1 ;; esac } From b52dee890446b040843b1bd35fe15c10f96693d3 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 7 Feb 2023 09:36:55 +0100 Subject: [PATCH 65/88] Optimize shell usage - remove useless pipes to external commands. - use parameter expansion when possible --- git-mr | 120 ++++++++++++++++++++++++++++------------------- test/git-mr.bats | 60 ++++++++++++++++++------ 2 files changed, 116 insertions(+), 64 deletions(-) diff --git a/git-mr b/git-mr index f371266..a8824a4 100755 --- a/git-mr +++ b/git-mr @@ -27,13 +27,14 @@ git_base_branch() { local refs_logs; refs_logs=$(git log --oneline --decorate "${branch}" \ --simplify-by-decoration --decorate-refs='refs/heads/*') # select only commits with a local branch - if [[ $(echo "$refs_logs" | wc -l) -gt 1 ]]; then + local ref_count; ref_count="${refs_logs//[!$'\n']/}"; ref_count=$((${#ref_count} + 1)) + if [[ $ref_count -gt 1 ]]; then base_branch=$( \ echo "$refs_logs" | - head -n2 | tail -n1 | # select closest decoration before current HEAD - sed 's/[a-f0-9]* (\([^)]*\)) .*/\1/' | # filters out everything but decorations - sed -e 's/, /\n/g' | # splits decorations - head -n1) # keep only first decoration + sed ' + 2!d # keep only 2nd line (closest decoration before current HEAD) + s/[a-f0-9]* (\([^),]*\).*/\1/ # keep only first decoration + ') fi # First possible merge base @@ -61,9 +62,11 @@ git_default_branch() { local default; default=$(git symbolic-ref "refs/remotes/${remote}/HEAD" -- 2>/dev/null) if [[ -n $default ]]; then - local local_tracking - local_tracking=$(git branch -vv | grep "${default#"refs/remotes/"}" | sed 's/^[* ]*//' | cut -d' ' -f1) + local_tracking=$(git branch -vv | grep "${default#"refs/remotes/"}") + local_tracking=${local_tracking:2} # remove first 2 characters (" " or "* ") + local_tracking=${local_tracking%% *} # remove all trailing characters after first space (included) + # -> only short local branch name remains # local branch tracking default remote with a different name [[ -n $local_tracking ]] && echo "$local_tracking" && return 0 @@ -171,7 +174,9 @@ git_titlize_branch() { # Formatting local title_ref; title_ref="${prefix^}${issue_id}" - local title_label; title_label="$(echo "${label^}" | sed 's/[-_]/ /g')" + local title_label; title_label=${label^} + title_label=${title_label//-/ } + title_label=${title_label//_/ } echo "${title_ref}${title_label}" } @@ -296,6 +301,20 @@ echo_spacer() { done } +trim() { + # shellcheck disable=SC2064 # expand now to restore initial value on exit + trap "$(shopt -p extglob)" RETURN + shopt -s extglob + + local str=$1 + local char=$2 + + str=${str##*("$2")} # trim leading characters + str=${str%%*("$2")} # trim trailing characters + + echo "$str" +} + confirm() { local question=$1 @@ -410,7 +429,7 @@ markdown_list() { local prefix="* ${MD_BOLD}" local suffix="${MD_BOLD}${MD_BR}" - echo "$content" | sed "s/.*/${prefix}&${suffix}/" + echo "${prefix}${content//$'\n'/${suffix}$'\n'${prefix}}${suffix}" } markdown_indent_list_items() { @@ -479,7 +498,7 @@ jira_show_transitions() { "-> " + (.to | .name + (" " * (23 - (.name | length)))), "[" + .to.statusCategory.name + "]" ] | @tsv' | - sed 's/\r//g' + tr -d '\r' } jira_transition() { @@ -524,9 +543,13 @@ gitlab_project_url() { remote_url=$(git remote get-url --push "$remote" | grep "${GITLAB_DOMAIN}") if [[ "$remote_url" == git* ]]; then - project_url=$(echo "$remote_url" | sed "s/git\@${GITLAB_DOMAIN}:\(.*\).git/\1/") + project_url=$remote_url + project_url=${project_url#"git@${GITLAB_DOMAIN}:"} + project_url=${project_url%".git"} elif [[ "$remote_url" == https* ]]; then - project_url=$(echo "$remote_url" | sed "s/https:\/\/${GITLAB_DOMAIN}\/\(.*\).git/\1/") + project_url=$remote_url + project_url=${project_url#"https://${GITLAB_DOMAIN}/"} + project_url=${project_url%".git"} fi if [[ -z $project_url ]]; then @@ -749,9 +772,9 @@ gitlab_extract_project_url() { local mr_url=$1 local project_url - project_url=$(echo "$mr_url" | - sed "s/https:\/\/$GITLAB_DOMAIN\///" | # remove prefix - sed "s/\/-\/merge_requests\/[0-9]*\$//") # remove suffix + project_url=$(echo "$mr_url" | sed \ + -e "s/https:\/\/$GITLAB_DOMAIN\///" \ + -e "s/\/-\/merge_requests\/[0-9]*\$//") project_url=$(urlencode "$project_url") @@ -791,7 +814,7 @@ gitlab_merge_request_threads() { } ) | .[] | .id + "\t" + "unresolved:" + (.unresolved | tostring) + "\t" + "note_id:" + (.first_unresolved_note_id | tostring)' | - sed 's/\r//g') + tr -d '\r') # append page if [[ -z $thread_summaries ]]; then @@ -842,9 +865,7 @@ gitlab_merge_request_merge() { gitlab_title_is_draft() { local title=$1 for prefix in "${GITLAB_DRAFT_PREFIXES[@]}"; do - if echo "$title" | grep -q "^${prefix}:"; then - return 0 - fi + [[ $title =~ ^${prefix}: ]] && return 0 done return 1 } @@ -857,7 +878,7 @@ gitlab_title_to_draft() { gitlab_title_undraft() { local title=$1 for prefix in "${GITLAB_DRAFT_PREFIXES[@]}"; do - title=$(echo "$title" | sed "s/^${prefix}:\s*//g") + title=${title#"${prefix}: "} done echo "$title" } @@ -1109,8 +1130,9 @@ mr_print_status() { local threads_display="${resolved_count_display}/${thread_count_display}" if [[ $resolved_count -lt "$thread_count" ]]; then - local first_unresolved_note_id - first_unresolved_note_id=$(echo "$threads" | grep 'unresolved:true' | cut -f 3 | cut -d ':' -f 2 | head -n 1) + local first_unresolved_thread; first_unresolved_thread=$(echo "$threads" | grep -m 1 'unresolved:true') + local first_unresolved_note_id; first_unresolved_note_id="${first_unresolved_thread##*:}" + local note_url="${mr_url}#note_${first_unresolved_note_id}" threads_display=$(terminal_link "$note_url" "$threads_display") fi @@ -1221,19 +1243,22 @@ replace_labels() { local to_add=$3 # split - labels=$( echo "$labels" | tr "," "\n") - to_remove=$( echo "$to_remove" | tr "," "\n") - to_add=$( echo "$to_add" | tr "," "\n") + labels=${labels//,/$'\n'} + to_remove=${to_remove//,/$'\n'} + to_add=${to_add//,/$'\n'} # remove - [[ -n $to_remove ]] && labels=$(echo "$labels" | grep -v "$to_remove") - [[ -n $to_add ]] && labels=$(echo "$labels" | grep -v "$to_add") + labels=$(echo "$labels" | grep -vx "$to_remove"$'\n'"$to_add") # add - [[ -n $to_add ]] && labels=$(echo -e "${labels}\n${to_add}") + [[ -n $to_add ]] && labels="${labels},${to_add}" # implode - labels=$(echo "$labels" | tr "\n" "," | sed 's/^,//' | sed 's/,$//') + labels=${labels//$'\n'/,} + + # trim commas + labels=${labels%,} + labels=${labels#,} echo "$labels" } @@ -1244,12 +1269,11 @@ labels_differ() { [[ $old_labels == "$new_labels" ]] && return 1 - local old_sorted; old_sorted=$(echo "$old_labels" | tr "," "\n" | grep . | sort -u | tr "\n" ",") - local new_sorted; new_sorted=$(echo "$new_labels" | tr "," "\n" | grep . | sort -u | tr "\n" ",") + # split to lines, sort and de-duplicate, remove potential empty line, join back to comma-separated string + old_labels=$(echo "${old_labels//,/$'\n'}" | sort -u); old_labels=${old_labels#$'\n'}; old_labels=${old_labels//$'\n'/,} + new_labels=$(echo "${new_labels//,/$'\n'}" | sort -u); new_labels=${new_labels#$'\n'}; new_labels=${new_labels//$'\n'/,} - [[ $old_sorted == "$new_sorted" ]] && return 1 - - return 0 + [[ $old_labels != "$new_labels" ]] } is_status_label() { @@ -1304,8 +1328,8 @@ mr_format_labels() { local status_labels_str; status_labels_str="$(printf "%s " "${status_labels[@]}")" local other_labels_str; other_labels_str="$(printf "%s " "${other_labels[@]}")" - echo "${status_labels_str}${other_labels_str}" | - sed 's/^\s*//' | sed 's/\s*$//' # remove leading and trailing spaces + # shellcheck disable=SC2086 # trim whitespace + echo ${status_labels_str}${other_labels_str} } @@ -1315,10 +1339,8 @@ mr_format_labels() { mr_update_labels() { local mr_iid=$1 local labels=$2 - - # strip leading & trailing label commas - local to_remove; to_remove=$(echo -e "$3" | sed 's/^,*//' | sed 's/,*$//') - local to_add; to_add=$(echo -e "$4" | sed 's/^,*//' | sed 's/,*$//') + local to_remove=$3 + local to_add=$4 if [[ -z $to_remove && -z $to_add ]]; then echo_error "No label to add or remove" @@ -1894,12 +1916,12 @@ mr_update() { if [[ -n $old ]]; then if [[ $old == "$curr" ]]; then # same sha-1 - only decorate - new_description_display=$(echo "$new_description_display" | sed "s/$old/$(colorize "$curr" "$sameColor")/") - new_description_content=$(echo "$new_description_content" | sed "s/$old/$curr/") + new_description_display=${new_description_display//"$old"/"$(colorize "$curr" "$sameColor")"} + new_description_content=${new_description_content//"$old"/"$curr"} else # different sha-1 - replace & decorate - new_description_display=$(echo "$new_description_display" | sed "s/$old/$(colorize "$curr" "$updatedColor")/") - new_description_content=$(echo "$new_description_content" | sed "s/$old/$curr/") + new_description_display=${new_description_display//"$old"/"$(colorize "$curr" "$updatedColor")"} + new_description_content=${new_description_content//"$old"/"$curr"} updated_commit_count=$((updated_commit_count + 1)) fi else @@ -1908,7 +1930,7 @@ mr_update() { new_commit="$(git_commit_extended "$curr")" || new_commit="$(echo "$commit_messages" | grep "$curr")" - new_commit_messages_display+=("$(echo "$new_commit" | sed "s/$curr/$(colorize "$curr" "$newColor")/")") + new_commit_messages_display+=("${new_commit//"$curr"/$(colorize "$curr" "$newColor")}") new_commit_messages_content+=("$new_commit") fi done @@ -2191,25 +2213,25 @@ mr_transition() { IP) name="In Progress" labels_to_add="${GITLAB_IP_LABELS}" - labels_to_remove="${GITLAB_CR_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" + labels_to_remove=$(trim "${GITLAB_CR_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" ",") jira_transition_var="JIRA_IP_ID" ;; CR) name="Code Review" labels_to_add="${GITLAB_CR_LABELS}" - labels_to_remove="${GITLAB_IP_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" + labels_to_remove=$(trim "${GITLAB_IP_LABELS},${GITLAB_QA_LABELS},${GITLAB_OK_LABELS}" ",") jira_transition_var="JIRA_CR_ID" ;; QA) name="Quality Assurance" labels_to_add="${GITLAB_QA_LABELS}" - labels_to_remove="${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_OK_LABELS}" + labels_to_remove=$(trim "${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_OK_LABELS}" ",") jira_transition_var="JIRA_QA_ID" ;; OK) name="Accepted" labels_to_add="${GITLAB_OK_LABELS}" - labels_to_remove="${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" + labels_to_remove=$(trim "${GITLAB_IP_LABELS},${GITLAB_CR_LABELS},${GITLAB_QA_LABELS}" ",") jira_transition_var="JIRA_OK_ID" ;; *) diff --git a/test/git-mr.bats b/test/git-mr.bats index 16ad1b9..c4e60cc 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -22,6 +22,7 @@ setup_file() { cd "${BATS_TEST_DIRNAME}" || exit + [[ -d data ]] && rm -rf data mkdir data && cd data || exit git init --bare remote @@ -324,10 +325,10 @@ full_sha() { } @test "Makes title from branch" { - run git_titlize_branch feature/AB-123-some_branch_title + run git_titlize_branch feature/AB-123-some-branch_title assert_output "Feature/AB-123 Some branch title" - run git_titlize_branch AB-123-some_branch_title + run git_titlize_branch AB-123-some-branch_title assert_output "AB-123 Some branch title" run git_titlize_branch task/other_branch-title @@ -405,6 +406,14 @@ full_sha() { assert_output "" } +@test "Trims strings" { + run trim " some string " " " + assert_output "some string" + + run trim ",,some,list,," "," + assert_output "some,list" +} + @test "Asks for confirmation" { run confirm "Are you sure?" <<< "yes" assert_success @@ -490,14 +499,14 @@ full_sha() { @test "Formats markdown lists" { run markdown_list "$(cat <<- EOF one - two - three + two two + three three three EOF )" assert_output "$(cat <<- EOF * **one**.. - * **two**.. - * **three**.. + * **two two**.. + * **three three three**.. EOF )" } @@ -744,6 +753,9 @@ full_sha() { run gitlab_title_is_draft "My MR" assert_failure + run gitlab_title_is_draft "My Draft: MR" + assert_failure + run gitlab_title_to_draft "My MR" assert_output "Draft: My MR" @@ -765,6 +777,9 @@ full_sha() { git switch feature/base run git-mr code assert_output "Unable to guess issue code" + + run guess_issue_code feature/AB-123-CD-456-test-feature + assert_output "CD-456" # debatable } @test "Generates MR title from Jira issue title" { @@ -1029,14 +1044,23 @@ full_sha() { # Merge request labels utility functions @test "Replaces labels" { - run replace_labels "toto,tata,titi" "tata" "tutu" - assert_output "toto,titi,tutu" + run replace_labels "" "" ""; assert_output "" + run replace_labels "" "toto" ""; assert_output "" + run replace_labels "" "" "toto"; assert_output "toto" + run replace_labels "toto" "" ""; assert_output "toto" - run replace_labels "toto,tata" "tata,toto" - assert_output "" + run replace_labels "toto,tata" "titi" ""; assert_output "toto,tata" + run replace_labels "toto,tata" "" "titi"; assert_output "toto,tata,titi" + + run replace_labels "toto,tata,titi" "toto" "tutu"; assert_output "tata,titi,tutu" + run replace_labels "toto,tata,titi" "tata" "tutu"; assert_output "toto,titi,tutu" + run replace_labels "toto,tata,titi" "titi" "tutu"; assert_output "toto,tata,tutu" + run replace_labels "toto,tata,titi" "plop" "tutu"; assert_output "toto,tata,titi,tutu" + + run replace_labels "toto,ta ta,titi" "plop,ta ta,plouf" "tutu,pouet"; assert_output "toto,titi,tutu,pouet" - run replace_labels "toto,tata" "nope" "plop,pouet" - assert_output "toto,tata,plop,pouet" + run replace_labels "to to,ta ta,ti ti" "to to,plop" "ta ta,pouet"; assert_output "ti ti,ta ta,pouet" + run replace_labels "to to,ta ta,ti ti" ",,plop,ta ta," "pouet,ti ti"; assert_output "to to,pouet,ti ti" } @test "Compares labels" { @@ -1060,7 +1084,7 @@ full_sha() { run labels_differ "aaa,bbb,ccc" "ccc,bbb,aaa,ccc"; assert_failure - run labels_differ "aaa,bbb,ccc" ",,ccc,bbb,aaa,,ccc"; assert_failure + run labels_differ "aaa,b bb,cc c" ",,cc c,b bb,aaa,,cc c"; assert_failure } @test "Identifies workflow-specific labels" { @@ -1136,8 +1160,14 @@ full_sha() { } @test "Formats labels" { - run mr_format_labels "abc-1,def-2" - assert_output "[abc-1] [def-2]" + run mr_format_labels "" + assert_output "" + + run mr_format_labels "abc 1" + assert_output "[abc 1]" + + run mr_format_labels "abc 1,def-2" + assert_output "[abc 1] [def-2]" } ################################################################################ From cfa52e60f0f7dabf44b188ab4396afa25d59858c Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 7 Feb 2023 10:31:17 +0100 Subject: [PATCH 66/88] Optimize project list loading --- git-mr | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/git-mr b/git-mr index a8824a4..5651a94 100755 --- a/git-mr +++ b/git-mr @@ -698,7 +698,7 @@ gitlab_merge_requests_search() { gitlab_projects() { local result - result=$(gitlab_request "projects?simple=true&archived=false&order_by=last_activity_at&per_page=100") || exit $? + result=$(gitlab_request "projects?simple=true&archived=false&order_by=last_activity_at&per_page=${GIT_MR_LAST_PROJECTS_LIMIT:-40}") || exit $? [[ -n $result && $result != "[]" ]] || return "$ERR_GITLAB" result=$(echo "$result" | jq 'map({id: .id, name: .name, path_with_namespace: .path_with_namespace})') @@ -1433,6 +1433,9 @@ mr_menu_contents() { "web_url=" + (.web_url | @sh) + ";\n" ')" + [[ -n $project_name && $project_name != "null" ]] || # Fallback to URL portion + project_name=$(echo "$web_url" | sed -e "s/https:\/\/$GITLAB_DOMAIN\///" -e "s/\/-\/merge_requests\/[0-9]*\$//") + title=$(gitlab_title_undraft "$title") local item_label; item_label="${project_name}: $(markdown_link "${title}" "$web_url")" @@ -1484,6 +1487,9 @@ mr_menu_status() { "web_url=" + (.web_url | @sh) + ";\n" ')" + [[ -n $project_name && $project_name != "null" ]] || # Fallback to URL portion + project_name=$(echo "$web_url" | sed -e "s/https:\/\/$GITLAB_DOMAIN\///" -e "s/\/-\/merge_requests\/[0-9]*\$//") + title=$(gitlab_title_undraft "$title") local project_url; project_url=$(gitlab_extract_project_url "$web_url") @@ -1592,6 +1598,9 @@ mr_menu_update_all() { "project_name=" + (.project_name | @sh) + ";\n" ')" + [[ -n $project_name && $project_name != "null" ]] || # Fallback to URL portion + project_name=$(echo "$mr_url" | sed -e "s/https:\/\/$GITLAB_DOMAIN\///" -e "s/\/-\/merge_requests\/[0-9]*\$//") + # Beware, `gitlab_merge_request` and `gitlab_merge_request_update` use 'gitlab_project_request', which is project-specific # Here, we can expect other target projects here. project_url=$(gitlab_extract_project_url "$mr_url") From 2963a1108a580cdd5ce2aaac885ae8c39920fbcd Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 7 Feb 2023 21:16:29 +0100 Subject: [PATCH 67/88] Refactor project url & threads extraction from MR URL --- git-mr | 55 +++++++++++++++++++++--------------------------- test/git-mr.bats | 8 +++---- 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/git-mr b/git-mr index 5651a94..3dbed63 100755 --- a/git-mr +++ b/git-mr @@ -768,27 +768,26 @@ gitlab_extract_labels() { echo "$mr_detail" | jq -r '.labels | join(",")' } -gitlab_extract_project_url() { - local mr_url=$1 - - local project_url - project_url=$(echo "$mr_url" | sed \ - -e "s/https:\/\/$GITLAB_DOMAIN\///" \ - -e "s/\/-\/merge_requests\/[0-9]*\$//") +gitlab_extract_project_url_part() { + local url=$1 - project_url=$(urlencode "$project_url") + url=${url#"https://${GITLAB_DOMAIN}/"} # remove prefix + url=${url%"/-/merge_requests/"*} # remove suffix - echo "$project_url" + echo "$url" } gitlab_merge_request_threads() { gitlab_check_env - local project_url=$1 - local mr_iid=$2 + local mr_url=$1 + + local mr_iid="${mr_url##*/}" + local project_url; project_url="$(gitlab_extract_project_url_part "$mr_url")" - [[ -n $project_url ]] || exit_error "$ERR_MR" "No project_url provided" - [[ -n $mr_iid ]] || exit_error "$ERR_MR" "No mr_iid provided" + [[ -n $mr_url ]] || exit_error "$ERR_MR" "No mr_url provided" + [[ -n $mr_iid ]] || exit_error "$ERR_MR" "Unable to determine mr_iid from mr_url" + [[ -n $project_url ]] || exit_error "$ERR_MR" "Unable to determine project_url from mr_url" local thread_summaries local per_page=100 @@ -799,7 +798,7 @@ gitlab_merge_request_threads() { # fetch page local notes_page - notes_page=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid/discussions?per_page=${per_page}&page=${page}") + notes_page=$(gitlab_request "projects/$(urlencode "$project_url")/merge_requests/${mr_iid}/discussions?per_page=${per_page}&page=${page}") if [[ $notes_page != "[]" ]]; then @@ -1035,8 +1034,7 @@ mr_status_block() { local mr_threads=$5 if [[ -z $mr_threads ]]; then - local project_url; project_url=$(gitlab_extract_project_url "$mr_url") - mr_threads=$(gitlab_merge_request_threads "$project_url" "$mr_iid") + mr_threads=$(gitlab_merge_request_threads "$mr_url") fi mr_print_title "$mr_title" "$mr_url" @@ -1061,8 +1059,7 @@ mr_show_status() { local mr_threads=$3 if [[ -z $mr_threads ]]; then local mr_url; mr_url=$(gitlab_extract_url "$merge_request") - local project_url; project_url=$(gitlab_extract_project_url "$mr_url") - mr_threads=$(gitlab_merge_request_threads "$project_url" "$mr_iid") + mr_threads=$(gitlab_merge_request_threads "$mr_url") fi mr_print_status "$merge_request" "$mr_threads" @@ -1101,8 +1098,6 @@ mr_print_status() { "current_target=" + (.target_branch | @sh) + ";\n" ')" - local project_url; project_url=$(gitlab_extract_project_url "$mr_url") - # Labels local labels_display; labels_display=$(mr_format_labels "$labels") local labels_str_len=$((${#labels} + $((labels_count * 2)) + 4)) # 2 spaces + 2 for larger icon @@ -1434,7 +1429,7 @@ mr_menu_contents() { ')" [[ -n $project_name && $project_name != "null" ]] || # Fallback to URL portion - project_name=$(echo "$web_url" | sed -e "s/https:\/\/$GITLAB_DOMAIN\///" -e "s/\/-\/merge_requests\/[0-9]*\$//") + project_name=$(gitlab_extract_project_url_part "$web_url") title=$(gitlab_title_undraft "$title") @@ -1488,14 +1483,14 @@ mr_menu_status() { ')" [[ -n $project_name && $project_name != "null" ]] || # Fallback to URL portion - project_name=$(echo "$web_url" | sed -e "s/https:\/\/$GITLAB_DOMAIN\///" -e "s/\/-\/merge_requests\/[0-9]*\$//") + project_name=$(gitlab_extract_project_url_part "$web_url") title=$(gitlab_title_undraft "$title") - local project_url; project_url=$(gitlab_extract_project_url "$web_url") + local project_url; project_url=$(gitlab_extract_project_url_part "$web_url") # Load existing merge request details # Do NOT use `gitlab_merge_request` - local merge_request; merge_request=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid") + local merge_request; merge_request=$(gitlab_request "projects/$(urlencode "$project_url")/merge_requests/$mr_iid") echo "* $(colorize "$project_name" "bold"): $(terminal_link "$web_url" "$title")" has_links || echo " ⇒ $web_url" @@ -1599,15 +1594,15 @@ mr_menu_update_all() { ')" [[ -n $project_name && $project_name != "null" ]] || # Fallback to URL portion - project_name=$(echo "$mr_url" | sed -e "s/https:\/\/$GITLAB_DOMAIN\///" -e "s/\/-\/merge_requests\/[0-9]*\$//") + project_name=$(gitlab_extract_project_url_part "$mr_url") # Beware, `gitlab_merge_request` and `gitlab_merge_request_update` use 'gitlab_project_request', which is project-specific # Here, we can expect other target projects here. - project_url=$(gitlab_extract_project_url "$mr_url") + project_url=$(gitlab_extract_project_url_part "$mr_url") # Load existing merge request details # Do NOT use `gitlab_merge_request` - merge_request=$(gitlab_request "projects/${project_url}/merge_requests/$mr_iid") + merge_request=$(gitlab_request "projects/$(urlencode "$project_url")/merge_requests/$mr_iid") mr_description=$(gitlab_extract_description "$merge_request") @@ -1625,7 +1620,7 @@ mr_menu_update_all() { if [[ $mr_update_data != "{}" ]]; then echo -n "Updating merge request..." # Do NOT use `gitlab_merge_request_update` - result=$(gitlab_request "projects/${project_url}/merge_requests/${mr_iid}" "PUT" "${mr_update_data}") + result=$(gitlab_request "projects/$(urlencode "$project_url")/merge_requests/${mr_iid}" "PUT" "${mr_update_data}") [[ -n $result ]] && ((updated_count += 1)) && echo -e "OK\n" @@ -2055,8 +2050,6 @@ mr_merge() { "mr_url=" + (.web_url | @sh) + ";\n" ')" - local project_url; project_url=$(gitlab_extract_project_url "$mr_url") - # Load existing merge request details local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") @@ -2090,7 +2083,7 @@ mr_merge() { # test open threads local unresolved_thread_count - unresolved_thread_count=$(gitlab_merge_request_threads "$project_url" "$mr_iid" | grep -c 'unresolved:true') + unresolved_thread_count=$(gitlab_merge_request_threads "$mr_url" | grep -c 'unresolved:true') if [[ $unresolved_thread_count -gt 0 ]]; then if [[ $GIT_MR_FORCE -eq 1 ]]; then diff --git a/test/git-mr.bats b/test/git-mr.bats index c4e60cc..4770641 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -705,13 +705,13 @@ full_sha() { @test "Extracts Gitlab project part from MR URL" { mr_url="https://gitlab.example.net/some/project/-/merge_requests/123" - run gitlab_extract_project_url "$mr_url" - assert_output "some%2Fproject" + run gitlab_extract_project_url_part "$mr_url" + assert_output "some/project" } @test "Extracts Gitlab merge request threads" { gitlab_request() { - [[ $1 == "projects/test/merge_requests/123/discussions?per_page=100&page=1" ]] && + [[ $1 == "projects/some%2Fproject/merge_requests/123/discussions?per_page=100&page=1" ]] && echo '[ {"id": "n1","notes": [{"id": 11},{"id": 12,"resolvable": false}]}, {"id": "n2","notes": [{"id": 21},{"id": 22,"resolvable": true, "resolved": false}]}, @@ -719,7 +719,7 @@ full_sha() { ]' } - run gitlab_merge_request_threads "test" "123" + run gitlab_merge_request_threads "https://gitlab.example.net/some/project/-/merge_requests/123" assert_output "$(cat <<- EOF n2 unresolved:true note_id:22 n3 unresolved:false note_id:null From 57d81cdf595a4e8d0fd0572db84cb1a85d72ec6b Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 7 Feb 2023 21:31:06 +0100 Subject: [PATCH 68/88] Documentation --- README.md | 2 ++ doc/generate-sample-output.sh | 17 +++++++++++++++++ doc/git-mr-prepare-commit-msg.png | Bin 0 -> 28274 bytes doc/git-mr-status.png | Bin 27566 -> 26990 bytes 4 files changed, 19 insertions(+) create mode 100644 doc/git-mr-prepare-commit-msg.png diff --git a/README.md b/README.md index 006dfb1..417250b 100644 --- a/README.md +++ b/README.md @@ -373,3 +373,5 @@ The following hooks are provided for convenience: ### `prepare-commit-msg` Ensures your commit messages are prefixed with the code of related issue. + +![git mr prepare-commit-msg hook](doc/git-mr-prepare-commit-msg.png) diff --git a/doc/generate-sample-output.sh b/doc/generate-sample-output.sh index e64d242..6311c31 100755 --- a/doc/generate-sample-output.sh +++ b/doc/generate-sample-output.sh @@ -290,6 +290,21 @@ EOF echo } +sample_mr_prepare_commit_msg() { + + local branch="feature/xy-1234-lorem-ipsum" + colorize "\n___________________________________________________________________________________________\n\n\n" "gray" + echo "$(colorize "me@mystation" "green"):$(colorize "~/my-project" "lightblue") $(colorize "($branch)" "purple") $(colorize "↔ ✔" "green")" + echo "$ git commit -m \"Consectetur adipiscing elit\"" + + cat <|GU=hRjaG3yQ^3A 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 DS9DoQ literal 27566 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 From 99ccdcca03e795931114fdb53428423df93ac76d Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 10 Feb 2023 09:55:12 +0100 Subject: [PATCH 69/88] Remove shellcheck warnings --- git-mr | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/git-mr b/git-mr index 3dbed63..929647e 100755 --- a/git-mr +++ b/git-mr @@ -1,7 +1,4 @@ #!/usr/bin/env bash -# shellcheck disable=SC2001,SC2005 -# SC2001: Ignore bash ${variable//search/replace} substitutions suggestions -# SC2005: Ignore useless echo warnings (colorize and other formatting functions don't output a new line) ################################################################################ # Git functions @@ -270,6 +267,10 @@ colorize() { fi } +echolor() { + colorize "$1\n" "${@:2}" +} + # https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda terminal_link() { local href=$1 @@ -282,6 +283,10 @@ terminal_link() { fi } +echolink() { + terminal_link "$@"; echo +} + echo_error() { colorize "$1\n" "orange" >&2 } @@ -391,7 +396,7 @@ git_mr_readonly() { [[ $GIT_MR_READONLY -eq 1 ]] || return 1 [[ -n $1 ]] && - echo "$(colorize "🚫 Read-only 🚫" "gray")" >&2 + echolor "🚫 Read-only 🚫" "gray" >&2 return 0 } @@ -1725,7 +1730,7 @@ mr_menu_print_description() { echo "--------------------------------------------------------------------------------" echo -n " " [[ -n $project_name ]] && echo -n "$(colorize "$project_name" "bold"): " - echo "$(terminal_link "$mr_url" "$(gitlab_title_undraft "$mr_title")")" + echolink "$mr_url" "$(gitlab_title_undraft "$mr_title")" echo "--------------------------------------------------------------------------------" echo @@ -2124,7 +2129,7 @@ mr_merge() { confirm "Do you want to checkout '$current_target' and pull changes?" || { echo; return 0; } - echo "$(colorize "git checkout $current_target && git pull --rebase" "lightgray")" + echolor "git checkout $current_target && git pull --rebase" "lightgray" git_mr_readonly || (git checkout "$current_target" && git pull --rebase) echo @@ -2133,7 +2138,7 @@ mr_merge() { confirm "Do you want to delete local branch '$source_branch'?" || { echo; return 0; } - echo "$(colorize "git branch -d $source_branch" "lightgray")" + echolor "git branch -d $source_branch" "lightgray" git_mr_readonly || git branch -d "$source_branch" echo From bda447e9bd3133fc19fd7f98b58a7e2ad1d085c6 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Fri, 10 Feb 2023 21:34:47 +0100 Subject: [PATCH 70/88] Refactor gitlab_*_request methods --- git-mr | 52 +++++++++++++++++++++++++++--------------------- test/git-mr.bats | 8 ++++---- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/git-mr b/git-mr index 929647e..91d98e6 100755 --- a/git-mr +++ b/git-mr @@ -576,7 +576,7 @@ gitlab_project_url() { echo "$project_url" } -gitlab_project_request() { +gitlab_current_project_request() { gitlab_check_env local request_url=$1 @@ -585,6 +585,15 @@ gitlab_project_request() { local project_url; project_url=$(gitlab_project_url) || exit $? + gitlab_project_request "$project_url" "$request_url" "$request_verb" "$request_data" +} + +gitlab_project_request() { + local project_url=$1 + local request_url=$2 + local request_verb=${3:-"GET"} + local request_data=${4} + gitlab_request "projects/$(urlencode "$project_url")/${request_url}" "$request_verb" "$request_data" } @@ -678,7 +687,7 @@ gitlab_merge_request_summary() { local source_branch=${1:-$(git_current_branch)} local result - result=$(gitlab_project_request "merge_requests?state=opened&view=simple&source_branch=${source_branch}") || exit $? + result=$(gitlab_current_project_request "merge_requests?state=opened&view=simple&source_branch=${source_branch}") || exit $? [[ -n $result && $result != "[]" ]] || return "$ERR_GITLAB" @@ -715,9 +724,10 @@ gitlab_projects() { gitlab_merge_request() { gitlab_check_env - local mr_iid=$1; [[ -n $mr_iid ]] || exit_error "$ERR_MR" "No mr_iid provided" + local mr_iid=$1; [[ -n $mr_iid ]] || exit_error "$ERR_MR" "No mr_iid provided" + local project_url=$2; [[ -n $project_url ]] || project_url=$(gitlab_project_url) || exit $? - gitlab_project_request "merge_requests/$mr_iid" + gitlab_project_request "$project_url" "merge_requests/$mr_iid" } gitlab_extract_iid() { @@ -803,7 +813,7 @@ gitlab_merge_request_threads() { # fetch page local notes_page - notes_page=$(gitlab_request "projects/$(urlencode "$project_url")/merge_requests/${mr_iid}/discussions?per_page=${per_page}&page=${page}") + notes_page=$(gitlab_project_request "$project_url" "merge_requests/${mr_iid}/discussions?per_page=${per_page}&page=${page}") if [[ $notes_page != "[]" ]]; then @@ -841,7 +851,7 @@ gitlab_merge_request_threads() { gitlab_default_label_ids() { gitlab_check_env - local gitlab_labels; gitlab_labels=$(gitlab_project_request "labels") + local gitlab_labels; gitlab_labels=$(gitlab_current_project_request "labels") echo "$GITLAB_DEFAULT_LABELS" | jq -R -r \ --argjson gitlab_labels "$gitlab_labels" \ @@ -855,7 +865,9 @@ gitlab_merge_request_update() { local mr_iid=$1; [[ -n $mr_iid ]] || exit_error "$ERR_MR" "No mr_iid provided" local mr_data=$2; [[ -n $mr_data ]] || exit_error "$ERR_MR" "No data provided" - gitlab_project_request "merge_requests/${mr_iid}" "PUT" "${mr_data}" + local project_url=$3; [[ -n $project_url ]] || project_url=$(gitlab_project_url) || exit $? + + gitlab_project_request "$project_url" "merge_requests/${mr_iid}" "PUT" "${mr_data}" } gitlab_merge_request_merge() { @@ -863,7 +875,7 @@ gitlab_merge_request_merge() { local mr_iid=$1; [[ -n $mr_iid ]] || exit_error "$ERR_MR" "No mr_iid provided" - gitlab_project_request "merge_requests/${mr_iid}/merge?should_remove_source_branch=${GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH:-1}" "PUT" + gitlab_current_project_request "merge_requests/${mr_iid}/merge?should_remove_source_branch=${GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH:-1}" "PUT" } gitlab_title_is_draft() { @@ -1487,15 +1499,14 @@ mr_menu_status() { "web_url=" + (.web_url | @sh) + ";\n" ')" - [[ -n $project_name && $project_name != "null" ]] || # Fallback to URL portion - project_name=$(gitlab_extract_project_url_part "$web_url") + local project_url; project_url=$(gitlab_extract_project_url_part "$web_url") + + [[ -n $project_name && $project_name != "null" ]] || project_name="$project_url" # Fallback to URL portion title=$(gitlab_title_undraft "$title") - local project_url; project_url=$(gitlab_extract_project_url_part "$web_url") # Load existing merge request details - # Do NOT use `gitlab_merge_request` - local merge_request; merge_request=$(gitlab_request "projects/$(urlencode "$project_url")/merge_requests/$mr_iid") + local merge_request; merge_request=$(gitlab_merge_request "$mr_iid" "$project_url") echo "* $(colorize "$project_name" "bold"): $(terminal_link "$web_url" "$title")" has_links || echo " ⇒ $web_url" @@ -1598,16 +1609,12 @@ mr_menu_update_all() { "project_name=" + (.project_name | @sh) + ";\n" ')" - [[ -n $project_name && $project_name != "null" ]] || # Fallback to URL portion - project_name=$(gitlab_extract_project_url_part "$mr_url") - - # Beware, `gitlab_merge_request` and `gitlab_merge_request_update` use 'gitlab_project_request', which is project-specific - # Here, we can expect other target projects here. project_url=$(gitlab_extract_project_url_part "$mr_url") + [[ -n $project_name && $project_name != "null" ]] || project_name="$project_url" # Fallback to URL portion + # Load existing merge request details - # Do NOT use `gitlab_merge_request` - merge_request=$(gitlab_request "projects/$(urlencode "$project_url")/merge_requests/$mr_iid") + merge_request=$(gitlab_merge_request "$mr_iid" "$project_url") mr_description=$(gitlab_extract_description "$merge_request") @@ -1624,8 +1631,7 @@ mr_menu_update_all() { fi if [[ $mr_update_data != "{}" ]]; then echo -n "Updating merge request..." - # Do NOT use `gitlab_merge_request_update` - result=$(gitlab_request "projects/$(urlencode "$project_url")/merge_requests/${mr_iid}" "PUT" "${mr_update_data}") + result=$(gitlab_merge_request_update "$mr_iid" "$mr_update_data" "$project_url") [[ -n $result ]] && ((updated_count += 1)) && echo -e "OK\n" @@ -2109,7 +2115,7 @@ mr_merge() { local undraft_title; undraft_title=$(gitlab_title_undraft "$mr_title") local mr_data; mr_data=$(jq_build "title" "$undraft_title") || exit "$ERR_MR" - local result; result=$(gitlab_merge_request_update "${mr_iid}" "${mr_data}") + local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") [[ -n $result ]] && echo -e "OK\n" [[ -n $result ]] || { echo_error; return "$ERR_GITLAB"; } # interrupt on error diff --git a/test/git-mr.bats b/test/git-mr.bats index 4770641..7832d37 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -597,7 +597,7 @@ full_sha() { echo "gitlab_request('$1' '${2:-"GET"}' '$3')" } - run gitlab_project_request 'test' 'POST' '{"test":1}' + run gitlab_current_project_request 'test' 'POST' '{"test":1}' assert_success assert_output "gitlab_request('projects/my%2Fproject/test' 'POST' '{\"test\":1}')" } @@ -624,7 +624,7 @@ full_sha() { @test "Determines new merge request URL" { GITLAB_DEFAULT_LABELS="Label A,Label C" - gitlab_project_request() { + gitlab_current_project_request() { [[ $1 == "labels" ]] && echo '[{"id":1,"name":"Label A"},{"id":2,"name":"Label B"},{"id":3,"name":"Label C"}]' } @@ -646,7 +646,7 @@ full_sha() { } @test "Extracts MR info from merge request summary" { - gitlab_project_request() { + gitlab_current_project_request() { case "$1" in "merge_requests?state=opened&view=simple&source_branch=feature/xy-1234-lorem-ipsum") echo '[{ @@ -729,7 +729,7 @@ full_sha() { @test "Fetches default Gitlab label ids" { GITLAB_DEFAULT_LABELS="Label A,Label C" - gitlab_project_request() { + gitlab_current_project_request() { [[ $1 == "labels" ]] && echo '[{"id":1,"name":"Label A"},{"id":2,"name":"Label B"},{"id":3,"name":"Label C"}, {"id":4,"name":"Label C"}]' } From 6ca89c7e76dbfab64f575a72ddfbf4bc72b9bb12 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 11 Feb 2023 01:35:49 +0100 Subject: [PATCH 71/88] Optimize merge request & threads loading speed - parallelize merge request & threads loading - let bash allocate custom file descriptors - extract async Gitlab methods --- doc/generate-sample-output.sh | 4 +- git-mr | 443 ++++++++++-------- test/git-mr.bats | 31 +- .../gitlab-mock-mr-description-extended.bash | 12 + .../gitlab-mock-mr-description-simple.bash | 8 + test/test_helper/gitlab-mock-mr-extended.bash | 36 -- test/test_helper/gitlab-mock-mr-update.bash | 39 ++ test/test_helper/gitlab-mock-mr.bash | 32 -- test/test_helper/gitlab-mock-transition.bash | 14 +- 9 files changed, 322 insertions(+), 297 deletions(-) create mode 100644 test/test_helper/gitlab-mock-mr-description-extended.bash create mode 100644 test/test_helper/gitlab-mock-mr-description-simple.bash delete mode 100644 test/test_helper/gitlab-mock-mr-extended.bash create mode 100644 test/test_helper/gitlab-mock-mr-update.bash delete mode 100644 test/test_helper/gitlab-mock-mr.bash diff --git a/doc/generate-sample-output.sh b/doc/generate-sample-output.sh index 6311c31..db6724b 100755 --- a/doc/generate-sample-output.sh +++ b/doc/generate-sample-output.sh @@ -108,7 +108,7 @@ sample_mr_status() { local threads='1 unresolved:true note_id:1' echo - mr_status_block "" "$mr" "" "" "$threads" + mr_status_block "$mr" "$mr" "$threads" } sample_mr_update() { @@ -181,7 +181,7 @@ sample_mr_merge() { cat << EOF -$(mr_status_block "" "$mr" "" "" "$threads") +$(mr_status_block "$mr" "$mr" "$threads") -------------------------------------------------------------------------------- diff --git a/git-mr b/git-mr index 91d98e6..2c549a9 100755 --- a/git-mr +++ b/git-mr @@ -741,13 +741,13 @@ gitlab_extract_url() { } gitlab_extract_title() { - local mr_detail=$1 - echo "$mr_detail" | jq -r '.title' + local mr_summary=$1 + echo "$mr_summary" | jq -r '.title' } gitlab_extract_description() { - local mr_detail=$1 - echo "$mr_detail" | jq -r '.description' + local mr_summary=$1 + echo "$mr_summary" | jq -r '.description' } gitlab_extract_merge_status() { @@ -819,16 +819,14 @@ gitlab_merge_request_threads() { local thread_summaries_page thread_summaries_page=$(echo "$notes_page" | jq -r ' - map( - select(any(.notes[]; .resolvable == true)) | - { - id: .id, - unresolved: any(.notes[]; .resolvable == true and .resolved == false), - first_unresolved_note_id: .notes | map(select(.resolvable == true and .resolved == false) | .id) | .[0] - } - ) | .[] | - .id + "\t" + "unresolved:" + (.unresolved | tostring) + "\t" + "note_id:" + (.first_unresolved_note_id | tostring)' | - tr -d '\r') + .[] | select(any(.notes[]; .resolvable == true)) | { + id: .id, + resolvables: .notes | map(select(.resolvable == true) | {id: .id, resolved: .resolved}) + } | + .id + "\t" + + "unresolved:" + (any(.resolvables[]; .resolved == false) | tostring) + "\t" + + "note_id:" + (.resolvables | map(select(.resolved == false)) | first | .id | tostring) + ' | tr -d '\r') # append page if [[ -z $thread_summaries ]]; then @@ -913,17 +911,16 @@ gitlab_undraft() { return "$ERR_GITLAB" fi - local mr_iid \ - mr_title - + local mr_iid mr_url mr_title eval "$(echo "$mr_summary" | jq -r ' - "mr_iid=" + (.iid | @sh) + ";\n" + - "mr_title=" + (.title | @sh) + ";\n" + "mr_iid=" + (.iid | @sh) + ";\n" + + "mr_url=" + (.web_url | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" ')" # Print merge request status summary echo - mr_status_block "$mr_iid" + mr_status_block "$mr_summary" "" "" "$mr_iid" "$mr_url" "$mr_title" echo "--------------------------------------------------------------------------------" echo @@ -945,6 +942,27 @@ gitlab_undraft() { fi } +# Async functions + +gitlab_load_mr() { + exec {git_mr_fd_mr}< <(gitlab_merge_request "$@") +} + +gitlab_load_threads() { + exec {git_mr_fd_th}< <(gitlab_merge_request_threads "$@") +} + +gitlab_read_mr() { + local var_name=$1 + IFS= read -r -d '' -u "$git_mr_fd_mr" "$var_name" + exec {git_mr_fd_mr}<&- +} + +gitlab_read_threads() { + local var_name=$1 + IFS= read -r -d '' -u "$git_mr_fd_th" "$var_name" + exec {git_mr_fd_th}<&- +} ################################################################################ # Merge request utility functions @@ -980,12 +998,10 @@ mr_title() { local issue_content; issue_content=$(jira_ticket_data "$issue_code") - local issue_key \ - issue_title - + local issue_key issue_title eval "$(echo "$issue_content" | jq -r ' - "issue_key=" + (.key // empty | @sh) + ";\n" + - "issue_title=" + (.fields.summary // empty | @sh) + ";\n" + "issue_key=" + (.key // empty | @sh) + ";\n" + + "issue_title=" + (.fields.summary // empty | @sh) + ";\n" ')" [[ -z $issue_key ]] && @@ -1043,18 +1059,33 @@ EOF } mr_status_block() { - local mr_iid=$1 - local merge_request; merge_request=${2:-$(gitlab_merge_request "$mr_iid")} + local mr_summary=$1 + local merge_request=$2 + local mr_threads=$3 - local mr_title=${3:-$(gitlab_extract_title "$merge_request")} - local mr_url=${4:-$(gitlab_extract_url "$merge_request")} + local mr_iid=$4 + local mr_url=$5 + local mr_title=$6 - local mr_threads=$5 - if [[ -z $mr_threads ]]; then - mr_threads=$(gitlab_merge_request_threads "$mr_url") - fi + local parse=() + [[ -z $merge_request && -z $mr_iid ]] && parse+=('"mr_iid=" + (.iid | @sh) + ";\n" +') + [[ -z $mr_url ]] && parse+=('"mr_url=" + (.web_url | @sh) + ";\n" +') + [[ -z $mr_title ]] && parse+=('"mr_title=" + (.title | @sh) + ";\n" +') + [[ ${#parse[@]} -gt 0 ]] && { + parse+=('""') + eval "$(echo "$mr_summary" | jq -r "${parse[*]}")" + } + + # Load merge request & threads in parallel + [[ -n $merge_request ]] || gitlab_load_mr "$mr_iid" + [[ -n $mr_threads ]] || gitlab_load_threads "$mr_url" mr_print_title "$mr_title" "$mr_url" + + # Read MR & threads + [[ -n $merge_request ]] || gitlab_read_mr merge_request + [[ -n $mr_threads ]] || gitlab_read_threads mr_threads + mr_print_status "$merge_request" "$mr_threads" } @@ -1068,20 +1099,6 @@ mr_print_title() { echo "--------------------------------------------------------------------------------" } -mr_show_status() { - local mr_iid=$1 - - local merge_request; merge_request=${2:-$(gitlab_merge_request "$mr_iid")} - - local mr_threads=$3 - if [[ -z $mr_threads ]]; then - local mr_url; mr_url=$(gitlab_extract_url "$merge_request") - mr_threads=$(gitlab_merge_request_threads "$mr_url") - fi - - mr_print_status "$merge_request" "$mr_threads" -} - mr_print_status() { local merge_request=$1 local threads=$2 @@ -1100,19 +1117,18 @@ mr_print_status() { current_target eval "$(echo "$merge_request" | jq -r ' - "mr_url=" + (.web_url | @sh) + ";\n" + - "title=" + (.title | @sh) + ";\n" + - "labels=" + (.labels | join(",") | @sh) + ";\n" + - "labels_count=" + (.labels | length | @sh) + ";\n" + - "upvotes=" + (.upvotes | @sh) + ";\n" + - "downvotes=" + (.downvotes | @sh) + ";\n" + - "state=" + (.state | @sh) + ";\n" + - "merge_status=" + (if .state == "merged" - then "merged" - else .merge_status end | @sh) + ";\n" + - "pipeline_status=" + (.head_pipeline.status | @sh) + ";\n" + - "pipeline_url=" + (.head_pipeline.web_url | @sh) + ";\n" + - "current_target=" + (.target_branch | @sh) + ";\n" + "mr_url=" + (.web_url | @sh) + ";\n" + + "title=" + (.title | @sh) + ";\n" + + "labels=" + (.labels | join(",") | @sh) + ";\n" + + "labels_count=" + (.labels | length | @sh) + ";\n" + + "upvotes=" + (.upvotes | @sh) + ";\n" + + "downvotes=" + (.downvotes | @sh) + ";\n" + + "merge_status=" + (if .state == "merged" + then "merged" + else .merge_status end | @sh) + ";\n" + + "pipeline_status=" + (.head_pipeline.status | @sh) + ";\n" + + "pipeline_url=" + (.head_pipeline.web_url | @sh) + ";\n" + + "current_target=" + (.target_branch | @sh) + ";\n" ')" # Labels @@ -1435,25 +1451,22 @@ mr_menu_contents() { echo while IFS=$'\n' read -r menu_item; do - local project_name \ - title \ - web_url - + local mr_url mr_title project_name eval "$(echo "$menu_item" | jq -r ' - "project_name=" + (.project_name | @sh) + ";\n" + - "title=" + (.title | @sh) + ";\n" + - "web_url=" + (.web_url | @sh) + ";\n" + "mr_url=" + (.web_url | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" + + "project_name=" + (.project_name | @sh) + ";\n" ')" [[ -n $project_name && $project_name != "null" ]] || # Fallback to URL portion - project_name=$(gitlab_extract_project_url_part "$web_url") + project_name=$(gitlab_extract_project_url_part "$mr_url") - title=$(gitlab_title_undraft "$title") + mr_title=$(gitlab_title_undraft "$mr_title") - local item_label; item_label="${project_name}: $(markdown_link "${title}" "$web_url")" + local item_label; item_label="${project_name}: $(markdown_link "$mr_title" "$mr_url")" local wrap='' - [[ $current_mr_url == "$web_url" ]] && + [[ $current_mr_url == "$mr_url" ]] && wrap='**' # Markdown bold echo "* ${wrap}${item_label}${wrap}" @@ -1486,33 +1499,38 @@ mr_menu_status() { mr_menu_print_title "$issue_code" "$menu_items" echo - while IFS=$'\n' read -r menu_item; do - local mr_iid \ - project_name \ - title \ - web_url + while IFS= read -r menu_item; do + local mr_iid mr_url mr_title project_name eval "$(echo "$menu_item" | jq -r ' "mr_iid=" + (.iid | @sh) + ";\n" + - "project_name=" + (.project_name | @sh) + ";\n" + - "title=" + (.title | @sh) + ";\n" + - "web_url=" + (.web_url | @sh) + ";\n" + "mr_url=" + (.web_url | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" + + "project_name=" + (.project_name | @sh) + ";\n" ')" - local project_url; project_url=$(gitlab_extract_project_url_part "$web_url") + local project_url; project_url=$(gitlab_extract_project_url_part "$mr_url") [[ -n $project_name && $project_name != "null" ]] || project_name="$project_url" # Fallback to URL portion - title=$(gitlab_title_undraft "$title") + # Load merge request & threads in parallel + gitlab_load_mr "$mr_iid" "$project_url" + gitlab_load_threads "$mr_url" - # Load existing merge request details - local merge_request; merge_request=$(gitlab_merge_request "$mr_iid" "$project_url") + mr_title=$(gitlab_title_undraft "$mr_title") + + echo "* $(colorize "$project_name" "bold"): $(terminal_link "$mr_url" "$mr_title")" + has_links || echo " ⇒ $mr_url" + + # Read MR & threads + local merge_request mr_threads + gitlab_read_mr merge_request + gitlab_read_threads mr_threads - echo "* $(colorize "$project_name" "bold"): $(terminal_link "$web_url" "$title")" - has_links || echo " ⇒ $web_url" - mr_show_status "$mr_iid" "$merge_request" + mr_print_status "$merge_request" "$mr_threads" echo - done < <(echo "$menu_items") + + done <<<"$menu_items" } mr_menu_show() { @@ -1542,23 +1560,19 @@ mr_menu_update() { return "$ERR_GITLAB" fi - local mr_iid \ - mr_url - + local mr_iid mr_url eval "$(echo "$mr_summary" | jq -r ' - "mr_iid=" + (.iid | @sh) + ";\n" + - "mr_url=" + (.web_url | @sh) + ";\n" + "mr_iid=" + (.iid | @sh) + ";\n" + + "mr_url=" + (.web_url | @sh) + ";\n" ')" # Load existing merge request details local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - local mr_description \ - mr_title - + local mr_title mr_description eval "$(echo "$merge_request" | jq -r ' - "mr_description=" + (.description | @sh) + ";\n" + - "mr_title=" + (.title | @sh) + ";\n" + "mr_title=" + (.title | @sh) + ";\n" + + "mr_description=" + (.description | @sh) + ";\n" ')" local mr_menu_content; mr_menu_content=$(mr_menu_contents "$menu_items" "$mr_url") @@ -1583,17 +1597,17 @@ mr_menu_update_all() { local issue_code=$1 local menu_items=$2 - local mr_iid - local mr_title - local mr_url - local project_name - local project_url - local merge_request - local mr_description - local mr_menu_content - local updated_description - local mr_update_data - local result + local mr_iid \ + mr_url \ + mr_title \ + project_name \ + project_url \ + merge_request \ + mr_description \ + mr_menu_content \ + updated_description \ + mr_update_data \ + result # Use array instead of looping over variable content with `read` to leave standard input open for `confirm` local menu_array @@ -1775,7 +1789,7 @@ EOF local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") if [[ -n $mr_summary ]]; then # Print merge request status summary - mr_status_block "$(gitlab_extract_iid "$mr_summary")" + mr_status_block "$mr_summary" else echo "--------------------------------------------------------------------------------" echo @@ -1814,7 +1828,7 @@ EOF open_in_browser "$(gitlab_extract_url "$mr_summary")" # Print merge request status summary - mr_status_block "$(gitlab_extract_iid "$mr_summary")" + mr_status_block "$mr_summary" else echo "--------------------------------------------------------------------------------" echo @@ -1847,14 +1861,9 @@ mr_status() { return "$ERR_GITLAB" fi - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - - # Load existing merge request details - local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - # Print merge request title & status echo - mr_status_block "$mr_iid" "$merge_request" + mr_status_block "$mr_summary" } mr_update() { @@ -1872,26 +1881,17 @@ mr_update() { return "$ERR_GITLAB" fi - local mr_iid \ - mr_url - + local mr_iid mr_url mr_title mr_description eval "$(echo "$mr_summary" | jq -r ' - "mr_iid=" + (.iid | @sh) + ";\n" + - "mr_url=" + (.web_url | @sh) + ";\n" + "mr_iid=" + (.iid | @sh) + ";\n" + + "mr_url=" + (.web_url | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" + + "mr_description=" + (.description | @sh) + ";\n" ')" - # Load existing merge request details - local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") - - local mr_title \ - mr_description \ - current_target - - eval "$(echo "$merge_request" | jq -r ' - "mr_title=" + (.title | @sh) + ";\n" + - "mr_description=" + (.description | @sh) + ";\n" + - "current_target=" + (.target_branch | @sh) + ";\n" - ')" + # Load merge request & threads in parallel + gitlab_load_mr "$mr_iid" + gitlab_load_threads "$mr_url" # Init commit lists @@ -1982,59 +1982,71 @@ mr_update() { # Propose update if changes are detected - if [[ ! -x "$(command -v jq)" ]]; then - echo_error "Please install jq to be able to update merge request" + local mr_update_data='{}' update_prompt - else - local mr_update_data='{}' update_prompt - - if [[ $((updated_commit_count + new_commit_count)) -gt 0 ]]; then - update_prompt=1 - if confirm "Do you want to update the merge request description?"; then - - local new_description; new_description=$(echo -e "${new_description_content}") - local newLines="" - - if [[ $new_commit_count -gt 0 ]]; then - if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then - new_description=$(echo -e "${new_description}\n\n## Update") - newLines="\n" - fi - [[ $GIT_MR_EXTENDED -eq 1 ]] && - new_description=$(echo -e "${new_description}\n${newLines}$(markdown_indent_list_items "$new_commit_messages_content_str")") || - new_description=$(echo -e "${new_description}\n${newLines}$(markdown_list "$new_commit_messages_content_str")") + if [[ $((updated_commit_count + new_commit_count)) -gt 0 ]]; then + update_prompt=1 + if confirm "Do you want to update the merge request description?"; then + + local new_description; new_description=$(echo -e "${new_description_content}") + local newLines="" + + if [[ $new_commit_count -gt 0 ]]; then + if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then + new_description=$(echo -e "${new_description}\n\n## Update") + newLines="\n" fi - new_description=$(echo -e "$new_description")$'\n' - mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit "$ERR_MR" + [[ $GIT_MR_EXTENDED -eq 1 ]] && + new_description=$(echo -e "${new_description}\n${newLines}$(markdown_indent_list_items "$new_commit_messages_content_str")") || + new_description=$(echo -e "${new_description}\n${newLines}$(markdown_list "$new_commit_messages_content_str")") fi + new_description=$(echo -e "$new_description")$'\n' + mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit "$ERR_MR" fi + fi - if [[ $target_branch != "$current_target" ]]; then - update_prompt=1 - if confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?"; then - if git_remote_branch_exists "$target_branch"; then - mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit "$ERR_MR" - else - echo_error "Target branch '$target_branch' does not exist on remote" - fi + # Read existing merge request details + local merge_request + gitlab_read_mr merge_request + + local current_target + eval "$(echo "$merge_request" | jq -r ' + "current_target=" + (.target_branch | @sh) + ";\n" + ')" + + if [[ $target_branch != "$current_target" ]]; then + update_prompt=1 + if confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?"; then + if git_remote_branch_exists "$target_branch"; then + mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit "$ERR_MR" + else + echo_error "Target branch '$target_branch' does not exist on remote" fi fi + fi - if [[ $mr_update_data != "{}" ]]; then - echo -n "Updating merge request..." + if [[ $mr_update_data != "{}" ]]; then + echo -n "Updating merge request..." - local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_update_data") - [[ -n $result ]] && echo -e "OK\n" + local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_update_data") + [[ -n $result ]] && echo -e "OK\n" - # reload merge request details - merge_request=$(gitlab_merge_request "$mr_iid") - else - [[ -n $update_prompt ]] && echo - fi + # reload merge request details + merge_request= + gitlab_load_mr "$mr_iid" + else + [[ -n $update_prompt ]] && echo fi - echo "--------------------------------------------------------------------------------" - mr_show_status "$mr_iid" "$merge_request" + # Read MR & threads + local mr_threads + [[ -n $merge_request ]] || + gitlab_read_mr merge_request + gitlab_read_threads mr_threads + + # -------------------------------------------------------------------------------- + mr_print_title "$mr_title" "$mr_url" + mr_print_status "$merge_request" "$mr_threads" } mr_merge() { @@ -2051,22 +2063,34 @@ mr_merge() { return "$ERR_GITLAB" fi - local mr_iid \ - mr_title \ - mr_url - + local mr_iid mr_url mr_title eval "$(echo "$mr_summary" | jq -r ' "mr_iid=" + (.iid | @sh) + ";\n" + - "mr_title=" + (.title | @sh) + ";\n" + - "mr_url=" + (.web_url | @sh) + ";\n" + "mr_url=" + (.web_url | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" ')" - # Load existing merge request details - local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") + # Load merge request & threads in parallel + gitlab_load_mr "$mr_iid" + gitlab_load_threads "$mr_url" - local merge_status \ - current_target + # Merge request status summary - title + echo + mr_print_title "$mr_title" "$mr_url" + + # Read MR & threads + local merge_request mr_threads + gitlab_read_mr merge_request + gitlab_read_threads mr_threads + # Merge request status summary - status + mr_print_status "$merge_request" "$mr_threads" + + echo "--------------------------------------------------------------------------------" + echo + + # Parse merge status + local merge_status current_target eval "$(echo "$merge_request" | jq -r ' "merge_status=" + (if .state == "merged" then "merged" @@ -2074,13 +2098,7 @@ mr_merge() { "current_target=" + (.target_branch | @sh) + ";\n" ')" - # Print merge request status summary - echo - mr_status_block "$mr_iid" "$merge_request" - echo "--------------------------------------------------------------------------------" - echo - - # test merge status + # Test merge status if [[ $merge_status == "merged" ]]; then echo_error "Merge request is already merged." echo_error @@ -2093,9 +2111,7 @@ mr_merge() { fi # test open threads - local unresolved_thread_count - unresolved_thread_count=$(gitlab_merge_request_threads "$mr_url" | grep -c 'unresolved:true') - + local unresolved_thread_count; unresolved_thread_count=$(echo "$mr_threads" | grep -c 'unresolved:true') if [[ $unresolved_thread_count -gt 0 ]]; then if [[ $GIT_MR_FORCE -eq 1 ]]; then echo_error "There are $unresolved_thread_count unresolved threads. Merging anyway." @@ -2209,17 +2225,16 @@ mr_transition() { return "$ERR_GITLAB" fi - local mr_iid; mr_iid=$(gitlab_extract_iid "$mr_summary") - - # Load existing merge request details - local merge_request; merge_request=$(gitlab_merge_request "$mr_iid") || exit $? - local labels; labels=$(gitlab_extract_labels "$merge_request") + local mr_iid mr_url mr_title + eval "$(echo "$mr_summary" | jq -r ' + "mr_iid=" + (.iid | @sh) + ";\n" + + "mr_url=" + (.web_url | @sh) + ";\n" + + "mr_title=" + (.title | @sh) + ";\n" + ')" - # Print merge request status summary - echo - mr_status_block "$mr_iid" "$merge_request" - echo "--------------------------------------------------------------------------------" - echo + # Load merge request & threads in parallel + gitlab_load_mr "$mr_iid" + gitlab_load_threads "$mr_url" local name labels_to_add labels_to_remove jira_transition_var case "$transition" in @@ -2253,7 +2268,22 @@ mr_transition() { ;; esac - mr_update_labels "$mr_iid" "$labels" "$labels_to_remove" "$labels_to_add" + # Merge request status summary - title + echo + mr_print_title "$mr_title" "$mr_url" + + # Read MR & threads + local merge_request mr_threads + gitlab_read_mr merge_request + gitlab_read_threads mr_threads + + # Merge request status summary - status + mr_print_status "$merge_request" "$mr_threads" + + echo "--------------------------------------------------------------------------------" + echo + + mr_update_labels "$mr_iid" "$(gitlab_extract_labels "$merge_request")" "$labels_to_remove" "$labels_to_add" [[ $transition == "OK" ]] && mr_gitlab_undraft "$mr_iid" "$mr_summary" @@ -2416,6 +2446,9 @@ GIT_MR_MENU_START=${GIT_MR_MENU_START:-"## Menu"} GIT_MR_MENU_END=${GIT_MR_MENU_END:-"--------------------------------------------------------------------------------"} GIT_MR_MENU_UPDATE_CONTEXT_LINES=${GIT_MR_MENU_UPDATE_CONTEXT_LINES:-15} +# Custom file descriptors +git_mr_fd_mr=${GIT_MR_FD_MR=} +git_mr_fd_th=${GIT_MR_FD_TH=} ################################################################################ # Run diff --git a/test/git-mr.bats b/test/git-mr.bats index 7832d37..06912e3 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -20,6 +20,11 @@ setup_file() { export MD_BR='..' # for easier visualization + # Custom file descriptors + # {var}-style redirects automatically allocating free file descriptors don't seem to work well in bats context + export GIT_MR_FD_MR=21 + export GIT_MR_FD_TH=22 + cd "${BATS_TEST_DIRNAME}" || exit [[ -d data ]] && rm -rf data @@ -714,7 +719,7 @@ full_sha() { [[ $1 == "projects/some%2Fproject/merge_requests/123/discussions?per_page=100&page=1" ]] && echo '[ {"id": "n1","notes": [{"id": 11},{"id": 12,"resolvable": false}]}, - {"id": "n2","notes": [{"id": 21},{"id": 22,"resolvable": true, "resolved": false}]}, + {"id": "n2","notes": [{"id": 21},{"id": 22,"resolvable": true, "resolved": false},{"id": 23,"resolvable": true, "resolved": false}]}, {"id": "n3","notes": [{"id": 31},{"id": 32,"resolvable": true, "resolved": true}]} ]' } @@ -865,7 +870,7 @@ full_sha() { threads='1 unresolved:false note_id:1 2 unresolved:true note_id:2' - run mr_status_block "1" "$mr" "" "" "$threads" + run mr_status_block "$mr" "$mr" "$threads" assert_output "$(cat <<- EOF -------------------------------------------------------------------------------- Feature/XY-1234 Lorem Ipsum @@ -888,7 +893,7 @@ full_sha() { threads='1 unresolved:false note_id:1 2 unresolved:false note_id:2' - run mr_status_block "1" "$mr" "" "" "$threads" + run mr_status_block "$mr" "$mr" "$threads" assert_output "$(cat <<- EOF -------------------------------------------------------------------------------- Feature/XY-1234 Lorem Ipsum @@ -909,7 +914,7 @@ full_sha() { }' threads="\n" - run mr_status_block "1" "$mr" "" "" "$threads" + run mr_status_block "$mr" "$mr" "$threads" assert_output "$(cat <<- EOF -------------------------------------------------------------------------------- Feature/XY-1234 Lorem Ipsum @@ -924,7 +929,8 @@ full_sha() { } @test "Updates MR description with new commits in new section" { - load "test_helper/gitlab-mock-mr.bash" + load "test_helper/gitlab-mock-mr-description-simple.bash" + load "test_helper/gitlab-mock-mr-update.bash" GIT_MR_EXTENDED= GIT_MR_UPDATE_NEW_SECTION=1 @@ -949,10 +955,6 @@ full_sha() { assert_output "$(cat <<- EOF - -------------------------------------------------------------------------------- - My MR - ⇒ https://gitlab.example.net/some/project/-/merge_requests/1 - -------------------------------------------------------------------------------- [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) @@ -972,8 +974,6 @@ full_sha() { updated commits: 1 new commits: 2 - - -------------------------------------------------------------------------------- EOF )" @@ -981,7 +981,8 @@ full_sha() { } @test "Updates MR description with new commits with extended description" { - load "test_helper/gitlab-mock-mr-extended.bash" + load "test_helper/gitlab-mock-mr-description-extended.bash" + load "test_helper/gitlab-mock-mr-update.bash" GIT_MR_EXTENDED=1 GIT_MR_UPDATE_NEW_SECTION= @@ -1007,10 +1008,6 @@ full_sha() { empty="" assert_output "$(cat <<-EOF - -------------------------------------------------------------------------------- - My MR - ⇒ https://gitlab.example.net/some/project/-/merge_requests/1 - -------------------------------------------------------------------------------- [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) @@ -1032,8 +1029,6 @@ full_sha() { updated commits: 1 new commits: 2 - - -------------------------------------------------------------------------------- EOF )" diff --git a/test/test_helper/gitlab-mock-mr-description-extended.bash b/test/test_helper/gitlab-mock-mr-description-extended.bash new file mode 100644 index 0000000..7e3532f --- /dev/null +++ b/test/test_helper/gitlab-mock-mr-description-extended.bash @@ -0,0 +1,12 @@ + +gitlab_mr_description() { + echo -n "[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" + echo -n "\n\n## Commits" + echo -n "\n\n* **${c1sha} Feature test - 1**.." + echo -n "\n* **${c2sha} Feature test - 2**.." + echo -n "\n This is my second commit.." + echo -n "\n* **${c3sha} Feature test - 3**.." + echo -n "\n This is my third commit.." + echo -n "\n " + echo -n "\n With an extended description" +} diff --git a/test/test_helper/gitlab-mock-mr-description-simple.bash b/test/test_helper/gitlab-mock-mr-description-simple.bash new file mode 100644 index 0000000..cc66cfc --- /dev/null +++ b/test/test_helper/gitlab-mock-mr-description-simple.bash @@ -0,0 +1,8 @@ + +gitlab_mr_description() { + echo -n "[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" + echo -n "\n\n## Commits" + echo -n "\n\n* **${c1sha} Feature test - 1**.." + echo -n "\n* **${c2sha} Feature test - 2**.." + echo -n "\n* **${c3sha} Feature test - 3**" +} diff --git a/test/test_helper/gitlab-mock-mr-extended.bash b/test/test_helper/gitlab-mock-mr-extended.bash deleted file mode 100644 index 75973fd..0000000 --- a/test/test_helper/gitlab-mock-mr-extended.bash +++ /dev/null @@ -1,36 +0,0 @@ - -gitlab_request() { - case "$1" in - "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") - echo '[{"iid":1,"web_url":"https://gitlab.example.net/some/project/-/merge_requests/1"}]' - ;; - - "projects/my%2Fproject/merge_requests/1") - local oldDesc - oldDesc="[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" - oldDesc="${oldDesc}$(echo "\n\n## Commits")" - oldDesc="${oldDesc}$(echo "\n\n* **${c1sha} Feature test - 1**..")" - oldDesc="${oldDesc}$(echo "\n* **${c2sha} Feature test - 2**..")" - oldDesc="${oldDesc}$(echo "\n This is my second commit..")" - oldDesc="${oldDesc}$(echo "\n* **${c3sha} Feature test - 3**..")" - oldDesc="${oldDesc}$(echo "\n This is my third commit..")" - oldDesc="${oldDesc}$(echo "\n ")" - oldDesc="${oldDesc}$(echo "\n With an extended description")" - - echo '{ - "iid":1, "web_url":"https://gitlab.example.net/some/project/-/merge_requests/1", - "title":"My MR", "target_branch":"feature/base", - "description":"'"$oldDesc"'" - }' - ;; - - *) - echo "$1" >> mr-extended-gitlab_request.log - return 1 - ;; - esac -} - -mr_show_status() { - return 0 -} diff --git a/test/test_helper/gitlab-mock-mr-update.bash b/test/test_helper/gitlab-mock-mr-update.bash new file mode 100644 index 0000000..ee3eac8 --- /dev/null +++ b/test/test_helper/gitlab-mock-mr-update.bash @@ -0,0 +1,39 @@ + +gitlab_request() { + + local mrSummaryFields; mrSummaryFields=' + "iid":1, + "title":"My MR", + "web_url":"https://gitlab.example.net/some/project/-/merge_requests/1", + "description":"'"$(gitlab_mr_description)"'" + ' + + case "$1" in + "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") + echo '[{'"$mrSummaryFields"'}]' + ;; + + "projects/my%2Fproject/merge_requests/1") + echo '{'"$mrSummaryFields"', "target_branch":"feature/base"}' + ;; + + "projects/some%2Fproject/merge_requests/1/discussions?per_page=100&page=1") + echo '[]' + ;; + + *) + echo "$1" > mr-gitlab_request.log + return 1 + ;; + esac +} + +# Irrelevant to test +mr_print_title () { + return 0 +} + +# Irrelevant to test +mr_print_status () { + return 0 +} diff --git a/test/test_helper/gitlab-mock-mr.bash b/test/test_helper/gitlab-mock-mr.bash deleted file mode 100644 index 74a2dff..0000000 --- a/test/test_helper/gitlab-mock-mr.bash +++ /dev/null @@ -1,32 +0,0 @@ - -gitlab_request() { - case "$1" in - "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") - echo '[{"iid":1,"web_url":"https://gitlab.example.net/some/project/-/merge_requests/1"}]' - ;; - - "projects/my%2Fproject/merge_requests/1") - local oldDesc - oldDesc="[AB-123 Test issue](https://mycompany.example.net/browse/AB-123)" - oldDesc="${oldDesc}$(echo "\n\n## Commits")" - oldDesc="${oldDesc}$(echo "\n\n* **${c1sha} Feature test - 1**..")" - oldDesc="${oldDesc}$(echo "\n* **${c2sha} Feature test - 2**..")" - oldDesc="${oldDesc}$(echo "\n* **${c3sha} Feature test - 3**")" - - echo '{ - "iid":1, "web_url":"https://gitlab.example.net/some/project/-/merge_requests/1", - "title":"My MR", "target_branch":"feature/base", - "description":"'"$oldDesc"'" - }' - ;; - - *) - echo "$1" > mr-gitlab_request.log - return 1 - ;; - esac -} - -mr_show_status() { - return 0 -} diff --git a/test/test_helper/gitlab-mock-transition.bash b/test/test_helper/gitlab-mock-transition.bash index 003abc6..bb6c16d 100644 --- a/test/test_helper/gitlab-mock-transition.bash +++ b/test/test_helper/gitlab-mock-transition.bash @@ -11,10 +11,6 @@ JIRA_CR_ID="120" JIRA_QA_ID="130" JIRA_OK_ID="140" -mr_status_block() { - return 0 -} - gitlab_request() { case "$1" in "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") @@ -56,3 +52,13 @@ jira_request() { ;; esac } + +# Irrelevant to test +mr_print_title () { + return 0 +} + +# Irrelevant to test +mr_print_status () { + return 0 +} From 63eb27b1ee7b117736964d3c5e3e2d609032cdc9 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 11 Feb 2023 19:30:59 +0100 Subject: [PATCH 72/88] Reverse `git mr menu update` behaviour Update all merge requests by default (that's the point of the menu) Introduce `--current` option to only update current merge request --- git-mr | 37 ++++++++++++++++++++++--------------- git-mr-completion.bash | 8 ++++---- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/git-mr b/git-mr index 2c549a9..3c69caa 100755 --- a/git-mr +++ b/git-mr @@ -2170,7 +2170,7 @@ mr_menu() { gitlab_check_env local git_mr_menu_mode=show - local git_mr_menu_update_all=0 + local git_mr_menu_update_all=1 # Parse options args=() @@ -2178,8 +2178,8 @@ mr_menu() { case "$1" in # Consume options up|update) git_mr_menu_mode=update ;; + --current) git_mr_menu_update_all=0 ;; st|status) git_mr_menu_mode=status ;; - -a|-A|--all) git_mr_menu_update_all=1 ;; # Default: conserve argument *) args+=("${1}") ;; esac @@ -2324,9 +2324,9 @@ ${b}SYNOPSIS${r} ${u}git${r} ${u}mr${r} [OPTION...] update [BRANCH] ${u}git${r} ${u}mr${r} [OPTION...] merge [BRANCH] - ${u}git${r} ${u}mr${r} [OPTION...] menu [SEARCH_TERM] - ${u}git${r} ${u}mr${r} [OPTION...] menu update [--all] [SEARCH_TERM] - ${u}git${r} ${u}mr${r} [OPTION...] menu status [SEARCH_TERM] + ${u}git${r} ${u}mr${r} [OPTION...] menu [SEARCH_TERM] + ${u}git${r} ${u}mr${r} [OPTION...] menu update [--current] [SEARCH_TERM] + ${u}git${r} ${u}mr${r} [OPTION...] menu status [SEARCH_TERM] ${u}git${r} ${u}mr${r} [OPTION...] (ip|cr|qa|accept) [BRANCH] ${u}git${r} ${u}mr${r} [OPTION...] undraft [BRANCH] @@ -2346,7 +2346,6 @@ ${b}ARGUMENTS${r} Defaults to Jira issue code guessed from branch name. ${b}OPTIONS${r} - -c, --code ISSUE_CODE Force issue code. @@ -2360,21 +2359,29 @@ ${b}OPTIONS${r} -y, --yes Bypass confirmation prompts ("yes"). - -n, --new-section - Add new section in description for new commits (for \`git mr update\`) - - -f, --force - Force merge even if there are unresolved threads (for \`git mr merge\`) - - -a, --all - Update all merge requests (for \`git mr menu update\`). - -v, --verbose Verbose output (displays called API URLs & other debugging info). -h Show this help. +${b}COMMAND-SPECIFIC OPTIONS${r} + + ${b}git mr update${r} + + -n, --new-section + Add new section in description for new commits. + + ${b}git mr menu update${r} + + --current + Update only current project/branch merge request. + + ${b}git mr merge${r} + + -f, --force + Force merge even if there are unresolved threads. + ${b}CONFIGURATION${r} You need to configure the following environment variables: diff --git a/git-mr-completion.bash b/git-mr-completion.bash index 4d2fe2b..d56deae 100644 --- a/git-mr-completion.bash +++ b/git-mr-completion.bash @@ -4,7 +4,7 @@ _git_mr() { local isMenu local isMenuStatus local isMenuUpdate - local isMenuUpdateAll + local isMenuUpdateCurrent local isMerge local isUpdate @@ -18,7 +18,7 @@ _git_mr() { [[ "$w" == "update" ]] && isMenuUpdate=1 [[ "$w" == "status" ]] && isMenuStatus=1 if [[ -n "$isMenuUpdate" ]]; then - [[ "$w" == "--all" ]] && isMenuUpdateAll=1 + [[ "$w" == "--current" ]] && isMenuUpdateCurrent=1 fi else [[ "$w" == "merge" ]] && isMerge=1 @@ -37,8 +37,8 @@ _git_mr() { # Menu if [[ -n $isMenu ]]; then [[ -n $isMenuStatus ]] && return - [[ -n $isMenuUpdateAll ]] && return - [[ -n $isMenuUpdate ]] && __gitcomp "--all" && return + [[ -n $isMenuUpdateCurrent ]] && return + [[ -n $isMenuUpdate ]] && __gitcomp "--current" && return __gitcomp "status update" return fi From 2ee544569ce7bdb1e979f838973a1cfe85c10e25 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 11 Feb 2023 19:43:45 +0100 Subject: [PATCH 73/88] Rename `accept` to `ok` For coherence with other 2-letter transitions & env variable names --- git-mr | 12 ++++++------ git-mr-completion.bash | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/git-mr b/git-mr index 3c69caa..cca2091 100755 --- a/git-mr +++ b/git-mr @@ -2328,8 +2328,8 @@ ${b}SYNOPSIS${r} ${u}git${r} ${u}mr${r} [OPTION...] menu update [--current] [SEARCH_TERM] ${u}git${r} ${u}mr${r} [OPTION...] menu status [SEARCH_TERM] - ${u}git${r} ${u}mr${r} [OPTION...] (ip|cr|qa|accept) [BRANCH] - ${u}git${r} ${u}mr${r} [OPTION...] undraft [BRANCH] + ${u}git${r} ${u}mr${r} [OPTION...] (ip|cr|qa|ok) [BRANCH] + ${u}git${r} ${u}mr${r} [OPTION...] undraft [BRANCH] ${u}git${r} ${u}mr${r} hook @@ -2505,10 +2505,10 @@ case $1 in menu) mr_menu "${@:2}" ;; - p|ip|IP) mr_transition "IP" "${@:2}" ;; - r|cr|CR) mr_transition "CR" "${@:2}" ;; - q|qa|QA) mr_transition "QA" "${@:2}" ;; - a|ac|accept) mr_transition "OK" "${@:2}" ;; + ip|IP) mr_transition "IP" "${@:2}" ;; + cr|CR) mr_transition "CR" "${@:2}" ;; + qa|QA) mr_transition "QA" "${@:2}" ;; + ok|OK) mr_transition "OK" "${@:2}" ;; undraft) gitlab_undraft "${@:2}" ;; diff --git a/git-mr-completion.bash b/git-mr-completion.bash index d56deae..23c5de4 100644 --- a/git-mr-completion.bash +++ b/git-mr-completion.bash @@ -11,7 +11,7 @@ _git_mr() { # Parse current command words to get context for w in "${words[@]}"; do case "$w" in - open|status|update|merge|menu|ip|cr|qa|accept|undraft|hook|base|code|help) isAnyAction=1 ;; + open|status|update|merge|menu|ip|cr|qa|ok|undraft|hook|base|code|help) isAnyAction=1 ;; esac [[ $w == "menu" ]] && isMenu=1 if [[ -n "$isMenu" ]]; then @@ -73,7 +73,7 @@ _git_mr() { ip cr qa - accept + ok undraft hook base From 0587b798ebd4e163b487a1a1c4d8c1bf69d7e096 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 11 Feb 2023 20:48:30 +0100 Subject: [PATCH 74/88] Documentation --- README.md | 83 +++++++++++++------------ doc/generate-sample-output.sh | 110 ++++++++++++++++++++++++++++++---- doc/git-mr-menu-update.png | Bin 0 -> 92681 bytes git-mr | 2 +- 4 files changed, 145 insertions(+), 50 deletions(-) create mode 100644 doc/git-mr-menu-update.png diff --git a/README.md b/README.md index 417250b..770529a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Prepares a merge request description, with link to Jira ticket and current branc + [`git mr status`](#git-mr-status) + [`git mr update`](#git-mr-update) + [`git mr menu`](#git-mr-menu) - + [`git mr ip|cr|qa|accept`](#git-mr-ipcrqaaccept) + + [`git mr ip|cr|qa|ok`](#git-mr-ipcrqaok) + [`git mr undraft`](#git-mr-undraft) + [`git mr merge`](#git-mr-merge) + [`git mr hook`](#git-mr-hook) @@ -38,12 +38,12 @@ Prepares a merge request description, with link to Jira ticket and current branc git mr [OPTIONS] update [BRANCH] git mr [OPTIONS] merge [BRANCH] -git mr [OPTIONS] menu [SEARCH_TERM] -git mr [OPTIONS] menu update [--all] [SEARCH_TERM] -git mr [OPTIONS] menu status [SEARCH_TERM] +git mr [OPTIONS] menu [SEARCH_TERM] +git mr [OPTIONS] menu update [--current] [SEARCH_TERM] +git mr [OPTIONS] menu status [SEARCH_TERM] -git mr [OPTIONS] (ip|cr|qa|accept) [BRANCH] -git mr [OPTIONS] undraft [BRANCH] +git mr [OPTIONS] (ip|cr|qa|ok) [BRANCH] +git mr [OPTIONS] undraft [BRANCH] git mr hook @@ -71,17 +71,24 @@ Prepares a merge request description, with link to Jira ticket and current branc You can also set `GIT_MR_EXTENDED=1` in your environment variables to always use extended commit descriptions. * `-y`, `--yes` Bypass confirmation prompts (always answer "yes"). -* `-n`, `--new-section` - Add new section in description for new commits (for `git mr update`) -* `-f`, `--force` - Force merge even if there are unresolved threads (for `git mr merge`) -* `-a`, `--all` - Update all merge requests (for `git mr menu update`). * `-v`, `--verbose` Verbose output (displays called API URLs). * `-h` Show help page. +#### Command-specific options + +* `git mr update` + * `-n`, `--new-section` + Add new section in description for new commits. + +* `git mr menu update` + * `--current` + Update only current project/branch merge request. + +* `git mr merge` + * `-f`, `--force` + Force merge even if there are unresolved threads. ## Installation @@ -103,7 +110,7 @@ Prepares a merge request description, with link to Jira ticket and current branc #### git-mr -* Add the `git-mr` directory to your `PATH`
+* Add the `git-mr` directory to your `PATH` in one of your shell startup scripts: ```bash PATH="${PATH}:/path/to/git-mr" @@ -111,7 +118,7 @@ Prepares a merge request description, with link to Jira ticket and current branc _OR_ -* Define it as a Git alias:
+* Define it as a Git alias: run: ```bash git config --global alias.mr '!bash /path/to/git-mr/git-mr' @@ -157,11 +164,10 @@ Other optional configuration variables: export GITLAB_DEFAULT_LABELS="Review,My Team" # Gitlab status labels (comma-separated, without spaces in between) -export GITLAB_IP_LABELS="WIP" # Label(s) set on IP step -export GITLAB_CR_LABELS="Review" # Label(s) set on CR step -export GITLAB_QA_LABELS="Testing" # Label(s) set on QA step -export GITLAB_OK_LABELS="Accepted" # Label(s) set on Accepted step - +export GITLAB_IP_LABELS="WIP" # Label(s) set on "In Progress" step +export GITLAB_CR_LABELS="Review" # Label(s) set on "Code Review" step +export GITLAB_QA_LABELS="Testing" # Label(s) set on "Quality Assurance" step +export GITLAB_OK_LABELS="Accepted" # Label(s) set on "Accepted" step # Jira status - transition IDs export JIRA_IP_ID="xx" # "In progress" transition ID export JIRA_CR_ID="xx" # "Code review" transition ID @@ -192,9 +198,9 @@ This will print a merge request description, with a link to Jira ticket and curr It can also be forced with the `-t|--target` option. If a merge request based on the current branch is found on Gitlab, its URL will be provided, along with current votes, open and resolved threads and mergeable status. +Otherwise, a link to create a new merge request will be provided. -Otherwise, a link to create a new merge request will be provided. Default labels and "Delete source branch" status -can be configured with the `GITLAB_DEFAULT_LABELS` and `GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH` environment variables. +Default labels and "Delete source branch" status can be configured with the `GITLAB_DEFAULT_LABELS` and `GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH` environment variables. ![git mr](doc/git-mr.png) @@ -245,34 +251,37 @@ You can also update the source branch if it is different from the current one. ### `git mr menu`
-git mr [OPTION...] menu                   [SEARCH_TERM] 
-git mr [OPTION...] menu up|update [--all] [SEARCH_TERM] 
-git mr [OPTION...] menu st|status         [SEARCH_TERM] 
+git mr [OPTION...] menu                       [SEARCH_TERM] 
+git mr [OPTION...] menu up|update [--current] [SEARCH_TERM] 
+git mr [OPTION...] menu st|status             [SEARCH_TERM] 
 
Searches for all (non-closed) merge requests with the current issue code in the title, and generates a menu. -* `git mr menu`
- Prints the markdown menu +* `git mr menu` + Prints the markdown menu. + + ![git mr menu](doc/git-mr-menu.png) + +* `git mr menu up|update` + Inserts or updates menu in all related merge request descriptions (prompts for confirmation). -* `git mr menu up|update`
- Updates the menu in the current merge request description (prompts for confirmation) -* `git mr menu up|update -a|--all`
- Updates the menu in all related merge requests (prompts for confirmation) + ![git mr menu update](doc/git-mr-menu-update.png) -* `git mr menu st|status`
- Prints the menu and status indicators for every related merge request +* `git mr menu up|update --current` + Inserts or updates menu in current merge request description only (prompts for confirmation). -![git mr menu](doc/git-mr-menu.png) +* `git mr menu st|status` + Prints menu and status indicators for every related merge request. -![git mr menu-status](doc/git-mr-menu-status.png) + ![git mr menu status](doc/git-mr-menu-status.png) ---------------------------------------------------------------- -### `git mr ip|cr|qa|accept` +### `git mr ip|cr|qa|ok`
-git mr [OPTION...] ip|cr|qa|accept [BRANCH]
+git mr [OPTION...] ip|cr|qa|ok [BRANCH]
 
This will: @@ -302,7 +311,7 @@ This will: * adds Gitlab labels defined in `GITLAB_QA_LABELS` * transitions Jira ticket using `JIRA_QA_ID` -#### `git mr accept` _("accepted")_ +#### `git mr ok` _("accepted")_ * removes Gitlab labels defined in `GITLAB_IP_LABELS`, `GITLAB_CR_LABELS`, and `GITLAB_QA_LABELS` * adds Gitlab labels defined in `GITLAB_OK_LABELS` * removes Gitlab draft status diff --git a/doc/generate-sample-output.sh b/doc/generate-sample-output.sh index db6724b..1f87a43 100755 --- a/doc/generate-sample-output.sh +++ b/doc/generate-sample-output.sh @@ -290,6 +290,62 @@ EOF echo } +sample_mr_menu_update() { + fake_prompt "git mr menu update" + + mr_description="# [XY-1234 Quisque sed](https://jira.example.net/browse/XY-1234) + +## Menu + +* Some Project: [Feature/XY-1234 Lorem Ipsum](https://myapp.gitlab.com/some/project/...) +* **Other Project: [Feature/XY-1234 Quisque sed](https://myapp.gitlab.com/other/project/...)** +* Third Project: [Feature/XY-1234 Nunc vestibulum](https://myapp.gitlab.com/third/project/...) + +-------------------------------------------------------------------------------- + + +Quisque sed consectetur adipiscing elit. + +Pellentesque eu lectus felis. Phasellus maximus, quam quis accumsan varius, +enim nunc egestas ante, ut venenatis nunc eros non lorem. Ut molestie elementum +nisi in sollicitudin. + +Nullam tempus ultricies velit ut scelerisque. Curabitur at ex suscipit odio. + +## Commits + +* **97b0769f XY-1234 Sed id ultrices lorem** +* **86128e01 XY-1234 Pellentesque habitant morbi** + tristique senectus et netus et malesuada fames ac turpis egestas +* **a1c23d36 XY-1234 Duis vehicula metus sit amet nulla ultrices dictum** +* **aa341612 XY-1234 Morbi condimentum sapien risus** + Sit amet facilisis urna semper quis +* **40aa1e6a XY-1234 Sed iaculis dui id facilisis venenatis** +* **f3b2e6c3 XY-1234 Proin vitae lobortis nunc, sed dictum orci** + Nullam vitae laoreet erat, et dignissim lectus + Nullam ornare, nibh et posuere rhoncus + Mauris tellus accumsan purus, in congue sapien nisl eu ante +* **969d26a6 XY-1234 Curabitur pretium sed justo in vehicula** +* **2c1422c6 XY-1234 Mauris id nunc odio** +" + +mr_url="https://myapp.gitlab.com/other/project/..." +mr_title="Feature/XY-1234 Quisque sed" +project_name="Other Project" + + cat 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 diff --git a/git-mr b/git-mr index af3be75..8acc708 100755 --- a/git-mr +++ b/git-mr @@ -2007,7 +2007,7 @@ mr_update() { if [[ $new_commit_count -gt 0 ]]; then if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then echo - echo "## Update" + echolor "## ${GIT_MR_UPDATE_NEW_SECTION_NAME:-"Update"}" "bold" echo fi @@ -2046,7 +2046,7 @@ mr_update() { if [[ $new_commit_count -gt 0 ]]; then if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then - new_description=$(echo -e "${new_description}\n\n## Update") + new_description=$(echo -e "${new_description}\n\n## ${GIT_MR_UPDATE_NEW_SECTION_NAME:-"Update"}") newLines="\n" fi [[ $GIT_MR_EXTENDED -eq 1 ]] && @@ -2436,7 +2436,7 @@ ${b}COMMAND-SPECIFIC OPTIONS${r} ${b}git mr update${r} - -n, --new-section + -n, --new-section [NEW_SECTION_TITLE] Add new section in description for new commits. ${b}git mr menu update${r} @@ -2550,7 +2550,11 @@ while [[ $# -gt 0 ]]; do -e|-E|--extended) GIT_MR_EXTENDED=1 ;; -y|-Y|--yes) GIT_MR_YES=1 ;; - -n|-N|--new-section) GIT_MR_UPDATE_NEW_SECTION=1 ;; + -n|-N|--new-section) GIT_MR_UPDATE_NEW_SECTION=1 + case "$2" in + -c|--code | -t|--target | -e|-E|--extended | -y|-Y|--yes | -f|-F|--force | -v|-V|--verbose | -h) ;; + *) GIT_MR_UPDATE_NEW_SECTION_NAME="$2"; shift ;; + esac ;; -f|-F|--force) GIT_MR_FORCE=1 ;; -v|-V|--verbose) GIT_MR_VERBOSE=1 ;; diff --git a/test/git-mr.bats b/test/git-mr.bats index 0ea6a94..8a5f2af 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -965,7 +965,6 @@ full_sha() { c5shaNew=$(git rev-parse --short HEAD) run mr_update <<< 'n' - assert_output "$(cat <<- EOF @@ -990,6 +989,32 @@ full_sha() { EOF )" + GIT_MR_UPDATE_NEW_SECTION_NAME="Cleanup & refactor" + run mr_update <<< 'n' + assert_output "$(cat <<- EOF + + + [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) + + ## Commits + + * **${c1sha} Feature test - 1**.. + * **${c2sha} Feature test - 2**.. + * **${c3shaNew} Feature test - 3** + + ## Cleanup & refactor + + * **${c4shaNew} Feature test - 4**.. + * **${c5shaNew} Feature test - 5**.. + + -------------------------------------------------------------------------------- + + updated commits: 1 + new commits: 2 + + EOF + )" + git reset --hard "$c3sha" } From 92c1679f5062f603b224d2d6c190576c7bcfc17f Mon Sep 17 00:00:00 2001 From: Djuuu Date: Sat, 25 Feb 2023 19:31:13 +0100 Subject: [PATCH 83/88] mr update - Warn when remote branch is not up-to-date --- git-mr | 17 +++++++-- test/git-mr.bats | 92 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 103 insertions(+), 6 deletions(-) diff --git a/git-mr b/git-mr index 8acc708..5b4d044 100755 --- a/git-mr +++ b/git-mr @@ -2039,8 +2039,21 @@ mr_update() { if [[ $((updated_commit_count + new_commit_count)) -gt 0 ]]; then update_prompt=1 - if confirm "Do you want to update the merge request description?"; then + local remote; remote=$(gitlab_remote) + local remote_branch="${remote}/${source_branch}" + + local should_update_description=0 + if [[ "$(git rev-parse "$source_branch")" != "$(git rev-parse "$remote_branch")" ]]; then + echo_error "Remote branch on ${remote} is not up-to-date with local branch ${source_branch}." + if confirm "Update merge request description anyway?"; then + should_update_description=1 + fi + elif confirm "Do you want to update the merge request description?"; then + should_update_description=1 + fi + + if [[ $should_update_description -eq 1 ]]; then local new_description; new_description=$(echo -e "${new_description_content}") local newLines="" @@ -2108,7 +2121,7 @@ mr_update() { [[ -n $merge_request ]] || gitlab_read_mr merge_request gitlab_read_threads mr_threads - + # -------------------------------------------------------------------------------- mr_print_title "$mr_title" "$mr_url" mr_print_status "$merge_request" "$mr_threads" diff --git a/test/git-mr.bats b/test/git-mr.bats index 8a5f2af..7f2dfb7 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -11,6 +11,7 @@ setup_file() { export GIT_MR_NO_COLORS=1 export GIT_MR_NO_TERMINAL_LINK=1 + export GIT_MR_EXTENDED= export JIRA_CODE_PATTERN="[A-Z]{2,3}-[0-9]+" export JIRA_INSTANCE= @@ -104,6 +105,12 @@ git() { "$@" } +git-push() { + [[ $1 == "gitlab" ]] && git remote set-url --push gitlab "../gitlab" + git push "$@" + [[ $1 == "gitlab" ]] && git remote set-url --push gitlab "git@${GITLAB_DOMAIN}:my/project.git" +} + git-mr() { "${BATS_TEST_DIRNAME}"/../git-mr "$@" } @@ -945,7 +952,6 @@ full_sha() { load "test_helper/gitlab-mock-mr-description-simple.bash" load "test_helper/gitlab-mock-mr-update.bash" - GIT_MR_EXTENDED= GIT_MR_UPDATE_NEW_SECTION=1 c1sha=$(short_sha "Feature test - 1") @@ -960,10 +966,12 @@ full_sha() { # Add new commits git commit --allow-empty -m "Feature test - 4" -m "With extended message too" c4shaNew=$(git rev-parse --short HEAD) - git commit --allow-empty -m "Feature test - 5" c5shaNew=$(git rev-parse --short HEAD) + # Ensure remote branch is up-to-date + git-push gitlab feature/AB-123-test-feature --force + run mr_update <<< 'n' assert_output "$(cat <<- EOF @@ -1015,7 +1023,9 @@ full_sha() { EOF )" + # Reset repo for next tests git reset --hard "$c3sha" + git-push gitlab feature/AB-123-test-feature --force } @test "Updates MR description with new commits with extended description" { @@ -1037,12 +1047,13 @@ full_sha() { # Add new commits git commit --allow-empty -m "Feature test - 4" -m "With extended message too" c4shaNew=$(git rev-parse --short HEAD) - git commit --allow-empty -m "Feature test - 5" c5shaNew=$(git rev-parse --short HEAD) - run mr_update <<< 'n' + # Ensure remote branch is up-to-date + git-push gitlab feature/AB-123-test-feature --force + run mr_update <<< 'n' empty="" assert_output "$(cat <<-EOF @@ -1070,6 +1081,69 @@ full_sha() { EOF )" + # Reset repo for next tests + git reset --hard "$c3sha" + git-push gitlab feature/AB-123-test-feature --force +} + +@test "Warns before updating merge request when remote branch is not up-to-date" { + load "test_helper/gitlab-mock-mr-description-simple.bash" + load "test_helper/gitlab-mock-mr-update.bash" + + c1sha=$(short_sha "Feature test - 1") + c2sha=$(short_sha "Feature test - 2") + c3sha=$(short_sha "Feature test - 3") + + # Add new commit + git commit --allow-empty -m "Feature test - 4" + c4shaNew=$(git rev-parse --short HEAD) + + run mr_update <<< 'n' + assert_output "$(cat <<- EOF + + + [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) + + ## Commits + + * **${c1sha} Feature test - 1**.. + * **${c2sha} Feature test - 2**.. + * **${c3sha} Feature test - 3** + * **${c4shaNew} Feature test - 4**.. + + -------------------------------------------------------------------------------- + + updated commits: 0 + new commits: 1 + + Remote branch on gitlab is not up-to-date with local branch feature/AB-123-test-feature. + EOF + )" + + run mr_update <<< 'y' + assert_output "$(cat <<- EOF + + + [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) + + ## Commits + + * **${c1sha} Feature test - 1**.. + * **${c2sha} Feature test - 2**.. + * **${c3sha} Feature test - 3** + * **${c4shaNew} Feature test - 4**.. + + -------------------------------------------------------------------------------- + + updated commits: 0 + new commits: 1 + + Remote branch on gitlab is not up-to-date with local branch feature/AB-123-test-feature. + Updating merge request...OK + EOF + )" + + # Reset repo for next tests git reset --hard "$c3sha" } @@ -1089,6 +1163,9 @@ full_sha() { git commit --allow-empty -m "Feature test - 4" c4shaNew=$(git rev-parse --short HEAD) + # Ensure remote branch is up-to-date + git-push gitlab feature/AB-123-test-feature --force + run mr_update <<< 'y'$'\n''y' assert_output --partial "$(cat <<-EOF -------------------------------------------------------------------------------- @@ -1100,7 +1177,9 @@ full_sha() { EOF )" + # Reset repo for next tests git reset --hard "$c3sha" + git-push gitlab feature/AB-123-test-feature --force git branch -d newbase } @@ -1122,6 +1201,9 @@ full_sha() { git commit --allow-empty -m "Feature test - 4" c4shaNew=$(git rev-parse --short HEAD) + # Ensure remote branch is up-to-date + git-push gitlab feature/AB-123-test-feature --force + run mr_update <<< 'y' assert_output --partial "$(cat <<-EOF -------------------------------------------------------------------------------- @@ -1136,7 +1218,9 @@ full_sha() { EOF )" + # Reset repo for next tests git reset --hard "$c3sha" + git-push gitlab feature/AB-123-test-feature --force } @test "Updates MR description with warning about unknown commits" { From e7056d2ab9a65fe3f7486f0433e89e2c417c2534 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 27 Feb 2023 20:03:27 +0100 Subject: [PATCH 84/88] mr update - Insert new commits right after last detected commit in description Also, when last description line is a list item (like a commit line), restore markdown newline that would have been trimmed by Gitlab. (As other commit lines, to prepare for an extended description going on the next line.) --- git-mr | 109 +++++++++++++++++++------- test/git-mr.bats | 193 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 272 insertions(+), 30 deletions(-) diff --git a/git-mr b/git-mr index 5b4d044..4046606 100755 --- a/git-mr +++ b/git-mr @@ -1269,6 +1269,82 @@ mr_print_status() { } +################################################################################ +# Merge request description functions + +mr_description_last_commit_line() { + local mr_description=$1 + + local last_commit_line + last_commit_line=$(echo "$mr_description" | grep -Pn '^[^0-9a-fA-F]*[0-9a-fA-F]{7,}\s' | tail -n1 | cut -d: -f1) + + local description_after_last_commit + description_after_last_commit=$(echo "$mr_description" | tail -n "+$((last_commit_line + 1))") + + local next_description_line + next_description_line=$(echo "$description_after_last_commit" | grep -vn '^ \|^$' | head -n1 | cut -d: -f1) + + local last_commit_extended_description + if [[ -n $next_description_line ]]; then + last_commit_extended_description=$(echo "$description_after_last_commit" | head -n $(( next_description_line - 1))) + else + last_commit_extended_description="$description_after_last_commit" + fi + + local last_extended_description_line + last_extended_description_line=$(echo "$last_commit_extended_description" | grep -vn '^$' | tail -n1 | cut -d: -f1) + + echo $((last_commit_line + last_extended_description_line)) +} + +mr_description_insert_new_commits() { + local mr_description=$1 + local new_commits=$2 + local last_commit_line=$3 + local for_terminal=$4 + + [[ -n $last_commit_line ]] || last_commit_line=$(mr_description_last_commit_line "$mr_description") + + local description_length; description_length=$(echo "$mr_description" | wc -l) + + # Iterate over description lines + local i=1 mr_description_line trailing_br + while IFS=$'\n' read -r mr_description_line; do + + # Add trailing markdown newline (that would have been trimmes by Gitlab) to list item on last line. + # (As other commit lines, to prepare for an extended description going on the next line.) + [[ $i -eq $description_length && $i -eq $last_commit_line ]] && + grep -q '^* ' <<< "$mr_description_line" && + trailing_br="$MD_BR" + + echo "${mr_description_line}${trailing_br}" + + # Insert new commits + if [[ $i -eq $last_commit_line ]]; then + mr_description_print_new_commits "$new_commits" "$for_terminal" + fi + ((i += 1)) + done < <(echo "$mr_description") +} + +mr_description_print_new_commits() { + local new_commits=$1 + local for_terminal=$2 + + if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then + echo + if [[ -n $for_terminal ]]; then + echolor "## ${GIT_MR_UPDATE_NEW_SECTION_NAME:-"Update"}" "bold"; else + echo "## ${GIT_MR_UPDATE_NEW_SECTION_NAME:-"Update"}";fi + echo + fi + + if [[ $GIT_MR_EXTENDED -eq 1 ]]; then + markdown_indent_list_items "$new_commits"; else + markdown_list "$new_commits"; fi +} + + ################################################################################ # Merge request labels utility functions @@ -1999,23 +2075,17 @@ mr_update() { local new_commit_messages_display_str; new_commit_messages_display_str=$(printf "%s\n" "${new_commit_messages_display[@]}") local new_commit_messages_content_str; new_commit_messages_content_str=$(printf "%s\n" "${new_commit_messages_content[@]}") + if [[ $new_commit_count -gt 0 ]]; then + local last_commit_line; last_commit_line=$(mr_description_last_commit_line "$mr_description") + new_description_display=$(mr_description_insert_new_commits "$new_description_display" "$new_commit_messages_display_str" "$last_commit_line" true) + new_description_content=$(mr_description_insert_new_commits "$new_description_content" "$new_commit_messages_content_str" "$last_commit_line") + fi + # Print updated merge request description echo mr_print_title "$mr_title" "$mr_url" echo echo "$new_description_display" - if [[ $new_commit_count -gt 0 ]]; then - if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then - echo - echolor "## ${GIT_MR_UPDATE_NEW_SECTION_NAME:-"Update"}" "bold" - echo - fi - - if [[ $GIT_MR_EXTENDED -eq 1 ]]; then - markdown_indent_list_items "$new_commit_messages_display_str"; else - markdown_list "$new_commit_messages_display_str"; fi - fi - echo echo "--------------------------------------------------------------------------------" echo @@ -2054,20 +2124,7 @@ mr_update() { fi if [[ $should_update_description -eq 1 ]]; then - local new_description; new_description=$(echo -e "${new_description_content}") - local newLines="" - - if [[ $new_commit_count -gt 0 ]]; then - if [[ $GIT_MR_UPDATE_NEW_SECTION -eq 1 ]]; then - new_description=$(echo -e "${new_description}\n\n## ${GIT_MR_UPDATE_NEW_SECTION_NAME:-"Update"}") - newLines="\n" - fi - [[ $GIT_MR_EXTENDED -eq 1 ]] && - new_description=$(echo -e "${new_description}\n${newLines}$(markdown_indent_list_items "$new_commit_messages_content_str")") || - new_description=$(echo -e "${new_description}\n${newLines}$(markdown_list "$new_commit_messages_content_str")") - fi - new_description=$(echo -e "$new_description")$'\n' - mr_update_data=$(jq_build "description" "$new_description" "$mr_update_data") || exit "$ERR_MR" + mr_update_data=$(jq_build "description" "$new_description_content" "$mr_update_data") || exit "$ERR_MR" fi fi diff --git a/test/git-mr.bats b/test/git-mr.bats index 7f2dfb7..f1e23d2 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -948,6 +948,191 @@ full_sha() { )" } +@test "Identifies last commit line in description" { + indent=" " + + # Standard commit list - Last description line is commit + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +* **472c4a8cb9 XY-1234 Pellentesque** {4}" + run mr_description_last_commit_line "$mr_description" + assert_output "4" + + # Standard commit list - Last non-empty description line is commit + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +* **472c4a8cb9 XY-1234 Pellentesque** {4} + +" + run mr_description_last_commit_line "$mr_description" + assert_output "4" + + # Standard commit list - With additional global description + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +* **472c4a8cb9 XY-1234 Pellentesque** {4} + + +Some Description {7}" + run mr_description_last_commit_line "$mr_description" + assert_output "4" + + + # Commits with extended description - Last description line is commit extended description + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +${indent}Curabitur eleifend elit in pellentesque dapibus. {4} +* **472c4a8cb9 XY-1234 Pellentesque** {5} +${indent}Duis bibendum lacus id lacus bibendum gravida. {6} +${indent} +${indent}Pellentesque vulputate risus id posuere malesuada. {8}" + run mr_description_last_commit_line "$mr_description" + assert_output "8" + + # (same with non-indented empty lines in extended description) + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +${indent}Curabitur eleifend elit in pellentesque dapibus. {4} +* **472c4a8cb9 XY-1234 Pellentesque** {5} +${indent}Duis bibendum lacus id lacus bibendum gravida. {6} + +${indent}Pellentesque vulputate risus id posuere malesuada. {8}" + run mr_description_last_commit_line "$mr_description" + assert_output "8" + + # Commits with extended description - Last non-empty description line is commit extended description + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +${indent}Curabitur eleifend elit in pellentesque dapibus. {4} +* **472c4a8cb9 XY-1234 Pellentesque** {5} +${indent}Duis bibendum lacus id lacus bibendum gravida. {6} +${indent} +${indent}Pellentesque vulputate risus id posuere malesuada. {8} + + +" + # (same with trailing indented line in extended description) + run mr_description_last_commit_line "$mr_description" + assert_output "8" + + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +${indent}Curabitur eleifend elit in pellentesque dapibus. {4} +* **472c4a8cb9 XY-1234 Pellentesque** {5} +${indent}Duis bibendum lacus id lacus bibendum gravida. {6} +${indent} +${indent}Pellentesque vulputate risus id posuere malesuada. {8} +${indent} + + +" + run mr_description_last_commit_line "$mr_description" + assert_output "9" + + # (same with non-indented empty lines in extended description) + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +${indent}Curabitur eleifend elit in pellentesque dapibus. {4} +* **472c4a8cb9 XY-1234 Pellentesque** {5} +${indent}Duis bibendum lacus id lacus bibendum gravida. {6} + +${indent}Pellentesque vulputate risus id posuere malesuada. {8} + + +" + run mr_description_last_commit_line "$mr_description" + assert_output "8" + + # Commits with extended description - With additional global description + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +${indent}Curabitur eleifend elit in pellentesque dapibus. {4} +* **472c4a8cb9 XY-1234 Pellentesque** {5} +${indent}Duis bibendum lacus id lacus bibendum gravida. {6} +${indent} +${indent}Pellentesque vulputate risus id posuere malesuada. {8} +Some global description. {9}" + run mr_description_last_commit_line "$mr_description" + assert_output "8" + + # (same with additional blank lines before global description) + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +${indent}Curabitur eleifend elit in pellentesque dapibus. {4} +* **472c4a8cb9 XY-1234 Pellentesque** {5} +${indent}Duis bibendum lacus id lacus bibendum gravida. {6} +${indent} +${indent}Pellentesque vulputate risus id posuere malesuada. {8} + + +Nulla eget sem semper, scelerisque enim nec, pellentesque nisi. {11} +${indent}With unrelated indent {12}" + run mr_description_last_commit_line "$mr_description" + assert_output "8" + + # (same with non-indented empty lines in extended description, and indented lines global description) + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +${indent}Curabitur eleifend elit in pellentesque dapibus. {4} +* **472c4a8cb9 XY-1234 Pellentesque** {5} +${indent}Duis bibendum lacus id lacus bibendum gravida. {6} + +${indent}Pellentesque vulputate risus id posuere malesuada. {8} + + +Nulla eget sem semper, scelerisque enim nec, pellentesque nisi. {11} +* Fusce vitae sem {12} +${indent}non mi egestas dignissim {13} +Nunc vitae {14}" + run mr_description_last_commit_line "$mr_description" + assert_output "8" +} + +@test "Inserts new commits in description" { + mr_description="# Title +## Commits +* **plop**.. +End" + new_commits="new commit" + last_commit_line=3 + + run mr_description_insert_new_commits "$mr_description" "$new_commits" "$last_commit_line" + assert_output "$(cat <<-EOF + # Title + ## Commits + * **plop**.. + * **new commit**.. + End + EOF + )" + + mr_description="# Title +## Commits +* **plop**" + new_commits="new commit" + last_commit_line=3 + + run mr_description_insert_new_commits "$mr_description" "$new_commits" "$last_commit_line" + assert_output "$(cat <<-EOF + # Title + ## Commits + * **plop**.. + * **new commit**.. + EOF + )" +} + @test "Updates MR description with new commits in new section" { load "test_helper/gitlab-mock-mr-description-simple.bash" load "test_helper/gitlab-mock-mr-update.bash" @@ -982,7 +1167,7 @@ full_sha() { * **${c1sha} Feature test - 1**.. * **${c2sha} Feature test - 2**.. - * **${c3shaNew} Feature test - 3** + * **${c3shaNew} Feature test - 3**.. ## Update @@ -1008,7 +1193,7 @@ full_sha() { * **${c1sha} Feature test - 1**.. * **${c2sha} Feature test - 2**.. - * **${c3shaNew} Feature test - 3** + * **${c3shaNew} Feature test - 3**.. ## Cleanup & refactor @@ -1108,7 +1293,7 @@ full_sha() { * **${c1sha} Feature test - 1**.. * **${c2sha} Feature test - 2**.. - * **${c3sha} Feature test - 3** + * **${c3sha} Feature test - 3**.. * **${c4shaNew} Feature test - 4**.. -------------------------------------------------------------------------------- @@ -1130,7 +1315,7 @@ full_sha() { * **${c1sha} Feature test - 1**.. * **${c2sha} Feature test - 2**.. - * **${c3sha} Feature test - 3** + * **${c3sha} Feature test - 3**.. * **${c4shaNew} Feature test - 4**.. -------------------------------------------------------------------------------- From 5918813344f564a9f099869daa90d41e88709b77 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 27 Feb 2023 21:47:37 +0100 Subject: [PATCH 85/88] mr update - Introduce `--replace-commits` option --- README.md | 2 ++ git-mr | 37 ++++++++++++++++++++++++-- git-mr-completion.bash | 7 +++-- test/git-mr.bats | 59 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ec4ef13..d285d67 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,8 @@ Prepares a merge request description, with link to Jira ticket and current branc * `git mr update` * `-n`, `--new-section` `[NEW_SECTION_TITLE]` Add new section in description for new commits. + * `-r`, `--replace-commits` + Fully replace commit list in description with current commits. * `git mr menu update` * `--current` diff --git a/git-mr b/git-mr index 4046606..df0ee48 100755 --- a/git-mr +++ b/git-mr @@ -1272,6 +1272,15 @@ mr_print_status() { ################################################################################ # Merge request description functions +mr_description_first_commit_line() { + local mr_description=$1 + + local first_commit_line + first_commit_line=$(echo "$mr_description" | grep -Pn '^[^0-9a-fA-F]*[0-9a-fA-F]{7,}\s' | head -n1 | cut -d: -f1) + + echo "$first_commit_line" +} + mr_description_last_commit_line() { local mr_description=$1 @@ -2018,6 +2027,23 @@ mr_update() { old_commits_array=($old_commits) IFS=$oIFS + # Prepare full commit list replacement + local last_commit_line + if [[ $GIT_MR_REPLACE_COMMITS -eq 1 ]]; then + local commits_start_line; commits_start_line=$(mr_description_first_commit_line "$mr_description") + local commits_end_line; commits_end_line=$(mr_description_last_commit_line "$mr_description") + + if [[ $commits_start_line -gt 0 && $commits_end_line -gt 0 ]]; then + # Remove old commits from description, keeping leading and/or trailing blank lines + IFS= read -rd '' mr_description < <(echo "$mr_description" | sed "${commits_start_line},${commits_end_line}d") + # Remember line where to insert new commits + last_commit_line=$((commits_start_line - 1)); [[ $last_commit_line -ge 1 ]] || last_commit_line=1 + fi + + # All MR commits will be added as new commits + old_commits_array=() + fi + local updated_commit_count=0 local new_commit= local new_commit_messages_display=() @@ -2076,7 +2102,10 @@ mr_update() { local new_commit_messages_content_str; new_commit_messages_content_str=$(printf "%s\n" "${new_commit_messages_content[@]}") if [[ $new_commit_count -gt 0 ]]; then - local last_commit_line; last_commit_line=$(mr_description_last_commit_line "$mr_description") + # Find last commit line in current description (when not replacing whole commit list) + [[ -z $last_commit_line ]] && + last_commit_line=$(mr_description_last_commit_line "$mr_description") + new_description_display=$(mr_description_insert_new_commits "$new_description_display" "$new_commit_messages_display_str" "$last_commit_line" true) new_description_content=$(mr_description_insert_new_commits "$new_description_content" "$new_commit_messages_content_str" "$last_commit_line") fi @@ -2509,6 +2538,9 @@ ${b}COMMAND-SPECIFIC OPTIONS${r} -n, --new-section [NEW_SECTION_TITLE] Add new section in description for new commits. + -r, --replace-commits + Fully replace commit list in description with current commits. + ${b}git mr menu update${r} --current @@ -2622,9 +2654,10 @@ while [[ $# -gt 0 ]]; do -y|-Y|--yes) GIT_MR_YES=1 ;; -n|-N|--new-section) GIT_MR_UPDATE_NEW_SECTION=1 case "$2" in - -c|--code | -t|--target | -e|-E|--extended | -y|-Y|--yes | -f|-F|--force | -v|-V|--verbose | -h) ;; + -c|--code | -t|--target | -e|-E|--extended | -y|-Y|--yes | -r|-R|--replace-commits | -f|-F|--force | -v|-V|--verbose | -h) ;; *) GIT_MR_UPDATE_NEW_SECTION_NAME="$2"; shift ;; esac ;; + -r|-R|--replace-commits) GIT_MR_REPLACE_COMMITS=1 ;; -f|-F|--force) GIT_MR_FORCE=1 ;; -v|-V|--verbose) GIT_MR_VERBOSE=1 ;; diff --git a/git-mr-completion.bash b/git-mr-completion.bash index 23c5de4..4cb0644 100644 --- a/git-mr-completion.bash +++ b/git-mr-completion.bash @@ -49,7 +49,8 @@ _git_mr() { [[ -n $isMerge ]] && __gitcomp_nl_append "--force" [[ -n $isUpdate ]] && - __gitcomp_nl_append "--new-section" + __gitcomp_nl_append "--new-section" && + __gitcomp_nl_append "--replace-commits" return ;; -*) @@ -59,7 +60,9 @@ _git_mr() { __gitcomp_nl_append "--force" [[ -n $isUpdate ]] && __gitcomp_nl_append "-n" && - __gitcomp_nl_append "--new-section" + __gitcomp_nl_append "--new-section" && + __gitcomp_nl_append "-r" && + __gitcomp_nl_append "--replace-commits" return ;; *) diff --git a/test/git-mr.bats b/test/git-mr.bats index f1e23d2..f984f9c 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -948,6 +948,15 @@ full_sha() { )" } +@test "Identifies first commit line in description" { + mr_description="XY-1234 Some Feature {1} +## Commits {2} +* **431561fff0 XY-1234 Donec id justo ut nisi** {3} +* **472c4a8cb9 XY-1234 Pellentesque** {4}" + run mr_description_first_commit_line "$mr_description" + assert_output "3" +} + @test "Identifies last commit line in description" { indent=" " @@ -1437,6 +1446,56 @@ End" git branch -d newbase } +@test "Replaces whole commit list in MR description" { + load "test_helper/gitlab-mock-mr-description-extended.bash" + load "test_helper/gitlab-mock-mr-update.bash" + + GIT_MR_EXTENDED=1 + GIT_MR_REPLACE_COMMITS=1 + + c1sha=$(short_sha "Feature test - 1") + c2sha=$(short_sha "Feature test - 2") + c3sha=$(short_sha "Feature test - 3") + + # Amend first commit + git reset --soft "$c1sha" + git commit --amend --allow-empty -m "Feature test - new 1" -m "Updated" + c1shaNew=$(git rev-parse --short HEAD) + + # Add new commit + git commit --allow-empty -m "Feature test - new 2" -m "With extended message too" + c2shaNew=$(git rev-parse --short HEAD) + + # Ensure remote branch is up-to-date + git-push gitlab feature/AB-123-test-feature --force + + run mr_update <<< 'n' + empty="" + assert_output "$(cat <<-EOF + + + [AB-123 Test issue](https://mycompany.example.net/browse/AB-123) + + ## Commits + + * **${c1shaNew} Feature test - new 1**.. + Updated.. + * **${c2shaNew} Feature test - new 2**.. + With extended message too.. + + -------------------------------------------------------------------------------- + + updated commits: 0 + new commits: 2 + + EOF + )" + + # Reset repo for next tests + git reset --hard "$c3sha" + git-push gitlab feature/AB-123-test-feature --force +} + ################################################################################ # Merge request labels utility functions From e86219186b0fa56e087dea6fd6b71e22feef1b9d Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 28 Feb 2023 01:15:20 +0100 Subject: [PATCH 86/88] Add `--no-color` & `--no-links` options --- README.md | 4 ++++ git-mr | 28 +++++++++++++++++++++------- git-mr-completion.bash | 4 ++-- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index d285d67..ca2beed 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,10 @@ Prepares a merge request description, with link to Jira ticket and current branc * `-e`, `--extended` Use full commit messages in description ("extended", for `git mr [open|update]`). You can also set `GIT_MR_EXTENDED=1` in your environment variables to always use extended commit descriptions. +* `--no-color` + Disable terminal colors. +* `--no-links` + Disable terminal hyperlinks and show merge request URL in `mr status` and `mr menu status`. * `-y`, `--yes` Bypass confirmation prompts (always answer "yes"). * `-v`, `--verbose` diff --git a/git-mr b/git-mr index df0ee48..c54f4e2 100755 --- a/git-mr +++ b/git-mr @@ -2522,6 +2522,12 @@ ${b}OPTIONS${r} Use full commit messages in description ("extended", for \`git mr [open|update]\`). You can also set GIT_MR_EXTENDED=1 in your environment variables to always use extended commit descriptions. + --no-color + Disable terminal colors. + + --no-links + Disable terminal hyperlinks and show merge request URL in \`mr status\` and \`mr menu status\`. + -y, --yes Bypass confirmation prompts ("yes"). @@ -2650,16 +2656,24 @@ while [[ $# -gt 0 ]]; do -c|--code) GIT_MR_CODE="$2"; shift ;; -t|--target) GIT_MR_TARGET="$2"; shift ;; - -e|-E|--extended) GIT_MR_EXTENDED=1 ;; - -y|-Y|--yes) GIT_MR_YES=1 ;; - -n|-N|--new-section) GIT_MR_UPDATE_NEW_SECTION=1 + -e|--extended) GIT_MR_EXTENDED=1 ;; + + --no-color) GIT_MR_NO_COLORS=1 ;; + --no-links) GIT_MR_NO_TERMINAL_LINK=1 ;; + + -y|--yes) GIT_MR_YES=1 ;; + -v|--verbose) GIT_MR_VERBOSE=1 ;; + + # mr update + -n|--new-section) GIT_MR_UPDATE_NEW_SECTION=1 case "$2" in - -c|--code | -t|--target | -e|-E|--extended | -y|-Y|--yes | -r|-R|--replace-commits | -f|-F|--force | -v|-V|--verbose | -h) ;; + -c|--code | -t|--target | -e|--extended | --no-color|--no-links | -y|--yes | -v|--verbose | -r|--replace-commits | -f|--force | -h) ;; *) GIT_MR_UPDATE_NEW_SECTION_NAME="$2"; shift ;; esac ;; - -r|-R|--replace-commits) GIT_MR_REPLACE_COMMITS=1 ;; - -f|-F|--force) GIT_MR_FORCE=1 ;; - -v|-V|--verbose) GIT_MR_VERBOSE=1 ;; + -r|--replace-commits) GIT_MR_REPLACE_COMMITS=1 ;; + + # mr merge + -f|--force) GIT_MR_FORCE=1 ;; -h) usage; exit 0; ;; diff --git a/git-mr-completion.bash b/git-mr-completion.bash index 4cb0644..c1997b4 100644 --- a/git-mr-completion.bash +++ b/git-mr-completion.bash @@ -45,7 +45,7 @@ _git_mr() { case "$cur" in --*) - __gitcomp "--code --target --verbose --extended --yes" + __gitcomp "--code --target --extended --no-color --no-links --verbose --yes" [[ -n $isMerge ]] && __gitcomp_nl_append "--force" [[ -n $isUpdate ]] && @@ -54,7 +54,7 @@ _git_mr() { return ;; -*) - __gitcomp "-c --code -t --target -v --verbose -e --extended -y --yes" + __gitcomp "-c --code -t --target -e --extended --no-color --no-links -v --verbose -y --yes" [[ -n $isMerge ]] && __gitcomp_nl_append "-f" && __gitcomp_nl_append "--force" From f9703bba300977af95108f8503088a84f24e6828 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 28 Feb 2023 10:12:08 +0100 Subject: [PATCH 87/88] `grep | head` optimizations --- git-mr | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/git-mr b/git-mr index c54f4e2..13372e5 100755 --- a/git-mr +++ b/git-mr @@ -1276,7 +1276,7 @@ mr_description_first_commit_line() { local mr_description=$1 local first_commit_line - first_commit_line=$(echo "$mr_description" | grep -Pn '^[^0-9a-fA-F]*[0-9a-fA-F]{7,}\s' | head -n1 | cut -d: -f1) + first_commit_line=$(echo "$mr_description" | grep -Pn '^[^0-9a-fA-F]*[0-9a-fA-F]{7,}\s' -m 1 | cut -d: -f1) echo "$first_commit_line" } @@ -1291,7 +1291,7 @@ mr_description_last_commit_line() { description_after_last_commit=$(echo "$mr_description" | tail -n "+$((last_commit_line + 1))") local next_description_line - next_description_line=$(echo "$description_after_last_commit" | grep -vn '^ \|^$' | head -n1 | cut -d: -f1) + next_description_line=$(echo "$description_after_last_commit" | grep -vn '^ \|^$' -m 1 | cut -d: -f1) local last_commit_extended_description if [[ -n $next_description_line ]]; then @@ -1778,7 +1778,7 @@ mr_menu_update_all() { mr_menu_start_line() { local mr_description=$1 - echo "$mr_description" | grep -n "$GIT_MR_MENU_START" | head -n1 | cut -d: -f1 + echo "$mr_description" | grep -n "$GIT_MR_MENU_START" -m 1 | cut -d: -f1 } mr_menu_end_line() { @@ -1786,7 +1786,7 @@ mr_menu_end_line() { local menu_start=${2:-1} local menu_end - menu_end=$(echo "$mr_description" | tail -n +"$((menu_start + 1))" | grep -n -- "$GIT_MR_MENU_END" | cut -d: -f1 | head -n 1) + menu_end=$(echo "$mr_description" | tail -n +"$((menu_start + 1))" | grep -n -m 1 -- "$GIT_MR_MENU_END" | cut -d: -f1) echo $((menu_start + menu_end)) } From 6113905bc9d0210d601a41e60f57b1c515436889 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 28 Feb 2023 10:12:29 +0100 Subject: [PATCH 88/88] Documentation --- README.md | 21 ++++++++++++++++----- git-mr | 48 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index ca2beed..a00012b 100644 --- a/README.md +++ b/README.md @@ -54,11 +54,12 @@ Prepares a merge request description, with link to Jira ticket and current branc ### Arguments * `BRANCH` - Force merge request source branch. - Defaults to current branch. + Merge request source branch. + (Defaults to current branch.) + * `SEARCH_TERM` Term searched in merge requests titles to build menu. - Defaults to Jira issue code guessed from branch name. + (Defaults to Jira issue code guessed from branch name.) ### Options @@ -174,17 +175,27 @@ export GITLAB_IP_LABELS="WIP" # Label(s) set on "In Progress" step export GITLAB_CR_LABELS="Review" # Label(s) set on "Code Review" step export GITLAB_QA_LABELS="Testing" # Label(s) set on "Quality Assurance" step export GITLAB_OK_LABELS="Accepted" # Label(s) set on "Accepted" step + # Jira status - transition IDs export JIRA_IP_ID="xx" # "In progress" transition ID export JIRA_CR_ID="xx" # "Code review" transition ID export JIRA_QA_ID="xx" # "Quality Assurance" transition ID export JIRA_OK_ID="xx" # "Accepted" transition ID +# Always use extended commit messages +# export GIT_MR_EXTENDED=1 + +# Required upvote count to turn indicator green in `mr status` (defaults to 2) +#export GIT_MR_REQUIRED_UPVOTES=2 + +# Number of description lines shown in `mr menu update` (defaults to 15) +#export GIT_MR_MENU_UPDATE_CONTEXT_LINES=15 + # Check "Delete source branch" by default (defaults to 1) -export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 +#export GITLAB_DEFAULT_FORCE_REMOVE_SOURCE_BRANCH=1 # Network timeout (in seconds, defaults to 5) -export GIT_MR_TIMEOUT=5 +#export GIT_MR_TIMEOUT=5 ``` diff --git a/git-mr b/git-mr index 13372e5..7bf5841 100755 --- a/git-mr +++ b/git-mr @@ -2476,6 +2476,7 @@ mr_hook() { usage() { local b; b="$(printf '\e[1m')" + local i; i="$(printf '\e[3m')" local u; u="$(printf '\e[4m')" local r; r="$(printf '\e[0m')" @@ -2504,12 +2505,12 @@ ${b}SYNOPSIS${r} ${b}ARGUMENTS${r} BRANCH - Force merge request source branch. - Defaults to current branch. + Merge request source branch. + (Defaults to current branch.) SEARCH_TERM Term searched in merge requests titles to build menu. - Defaults to Jira issue code guessed from branch name. + (Defaults to Jira issue code guessed from branch name.) ${b}OPTIONS${r} -c, --code ISSUE_CODE @@ -2558,7 +2559,9 @@ ${b}COMMAND-SPECIFIC OPTIONS${r} Force merge even if there are unresolved threads. ${b}CONFIGURATION${r} - +EOF + if [[ $GIT_MR_VERBOSE -eq 1 ]]; then + cat <

NT%fxm`>DL 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 -> yes" >&2 + echo "$(colorize "${question}" "cyan") -> yes" >&2 return 0 fi From f83eea0354b6526d6a3a52eb3183e5fad28faa77 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 13 Feb 2023 10:00:13 +0100 Subject: [PATCH 75/88] Display tweaks --- doc/generate-sample-output.sh | 6 +++--- git-mr | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/doc/generate-sample-output.sh b/doc/generate-sample-output.sh index 1f87a43..631824b 100755 --- a/doc/generate-sample-output.sh +++ b/doc/generate-sample-output.sh @@ -275,17 +275,17 @@ sample_mr_menu_status() { EOF echo "* $(colorize "Some Project" "bold"): $(terminal_link "https://myapp.gitlab.com/some/project/-/merge_requests/12" "Feature/XY-1234 Lorem Ipsum")" - has_links || echo " ⇒ https://myapp.gitlab.com/some/project/-/merge_requests/12" + has_links || echolor " ⇒ https://myapp.gitlab.com/some/project/-/merge_requests/12" "midgray" mr_print_status "$mr1" "$threads1" echo echo "* $(colorize "Other Project" "bold"): $(terminal_link "https://myapp.gitlab.com/other/project/-/merge_requests/34" "Feature/XY-1234 Quisque sed")" - has_links || echo " ⇒ https://myapp.gitlab.com/some/project/-/merge_requests/34" + has_links || echolor " ⇒ https://myapp.gitlab.com/some/project/-/merge_requests/34" "midgray" mr_print_status "$mr2" "$threads2" echo echo "* $(colorize "Third Project" "bold"): $(terminal_link "https://myapp.gitlab.com/third/project/-/merge_requests/56" "Feature/XY-1234 Nunc vestibulum")" - has_links || echo " ⇒ https://myapp.gitlab.com/some/project/-/merge_requests/56" + has_links || echolor " ⇒ https://myapp.gitlab.com/some/project/-/merge_requests/56" "midgray" mr_print_status "$mr3" "$threads3" echo } diff --git a/git-mr b/git-mr index e8247bc..de5ea1e 100755 --- a/git-mr +++ b/git-mr @@ -255,6 +255,8 @@ colorize() { local cyan='\e[36m'; local lightcyan='\e[96m' local gray='\e[090m'; local lightgray='\e[37m' + local midgray='\e[38;5;247m' + local reset='\e[0m' for style in "${@:2}"; do @@ -1095,7 +1097,7 @@ mr_print_title() { echo "--------------------------------------------------------------------------------" echo " $(terminal_link "$mr_url" "$(gitlab_title_undraft "$mr_title")")" - has_links || echo " ⇒ $mr_url" + has_links || echolor " ⇒ $mr_url" "midgray" echo "--------------------------------------------------------------------------------" } @@ -1234,7 +1236,9 @@ mr_print_status() { fi echo_spacer "$spacer_chars_r" # Target - echo -e "${target_display}\n" + echo "$target_display" + + echo # 2nd row ------------------------------------------------------------------ # Votes @@ -1519,8 +1523,13 @@ mr_menu_status() { mr_title=$(gitlab_title_undraft "$mr_title") - echo "* $(colorize "$project_name" "bold"): $(terminal_link "$mr_url" "$mr_title")" - has_links || echo " ⇒ $mr_url" + echo -n "* $(colorize "$project_name" "bold"): " + if has_links; then + echolink "$mr_url" "$mr_title" + else + echo "$mr_title" + echolor " ⇒ $mr_url" "midgray" + fi # Read MR & threads local merge_request mr_threads From dd7b65f84835738fd7ace8494022a7fa57558e47 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 13 Feb 2023 20:19:46 +0100 Subject: [PATCH 76/88] Remove 'heads/' prefix from revision range in `git_commits()` Target can be a commit sha-1 when target determination falls back to merge base in `git_base_branch()`. --- git-mr | 2 +- test/git-mr.bats | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/git-mr b/git-mr index de5ea1e..e82a031 100755 --- a/git-mr +++ b/git-mr @@ -107,7 +107,7 @@ git_commits() { local source_branch=${1:-$(git_current_branch)} local target_branch=${2:-${GIT_MR_TARGET:-$(git_base_branch "$source_branch")}} - git log --oneline --reverse --no-decorate "heads/${target_branch}..heads/${source_branch}" + git log --oneline --reverse --no-decorate "${target_branch}..${source_branch}" } git_commits_extended() { diff --git a/test/git-mr.bats b/test/git-mr.bats index 06912e3..c84a4fd 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -265,7 +265,6 @@ full_sha() { # Commits of current branch run git_commits - assert_output "$(cat <<- EOF ${testSha1} Feature test - 1 ${testSha2} Feature test - 2 @@ -277,7 +276,6 @@ full_sha() { # Commits of specified branch run git_commits "feature/base" - assert_output "$(cat <<- EOF ${baseSha1} Feature base - 1 ${baseSha2} Feature base - 2 @@ -286,7 +284,6 @@ full_sha() { )" run git_commits "feature/AB-123-test-feature" "epic/big-feature" - assert_output "$(cat <<- EOF ${baseSha1} Feature base - 1 ${baseSha2} Feature base - 2 @@ -296,6 +293,13 @@ full_sha() { ${testSha3} Feature test - 3 EOF )" + + run git_commits "feature/AB-123-test-feature" "${testSha1}" + assert_output "$(cat <<- EOF + ${testSha2} Feature test - 2 + ${testSha3} Feature test - 3 + EOF + )" } @test "Lists current branch commits with commit body" { From 10c354c8fd3253d69b76223116c51a1282b7bcb3 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 13 Feb 2023 21:44:54 +0100 Subject: [PATCH 77/88] Check target branch existence when explicitly provided + check branches on update --- git-mr | 10 +++++++--- test/git-mr.bats | 9 +++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/git-mr b/git-mr index e82a031..6e3e65f 100755 --- a/git-mr +++ b/git-mr @@ -17,7 +17,7 @@ git_base_branch() { [[ -n $branch ]] || exit "$ERR_GIT" # Not on any branch [[ $branch != "$default_branch" ]] || exit "$ERR_GIT" # On default branch - git show-ref -q --heads "$branch" || exit "$ERR_GIT" # Branch does not exist + git_branch_exists "$branch" || exit "$ERR_GIT" # Branch does not exist # Nearest branch in commit history local base_branch @@ -35,7 +35,7 @@ git_base_branch() { fi # First possible merge base - if ! git show-ref -q --heads "$base_branch"; then + if ! git_branch_exists "$base_branch"; then base_branch=$(git show-branch --merge-base "$branch" "$default_branch" | head -n1) fi @@ -94,12 +94,15 @@ git_check_branches() { [[ $source_branch != "$(git_default_branch)" ]] || exit_error "$ERR_GIT" "On default branch" - git show-ref -q --heads "$source_branch" || + git_branch_exists "$source_branch" || exit_error "$ERR_GIT" "Branch '$source_branch' does not exist" [[ -n $target_branch ]] || exit_error "$ERR_GIT" "Unable to determine target branch" + [[ $target_branch == "$GIT_MR_TARGET" ]] && ! git_branch_exists "$target_branch" && + exit_error "$ERR_GIT" "Branch '$target_branch' does not exist" + return 0 } @@ -1881,6 +1884,7 @@ mr_update() { local source_branch=${1:-$(git_current_branch)} local target_branch=${GIT_MR_TARGET:-$(git_base_branch "$source_branch")} + git_check_branches "$source_branch" "$target_branch" # Search existing merge request local mr_summary; mr_summary=$(gitlab_merge_request_summary "$source_branch") diff --git a/test/git-mr.bats b/test/git-mr.bats index c84a4fd..d4d2793 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -253,6 +253,15 @@ full_sha() { run git_check_branches feature/base "" assert_failure "$ERR_GIT" assert_output "Unable to determine target branch" + + # Workaround when we don't care about checking target (mr status) + run git_check_branches feature/base "-" + assert_success + + GIT_MR_TARGET="wrong" + run git_check_branches feature/base "wrong" + assert_failure "$ERR_GIT" + assert_output "Branch 'wrong' does not exist" } @test "Lists current branch commits" { From 446721e067e0f6b35826234069c07fbafe1d0bfa Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 13 Feb 2023 22:26:20 +0100 Subject: [PATCH 78/88] mr update - add warning for unknown commits when there are more commits in current description than in current branch --- git-mr | 23 ++++++++++++++++++++++- test/git-mr.bats | 29 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/git-mr b/git-mr index 6e3e65f..f3eb4ad 100755 --- a/git-mr +++ b/git-mr @@ -1934,6 +1934,7 @@ mr_update() { local sameColor="lightblue" local updatedColor="orange" local newColor="green" + local wrongColor="lightred" # Iterate over commit lists, compare sha-1 and update description for i in ${!current_commits_array[*]}; do @@ -1963,7 +1964,17 @@ mr_update() { fi done - local new_commit_count=${#new_commit_messages_display[@]} + local old_commit_count=${#old_commits_array[@]} + local current_commit_count=${#current_commits_array[@]} + local new_commit_count=${#new_commit_messages_content[@]} + local unknown_commit_count=$((old_commit_count - current_commit_count)) + + if [[ $unknown_commit_count -gt 0 ]]; then + for (( i = current_commit_count; i < old_commit_count; i++ )); do + old="${old_commits_array[$i]}" + new_description_display=${new_description_display//"$old"/"$(colorize "$old" "$wrongColor")"} + done + fi # implode arrays local new_commit_messages_display_str; new_commit_messages_display_str=$(printf "%s\n" "${new_commit_messages_display[@]}") @@ -1991,12 +2002,22 @@ mr_update() { echo echo " updated commits: $(colorize "$updated_commit_count" "$updatedColor")" echo " new commits: $(colorize "$new_commit_count" "$newColor")" + if [[ $unknown_commit_count -gt 0 ]]; then + echo + echo " unknown commits: $(colorize "$unknown_commit_count" "$wrongColor")" + fi echo # Propose update if changes are detected local mr_update_data='{}' update_prompt + if [[ $unknown_commit_count -gt 0 ]]; then + echo_error "Current description has ${unknown_commit_count} more commit(s) than found in branch, given target '${target_branch}'." + echo_error "You might want to check your target branch or update the description manually." + echo_error + fi + if [[ $((updated_commit_count + new_commit_count)) -gt 0 ]]; then update_prompt=1 if confirm "Do you want to update the merge request description?"; then diff --git a/test/git-mr.bats b/test/git-mr.bats index d4d2793..814cb6f 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1048,6 +1048,35 @@ full_sha() { git reset --hard "$c3sha" } +@test "Updates MR description with warning about unknown commits" { + load "test_helper/gitlab-mock-mr-description-simple.bash" + load "test_helper/gitlab-mock-mr-update.bash" + + c1sha=$(short_sha "Feature test - 1") + c2sha=$(short_sha "Feature test - 2") + c3sha=$(short_sha "Feature test - 3") + + # Create new branch which will be detected as base + baseCommit=$(short_sha "Feature base - 3") + git branch newbase "$c1sha" + + run mr_update <<< 'y' + assert_output --partial "$(cat <<-EOF + -------------------------------------------------------------------------------- + + updated commits: 2 + new commits: 0 + + unknown commits: 1 + + Current description has 1 more commit(s) than found in branch, given target 'newbase'. + You might want to check your target branch or update the description manually. + EOF + )" + + git branch -d newbase +} + ################################################################################ # Merge request labels utility functions From 6a1af5b805187baba203ae192a41251a8c427cda Mon Sep 17 00:00:00 2001 From: Djuuu Date: Mon, 13 Feb 2023 22:37:33 +0100 Subject: [PATCH 79/88] mr update - add warning when target is a commit reference when falling back to first possible merge base --- git-mr | 24 +++++++++++++----- test/git-mr.bats | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/git-mr b/git-mr index f3eb4ad..86a583a 100755 --- a/git-mr +++ b/git-mr @@ -2049,13 +2049,25 @@ mr_update() { ')" if [[ $target_branch != "$current_target" ]]; then - update_prompt=1 - if confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?"; then - if git_remote_branch_exists "$target_branch"; then - mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit "$ERR_MR" - else - echo_error "Target branch '$target_branch' does not exist on remote" + if git_branch_exists "$target_branch"; then + update_prompt=1 + if confirm "Do you want to update the merge request target branch from '$current_target' to '$target_branch'?"; then + if git_remote_branch_exists "$target_branch"; then + mr_update_data=$(jq_build "target_branch" "$target_branch" "$mr_update_data") || exit "$ERR_MR" + else + echo_error "Target branch '$target_branch' does not exist on remote." + [[ $mr_update_data != '{}' ]] && ! confirm "Update description anyway?" && mr_update_data="{}" + fi fi + elif git cat-file -e "$target_branch" 2>/dev/null; then + echo_error + echo_error "Guessed target '$target_branch' is a commit reference." + echo_error "(No local base branch found, first possible merge base used.)" + echo_error "You might need to rebase your branch." + [[ $mr_update_data != '{}' ]] && ! confirm "Update description anyway?" && mr_update_data="{}" + else + echo_error "Target '$target_branch' does not exist." + [[ $mr_update_data != '{}' ]] && ! confirm "Update description anyway?" && mr_update_data="{}" fi fi diff --git a/test/git-mr.bats b/test/git-mr.bats index 814cb6f..ff6ea27 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1048,6 +1048,72 @@ full_sha() { git reset --hard "$c3sha" } +@test "Does not update MR target if target branch does not exist on remote" { + load "test_helper/gitlab-mock-mr-description-simple.bash" + load "test_helper/gitlab-mock-mr-update.bash" + + c1sha=$(short_sha "Feature test - 1") + c2sha=$(short_sha "Feature test - 2") + c3sha=$(short_sha "Feature test - 3") + + # Create new branch which will be detected as base + baseCommit=$(short_sha "Feature base - 3") + git branch newbase "$baseCommit" + + # Add new commit + git commit --allow-empty -m "Feature test - 4" + c4shaNew=$(git rev-parse --short HEAD) + + run mr_update <<< 'y'$'\n''y' + assert_output --partial "$(cat <<-EOF + -------------------------------------------------------------------------------- + + updated commits: 0 + new commits: 1 + + Target branch 'newbase' does not exist on remote. + EOF + )" + + git reset --hard "$c3sha" + git branch -d newbase +} + +@test "Updates MR description with warning about misplaced target" { + load "test_helper/gitlab-mock-mr-description-simple.bash" + load "test_helper/gitlab-mock-mr-update.bash" + + c1sha=$(short_sha "Feature test - 1") + c2sha=$(short_sha "Feature test - 2") + c3sha=$(short_sha "Feature test - 3") + + # simulate commit ref base (when 1st possible merge base is used) + baseCommit=$(short_sha "Feature base - 3") + git_base_branch() { + echo "$baseCommit" + } + + # Add new commit + git commit --allow-empty -m "Feature test - 4" + c4shaNew=$(git rev-parse --short HEAD) + + run mr_update <<< 'y' + assert_output --partial "$(cat <<-EOF + -------------------------------------------------------------------------------- + + updated commits: 0 + new commits: 1 + + + Guessed target '$baseCommit' is a commit reference. + (No local base branch found, first possible merge base used.) + You might need to rebase your branch. + EOF + )" + + git reset --hard "$c3sha" +} + @test "Updates MR description with warning about unknown commits" { load "test_helper/gitlab-mock-mr-description-simple.bash" load "test_helper/gitlab-mock-mr-update.bash" From eaa1a399ea0879aa22267b1514de9eaccd3857bc Mon Sep 17 00:00:00 2001 From: Djuuu Date: Tue, 14 Feb 2023 19:50:48 +0100 Subject: [PATCH 80/88] Make required upvotes configurable --- git-mr | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/git-mr b/git-mr index 86a583a..165be49 100755 --- a/git-mr +++ b/git-mr @@ -1141,9 +1141,9 @@ mr_print_status() { local labels_str_len=$((${#labels} + $((labels_count * 2)) + 4)) # 2 spaces + 2 for larger icon # Votes - if [[ $upvotes -gt 1 ]]; then upvotes=$(colorize "$upvotes" "bold" "lightgreen") - elif [[ $upvotes -gt 0 ]]; then upvotes=$(colorize "$upvotes" "bold" "lightyellow") - else upvotes=$(colorize "$upvotes" "bold"); fi + if [[ $upvotes -ge ${GIT_MR_REQUIRED_UPVOTES:-2} ]]; then upvotes=$(colorize "$upvotes" "bold" "lightgreen") + elif [[ $upvotes -gt 0 ]]; then upvotes=$(colorize "$upvotes" "bold" "lightyellow") + else upvotes=$(colorize "$upvotes" "bold"); fi if [[ $downvotes -gt 0 ]]; then downvotes=$(colorize "$downvotes" "bold" "lightred") @@ -2499,6 +2499,9 @@ GIT_MR_MENU_START=${GIT_MR_MENU_START:-"## Menu"} GIT_MR_MENU_END=${GIT_MR_MENU_END:-"--------------------------------------------------------------------------------"} GIT_MR_MENU_UPDATE_CONTEXT_LINES=${GIT_MR_MENU_UPDATE_CONTEXT_LINES:-15} +# Defaults +GIT_MR_REQUIRED_UPVOTES=2 + # Custom file descriptors git_mr_fd_mr=${GIT_MR_FD_MR=} git_mr_fd_th=${GIT_MR_FD_TH=} From 4a42046e20eb2597df6c7c24968f47afab522f3f Mon Sep 17 00:00:00 2001 From: Djuuu Date: Thu, 16 Feb 2023 19:40:23 +0100 Subject: [PATCH 81/88] mr ip - set draft status when going back to "In Progress" --- README.md | 1 + git-mr | 21 ++++++++++++++++++++ test/git-mr.bats | 21 +++++++++++++++----- test/test_helper/gitlab-mock-transition.bash | 7 +++++-- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 770529a..9ff99ba 100644 --- a/README.md +++ b/README.md @@ -299,6 +299,7 @@ This will: #### `git mr ip` _("in progress")_ * removes Gitlab labels defined in `GITLAB_CR_LABELS`, `GITLAB_QA_LABELS` and `GITLAB_OK_LABELS` * adds Gitlab labels defined in `GITLAB_IP_LABELS` +* sets Gitlab draft status * transitions Jira ticket using `JIRA_IP_ID` #### `git mr cr` _("code review")_ diff --git a/git-mr b/git-mr index 165be49..af3be75 100755 --- a/git-mr +++ b/git-mr @@ -1394,6 +1394,25 @@ mr_update_labels() { fi } +mr_gitlab_draft() { + local mr_iid=$1 + local mr_summary=$2 + + local mr_title; mr_title=$(gitlab_extract_title "$mr_summary") + + ! gitlab_title_is_draft "$mr_title" || return 0 + + confirm "Do you want to set draft status?" || return 0 + + echo -n "Setting draft status... " + + local draft_title; draft_title=$(gitlab_title_to_draft "$mr_title") + local mr_data; mr_data=$(jq_build "title" "$draft_title") || exit "$ERR_MR" + + local result; result=$(gitlab_merge_request_update "$mr_iid" "$mr_data") + [[ -n $result ]] && echo -e "OK\n" +} + mr_gitlab_undraft() { local mr_iid=$1 local mr_summary=$2 @@ -2331,6 +2350,8 @@ mr_transition() { mr_update_labels "$mr_iid" "$(gitlab_extract_labels "$merge_request")" "$labels_to_remove" "$labels_to_add" + [[ $transition == "IP" ]] && + mr_gitlab_draft "$mr_iid" "$mr_summary" [[ $transition == "OK" ]] && mr_gitlab_undraft "$mr_iid" "$mr_summary" diff --git a/test/git-mr.bats b/test/git-mr.bats index ff6ea27..0ea6a94 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -1404,6 +1404,14 @@ This is an example without menu. EOF } + draft_output() { + cat <<- EOF + + Do you want to set draft status? -> yes + Setting draft status... OK + EOF + } + undraft_output() { cat <<- EOF @@ -1419,13 +1427,14 @@ This is an example without menu. # In Progress ------------------------------------------------------------------ - GIT_MR_MOCK_LABELS='"Review","Testing","Accepted","My Team"' + git_mr_mock_labels='"Review","Testing","Accepted","My Team"' GITLAB_IP_LABELS="" # labels can be empty run mr_transition "IP" assert_output "$(cat <<-EOF ${separator} $(labels_output "My Team") + $(draft_output) $(jira_output "In Progress") EOF )" @@ -1435,13 +1444,14 @@ This is an example without menu. assert_output "$(cat <<- EOF ${separator} $(labels_output "My Team,WIP") + $(draft_output) $(jira_output "In Progress") EOF )" # Code Review ------------------------------------------------------------------ - GIT_MR_MOCK_LABELS='"WIP","Testing","Accepted","My Team"' + git_mr_mock_labels='"WIP","Testing","Accepted","My Team"' GITLAB_CR_LABELS="" # labels can be empty run mr_transition "CR" @@ -1463,7 +1473,7 @@ This is an example without menu. # Quality Assurance ------------------------------------------------------------ - GIT_MR_MOCK_LABELS='"WIP","Review","Accepted","My Team"' + git_mr_mock_labels='"WIP","Review","Accepted","My Team"' GITLAB_QA_LABELS="" # labels can be empty run mr_transition "QA" @@ -1485,7 +1495,8 @@ This is an example without menu. # Accepted --------------------------------------------------------------------- - GIT_MR_MOCK_LABELS='"WIP","Review","Testing","My Team"' + git_mr_mock_labels='"WIP","Review","Testing","My Team"' + git_mr_mock_title="Draft: My MR" GITLAB_OK_LABELS="" # labels can be empty run mr_transition "OK" @@ -1509,7 +1520,7 @@ This is an example without menu. # No label change -------------------------------------------------------------- - GIT_MR_MOCK_LABELS='"Testing","My Team"' # no label change + git_mr_mock_labels='"Testing","My Team"' # no label change run mr_transition "QA" assert_output "$(cat <<- EOF ${separator} diff --git a/test/test_helper/gitlab-mock-transition.bash b/test/test_helper/gitlab-mock-transition.bash index bb6c16d..6d23031 100644 --- a/test/test_helper/gitlab-mock-transition.bash +++ b/test/test_helper/gitlab-mock-transition.bash @@ -11,14 +11,17 @@ JIRA_CR_ID="120" JIRA_QA_ID="130" JIRA_OK_ID="140" +git_mr_mock_labels='"My Team"' +git_mr_mock_title="My MR" + gitlab_request() { case "$1" in "projects/my%2Fproject/merge_requests?state=opened&view=simple&source_branch=feature/AB-123-test-feature") - echo '[{"iid":1, "title":"Draft: My MR"}]' + echo '[{"iid":1, "title":"'"$git_mr_mock_title"'"}]' ;; "projects/my%2Fproject/merge_requests/1") - echo '{"iid":1, "title":"Draft: My MR", "labels":['"$GIT_MR_MOCK_LABELS"']}' + echo '{"iid":1, "title":"'"$git_mr_mock_title"'", "labels":['"$git_mr_mock_labels"']}' ;; *) From f28fb9a023c43a66998e593e4e223ab522710961 Mon Sep 17 00:00:00 2001 From: Djuuu Date: Wed, 22 Feb 2023 12:07:32 +0100 Subject: [PATCH 82/88] mr update - Allow custom section separator title --- README.md | 2 +- doc/generate-sample-output.sh | 4 ++-- doc/git-mr-update.png | Bin 102985 -> 105710 bytes git-mr | 12 ++++++++---- test/git-mr.bats | 27 ++++++++++++++++++++++++++- 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 9ff99ba..ec4ef13 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ Prepares a merge request description, with link to Jira ticket and current branc #### Command-specific options * `git mr update` - * `-n`, `--new-section` + * `-n`, `--new-section` `[NEW_SECTION_TITLE]` Add new section in description for new commits. * `git mr menu update` diff --git a/doc/generate-sample-output.sh b/doc/generate-sample-output.sh index 631824b..4931d4b 100755 --- a/doc/generate-sample-output.sh +++ b/doc/generate-sample-output.sh @@ -112,7 +112,7 @@ sample_mr_status() { } sample_mr_update() { - fake_prompt "git mr update -n" + fake_prompt "git mr update -n \"QA feedback\"" local mr='{ "title": "Draft: '"$mr_title"'", "web_url":"'"$mr_url"'", @@ -146,7 +146,7 @@ Sed non nulla ac metus congue consectetur et vel magna. Hendrerit ex egestas egestas sed -## Update +$(colorize "## QA feedback" "bold") * **$(colorize "e9642b7" "green") Ut consectetur leo ut leo commodo porttitor** Nam tincidunt ligula lectus diff --git a/doc/git-mr-update.png b/doc/git-mr-update.png index 5e3163026876ac7e4483c9644e978387dcb0924f..f7d5e236783966837d91a7b38e133f0345a1a706 100644 GIT binary patch literal 105710 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