-
Notifications
You must be signed in to change notification settings - Fork 4
/
git-bubbles.sh
executable file
·109 lines (93 loc) · 3.29 KB
/
git-bubbles.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
#!/usr/bin/env bash
set -e
#==============================================================================
# The MIT License
#
# Copyright (c) 2013-, Frédéric Menou
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#==============================================================================
function log {
git --no-pager log --oneline --decorate --graph "$@"
}
function find_pushable_head {
local pattern=$1
git log --oneline "HEAD@{u}.." | sed "/${pattern}/d" | head -1 | cut -d" " -f1
}
filter_pattern=$(git config bubbles.pattern || echo "--")
mine=$(git config bubbles.remote-name || echo "origin")
commit=$(find_pushable_head "$filter_pattern")
branch_name=$(git rev-parse --symbolic-full-name HEAD | sed 's-^refs/heads/--')
push_command="git push $mine $commit:$branch_name --force"
function print_log {
if [[ ! $(git rev-parse HEAD) =~ ^$commit ]]; then
log "${commit}..HEAD"
echo "--------------------------------------------------"
fi
log "HEAD@{u}..$commit"
}
function announce {
echo "$*"
"$@"
}
function print_status {
local command=$1
missing_branch=$(git rev-parse "$mine/$branch_name" >/dev/null 2>/dev/null || echo "1")
if [ "$missing_branch" == "1" ]; then
echo "Branch $branch_name not yet pushed on ${mine}. To create it:"
echo "git push $mine HEAD"
else
diff_stat=$(git diff --stat "$mine/$branch_name..$commit" 2>/dev/null | wc -c)
log_stat=$(git --no-pager log --oneline "$mine/$branch_name..$commit" 2>/dev/null | wc -l)
if [ "$diff_stat" != "0" ]; then
if [ "$command" == "execute" ]; then
$push_command
else
announce git diff -b -M "$mine/$branch_name..$commit" --stat
echo ""
echo "$push_command"
fi
elif [ "$log_stat" != "0" ]; then
echo "No diff but history diverged."
echo ""
if [ "$command" == "execute" ]; then
$push_command
else
echo "$push_command"
fi
else
echo "Nothing to push. We're good!"
fi
fi
}
if [ "$1" == "push" ]; then
print_status execute
elif [ "$1" == "diff" ]; then
shift 1
if [ "$diff_stat" != "0" ]; then
announce git diff -b -M "$mine/$branch_name..$commit" "$@"
fi
elif [ "$1" == "content" ]; then
shift 1
git diff --stat --patch -w -M "HEAD@{u}..$commit" "$@"
else
print_log
echo ""
print_status
fi