git-scripts 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +0 -15
- data/bin/feature +70 -15
- data/bin/hotfix +78 -23
- data/completion/_feature +38 -0
- data/completion/_hotfix +28 -0
- data/{bash_completion.sh → completion/bash_completion.sh} +2 -2
- data/lib/git.rb +59 -13
- data/lib/github.rb +15 -9
- data/lib/helpers.rb +20 -11
- data/man/feature-finish-issue.1 +22 -0
- data/man/feature-finish-issue.1.ronn +26 -0
- data/man/feature-finish.1 +4 -4
- data/man/feature-finish.1.html +7 -12
- data/man/feature-finish.1.ronn +6 -5
- data/man/feature-list.1 +8 -2
- data/man/feature-list.1.html +11 -9
- data/man/feature-list.1.ronn +6 -1
- data/man/feature-merge.1.html +4 -9
- data/man/feature-switch.1 +3 -3
- data/man/feature-switch.1.html +6 -10
- data/man/feature-switch.1.ronn +3 -1
- data/man/{feature-github-test.1.html → feature-url.1.html} +9 -15
- data/man/feature.1.html +3 -7
- data/man/hotfix-finish-issue.1 +22 -0
- data/man/hotfix-finish-issue.1.ronn +26 -0
- data/man/hotfix-finish.1 +2 -2
- data/man/hotfix-finish.1.ronn +1 -1
- data/man/hotfix-list.1 +8 -2
- data/man/hotfix-list.1.html +11 -9
- data/man/hotfix-list.1.ronn +6 -1
- data/man/hotfix-merge.1.html +4 -9
- data/man/hotfix-switch.1 +3 -3
- data/man/hotfix-switch.1.ronn +3 -1
- data/man/{hotfix-start.1.html → hotfix-url.1.html} +9 -15
- data/man/hotfix.1.html +2 -7
- metadata +13 -28
- data/man/feature-clean.1.html +0 -120
- data/man/feature-clean.1.markdown +0 -58
- data/man/feature-finish.1.markdown +0 -52
- data/man/feature-github-test.1.markdown +0 -50
- data/man/feature-list.1.markdown +0 -51
- data/man/feature-merge.1.markdown +0 -55
- data/man/feature-start.1.html +0 -110
- data/man/feature-start.1.markdown +0 -50
- data/man/feature-stashes.1.html +0 -122
- data/man/feature-stashes.1.markdown +0 -60
- data/man/feature-status.1.html +0 -113
- data/man/feature-status.1.markdown +0 -53
- data/man/feature-switch.1.markdown +0 -56
- data/man/feature.1.markdown +0 -75
- data/man/feature.html +0 -140
- data/man/hotfix-finish.1.html +0 -112
- data/man/hotfix-finish.1.markdown +0 -52
- data/man/hotfix-list.1.markdown +0 -51
- data/man/hotfix-merge.1.markdown +0 -55
- data/man/hotfix-start.1.markdown +0 -50
- data/man/hotfix-switch.1.html +0 -110
- data/man/hotfix-switch.1.markdown +0 -50
- data/man/hotfix.1.markdown +0 -65
data/README.md
CHANGED
@@ -124,18 +124,3 @@ Merges the hotfix branch back into `stable` with `--no-ff`. Also does a
|
|
124
124
|
merge back into `master`.
|
125
125
|
|
126
126
|
[gitflow]: http://nvie.com/posts/a-successful-git-branching-model/
|
127
|
-
|
128
|
-
## Hacking
|
129
|
-
|
130
|
-
We (obviously) use the same method on this repo as the tools contained within
|
131
|
-
encourage. Unfortunately, `feature finish` will create a pull request within
|
132
|
-
your own forked repo. Thus, if you do not have write privileges to this
|
133
|
-
repository, you have to create the pull request manually - bummer.
|
134
|
-
|
135
|
-
Please include any necessary changes to the documentation. The man files are
|
136
|
-
written in [ronn], so the only manual change you need make are to the
|
137
|
-
man/*.ronn files. After you've done that, run `rake man` to generate the HTML
|
138
|
-
and roff files.
|
139
|
-
|
140
|
-
[ronn]: http://rtomayko.github.io/ronn/ronn-format.7.html
|
141
|
-
|
data/bin/feature
CHANGED
@@ -8,6 +8,12 @@ command=ARGV.first
|
|
8
8
|
|
9
9
|
$0 = ARGV.join(" ")
|
10
10
|
|
11
|
+
unless command == '--help' or command == '-h'
|
12
|
+
unless Git::in_a_repo
|
13
|
+
die("\nSwitch to a git repo. If you need help, use --help or -h.")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
11
17
|
case command
|
12
18
|
when 'github-test'
|
13
19
|
octokit = Github::api
|
@@ -99,20 +105,70 @@ when 'finish'
|
|
99
105
|
puts "Successfully created pull-request ##{response[:number]}"
|
100
106
|
puts " " + response[:html_url]
|
101
107
|
|
108
|
+
when 'finish-issue'
|
109
|
+
require_argument(:feature, :'finish-issue')
|
110
|
+
issue = ARGV[1]
|
111
|
+
feature = Git::current_branch
|
112
|
+
# Push commits to origin
|
113
|
+
Git::run_safe(["git push origin #{feature}:#{feature}"])
|
114
|
+
|
115
|
+
exit 1 unless confirm("Convert issue ##{issue} into a pull-request using " +
|
116
|
+
"feature branch named '#{feature}' ?")
|
117
|
+
octokit = Github::api
|
118
|
+
|
119
|
+
pull = octokit.create_pull_request_for_issue(
|
120
|
+
Github::get_github_repo,
|
121
|
+
Git::development_branch,
|
122
|
+
feature,
|
123
|
+
issue
|
124
|
+
)
|
125
|
+
|
126
|
+
# We've converted the issue to a pull request, now lets change the
|
127
|
+
# description to include the last commit message and prompt the user to
|
128
|
+
# confirm it.
|
129
|
+
|
130
|
+
last_commit_message = Git::commit_message(feature)
|
131
|
+
|
132
|
+
original_title = pull[:title].gsub("\r","")
|
133
|
+
original_body = pull[:body].gsub("\r","")
|
134
|
+
|
135
|
+
initial_message = <<-MESSAGE
|
136
|
+
#{last_commit_message}
|
137
|
+
|
138
|
+
----
|
139
|
+
|
140
|
+
Original issue: #{original_title}
|
141
|
+
----
|
142
|
+
|
143
|
+
#{original_body}
|
144
|
+
MESSAGE
|
145
|
+
|
146
|
+
description = Github::open_title_body_editor(initial_message)
|
147
|
+
|
148
|
+
updated_pull = octokit.update_pull_request(
|
149
|
+
Github::get_github_repo,
|
150
|
+
issue,
|
151
|
+
description[:title],
|
152
|
+
description[:body]
|
153
|
+
)
|
154
|
+
|
155
|
+
puts "Successfully converted issue ##{issue} to a pull-request"
|
156
|
+
puts " " + updated_pull[:html_url]
|
157
|
+
|
102
158
|
when 'merge'
|
103
159
|
dev_branch = Git::development_branch
|
104
160
|
fail_on_local_changes
|
105
161
|
|
106
|
-
Git::run_safe(["git fetch"])
|
107
|
-
|
108
162
|
feature = ARGV[1] || Git::current_branch
|
109
163
|
|
110
164
|
exit 1 unless confirm("Merge feature branch named: '#{feature}' ?")
|
111
165
|
|
112
166
|
description = Github::get_pull_request_description_from_api(feature, dev_branch)
|
167
|
+
update = Git::submodules_update("get")
|
113
168
|
|
114
|
-
# Checkout the branch first to make sure we have it locally.
|
115
169
|
Git::run_safe([
|
170
|
+
"git fetch",
|
171
|
+
# Checkout the branch first to make sure we have it locally.
|
116
172
|
"git checkout \"#{feature}\"",
|
117
173
|
"git rebase --preserve-merges origin/#{feature}",
|
118
174
|
# pull the latest changes from master
|
@@ -121,19 +177,12 @@ when 'merge'
|
|
121
177
|
"git rebase --preserve-merges origin/#{dev_branch}",
|
122
178
|
# merge the feature branch into master
|
123
179
|
"git merge --no-ff --edit -m #{description.shellescape} \"#{feature}\"",
|
180
|
+
# init any submodules in the master branch
|
181
|
+
"#{update}",
|
182
|
+
# delete the local feature-branch
|
183
|
+
"git branch -d \"#{feature}\""
|
124
184
|
])
|
125
185
|
|
126
|
-
# init any submodules in the master branch
|
127
|
-
Git::submodules_update
|
128
|
-
|
129
|
-
# delete the local feature-branch
|
130
|
-
Git::run_safe(["git branch -d \"#{feature}\""])
|
131
|
-
|
132
|
-
# delete the remote branch we'll leave this off for now
|
133
|
-
# Git::run_safe("git push origin :\"#{feature}\"")
|
134
|
-
# push the the merge to our origin
|
135
|
-
# Git::run_safe("git push origin")
|
136
|
-
|
137
186
|
puts
|
138
187
|
puts "Successfully merged feature-branch: #{feature} into #{dev_branch}"
|
139
188
|
puts "If you are satisfied with the result, do this:\n" + <<CMDS
|
@@ -141,9 +190,15 @@ when 'merge'
|
|
141
190
|
CMDS
|
142
191
|
|
143
192
|
when 'switch'
|
144
|
-
|
193
|
+
|
194
|
+
require_argument(:feature, :switch, min=2, max=4)
|
195
|
+
|
145
196
|
feature = ARGV[1]
|
146
197
|
|
198
|
+
if ARGV[1] == '-n'
|
199
|
+
feature = get_branch_name_from_number(ARGV[2])
|
200
|
+
end
|
201
|
+
|
147
202
|
Git::switch_branch(feature)
|
148
203
|
|
149
204
|
when 'prune'
|
data/bin/hotfix
CHANGED
@@ -8,6 +8,12 @@ command=ARGV.first
|
|
8
8
|
|
9
9
|
$0 = ARGV.join(" ")
|
10
10
|
|
11
|
+
unless command == '--help' or command == '-h'
|
12
|
+
unless Git::in_a_repo
|
13
|
+
die("\nSwitch to a git repo. If you need help, use --help or -h.")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
11
17
|
case command
|
12
18
|
when 'start'
|
13
19
|
require_argument(:hotfix, :start)
|
@@ -63,6 +69,57 @@ when 'finish'
|
|
63
69
|
puts "Successfully created pull-request ##{response[:number]}"
|
64
70
|
puts " " + response[:html_url]
|
65
71
|
|
72
|
+
when 'finish-issue'
|
73
|
+
require_argument(:hotfix, :'finish-issue')
|
74
|
+
issue = ARGV[1]
|
75
|
+
hotfix = Git::current_branch
|
76
|
+
|
77
|
+
# Push commits to origin
|
78
|
+
Git::run_safe(["git push origin #{hotfix}:#{hotfix}"])
|
79
|
+
|
80
|
+
exit 1 unless confirm("Convert issue ##{issue} into a pull-request using " +
|
81
|
+
"hotfix branch named '#{hotfix}' ?")
|
82
|
+
octokit = Github::api
|
83
|
+
|
84
|
+
pull = octokit.create_pull_request_for_issue(
|
85
|
+
Github::get_github_repo,
|
86
|
+
'stable',
|
87
|
+
hotfix,
|
88
|
+
issue
|
89
|
+
)
|
90
|
+
|
91
|
+
# We've converted the issue to a pull request, now lets change the
|
92
|
+
# description to include the last commit message and prompt the user to
|
93
|
+
# confirm it.
|
94
|
+
|
95
|
+
last_commit_message = Git::commit_message(hotfix)
|
96
|
+
|
97
|
+
original_title = pull[:title].gsub("\r","")
|
98
|
+
original_body = pull[:body].gsub("\r","")
|
99
|
+
|
100
|
+
initial_message = <<-MESSAGE
|
101
|
+
#{last_commit_message}
|
102
|
+
|
103
|
+
----
|
104
|
+
|
105
|
+
Original issue: #{original_title}
|
106
|
+
----
|
107
|
+
|
108
|
+
#{original_body}
|
109
|
+
MESSAGE
|
110
|
+
|
111
|
+
description = Github::open_title_body_editor(initial_message)
|
112
|
+
|
113
|
+
updated_pull = octokit.update_pull_request(
|
114
|
+
Github::get_github_repo,
|
115
|
+
issue,
|
116
|
+
description[:title],
|
117
|
+
description[:body]
|
118
|
+
)
|
119
|
+
|
120
|
+
puts "Successfully converted issue ##{issue} to a pull-request"
|
121
|
+
puts " " + updated_pull[:html_url]
|
122
|
+
|
66
123
|
when 'merge'
|
67
124
|
fail_on_local_changes
|
68
125
|
dev_branch = Git::development_branch
|
@@ -73,40 +130,38 @@ when 'merge'
|
|
73
130
|
exit 1 unless confirm("Merge hotfix named: '#{hotfix}' ?")
|
74
131
|
|
75
132
|
description = Github::get_pull_request_description_from_api(hotfix, 'stable')
|
76
|
-
|
77
|
-
|
133
|
+
|
134
|
+
commit_message = Git::get_description_from_user(description)
|
135
|
+
# The first instance of stable should be in the pull request title.
|
136
|
+
dev_commit_message = commit_message.sub('stable', dev_branch)
|
137
|
+
|
138
|
+
# Get command to init any submodules in the stable branch.
|
78
139
|
update = Git::submodules_update("get")
|
79
140
|
|
80
141
|
Git::run_safe([
|
81
142
|
# Checkout the branch to make sure we have it locally.
|
82
|
-
"git checkout
|
83
|
-
"git rebase --preserve-merges origin/#{hotfix}",
|
84
|
-
# Merge into stable
|
143
|
+
"git checkout #{hotfix.shellescape}",
|
144
|
+
"git rebase --preserve-merges origin/#{hotfix.shellescape}",
|
145
|
+
# Merge into stable.
|
85
146
|
"git checkout stable",
|
86
|
-
#
|
147
|
+
# Pull the latest changes and rebase the unpushed commits if any.
|
87
148
|
"git rebase --preserve-merges origin/stable",
|
88
|
-
#
|
89
|
-
"git merge --no-ff --edit -m #{
|
149
|
+
# Merge the hotfix branch into stable.
|
150
|
+
"git merge --no-ff --no-edit -m #{commit_message.shellescape} #{hotfix.shellescape}",
|
90
151
|
"#{update}",
|
91
|
-
#
|
92
|
-
# Git::run_safe("git push origin")
|
93
|
-
# Merge into master
|
152
|
+
# Merge into master.
|
94
153
|
"git checkout #{dev_branch}",
|
95
|
-
#
|
154
|
+
# Pull the latest changes and rebase the unpushed master commits if any.
|
96
155
|
"git rebase origin/#{dev_branch}",
|
97
|
-
#
|
98
|
-
"git merge --no-ff --edit -m #{
|
99
|
-
#
|
156
|
+
# Merge the hotfix branch into master.
|
157
|
+
"git merge --no-ff --no-edit -m #{dev_commit_message.shellescape} #{hotfix.shellescape}",
|
158
|
+
# Init any submodules in the master branch. Note: no need to change
|
100
159
|
# directories before calling git submodule since we are already in the
|
101
|
-
# projects top-level directory
|
160
|
+
# projects top-level directory.
|
102
161
|
"#{update}",
|
103
|
-
#
|
104
|
-
|
105
|
-
#
|
106
|
-
"git branch -d \"#{hotfix}\"",
|
107
|
-
# delete the remote hotfix branch -- we'll leave this off for now
|
108
|
-
# Git::run_safe("git push origin :\"#{hotfix}\"")
|
109
|
-
# checkout stable branch
|
162
|
+
# Delete the local hotfix branch.
|
163
|
+
"git branch -d #{hotfix.shellescape}",
|
164
|
+
# Checkout stable branch.
|
110
165
|
"git checkout stable"
|
111
166
|
])
|
112
167
|
|
data/completion/_feature
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#compdef feature
|
2
|
+
|
3
|
+
_feature() {
|
4
|
+
local curcontext="$curcontext" state line
|
5
|
+
typeset -A opt_args
|
6
|
+
|
7
|
+
_arguments \
|
8
|
+
'1: :->commands'\
|
9
|
+
'2: :->params'\
|
10
|
+
'3: :->choice'
|
11
|
+
|
12
|
+
case $state in
|
13
|
+
commands)
|
14
|
+
_arguments '1:Commands:(list start switch finish finish-issue merge pull prune status stashes clean github-test)'
|
15
|
+
;;
|
16
|
+
params)
|
17
|
+
if [[ "$words[2]" == "prune" ]]; then
|
18
|
+
_arguments '2:Location:(local origin)'
|
19
|
+
fi
|
20
|
+
if [[ "$words[2]" == "switch" ||
|
21
|
+
"$words[2]" == "merge" ||
|
22
|
+
"$words[2]" == "finish" ]]; then
|
23
|
+
local -a featureBranches args
|
24
|
+
featureBranches="$(git branch -a | tr -d ' *' | grep -v 'hotfix-' | sed 's|remotes/origin/||')"
|
25
|
+
args="$(echo ${featureBranches} | tr "\$\'\\n\'" " ")"
|
26
|
+
_arguments '2:Branches:($(echo ${args}))'
|
27
|
+
fi
|
28
|
+
;;
|
29
|
+
choice)
|
30
|
+
if [[ "$words[3]" == "local" || "$words[3]" == "origin" ]]; then
|
31
|
+
_arguments '3:Commands:(preview clean)'
|
32
|
+
fi
|
33
|
+
;;
|
34
|
+
*)
|
35
|
+
esac
|
36
|
+
}
|
37
|
+
|
38
|
+
_feature "$@"
|
data/completion/_hotfix
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#compdef hotfix
|
2
|
+
|
3
|
+
_hotfix() {
|
4
|
+
local curcontext="$curcontext" state line
|
5
|
+
typeset -A opt_args
|
6
|
+
|
7
|
+
_arguments \
|
8
|
+
'1: :->commands'\
|
9
|
+
'2: :->params'
|
10
|
+
case $state in
|
11
|
+
commands)
|
12
|
+
_arguments '1:Commands:(list start switch finish finish-issue merge)'
|
13
|
+
;;
|
14
|
+
params)
|
15
|
+
if [[ "$words[2]" != 'list' ||
|
16
|
+
"$words[2]" != 'finish-issue' ]]; then
|
17
|
+
local -a hotfixBranches args
|
18
|
+
hotfixBranches="$(git branch -a | tr -d ' *' | grep 'hotfix-' | sed -e 's|remotes/origin/||' -e 's|hotfix-||')"
|
19
|
+
|
20
|
+
args="$(echo ${hotfixBranches} | tr "\$\'\\n\'" " ")"
|
21
|
+
_arguments '2:Branches:($(echo ${args}))'
|
22
|
+
fi
|
23
|
+
;;
|
24
|
+
*)
|
25
|
+
esac
|
26
|
+
}
|
27
|
+
|
28
|
+
_hotfix "$@"
|
@@ -10,7 +10,7 @@ _git-scripts()
|
|
10
10
|
case "$cmd" in
|
11
11
|
feature)
|
12
12
|
if [ "$line" = "$cmd $cur" ]; then
|
13
|
-
words="switch start finish stashes list merge pull status clean"
|
13
|
+
words="switch start finish finish-issue stashes list merge pull status clean prune"
|
14
14
|
else
|
15
15
|
# get branch names minus hotfixes
|
16
16
|
words="$(git branch -a | tr -d ' *' | grep -v 'hotfix-' | sed 's|remotes/origin/||')"
|
@@ -18,7 +18,7 @@ _git-scripts()
|
|
18
18
|
;;
|
19
19
|
hotfix)
|
20
20
|
if [ "$line" = "$cmd $cur" ]; then
|
21
|
-
words="switch start finish merge list clean"
|
21
|
+
words="switch start finish finish-issue merge list clean"
|
22
22
|
else
|
23
23
|
# get hotfix branch names
|
24
24
|
words="$(git branch -a | tr -d ' *' | grep 'hotfix-' | sed -e 's|remotes/origin/||' -e 's|hotfix-||')"
|
data/lib/git.rb
CHANGED
@@ -4,18 +4,57 @@ module Git
|
|
4
4
|
return !clean
|
5
5
|
end
|
6
6
|
|
7
|
+
def self.in_a_repo
|
8
|
+
return system("git rev-parse")
|
9
|
+
end
|
10
|
+
|
7
11
|
# Return the development branch specified by the
|
8
12
|
# feature.development-branch git config value
|
9
13
|
def self.development_branch
|
10
14
|
dev_branch = `git config feature.development-branch`.strip
|
11
15
|
if !dev_branch || $? != 0
|
12
|
-
|
13
|
-
|
14
|
-
exit 1;
|
16
|
+
die("No development branch specified; set it with: " +
|
17
|
+
"git config feature.development-branch master")
|
15
18
|
end
|
16
19
|
dev_branch
|
17
20
|
end
|
18
21
|
|
22
|
+
# Returns the editor specified in the user's gitconfig.
|
23
|
+
def self.editor
|
24
|
+
editor = `git var GIT_EDITOR`.strip
|
25
|
+
unless editor
|
26
|
+
abort "Configure an editor for git:\n" +
|
27
|
+
"git config --global core.editor vim"
|
28
|
+
end
|
29
|
+
return editor
|
30
|
+
end
|
31
|
+
|
32
|
+
# Starts an editor with a file. Returns a string with the contents of that
|
33
|
+
# file.
|
34
|
+
def self.get_description_from_user(initial_message = '')
|
35
|
+
require 'tempfile'
|
36
|
+
editor = self::editor
|
37
|
+
|
38
|
+
file = Tempfile.new('merge-msg')
|
39
|
+
file.print(initial_message)
|
40
|
+
file.flush
|
41
|
+
|
42
|
+
if editor == 'vim'
|
43
|
+
params = "'+set ft=gitcommit' '+set textwidth=72'" +
|
44
|
+
" '+setlocal spell spelllang=en_us'"
|
45
|
+
else
|
46
|
+
params = ''
|
47
|
+
end
|
48
|
+
pid = spawn("#{editor} #{params} #{file.path}")
|
49
|
+
Process.wait pid
|
50
|
+
|
51
|
+
file.rewind
|
52
|
+
commit = file.read
|
53
|
+
file.unlink
|
54
|
+
|
55
|
+
return commit
|
56
|
+
end
|
57
|
+
|
19
58
|
# Returns an array of branches that aren't merged into the specified branch
|
20
59
|
def self.branches_not_merged_into(branch)
|
21
60
|
self::all_branches - self::merged_branches(branch)
|
@@ -27,6 +66,8 @@ module Git
|
|
27
66
|
self.branches_not_merged_into('stable')
|
28
67
|
elsif type == :merged
|
29
68
|
self.merged_branches('stable')
|
69
|
+
else
|
70
|
+
raise ArgumentError, 'Must specify :merged or :unmerged in hotfix_branches.'
|
30
71
|
end
|
31
72
|
|
32
73
|
branches.select {|branch| branch.include?('hotfix-') }
|
@@ -34,10 +75,14 @@ module Git
|
|
34
75
|
|
35
76
|
# Returns an array of unmerged feature branches
|
36
77
|
def self.feature_branches(type)
|
78
|
+
devBranch = development_branch()
|
79
|
+
|
37
80
|
branches = if type == :unmerged
|
38
|
-
self.branches_not_merged_into(
|
81
|
+
self.branches_not_merged_into(devBranch)
|
39
82
|
elsif type == :merged
|
40
|
-
self.merged_branches(
|
83
|
+
self.merged_branches(devBranch)
|
84
|
+
else
|
85
|
+
raise ArgumentError, 'Must specify :merged or :unmerged in feature_branches.'
|
41
86
|
end
|
42
87
|
|
43
88
|
branches.reject {|branch| branch.include?('hotfix-') }
|
@@ -88,12 +133,12 @@ module Git
|
|
88
133
|
while command = commands.shift
|
89
134
|
puts "> " + command
|
90
135
|
unless system(command)
|
91
|
-
puts "\
|
92
|
-
puts "\tWould have run:"
|
93
|
-
commands.each do |
|
94
|
-
puts "\t" +
|
95
|
-
exit
|
136
|
+
puts highlight("\n\tERROR: failed on \`#{command}\`.")
|
137
|
+
puts "\n\tWould have run:"
|
138
|
+
commands.each do |command|
|
139
|
+
puts "\t# " + command
|
96
140
|
end
|
141
|
+
abort
|
97
142
|
end
|
98
143
|
end
|
99
144
|
end
|
@@ -163,7 +208,7 @@ module Git
|
|
163
208
|
##
|
164
209
|
# Switch to the specified branch.
|
165
210
|
# Because we use submodules, we have to check for updates to those
|
166
|
-
# submodules when we checkout a branch
|
211
|
+
# submodules when we checkout a branch.
|
167
212
|
#
|
168
213
|
# args: --clean - remove every unstaged file, including non-existant
|
169
214
|
# submodules
|
@@ -177,9 +222,10 @@ module Git
|
|
177
222
|
end
|
178
223
|
|
179
224
|
##
|
180
|
-
# Update / initialize submodules from the TLD
|
225
|
+
# Update / initialize submodules from the TLD or return the command that
|
226
|
+
# would do so as a string.
|
181
227
|
#
|
182
|
-
def self.submodules_update(mode =
|
228
|
+
def self.submodules_update(mode = "")
|
183
229
|
# capture only the path, not the newline
|
184
230
|
basedir = `git rev-parse --show-toplevel`.split("\n").first
|
185
231
|
command = "cd #{basedir} && git submodule --quiet update --init --recursive"
|
data/lib/github.rb
CHANGED
@@ -78,8 +78,7 @@ module Github
|
|
78
78
|
system("git config --global github.token #{auth[:token]}")
|
79
79
|
|
80
80
|
unless success
|
81
|
-
|
82
|
-
exit
|
81
|
+
die("Couldn't set git config")
|
83
82
|
end
|
84
83
|
|
85
84
|
return {:login => username, :oauth_token => auth[:token]}
|
@@ -108,8 +107,6 @@ module Github
|
|
108
107
|
# Returns a hash containing a :title and :body
|
109
108
|
##
|
110
109
|
def self.get_pull_request_description(branch_name = nil)
|
111
|
-
require 'tempfile'
|
112
|
-
|
113
110
|
if branch_name
|
114
111
|
initial_message = Git::commit_message(branch_name).gsub("\r","")
|
115
112
|
else
|
@@ -120,8 +117,20 @@ Body of pull-request
|
|
120
117
|
MESSAGE
|
121
118
|
end
|
122
119
|
|
120
|
+
return self::open_title_body_editor(initial_message)
|
121
|
+
end
|
122
|
+
|
123
|
+
##
|
124
|
+
# Prompts the user (using $EDITOR) to confirm the title and body
|
125
|
+
# in the provided message.
|
126
|
+
#
|
127
|
+
# Returns a hash containing a :title and :body
|
128
|
+
##
|
129
|
+
def self.open_title_body_editor(message)
|
130
|
+
require 'tempfile'
|
131
|
+
|
123
132
|
msg = Tempfile.new('pull-message')
|
124
|
-
msg.write(
|
133
|
+
msg.write(message)
|
125
134
|
msg.close
|
126
135
|
|
127
136
|
# -c blah only works for vim
|
@@ -181,10 +190,7 @@ class OctokitWrapper
|
|
181
190
|
begin
|
182
191
|
return @client.send(meth,*args)
|
183
192
|
rescue Octokit::Error => e
|
184
|
-
|
185
|
-
$stderr.puts "Github API Error"
|
186
|
-
$stderr.puts e
|
187
|
-
exit(1)
|
193
|
+
die("=" * 80 + "\nGithub API Error\n" + e.to_s)
|
188
194
|
end
|
189
195
|
end
|
190
196
|
end
|
data/lib/helpers.rb
CHANGED
@@ -12,10 +12,11 @@ def display_feature_help(command = nil, message = nil)
|
|
12
12
|
display_help(
|
13
13
|
:script_name => "Git Feature Branch Helper",
|
14
14
|
:commands => {
|
15
|
-
:list => "feature list",
|
15
|
+
:list => "feature list [-v]",
|
16
16
|
:start => "feature start name-of-feature",
|
17
|
-
:switch => "feature switch name-of-feature [--clean]",
|
18
|
-
:finish => "feature finish name-of-feature",
|
17
|
+
:switch => "feature switch (name-of-feature | -n number-of-feature) [--clean]",
|
18
|
+
:finish => "feature finish [name-of-feature]",
|
19
|
+
:'finish-issue' => "feature finish-issue issue-number",
|
19
20
|
:merge => "feature merge [name-of-feature]",
|
20
21
|
:pull => "feature pull",
|
21
22
|
:prune => "feature prune <local | origin> <preview | clean>",
|
@@ -34,10 +35,11 @@ def display_hotfix_help(command = nil, message = nil)
|
|
34
35
|
display_help(
|
35
36
|
:script_name => "Git Hotfix Helper",
|
36
37
|
:commands => {
|
37
|
-
:list => "hotfix list",
|
38
|
+
:list => "hotfix list [-v]",
|
38
39
|
:start => "hotfix start name-of-hotfix",
|
39
|
-
:switch => "hotfix switch name-of-hotfix",
|
40
|
+
:switch => "hotfix switch (name-of-hotfix | -n number-of-hotfix)",
|
40
41
|
:finish => "hotfix finish [name-of-hotfix]",
|
42
|
+
:'finish-issue' => "hotfix finish-issue issue-number",
|
41
43
|
:merge => "hotfix merge [name-of-hotfix]"
|
42
44
|
},
|
43
45
|
:command_name => 'hotfix',
|
@@ -113,7 +115,7 @@ end
|
|
113
115
|
def confirm(question)
|
114
116
|
loop do
|
115
117
|
print(question)
|
116
|
-
print(" (y/n):")
|
118
|
+
print(" (y/n): ")
|
117
119
|
STDOUT.flush
|
118
120
|
s = STDIN.gets
|
119
121
|
exit if s == nil
|
@@ -124,13 +126,18 @@ def confirm(question)
|
|
124
126
|
end
|
125
127
|
end
|
126
128
|
|
127
|
-
def die(message =
|
128
|
-
|
129
|
-
exit 1
|
129
|
+
def die(message = '')
|
130
|
+
abort wrap_text(message)
|
130
131
|
end
|
131
132
|
|
132
133
|
def highlight(str)
|
133
|
-
return HIGHLIGHT + str + HIGHLIGHT_OFF
|
134
|
+
return HIGHLIGHT + str + HIGHLIGHT_OFF
|
135
|
+
end
|
136
|
+
|
137
|
+
def get_branch_name_from_number(num)
|
138
|
+
octokit = Github::api
|
139
|
+
|
140
|
+
return octokit.pull_request(Github::get_github_repo, num).head.ref
|
134
141
|
end
|
135
142
|
|
136
143
|
def hotfix_branch(name)
|
@@ -142,7 +149,9 @@ def hotfix_branch(name)
|
|
142
149
|
end
|
143
150
|
|
144
151
|
def current_hotfix_branch()
|
145
|
-
if ARGV[1]
|
152
|
+
if ARGV[1] == '-n'
|
153
|
+
branch = get_branch_name_from_number(ARGV[2])
|
154
|
+
elsif ARGV[1]
|
146
155
|
branch = hotfix_branch(ARGV[1])
|
147
156
|
else
|
148
157
|
branch = Git::current_branch
|
@@ -0,0 +1,22 @@
|
|
1
|
+
.\" generated with Ronn/v0.7.3
|
2
|
+
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
|
+
.
|
4
|
+
.TH "FEATURE\-FINISH\-ISSUE" "1" "August 2013" "iFixit" ""
|
5
|
+
.
|
6
|
+
.SH "NAME"
|
7
|
+
\fBfeature\-finish\-issue\fR \- Finish this feature branch and attach it to an issue\.
|
8
|
+
.
|
9
|
+
.SH "SYNOPSIS"
|
10
|
+
\fBfeature finish\fR \fIissue\-number\fR
|
11
|
+
.
|
12
|
+
.SH "DESCRIPTION"
|
13
|
+
Finish the current feature branch and optionally convert an existing issue into a pull request\. The pull\'s description defaults to the commit message from the last commit on the branch with the issue\'s original title and description underneath\.
|
14
|
+
.
|
15
|
+
.SH "COPYRIGHT"
|
16
|
+
Copyright (c) 2012\-2013 iFixit\.
|
17
|
+
.
|
18
|
+
.SH "SEE ALSO"
|
19
|
+
feature(1), feature\-finish(1), hotfix\-finish(1), hotfix\-finish\-issue(1)
|
20
|
+
.
|
21
|
+
.SH "WWW"
|
22
|
+
https://github\.com/iFixit/git\-scripts
|
@@ -0,0 +1,26 @@
|
|
1
|
+
feature-finish-issue(1) - Finish this feature branch and attach it to an issue.
|
2
|
+
===============================================
|
3
|
+
|
4
|
+
## SYNOPSIS
|
5
|
+
|
6
|
+
`feature finish` <issue-number>
|
7
|
+
|
8
|
+
## DESCRIPTION
|
9
|
+
|
10
|
+
Finish the current feature branch and optionally convert an existing issue
|
11
|
+
into a pull request. The pull's description defaults to the commit message
|
12
|
+
from the last commit on the branch with the issue's original title and
|
13
|
+
description underneath.
|
14
|
+
|
15
|
+
## COPYRIGHT
|
16
|
+
|
17
|
+
Copyright (c) 2012-2013 iFixit.
|
18
|
+
|
19
|
+
## SEE ALSO
|
20
|
+
|
21
|
+
feature(1), feature-finish(1), hotfix-finish(1), hotfix-finish-issue(1)
|
22
|
+
|
23
|
+
## WWW
|
24
|
+
|
25
|
+
https://github.com/iFixit/git-scripts
|
26
|
+
|