From 822d74405ae8098c732edd810b18dc91a48dc796 Mon Sep 17 00:00:00 2001 From: Evan B Date: Mon, 13 Sep 2021 15:40:58 +0200 Subject: [PATCH 01/13] X-Smart-Branch-Parent: master From b6dd3622086774fd8b4a2b3e9cd6680de5b60767 Mon Sep 17 00:00:00 2001 From: Evan B Date: Tue, 3 Aug 2021 14:29:25 +0200 Subject: [PATCH 02/13] Add smart-gogen as copy of smart-diff --- scripts/dev/smart-gogen.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 scripts/dev/smart-gogen.sh diff --git a/scripts/dev/smart-gogen.sh b/scripts/dev/smart-gogen.sh new file mode 100755 index 0000000..b8fccf1 --- /dev/null +++ b/scripts/dev/smart-gogen.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +# Produces git diff relative to the last smart-branch commit. + +SCRIPT="$(python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "${BASH_SOURCE[0]}")" +source "$(dirname "$SCRIPT")/../../lib/git.sh" + +marker_commit="$(git log --grep="^X-Smart-Branch-Parent: " --format="%H" --max-count=1)" +[[ $? == 0 ]] || die "Could not inspect git logs." +if [[ -z "$marker_commit" ]]; then + die 'Could not find a smart-branch commit. Please run `smart-rebase []` first.' +fi + +git diff "$marker_commit" -- "$@" From 4469e7c3578e9f44df40d887fae96cfcf136ffd8 Mon Sep 17 00:00:00 2001 From: Evan B Date: Tue, 3 Aug 2021 14:32:46 +0200 Subject: [PATCH 03/13] Change comments and behavior to initial smart-gogen script, need to test --- scripts/dev/smart-gogen.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/dev/smart-gogen.sh b/scripts/dev/smart-gogen.sh index b8fccf1..16d2c20 100755 --- a/scripts/dev/smart-gogen.sh +++ b/scripts/dev/smart-gogen.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Produces git diff relative to the last smart-branch commit. +# Generates files using go generate relative to the last smart-branch commit. SCRIPT="$(python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "${BASH_SOURCE[0]}")" source "$(dirname "$SCRIPT")/../../lib/git.sh" @@ -11,4 +11,4 @@ if [[ -z "$marker_commit" ]]; then die 'Could not find a smart-branch commit. Please run `smart-rebase []` first.' fi -git diff "$marker_commit" -- "$@" +git diff "$marker_commit" --name-only | xargs -n 1 dirname | sort -u | xargs gogen From c5b834681d414167f8ae6be9bfeab14671064e46 Mon Sep 17 00:00:00 2001 From: Evan B Date: Tue, 3 Aug 2021 14:37:49 +0200 Subject: [PATCH 04/13] Add symlink to bin directory --- bin/smart-gogen | 1 + 1 file changed, 1 insertion(+) create mode 120000 bin/smart-gogen diff --git a/bin/smart-gogen b/bin/smart-gogen new file mode 120000 index 0000000..eea1853 --- /dev/null +++ b/bin/smart-gogen @@ -0,0 +1 @@ +../scripts/dev/smart-gogen.sh \ No newline at end of file From 5083bdbf84cdd3e5da5f06f0abbb89c9685e4660 Mon Sep 17 00:00:00 2001 From: Evan B Date: Tue, 3 Aug 2021 14:39:16 +0200 Subject: [PATCH 05/13] Update usage comment --- scripts/dev/smart-gogen.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/dev/smart-gogen.sh b/scripts/dev/smart-gogen.sh index 16d2c20..7c8c5ec 100755 --- a/scripts/dev/smart-gogen.sh +++ b/scripts/dev/smart-gogen.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Generates files using go generate relative to the last smart-branch commit. +# Usage: smart-gogen (uses gogen only on files touched since smart-branch) SCRIPT="$(python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "${BASH_SOURCE[0]}")" source "$(dirname "$SCRIPT")/../../lib/git.sh" From a5c15ccedc0fe4063a1b1895e005533a8efd249a Mon Sep 17 00:00:00 2001 From: Evan B Date: Tue, 3 Aug 2021 15:00:33 +0200 Subject: [PATCH 06/13] Updated comment to reflect actual behavior --- scripts/dev/smart-gogen.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/dev/smart-gogen.sh b/scripts/dev/smart-gogen.sh index 7c8c5ec..152d3fe 100755 --- a/scripts/dev/smart-gogen.sh +++ b/scripts/dev/smart-gogen.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Usage: smart-gogen (uses gogen only on files touched since smart-branch) +# Usage: smart-gogen (runs gogen on directories of files touched since smart-branch) SCRIPT="$(python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "${BASH_SOURCE[0]}")" source "$(dirname "$SCRIPT")/../../lib/git.sh" From 40a02619f98b40d06bfa61c09bb6c43eda52d79c Mon Sep 17 00:00:00 2001 From: Evan B Date: Wed, 4 Aug 2021 13:14:12 +0200 Subject: [PATCH 07/13] Rename smart-gogen and bin symlink to quickgogen --- bin/quickgogen | 1 + bin/smart-gogen | 1 - scripts/dev/{smart-gogen.sh => quickgogen.sh} | 0 3 files changed, 1 insertion(+), 1 deletion(-) create mode 120000 bin/quickgogen delete mode 120000 bin/smart-gogen rename scripts/dev/{smart-gogen.sh => quickgogen.sh} (100%) diff --git a/bin/quickgogen b/bin/quickgogen new file mode 120000 index 0000000..8165259 --- /dev/null +++ b/bin/quickgogen @@ -0,0 +1 @@ +../scripts/dev/quickgogen.sh \ No newline at end of file diff --git a/bin/smart-gogen b/bin/smart-gogen deleted file mode 120000 index eea1853..0000000 --- a/bin/smart-gogen +++ /dev/null @@ -1 +0,0 @@ -../scripts/dev/smart-gogen.sh \ No newline at end of file diff --git a/scripts/dev/smart-gogen.sh b/scripts/dev/quickgogen.sh similarity index 100% rename from scripts/dev/smart-gogen.sh rename to scripts/dev/quickgogen.sh From 5a8ba19a7a039faf3d50d272ebfeb1bd749461ea Mon Sep 17 00:00:00 2001 From: Evan B Date: Wed, 4 Aug 2021 15:57:22 +0200 Subject: [PATCH 08/13] First attempt at quickgogen --- scripts/dev/quickgogen.sh | 65 ++++++++++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/scripts/dev/quickgogen.sh b/scripts/dev/quickgogen.sh index 152d3fe..73a075a 100755 --- a/scripts/dev/quickgogen.sh +++ b/scripts/dev/quickgogen.sh @@ -1,14 +1,65 @@ #!/usr/bin/env bash -# Usage: smart-gogen (runs gogen on directories of files touched since smart-branch) +# Usage: Runs gogen for all Go files that have changed between the current code and master. SCRIPT="$(python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "${BASH_SOURCE[0]}")" -source "$(dirname "$SCRIPT")/../../lib/git.sh" +source "$(dirname "$SCRIPT")/../../lib/common.sh" -marker_commit="$(git log --grep="^X-Smart-Branch-Parent: " --format="%H" --max-count=1)" -[[ $? == 0 ]] || die "Could not inspect git logs." -if [[ -z "$marker_commit" ]]; then - die 'Could not find a smart-branch commit. Please run `smart-rebase []` first.' +gitroot="$(git rev-parse --show-toplevel)" +[[ $? -eq 0 ]] || die "Current directory is not a git repository." + +if [[ -f "${gitroot}/go.mod" ]]; then + export GO111MODULE=on fi -git diff "$marker_commit" --name-only | xargs -n 1 dirname | sort -u | xargs gogen +# From https://stackoverflow.com/questions/28666357/git-how-to-get-default-branch#comment92366240_50056710 +main_branch="$(git remote show origin | grep "HEAD branch" | sed 's/.*: //')" +[[ -n "${main_branch}" ]] || die "Failed to get main branch" + +diffbase="$(git merge-base HEAD "origin/${main_branch}")" +[[ $? -eq 0 ]] || die "Failed to determine diffbase" + +generated_files="$(git -C "$gitroot" grep -l '^// Code generated by .* DO NOT EDIT\.' -- '*.go' | sed -e "s@^@${gitroot}/@")" + +IFS=$'\n' read -d '' -r -a changed_files < <( + { + git diff "$diffbase" --name-status . | + sed -n -E -e "s@^[AM][[:space:]]+|^R[^[:space:]]*[[:space:]]+[^[:space:]]+[[:space:]]+@${gitroot}/@p" ; + echo "$generated_files" ; echo "$generated_files" +} | sort | uniq -u) || true + +function private_gogen() { + local status=0 + local changed_files=("$@") + local gofiles + + IFS=$'\n' read -d '' -r -a gofiles < <( + printf '%s\n' "${changed_files[@]}" | + grep '\.go$' + ) + [[ "${#gofiles[@]}" == 0 ]] && return 0 + + IFS=$'\n' read -d '' -r -a godirs < <( + for f in "${gofiles[@]}"; do dirname "$f"; done | + sort | uniq) + + einfo "Running go generate..." + for dir in "${godirs[@]}"; do + einfo " Generating for ${dir}..." + ( cd "$dir" && go generate "./" ) && (( status == 0 )) + status=$? + done + + return "${status}" +} + +[[ "${#changed_files[@]}" -eq 0 ]] && { ewarn "No relevant changes found in current directory."; exit 0; } + +status=0 + +private_gogen "${changed_files[@]}" && (( status == 0 )) +status=$? + +[[ "${status}" -eq 0 ]] && exit 0 +efatal "An error occurred while generating files" +exit 1 \ No newline at end of file From fee046ebe577efd522de8d607f87f430dd4da15a Mon Sep 17 00:00:00 2001 From: Evan B Date: Wed, 4 Aug 2021 16:18:31 +0200 Subject: [PATCH 09/13] Change einfo to have ... prefix --- scripts/dev/quickgogen.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/dev/quickgogen.sh b/scripts/dev/quickgogen.sh index 73a075a..8ac6036 100755 --- a/scripts/dev/quickgogen.sh +++ b/scripts/dev/quickgogen.sh @@ -45,7 +45,7 @@ function private_gogen() { einfo "Running go generate..." for dir in "${godirs[@]}"; do - einfo " Generating for ${dir}..." + einfo "...Generating for ${dir}" ( cd "$dir" && go generate "./" ) && (( status == 0 )) status=$? done From bd6b9a8b8da7c83ed966a1fb08f3ed1fb27b8986 Mon Sep 17 00:00:00 2001 From: Evan B Date: Mon, 13 Sep 2021 15:32:39 +0200 Subject: [PATCH 10/13] Add new line to end of file, add path export for generate helpers --- scripts/dev/quickgogen.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/dev/quickgogen.sh b/scripts/dev/quickgogen.sh index 8ac6036..a9c7f8b 100755 --- a/scripts/dev/quickgogen.sh +++ b/scripts/dev/quickgogen.sh @@ -12,6 +12,9 @@ if [[ -f "${gitroot}/go.mod" ]]; then export GO111MODULE=on fi +# Various code generation helpers are expected to be in the PATH when called by go generate. +export PATH="$PATH:${gitroot}/tools/generate-helpers" + # From https://stackoverflow.com/questions/28666357/git-how-to-get-default-branch#comment92366240_50056710 main_branch="$(git remote show origin | grep "HEAD branch" | sed 's/.*: //')" [[ -n "${main_branch}" ]] || die "Failed to get main branch" @@ -62,4 +65,4 @@ status=$? [[ "${status}" -eq 0 ]] && exit 0 efatal "An error occurred while generating files" -exit 1 \ No newline at end of file +exit 1 From 47025979bab5510e2e95be05679e10d94fda078e Mon Sep 17 00:00:00 2001 From: Evan B Date: Mon, 13 Sep 2021 15:38:45 +0200 Subject: [PATCH 11/13] Convert each double space to tab --- scripts/dev/quickgogen.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/dev/quickgogen.sh b/scripts/dev/quickgogen.sh index a9c7f8b..c539c67 100755 --- a/scripts/dev/quickgogen.sh +++ b/scripts/dev/quickgogen.sh @@ -39,18 +39,18 @@ function private_gogen() { IFS=$'\n' read -d '' -r -a gofiles < <( printf '%s\n' "${changed_files[@]}" | grep '\.go$' - ) - [[ "${#gofiles[@]}" == 0 ]] && return 0 + ) + [[ "${#gofiles[@]}" == 0 ]] && return 0 - IFS=$'\n' read -d '' -r -a godirs < <( + IFS=$'\n' read -d '' -r -a godirs < <( for f in "${gofiles[@]}"; do dirname "$f"; done | - sort | uniq) + sort | uniq) einfo "Running go generate..." for dir in "${godirs[@]}"; do - einfo "...Generating for ${dir}" - ( cd "$dir" && go generate "./" ) && (( status == 0 )) - status=$? + einfo "...Generating for ${dir}" + ( cd "$dir" && go generate "./" ) && (( status == 0 )) + status=$? done return "${status}" From 3a15d1bd0ddb4c5b24b80d72cb7b0a88fa582148 Mon Sep 17 00:00:00 2001 From: Evan B Date: Mon, 13 Sep 2021 16:40:26 +0200 Subject: [PATCH 12/13] Try to increase code reuse - main_branch and diffbase added, quick_get_generated_files unclear - multiline output --- lib/git.sh | 26 ++++++++++++++++++++++++++ scripts/dev/quickgogen.sh | 10 +++------- scripts/dev/quickstyle.sh | 9 +++------ 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/git.sh b/lib/git.sh index 6de326c..18e0ec1 100644 --- a/lib/git.sh +++ b/lib/git.sh @@ -11,6 +11,22 @@ function get_current_branch() { echo "${ref#refs/heads/}" } +# Gets the main branch or dies. +function get_main_branch_or_die() { + # From https://stackoverflow.com/questions/28666357/git-how-to-get-default-branch#comment92366240_50056710 + local main_branch + main_branch="$(git remote show origin | grep "HEAD branch" | sed 's/.*: //')" + [[ -n "${main_branch}" ]] || die "Failed to get main branch" + echo "${main_branch}" +} + +# Gets the diffbase off of the remote's main branch or dies. +function get_diffbase_or_die() { + diffbase="$(git merge-base HEAD "origin/${main_branch}")" + [[ $? -eq 0 ]] || die "Failed to determine diffbase" + echo "${diffbase}" +} + function get_remote() { local remote remote="$(git config --get remote.origin.url)" @@ -67,3 +83,13 @@ function branch_exists() { local branch="$1" git show-ref --verify --quiet "refs/heads/$branch" } + +# TODO(do-not-merge): How return multi-line output properly? +# Requires $gitroot. +# Returns the list of .go file paths in $gitroot (with $gitroot prefix) +# that have a comment saying they are generated files. +function quick_get_generated_files { + echo "$(git -C "$gitroot" \ + grep -l '^// Code generated by .* DO NOT EDIT\.' -- '*.go' | \ + sed -e "s@^@${gitroot}/@")" +} \ No newline at end of file diff --git a/scripts/dev/quickgogen.sh b/scripts/dev/quickgogen.sh index c539c67..99a9914 100755 --- a/scripts/dev/quickgogen.sh +++ b/scripts/dev/quickgogen.sh @@ -4,6 +4,7 @@ SCRIPT="$(python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "${BASH_SOURCE[0]}")" source "$(dirname "$SCRIPT")/../../lib/common.sh" +source "$(dirname "$SCRIPT")/../../lib/git.sh" gitroot="$(git rev-parse --show-toplevel)" [[ $? -eq 0 ]] || die "Current directory is not a git repository." @@ -15,12 +16,8 @@ fi # Various code generation helpers are expected to be in the PATH when called by go generate. export PATH="$PATH:${gitroot}/tools/generate-helpers" -# From https://stackoverflow.com/questions/28666357/git-how-to-get-default-branch#comment92366240_50056710 -main_branch="$(git remote show origin | grep "HEAD branch" | sed 's/.*: //')" -[[ -n "${main_branch}" ]] || die "Failed to get main branch" - -diffbase="$(git merge-base HEAD "origin/${main_branch}")" -[[ $? -eq 0 ]] || die "Failed to determine diffbase" +main_branch="$(get_main_branch_or_die)" +diffbase="$(get_diffbase_or_die)" generated_files="$(git -C "$gitroot" grep -l '^// Code generated by .* DO NOT EDIT\.' -- '*.go' | sed -e "s@^@${gitroot}/@")" @@ -57,7 +54,6 @@ function private_gogen() { } [[ "${#changed_files[@]}" -eq 0 ]] && { ewarn "No relevant changes found in current directory."; exit 0; } - status=0 private_gogen "${changed_files[@]}" && (( status == 0 )) diff --git a/scripts/dev/quickstyle.sh b/scripts/dev/quickstyle.sh index 2313905..39192bd 100755 --- a/scripts/dev/quickstyle.sh +++ b/scripts/dev/quickstyle.sh @@ -8,6 +8,7 @@ SCRIPT="$(python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "${BASH_SOURCE[0]}")" source "$(dirname "$SCRIPT")/../../lib/common.sh" source "$(dirname "$SCRIPT")/../../setup/packages.sh" +source "$(dirname "$SCRIPT")/../../lib/git.sh" check_dependencies @@ -213,12 +214,8 @@ if [[ -f "${gitroot}/go.mod" ]]; then export GO111MODULE=on fi -# https://stackoverflow.com/a/44750379 -main_branch="$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')" -[[ -n "${main_branch}" ]] || die "Failed to get main branch" - -diffbase="$(git merge-base HEAD "origin/${main_branch}")" -[[ $? -eq 0 ]] || die "Failed to determine diffbase" +main_branch=$(get_main_branch_or_die) +diffbase=$(get_diffbase_or_die) generated_files="$(git -C "$gitroot" grep -l '^// Code generated by .* DO NOT EDIT\.' -- '*.go' | sed -e "s@^@${gitroot}/@")" From affd5e3a1e69e983d4505ee2877a185786da41c0 Mon Sep 17 00:00:00 2001 From: Evan B Date: Wed, 9 Feb 2022 14:27:21 +0100 Subject: [PATCH 13/13] Quote branch and diffbase names in variable substitution Co-authored-by: Viswajith Venugopal --- scripts/dev/quickstyle.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/dev/quickstyle.sh b/scripts/dev/quickstyle.sh index f7e18e5..b10b657 100755 --- a/scripts/dev/quickstyle.sh +++ b/scripts/dev/quickstyle.sh @@ -223,8 +223,8 @@ if [[ -f "${gitroot}/go.mod" ]]; then export GO111MODULE=on fi -main_branch=$(get_main_branch_or_die) -diffbase=$(get_diffbase_or_die) +main_branch="$(get_main_branch_or_die)" +diffbase="$(get_diffbase_or_die)" generated_files="$(git -C "$gitroot" grep -l '^// Code generated by .* DO NOT EDIT\.' -- '*.go' | sed -e "s@^@${gitroot}/@")"