summaryrefslogtreecommitdiff
path: root/plugins/git-auto-fetch
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/git-auto-fetch')
-rw-r--r--plugins/git-auto-fetch/README.md31
-rw-r--r--plugins/git-auto-fetch/git-auto-fetch.plugin.zsh36
2 files changed, 67 insertions, 0 deletions
diff --git a/plugins/git-auto-fetch/README.md b/plugins/git-auto-fetch/README.md
new file mode 100644
index 000000000..35f3c2f71
--- /dev/null
+++ b/plugins/git-auto-fetch/README.md
@@ -0,0 +1,31 @@
+# Git auto-fetch
+
+Automatically fetches all changes from all remotes while you are working in git-initialized directory.
+
+#### Usage
+
+Add `git-auto-fetch` to the plugins array in your zshrc file:
+
+```shell
+plugins=(... git-auto-fetch)
+```
+
+Every time you launch a command in your shell all remotes will be fetched in background.
+By default autofetch will be triggered only if last fetch was done at least 60 seconds ago.
+You can change fetch interval in your .zshrc:
+```
+GIT_AUTO_FETCH_INTERVAL=1200 #in seconds
+```
+Log of `git fetch --all` will be saved into `.git/FETCH_LOG`
+
+
+#### Toggle auto fetch per folder
+If you are using mobile connection or for any other reason you can disable git-auto-fetch for any folder:
+
+```shell
+$ cd to/your/project
+$ git-auto-fetch
+disabled
+$ git-auto-fetch
+enabled
+```
diff --git a/plugins/git-auto-fetch/git-auto-fetch.plugin.zsh b/plugins/git-auto-fetch/git-auto-fetch.plugin.zsh
new file mode 100644
index 000000000..5c42c21a7
--- /dev/null
+++ b/plugins/git-auto-fetch/git-auto-fetch.plugin.zsh
@@ -0,0 +1,36 @@
+GIT_AUTO_FETCH_INTERVAL=${GIT_AUTO_FETCH_INTERVAL:=60}
+
+function git-fetch-all {
+ (`command git rev-parse --is-inside-work-tree 2>/dev/null` &&
+ dir=`command git rev-parse --git-dir` &&
+ [[ ! -f $dir/NO_AUTO_FETCH ]] &&
+ (( `date +%s` - `date -r $dir/FETCH_LOG +%s 2>/dev/null || echo 0` > $GIT_AUTO_FETCH_INTERVAL )) &&
+ GIT_SSH_COMMAND="command ssh -o BatchMode=yes" \
+ command git fetch --all 2>/dev/null &>! $dir/FETCH_LOG &)
+}
+
+function git-auto-fetch {
+ `command git rev-parse --is-inside-work-tree 2>/dev/null` || return
+ guard="`command git rev-parse --git-dir`/NO_AUTO_FETCH"
+
+ (rm $guard 2>/dev/null &&
+ echo "${fg_bold[green]}enabled${reset_color}") ||
+ (touch $guard &&
+ echo "${fg_bold[red]}disabled${reset_color}")
+}
+
+# Override zle-line-init if it exists
+if (( $+functions[zle-line-init] )); then
+ eval "override-git-auto-fetch-$(declare -f zle-line-init)"
+
+ function zle-line-init () {
+ git-fetch-all
+ override-git-auto-fetch-zle-line-init
+ }
+else
+ function zle-line-init () {
+ git-fetch-all
+ }
+fi
+
+zle -N zle-line-init