From 4a47ea034bd474d5f6cf61d34251faa3be8e72ad Mon Sep 17 00:00:00 2001 From: go2null <1t1is2@gmail.com> Date: Sun, 20 Oct 2019 12:42:00 -0400 Subject: [PATCH 1/8] delete empty .gitmodules --- bin/git-delete-submodule | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/git-delete-submodule b/bin/git-delete-submodule index 542390d..69da9d9 100755 --- a/bin/git-delete-submodule +++ b/bin/git-delete-submodule @@ -6,8 +6,8 @@ test ! -f .gitmodules && echo ".gitmodules file not found" 1>&2 && exit 2 NAME="$(echo "$1" | sed 's/\/$//g')" test -z \ - "$(git config --file=.gitmodules submodule."$NAME".url)" \ - && echo "submodule not found" 1>&2 && exit 3 + "$( git config --file=.gitmodules submodule."$NAME".url)" \ + && echo "submodule not found" 1>&2 && exit 3 # 1. Delete the relevant section from .git/config and clean submodule files git submodule deinit -f "$NAME" || exit 4 @@ -16,6 +16,8 @@ rm -rf .git/modules/"$NAME" # 2. Delete the relevant line from .gitmodules git config --file=.gitmodules --remove-section submodule."$NAME" git add .gitmodules +# 2.a Delete empty .gitmodules +[ "$(wc -l '.gitmodules' | cut -d' ' -f1)" = '0' ] && git rm -f '.gitmodules' # 3. Run git rm --cached path_to_submodule git rm --cached -rf "$NAME" # 4. Need to confirm and commit the changes for yourself From 4bb273a8021520833c8fd016b0bfa9a13ea967c1 Mon Sep 17 00:00:00 2001 From: go2null <1t1is2@gmail.com> Date: Sun, 20 Oct 2019 12:56:04 -0400 Subject: [PATCH 2/8] reorganize flow --- bin/git-delete-submodule | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/bin/git-delete-submodule b/bin/git-delete-submodule index 69da9d9..7618685 100755 --- a/bin/git-delete-submodule +++ b/bin/git-delete-submodule @@ -9,18 +9,23 @@ test -z \ "$( git config --file=.gitmodules submodule."$NAME".url)" \ && echo "submodule not found" 1>&2 && exit 3 -# 1. Delete the relevant section from .git/config and clean submodule files +# 1. Handle the .git directory +# 1.a. Delete the relevant section from .git/config git submodule deinit -f "$NAME" || exit 4 -rmdir "$NAME" +# 1.b. Delete the submodule .git directory rm -rf .git/modules/"$NAME" -# 2. Delete the relevant line from .gitmodules +# 1.c. Delete empty submodule directory +git rm -f "$NAME" + +# 2. Handle .gitignore file +# 2.a. Delete the relevant line from .gitmodules git config --file=.gitmodules --remove-section submodule."$NAME" +# 2.b and stage changes git add .gitmodules -# 2.a Delete empty .gitmodules +# 2.c. Delete empty .gitmodules [ "$(wc -l '.gitmodules' | cut -d' ' -f1)" = '0' ] && git rm -f '.gitmodules' -# 3. Run git rm --cached path_to_submodule -git rm --cached -rf "$NAME" -# 4. Need to confirm and commit the changes for yourself + +# 3. Need to confirm and commit the changes for yourself echo echo "Now submodule $NAME is deleted." echo 'Confirm with `git submodule status` and commit the changes for yourself.' From 5ea4a626a683f77b73d4d265251c76886b154f85 Mon Sep 17 00:00:00 2001 From: go2null <1t1is2@gmail.com> Date: Sun, 20 Oct 2019 13:21:40 -0400 Subject: [PATCH 3/8] check git submodule status before declaring success --- bin/git-delete-submodule | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/git-delete-submodule b/bin/git-delete-submodule index 7618685..7215287 100755 --- a/bin/git-delete-submodule +++ b/bin/git-delete-submodule @@ -27,5 +27,10 @@ git add .gitmodules # 3. Need to confirm and commit the changes for yourself echo -echo "Now submodule $NAME is deleted." +if git submodule status >/dev/null 2>&1 \ + && ! git submodule status | grep "$NAME"; then + echo "Successfully deleted $NAME." +else + echo "Failed to delete $NAME." 1>&2 && exit 6 +fi echo 'Confirm with `git submodule status` and commit the changes for yourself.' From 4f35f8cad89c66823f87c00679a20becb0c1b418 Mon Sep 17 00:00:00 2001 From: go2null <1t1is2@gmail.com> Date: Sun, 20 Oct 2019 13:23:34 -0400 Subject: [PATCH 4/8] display git submodule status output before exiting --- bin/git-delete-submodule | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/git-delete-submodule b/bin/git-delete-submodule index 7215287..aca1c28 100755 --- a/bin/git-delete-submodule +++ b/bin/git-delete-submodule @@ -33,4 +33,8 @@ if git submodule status >/dev/null 2>&1 \ else echo "Failed to delete $NAME." 1>&2 && exit 6 fi -echo 'Confirm with `git submodule status` and commit the changes for yourself.' +echo +git submodule status +echo +echo 'Confirm the output of `git submodule status` above' \ + ' and commit the changes for yourself.' From f00c1389d6a5b02352e43bca4eb50b984d0290c1 Mon Sep 17 00:00:00 2001 From: go2null <1t1is2@gmail.com> Date: Sun, 20 Oct 2019 13:31:20 -0400 Subject: [PATCH 5/8] improve readability --- bin/git-delete-submodule | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/bin/git-delete-submodule b/bin/git-delete-submodule index aca1c28..948a652 100755 --- a/bin/git-delete-submodule +++ b/bin/git-delete-submodule @@ -1,27 +1,31 @@ #!/usr/bin/env bash -test -z "$1" && echo "submodule required" 1>&2 && exit 1 -cd "$(git root)" -test ! -f .gitmodules && echo ".gitmodules file not found" 1>&2 && exit 2 +abort() { + error="$1" && shift + echo "FATAL: $*" 1>&2 && exit "$error" +} -NAME="$(echo "$1" | sed 's/\/$//g')" -test -z \ - "$( git config --file=.gitmodules submodule."$NAME".url)" \ - && echo "submodule not found" 1>&2 && exit 3 +test -z "$1" && abort 1 'Submodule required' +cd "$(git root)" || abort 5 'Cannot change to repository root' +test ! -f '.gitmodules' && abort 2 '.gitmodules file not found' + +NAME="${1%/}" +test -z "$(git config --file='.gitmodules' "submodule.$NAME.url")" \ + && abort 3 'Submodule not found' # 1. Handle the .git directory # 1.a. Delete the relevant section from .git/config -git submodule deinit -f "$NAME" || exit 4 +git submodule deinit -f "$NAME" || abort 4 "Failed to deinitialize $NAME" # 1.b. Delete the submodule .git directory -rm -rf .git/modules/"$NAME" +rm -rf ".git/modules/$NAME" # 1.c. Delete empty submodule directory git rm -f "$NAME" # 2. Handle .gitignore file # 2.a. Delete the relevant line from .gitmodules -git config --file=.gitmodules --remove-section submodule."$NAME" +git config --file='.gitmodules' --remove-section "submodule.$NAME" # 2.b and stage changes -git add .gitmodules +git add '.gitmodules' # 2.c. Delete empty .gitmodules [ "$(wc -l '.gitmodules' | cut -d' ' -f1)" = '0' ] && git rm -f '.gitmodules' @@ -31,7 +35,7 @@ if git submodule status >/dev/null 2>&1 \ && ! git submodule status | grep "$NAME"; then echo "Successfully deleted $NAME." else - echo "Failed to delete $NAME." 1>&2 && exit 6 + abort 6 "Failed to delete $NAME." fi echo git submodule status From 17d1a471a47e51d8a4f298f49bcef833f0d1f91d Mon Sep 17 00:00:00 2001 From: go2null <1t1is2@gmail.com> Date: Sun, 20 Oct 2019 14:03:58 -0400 Subject: [PATCH 6/8] add --force option to continue on error --- bin/git-delete-submodule | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bin/git-delete-submodule b/bin/git-delete-submodule index 948a652..f5f9831 100755 --- a/bin/git-delete-submodule +++ b/bin/git-delete-submodule @@ -2,9 +2,13 @@ abort() { error="$1" && shift - echo "FATAL: $*" 1>&2 && exit "$error" + echo "ERROR: $*" 1>&2 + test -z "$FORCE" && exit "$error" } +# Don't abort on failures. This allows to cleanup after a rpevious failure. +[ "$1" = '--force' ] && FORCE=1 && shift + test -z "$1" && abort 1 'Submodule required' cd "$(git root)" || abort 5 'Cannot change to repository root' test ! -f '.gitmodules' && abort 2 '.gitmodules file not found' @@ -30,7 +34,6 @@ git add '.gitmodules' [ "$(wc -l '.gitmodules' | cut -d' ' -f1)" = '0' ] && git rm -f '.gitmodules' # 3. Need to confirm and commit the changes for yourself -echo if git submodule status >/dev/null 2>&1 \ && ! git submodule status | grep "$NAME"; then echo "Successfully deleted $NAME." @@ -39,6 +42,5 @@ else fi echo git submodule status -echo echo 'Confirm the output of `git submodule status` above' \ ' and commit the changes for yourself.' From 1f605df053a41172cfdae99629bb7da1776136e0 Mon Sep 17 00:00:00 2001 From: go2null <1t1is2@gmail.com> Date: Tue, 22 Oct 2019 16:41:55 -0400 Subject: [PATCH 7/8] add PR changes --- bin/git-delete-submodule | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/bin/git-delete-submodule b/bin/git-delete-submodule index f5f9831..b5ee290 100755 --- a/bin/git-delete-submodule +++ b/bin/git-delete-submodule @@ -6,7 +6,7 @@ abort() { test -z "$FORCE" && exit "$error" } -# Don't abort on failures. This allows to cleanup after a rpevious failure. +# Don't abort on failures. This allows to cleanup after a previous failure. [ "$1" = '--force' ] && FORCE=1 && shift test -z "$1" && abort 1 'Submodule required' @@ -25,22 +25,27 @@ rm -rf ".git/modules/$NAME" # 1.c. Delete empty submodule directory git rm -f "$NAME" -# 2. Handle .gitignore file +# 2. Handle .gitmodules file # 2.a. Delete the relevant line from .gitmodules -git config --file='.gitmodules' --remove-section "submodule.$NAME" +git config --file='.gitmodules' --remove-section "submodule.$NAME" 2>/dev/null || : # 2.b and stage changes git add '.gitmodules' # 2.c. Delete empty .gitmodules [ "$(wc -l '.gitmodules' | cut -d' ' -f1)" = '0' ] && git rm -f '.gitmodules' # 3. Need to confirm and commit the changes for yourself -if git submodule status >/dev/null 2>&1 \ - && ! git submodule status | grep "$NAME"; then +git_status_text="$(git submodule status 2>&1)" +git_status_exit=$? +if [ "$git_status_exit" -eq 0 ] \ + && printf '%s' "DUMMY$git_status_text" | grep -v "$NAME"; then + echo "Successfully deleted $NAME." else - abort 6 "Failed to delete $NAME." + abort 6 "Failed to delete $NAME with error:\n$git_status_text" fi -echo -git submodule status -echo 'Confirm the output of `git submodule status` above' \ - ' and commit the changes for yourself.' +printf '\n%s\n' '== git submodule status ==' +printf '%s\n' "$git_status_text" +printf '%s\n' '==========================' +# shellcheck disable=SC2016 +echo 'Confirm the output of `git submodule status` above (if any)' \ + 'and then commit the changes.' From 677f570f34609cbdaaa7cf7cc171dc0f46a5fa31 Mon Sep 17 00:00:00 2001 From: spacewander Date: Sun, 3 Nov 2019 11:30:03 +0800 Subject: [PATCH 8/8] git-delete-submodule: comment the DUMMY prefix and ignore the output of grep -v. --- bin/git-delete-submodule | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/git-delete-submodule b/bin/git-delete-submodule index b5ee290..9d8eea5 100755 --- a/bin/git-delete-submodule +++ b/bin/git-delete-submodule @@ -37,7 +37,8 @@ git add '.gitmodules' git_status_text="$(git submodule status 2>&1)" git_status_exit=$? if [ "$git_status_exit" -eq 0 ] \ - && printf '%s' "DUMMY$git_status_text" | grep -v "$NAME"; then + && printf '%s' "DUMMY$git_status_text" | grep -v "$NAME" > /dev/null; then + # grep fails when piping in an empty string, so we add a DUMMY prefix echo "Successfully deleted $NAME." else