-
Notifications
You must be signed in to change notification settings - Fork 192
/
scm_breeze.sh
115 lines (105 loc) · 4.42 KB
/
scm_breeze.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# Detect shell
if [ -n "${ZSH_VERSION:-}" ]; then shell="zsh"; else shell="bash"; fi
# Detect whether zsh 'shwordsplit' option is on by default.
if [ $shell = "zsh" ]; then zsh_shwordsplit=$( (setopt | grep -q shwordsplit) && echo "true" ); fi
# Switch on/off shwordsplit for functions that require it.
zsh_compat(){ if [ $shell = "zsh" ] && [ -z $zsh_shwordsplit ]; then setopt shwordsplit; fi; }
zsh_reset(){ if [ $shell = "zsh" ] && [ -z $zsh_shwordsplit ]; then unsetopt shwordsplit; fi; }
# Enable/disable nullglob for zsh or bash
enable_nullglob() { if [ $shell = "zsh" ]; then setopt NULL_GLOB; else shopt -s nullglob; fi; }
disable_nullglob() { if [ $shell = "zsh" ]; then unsetopt NULL_GLOB; else shopt -u nullglob; fi; }
# Alias wrapper that ignores errors if alias is not defined.
_safe_alias(){ alias "$@" 2> /dev/null; }
_alias() {
if [ -n "$1" ]; then
local alias_str="$1"; local cmd="$2"
_safe_alias $alias_str="$cmd"
fi
}
# Quote the contents of "$@"
function token_quote {
# Older versions of {ba,z}sh don't support the built-in quoting, so fall back to printf %q
local quoted
quoted=() # Assign separately for zsh 5.0.2 of Ubuntu 14.04
for token; do
quoted+=( "$(printf '%q' "$token")" )
done
printf '%s\n' "${quoted[*]}"
# Keep this code for use when minimum versions of {ba,z}sh can be increased.
# See https://github.com/scmbreeze/scm_breeze/issues/260
#
# if [[ $shell = bash ]]; then
# # ${parameter@operator} where parameter is ${@} and operator is 'Q'
# # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
# eval "${@@Q}"
# else # zsh
# # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags
# eval "${(q-)@}"
# fi
}
# Quote "$@" before `eval` to prevent arbitrary code execution.
# Eg, the following will run `date`:
# evil() { eval "$@"; }; evil "echo" "foo;date"
function _safe_eval() {
eval $(token_quote "$@")
# Keep this code for use when minimum versions of {ba,z}sh can be increased.
# See https://github.com/scmbreeze/scm_breeze/issues/260
#
# if [[ $shell = bash ]]; then
# # ${parameter@operator} where parameter is ${@} and operator is 'Q'
# # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
# eval "${@@Q}"
# else # zsh
# # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags
# eval "${(q-)@}"
# fi
}
find_binary(){
if [ $shell = "zsh" ]; then
builtin type -p "$1" | sed "s/$1 is //" | head -1
else
builtin type -P "$1"
fi
}
export GIT_BINARY=$(find_binary git)
# Updates SCM Breeze from GitHub.
update_scm_breeze() {
currDir=$PWD
cd "$scmbDir"
oldHEAD=$(git rev-parse HEAD 2> /dev/null)
git pull origin master
# Reload latest version of '_create_or_patch_scmbrc' function
source "$scmbDir/lib/scm_breeze.sh"
_create_or_patch_scmbrc $oldHEAD
# Reload SCM Breeze
source "$scmbDir/scm_breeze.sh"
cd "$currDir"
}
# Create '~/.*.scmbrc' files, or attempt to patch them if passed a previous revision
_create_or_patch_scmbrc() {
patchfile=$(mktemp -t tmp.XXXXXXXXXX)
# Process '~/.scmbrc' and '~/.*.scmbrc'
for prefix in "" "git."; do
# Create file from example if it doesn't already exist
if ! [ -e "$HOME/.$prefix""scmbrc" ]; then
cp "$scmbDir/$prefix""scmbrc.example" "$HOME/.$prefix""scmbrc"
printf "== '~/.$prefix""scmbrc' has been created. Please edit this file to change SCM Breeze settings.\n"
# If file exists, attempt to update it with any new settings
elif [ -n "$1" ]; then
# Create diff of example file, substituting example file for user's config.
git diff $1 "$prefix""scmbrc.example" | sed "s/$prefix""scmbrc.example/.$prefix""scmbrc/g" >| $patchfile
if [ -s $patchfile ]; then # If patchfile is not empty
cd "$HOME"
# If the patch cannot be applied cleanly, show the updates and tell user to update file manually.
if ! patch -f "$HOME/.$prefix""scmbrc" $patchfile; then
printf "== \033[0;31mUpdates could not be applied to '\033[1m~/.$prefix""scmbrc\033[0;31m'.\033[0m\n"
printf "== Please look at the following changes and manually update '~/.$prefix""scmbrc', if necessary.\n\n"
cat "$HOME/.$prefix""scmbrc.rej"
fi
cd "$scmbDir"
fi
fi
done
}
# Update ~/.scmbrc, ~/.git.scmbrc, etc. from latest commit
alias update_scmbrc_from_latest_commit="_create_or_patch_scmbrc HEAD~"