From d48cbb82b1a44d646c6b12b6bfb13c5fd366e1ae Mon Sep 17 00:00:00 2001
From: Unnit Metaliya <unnitjmetaliya@gmail.com>
Date: Mon, 6 Feb 2023 06:07:40 -0500
Subject: [PATCH] feat(git)!: add `force-if-includes` flag (#11481)

Co-authored-by: Carlo Sala <carlosalag@protonmail.com>

Closes #11388

BREAKING CHANGE: `gpf` and `gpsupf` now have the `--force-if-includes` flag if git version is greater than 2.30. It will make force pushes more safer. See https://stackoverflow.com/questions/65837109/when-should-i-use-git-push-force-if-includes
---
 plugins/git/README.md      | 5 ++++-
 plugins/git/git.plugin.zsh | 8 ++++++--
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/plugins/git/README.md b/plugins/git/README.md
index d5eaaa53f..cd018d435 100644
--- a/plugins/git/README.md
+++ b/plugins/git/README.md
@@ -89,7 +89,8 @@ plugins=(... git)
 | ggsup                | git branch --set-upstream-to=origin/$(git_current_branch)                                                                                                                                |
 | ggu                  | git pull --rebase origin $(current_branch)                                                                                                                                               |
 | gpsup                | git push --set-upstream origin $(git_current_branch)                                                                                                                                     |
-| gpsupf                | git push --set-upstream origin $(git_current_branch) --force-with-lease                                                                                                                                     |
+| gpsupf               | git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes (git version >= 2.30)                                                                        |
+| gpsupf               | git push --set-upstream origin $(git_current_branch) --force-with-lease (git version < 2.30)                                                                                             |
 | ghh                  | git help                                                                                                                                                                                 |
 | gignore              | git update-index --assume-unchanged                                                                                                                                                      |
 | gignored             | git ls-files -v \| grep "^[[:lower:]]"                                                                                                                                                   |
@@ -120,6 +121,8 @@ plugins=(... git)
 | gp                   | git push                                                                                                                                                                                 |
 | gpd                  | git push --dry-run                                                                                                                                                                       |
 | gpf                  | git push --force-with-lease                                                                                                                                                              |
+| gpf                  | git push --force-with-lease --force-if-includes (git version >= 2.30)                                                                                                                    |
+| gpf                  | git push --force-with-lease (git version < 2.30)                                                                                                                                         |
 | gpf!                 | git push --force                                                                                                                                                                         |
 | gpoat                | git push origin --all && git push origin --tags                                                                                                                                          |
 | gpr                  | git pull --rebase                                                                                                                                                                        |
diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh
index fc2c08ccd..7541ccff2 100644
--- a/plugins/git/git.plugin.zsh
+++ b/plugins/git/git.plugin.zsh
@@ -199,7 +199,9 @@ alias ggpush='git push origin "$(git_current_branch)"'
 
 alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)'
 alias gpsup='git push --set-upstream origin $(git_current_branch)'
-alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease'
+is-at-least 2.30 "$git_version" \
+  && alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes' \
+  || alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease'
 
 alias ghh='git help'
 
@@ -235,7 +237,9 @@ alias gma='git merge --abort'
 
 alias gp='git push'
 alias gpd='git push --dry-run'
-alias gpf='git push --force-with-lease'
+is-at-least 2.30 "$git_version" \
+  && alias gpf='git push --force-with-lease --force-if-includes' \
+  || alias gpf='git push --force-with-lease'
 alias gpf!='git push --force'
 alias gpoat='git push origin --all && git push origin --tags'
 alias gpr='git pull --rebase'