git-scripts 0.1.0 → 0.2.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.
Files changed (74) hide show
  1. data/README.md +17 -0
  2. data/bin/feature +101 -32
  3. data/bin/hotfix +61 -71
  4. data/lib/git.rb +50 -16
  5. data/lib/github.rb +4 -4
  6. data/lib/helpers.rb +46 -6
  7. data/lib/signal_handlers.rb +3 -0
  8. data/man/feature-clean.1 +4 -1
  9. data/man/feature-clean.1.html +6 -1
  10. data/man/feature-clean.1.markdown +5 -0
  11. data/man/feature-clean.1.ronn +4 -0
  12. data/man/feature-finish.1 +4 -1
  13. data/man/feature-finish.1.html +6 -1
  14. data/man/feature-finish.1.markdown +5 -0
  15. data/man/feature-finish.1.ronn +4 -0
  16. data/man/feature-github-test.1 +4 -1
  17. data/man/feature-github-test.1.html +6 -1
  18. data/man/feature-github-test.1.markdown +5 -0
  19. data/man/feature-github-test.1.ronn +4 -0
  20. data/man/feature-list.1 +4 -1
  21. data/man/feature-list.1.html +6 -1
  22. data/man/feature-list.1.markdown +5 -0
  23. data/man/feature-list.1.ronn +4 -0
  24. data/man/feature-merge.1 +4 -1
  25. data/man/feature-merge.1.html +6 -1
  26. data/man/feature-merge.1.markdown +5 -0
  27. data/man/feature-merge.1.ronn +4 -0
  28. data/man/feature-prune.1 +37 -0
  29. data/man/feature-prune.1.ronn +30 -0
  30. data/man/feature-start.1 +4 -1
  31. data/man/feature-start.1.html +6 -1
  32. data/man/feature-start.1.markdown +5 -0
  33. data/man/feature-start.1.ronn +4 -0
  34. data/man/feature-stashes.1 +4 -1
  35. data/man/feature-stashes.1.html +6 -1
  36. data/man/feature-stashes.1.markdown +5 -0
  37. data/man/feature-stashes.1.ronn +4 -0
  38. data/man/feature-status.1 +4 -1
  39. data/man/feature-status.1.html +6 -1
  40. data/man/feature-status.1.markdown +5 -0
  41. data/man/feature-status.1.ronn +4 -0
  42. data/man/feature-switch.1 +4 -1
  43. data/man/feature-switch.1.html +6 -1
  44. data/man/feature-switch.1.markdown +5 -0
  45. data/man/feature-switch.1.ronn +4 -0
  46. data/man/feature.1 +8 -1
  47. data/man/feature.1.html +6 -1
  48. data/man/feature.1.markdown +5 -0
  49. data/man/feature.1.ronn +6 -0
  50. data/man/hotfix-finish.1 +4 -1
  51. data/man/hotfix-finish.1.html +6 -1
  52. data/man/hotfix-finish.1.markdown +5 -0
  53. data/man/hotfix-finish.1.ronn +4 -0
  54. data/man/hotfix-list.1 +4 -1
  55. data/man/hotfix-list.1.html +6 -1
  56. data/man/hotfix-list.1.markdown +5 -0
  57. data/man/hotfix-list.1.ronn +4 -0
  58. data/man/hotfix-merge.1 +4 -1
  59. data/man/hotfix-merge.1.html +6 -1
  60. data/man/hotfix-merge.1.markdown +5 -0
  61. data/man/hotfix-merge.1.ronn +4 -0
  62. data/man/hotfix-start.1 +4 -1
  63. data/man/hotfix-start.1.html +6 -1
  64. data/man/hotfix-start.1.markdown +5 -0
  65. data/man/hotfix-start.1.ronn +4 -0
  66. data/man/hotfix-switch.1 +4 -1
  67. data/man/hotfix-switch.1.html +6 -1
  68. data/man/hotfix-switch.1.markdown +5 -0
  69. data/man/hotfix-switch.1.ronn +4 -0
  70. data/man/hotfix.1 +4 -1
  71. data/man/hotfix.1.html +6 -1
  72. data/man/hotfix.1.markdown +5 -0
  73. data/man/hotfix.1.ronn +4 -0
  74. metadata +5 -2
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Gem Version](https://badge.fury.io/rb/git-scripts.png)](http://rubygems.org/gems/git-scripts)
2
+
1
3
  # Git Scripts
2
4
 
3
5
  User scripts for easily managing feature branches and hotfixes.
@@ -122,3 +124,18 @@ Merges the hotfix branch back into `stable` with `--no-ff`. Also does a
122
124
  merge back into `master`.
123
125
 
124
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
@@ -1,10 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
+ require_relative '../lib/signal_handlers.rb'
2
3
  require_relative '../lib/github.rb'
3
4
  require_relative '../lib/git.rb'
4
5
  require_relative '../lib/helpers.rb'
5
6
 
6
7
  command=ARGV.first
7
8
 
9
+ $0 = ARGV.join(" ")
10
+
8
11
  case command
9
12
  when 'github-test'
10
13
  octokit = Github::api
@@ -16,25 +19,29 @@ when 'start'
16
19
  require_argument(:feature, :start)
17
20
  feature = ARGV[1]
18
21
 
19
- exit if !confirm("Create feature branch named: '#{feature}' ?")
22
+ exit unless confirm("Create feature branch named: '#{feature}' ?")
20
23
 
21
- Git::run_safe("git checkout #{Git::development_branch}")
22
- Git::run_safe("git pull --rebase")
23
- Git::run_safe("git branch \"#{feature}\" #{Git::development_branch}")
24
- Git::run_safe("git checkout \"#{feature}\"")
24
+ Git::run_safe([
25
+ "git checkout #{Git::development_branch}",
26
+ "git pull --rebase",
27
+ "git branch \"#{feature}\" #{Git::development_branch}",
28
+ "git checkout \"#{feature}\"",
29
+ ])
25
30
 
26
31
  Git::submodules_update
27
32
 
28
33
  # Automatically setup remote tracking branch
29
- Git::run_safe("git config branch.#{feature}.remote origin")
30
- Git::run_safe("git config branch.#{feature}.merge refs/heads/#{feature}")
31
- Git::run_safe("git config branch.#{feature}.rebase true")
34
+ Git::run_safe([
35
+ "git config branch.#{feature}.remote origin",
36
+ "git config branch.#{feature}.merge refs/heads/#{feature}",
37
+ "git config branch.#{feature}.rebase true"
38
+ ])
32
39
 
33
40
  puts "Successfully created a new feature-branch: #{feature}"
34
41
 
35
42
  when 'status'
36
43
  current = Git::current_branch
37
- Git::run_safe("git fetch")
44
+ Git::run_safe(["git fetch"])
38
45
 
39
46
  upstream = `git rev-parse --verify --quiet #{current}@{upstream} 2>/dev/null`.strip
40
47
  if upstream == ''
@@ -70,9 +77,9 @@ when 'status'
70
77
  when 'finish'
71
78
  feature = ARGV[1] || Git::current_branch
72
79
  # Push commits to origin
73
- Git::run_safe("git push origin #{feature}:#{feature}")
80
+ Git::run_safe(["git push origin #{feature}:#{feature}"])
74
81
 
75
- exit 1 if !confirm("Create a pull-request for feature branch named: '#{feature}' ?")
82
+ exit 1 unless confirm("Create a pull-request for feature branch named: '#{feature}' ?")
76
83
  octokit = Github::api
77
84
 
78
85
  description = Github::get_pull_request_description(feature)
@@ -95,34 +102,32 @@ when 'finish'
95
102
  when 'merge'
96
103
  dev_branch = Git::development_branch
97
104
  fail_on_local_changes
98
- Git::run_safe("git fetch")
105
+
106
+ Git::run_safe(["git fetch"])
99
107
 
100
108
  feature = ARGV[1] || Git::current_branch
101
109
 
102
- exit 1 if !confirm("Merge feature branch named: '#{feature}' ?")
110
+ exit 1 unless confirm("Merge feature branch named: '#{feature}' ?")
103
111
 
104
112
  description = Github::get_pull_request_description_from_api(feature, dev_branch)
105
113
 
106
114
  # Checkout the branch first to make sure we have it locally.
107
- Git::run_safe("git fetch")
108
- Git::run_safe("git checkout \"#{feature}\"")
109
-
110
- Git::run_safe("git rebase --preserve-merges origin/#{feature}")
111
-
112
- # pull the latest changes from master
113
- Git::run_safe("git checkout #{dev_branch}")
114
-
115
- # rebase the unpushed master commits if any.
116
- Git::run_safe("git rebase --preserve-merges origin/#{dev_branch}")
117
-
118
- # merge the feature branch into master
119
- Git::run_safe("git merge --no-ff --edit -m #{description.shellescape} \"#{feature}\"")
115
+ Git::run_safe([
116
+ "git checkout \"#{feature}\"",
117
+ "git rebase --preserve-merges origin/#{feature}",
118
+ # pull the latest changes from master
119
+ "git checkout #{dev_branch}",
120
+ # rebase the unpushed master commits if any.
121
+ "git rebase --preserve-merges origin/#{dev_branch}",
122
+ # merge the feature branch into master
123
+ "git merge --no-ff --edit -m #{description.shellescape} \"#{feature}\"",
124
+ ])
120
125
 
121
126
  # init any submodules in the master branch
122
127
  Git::submodules_update
123
128
 
124
129
  # delete the local feature-branch
125
- Git::run_safe("git branch -d \"#{feature}\"")
130
+ Git::run_safe(["git branch -d \"#{feature}\""])
126
131
 
127
132
  # delete the remote branch we'll leave this off for now
128
133
  # Git::run_safe("git push origin :\"#{feature}\"")
@@ -131,6 +136,9 @@ when 'merge'
131
136
 
132
137
  puts
133
138
  puts "Successfully merged feature-branch: #{feature} into #{dev_branch}"
139
+ puts "If you are satisfied with the result, do this:\n" + <<CMDS
140
+ git push
141
+ CMDS
134
142
 
135
143
  when 'switch'
136
144
  require_argument(:feature, :switch, min=2, max=3)
@@ -138,17 +146,77 @@ when 'switch'
138
146
 
139
147
  Git::switch_branch(feature)
140
148
 
149
+ when 'prune'
150
+ require_argument(:feature, :prune, min=3, max=3)
151
+ location = ARGV[1]
152
+ option = ARGV[2]
153
+
154
+ # Check arguments.
155
+ if location != "local" and location != "origin"
156
+ abort("Valid locations: local, origin.")
157
+ end
158
+
159
+ if option != "preview" and option != "clean"
160
+ abort("Valid options: preview, clean.")
161
+ end
162
+
163
+ currentBranch = Git::current_branch()
164
+
165
+ def branches_cmd(location, currentBranch)
166
+ branch = location == 'origin' ? 'origin/master' : 'master'
167
+ return "git branch --merged #{branch} |
168
+ grep -v master |
169
+ grep -v stable |
170
+ grep -v #{currentBranch}"
171
+ end
172
+
173
+ def preview(location, currentBranch)
174
+ puts "Would delete the following..."
175
+ commands = branches_cmd(location, currentBranch)
176
+
177
+ if location == "local"
178
+ system(commands)
179
+ elsif location == "origin"
180
+ message = `git remote prune -n origin && #{commands}`
181
+ puts message.gsub(" * [would prune] origin/",'')
182
+ end
183
+ end
184
+
185
+ def delete(location, currentBranch)
186
+ puts "Deleting..."
187
+ commands = branches_cmd(location, currentBranch)
188
+
189
+ if location == "local"
190
+ system("#{commands} | xargs git branch -d")
191
+ elsif location == "origin"
192
+ system("git remote prune origin &&
193
+ git branch -r --merged origin/master |
194
+ grep -v master |
195
+ grep -v stable |
196
+ grep -v #{currentBranch} |
197
+ sed -n 's| origin/|:|p' |
198
+ xargs git push origin")
199
+ end
200
+ end
201
+
202
+ if option == 'preview'
203
+ preview(location, currentBranch)
204
+ elsif option == 'clean'
205
+ exit unless confirm("Are you sure you want to prune branches?")
206
+ delete(location, currentBranch)
207
+ end
208
+
141
209
  when 'clean'
142
210
  args = ''
143
211
 
144
- # Remove all untracked .gitignored files as well
212
+ # Remove all untracked .gitignore'd files as well
145
213
  args += 'x' if ARGV.include?('--all')
146
214
 
147
215
  # -fd alone will NOT remove submodule directories, -ffd is required for this
148
- Git::run_safe("git clean -ffd#{args}")
216
+ Git::run_safe(["git clean -ffd#{args}"])
149
217
 
150
218
  when 'pull'
151
- Git::run_safe("git fetch")
219
+ Git::run_safe(["git fetch"])
152
220
 
153
221
  current = Git::current_branch
154
222
  upstream = "#{current}@{upstream}"
@@ -159,7 +227,7 @@ when 'pull'
159
227
  end
160
228
 
161
229
  old_branch_hash = Git::branch_hash(current)
162
- Git::run_safe("git rebase --preserve-merges origin/#{current}")
230
+ Git::run_safe(["git rebase --preserve-merges origin/#{current}"])
163
231
 
164
232
  Git::submodules_update
165
233
 
@@ -179,7 +247,7 @@ when 'list'
179
247
  when 'stashes'
180
248
  current_branch = nil
181
249
 
182
- if !ARGV.include?('-v')
250
+ unless ARGV.include?('-v')
183
251
  current_branch = Git::current_branch
184
252
  end
185
253
 
@@ -189,3 +257,4 @@ else
189
257
  display_feature_help
190
258
  end
191
259
 
260
+ log_command("feature #{$0}")
data/bin/hotfix CHANGED
@@ -1,47 +1,49 @@
1
1
  #!/usr/bin/env ruby
2
+ require_relative '../lib/signal_handlers.rb'
2
3
  require_relative '../lib/github.rb'
3
4
  require_relative '../lib/git.rb'
4
5
  require_relative '../lib/helpers.rb'
5
6
 
6
7
  command=ARGV.first
7
- BRANCH_PREFIX = "hotfix-"
8
+
9
+ $0 = ARGV.join(" ")
10
+
8
11
  case command
9
12
  when 'start'
10
13
  require_argument(:hotfix, :start)
11
- hotfix = BRANCH_PREFIX + ARGV[1]
14
+ hotfix = hotfix_branch(ARGV[1])
12
15
 
13
- exit if !confirm("Create hotfix branch named: '#{hotfix}' ?")
16
+ exit unless confirm("Create hotfix branch named: '#{hotfix}' ?")
14
17
 
15
- Git::run_safe("git checkout stable")
16
- Git::run_safe("git pull --rebase")
17
- Git::run_safe("git branch \"#{hotfix}\" stable")
18
- Git::run_safe("git checkout \"#{hotfix}\"")
18
+ Git::run_safe([
19
+ "git checkout stable",
20
+ "git pull --rebase",
21
+ "git branch \"#{hotfix}\" stable",
22
+ "git checkout \"#{hotfix}\""
23
+ ])
19
24
 
20
25
  Git::submodules_update
21
26
 
22
27
  # Automatically setup remote tracking branch
23
- Git::run_safe("git config branch.#{hotfix}.remote origin")
24
- Git::run_safe("git config branch.#{hotfix}.merge refs/heads/#{hotfix}")
25
- Git::run_safe("git config branch.#{hotfix}.rebase true")
28
+ Git::run_safe([
29
+ "git config branch.#{hotfix}.remote origin",
30
+ "git config branch.#{hotfix}.merge refs/heads/#{hotfix}",
31
+ "git config branch.#{hotfix}.rebase true"
32
+ ])
26
33
 
27
34
  when 'switch'
28
35
  require_argument(:hotfix, :switch, min=2, max=3)
29
- hotfix = BRANCH_PREFIX + ARGV[1]
36
+ hotfix = current_hotfix_branch
30
37
 
31
38
  Git::switch_branch(hotfix)
32
39
 
33
40
  when 'finish'
34
- hotfix = ARGV[1] || Git::current_branch
35
-
36
- # ensure the hotfix name is the real branch name
37
- if (!hotfix.start_with?("hotfix-"))
38
- hotfix = "hotfix-" + hotfix
39
- end
41
+ hotfix = current_hotfix_branch
40
42
 
41
43
  # Push commits to origin
42
- Git::run_safe("git push origin #{hotfix}:#{hotfix}")
44
+ Git::run_safe(["git push origin #{hotfix}:#{hotfix}"])
43
45
 
44
- exit 1 if !confirm("Create a pull-request for hotfix branch named: '#{hotfix}' ?")
46
+ exit 1 unless confirm("Create a pull-request for hotfix branch named: '#{hotfix}' ?")
45
47
  octokit = Github::api
46
48
 
47
49
  description = Github::get_pull_request_description(hotfix)
@@ -64,63 +66,49 @@ when 'finish'
64
66
  when 'merge'
65
67
  fail_on_local_changes
66
68
  dev_branch = Git::development_branch
69
+ hotfix = current_hotfix_branch
67
70
 
68
- Git::run_safe("git fetch")
69
-
70
- if ARGV[1]
71
- hotfix = BRANCH_PREFIX + ARGV[1]
72
- else
73
- hotfix = Git::current_branch
74
- end
71
+ Git::run_safe(["git fetch"])
75
72
 
76
- exit 1 if !confirm("Merge hotfix named: '#{hotfix}' ?")
73
+ exit 1 unless confirm("Merge hotfix named: '#{hotfix}' ?")
77
74
 
78
75
  description = Github::get_pull_request_description_from_api(hotfix, 'stable')
79
-
80
- # Checkout the branch to make sure we have it locally.
81
- Git::run_safe("git checkout \"#{hotfix}\"")
82
- Git::run_safe("git rebase --preserve-merges origin/#{hotfix}")
83
-
84
- # Merge into stable
85
- Git::run_safe("git checkout stable")
86
-
87
- # pull the latest changes and rebase the unpushed commits if any.
88
- Git::run_safe("git rebase --preserve-merges origin/stable")
89
-
90
- # merge the hotfix branch into stable
91
- Git::run_safe("git merge --no-ff --edit -m #{description.shellescape} \"#{hotfix}\"")
92
-
76
+ descriptionDev = Github::get_pull_request_description_from_api(hotfix, dev_branch)
93
77
  # init any submodules in the stable branch
94
- Git::submodules_update
95
- # push the the merge to our origin
96
- # Git::run_safe("git push origin")
97
-
98
- description = Github::get_pull_request_description_from_api(hotfix, dev_branch)
99
-
100
- # Merge into master
101
- Git::run_safe("git checkout #{dev_branch}")
102
-
103
- # pull the latest changes and rebase the unpushed master commits if any.
104
- Git::run_safe("git rebase origin/#{dev_branch}")
105
-
106
- # merge the hotfix branch into master
107
- Git::run_safe("git merge --no-ff --edit -m #{description.shellescape} \"#{hotfix}\"")
108
-
109
- # init any submodules in the master branch. Note: no need to change
110
- # directories before calling git submodule since we are already in the
111
- # projects top-level directory
112
- Git::submodules_update
113
-
114
- # push the the merge to our origin
115
- # Git::run_safe("git push origin")
116
-
117
- # delete the local hotfix branch
118
- Git::run_safe("git branch -d \"#{hotfix}\"")
119
- # delete the remote hotfix branch -- we'll leave this off for now
120
- # Git::run_safe("git push origin :\"#{hotfix}\"")
121
-
122
- # checkout stable branch
123
- Git::run_safe("git checkout stable")
78
+ update = Git::submodules_update("get")
79
+
80
+ Git::run_safe([
81
+ # Checkout the branch to make sure we have it locally.
82
+ "git checkout \"#{hotfix}\"",
83
+ "git rebase --preserve-merges origin/#{hotfix}",
84
+ # Merge into stable
85
+ "git checkout stable",
86
+ # pull the latest changes and rebase the unpushed commits if any.
87
+ "git rebase --preserve-merges origin/stable",
88
+ # merge the hotfix branch into stable
89
+ "git merge --no-ff --edit -m #{description.shellescape} \"#{hotfix}\"",
90
+ "#{update}",
91
+ # push the the merge to our origin
92
+ # Git::run_safe("git push origin")
93
+ # Merge into master
94
+ "git checkout #{dev_branch}",
95
+ # pull the latest changes and rebase the unpushed master commits if any.
96
+ "git rebase origin/#{dev_branch}",
97
+ # merge the hotfix branch into master
98
+ "git merge --no-ff --edit -m #{descriptionDev.shellescape} \"#{hotfix}\"",
99
+ # init any submodules in the master branch. Note: no need to change
100
+ # directories before calling git submodule since we are already in the
101
+ # projects top-level directory
102
+ "#{update}",
103
+ # push the the merge to our origin
104
+ # Git::run_safe("git push origin")
105
+ # delete the local hotfix branch
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
110
+ "git checkout stable"
111
+ ])
124
112
 
125
113
  puts "Successfully merged hotfix branch: #{hotfix} into stable and #{dev_branch}"
126
114
  puts "If you are satisfied with the result, do this:\n" + <<CMDS
@@ -140,3 +128,5 @@ when 'list'
140
128
  else
141
129
  display_hotfix_help
142
130
  end
131
+
132
+ log_command("hotfix #{$0}")
data/lib/git.rb CHANGED
@@ -4,6 +4,8 @@ module Git
4
4
  return !clean
5
5
  end
6
6
 
7
+ # Return the development branch specified by the
8
+ # feature.development-branch git config value
7
9
  def self.development_branch
8
10
  dev_branch = `git config feature.development-branch`.strip
9
11
  if !dev_branch || $? != 0
@@ -14,7 +16,7 @@ module Git
14
16
  dev_branch
15
17
  end
16
18
 
17
- # Returns an array of branches that aren't merged into the specifeid branch
19
+ # Returns an array of branches that aren't merged into the specified branch
18
20
  def self.branches_not_merged_into(branch)
19
21
  self::all_branches - self::merged_branches(branch)
20
22
  end
@@ -53,23 +55,27 @@ module Git
53
55
  def self.all_branches()
54
56
  `git for-each-ref --sort=-committerdate --format='%(refname)' refs/heads refs/remotes`.
55
57
  split("\n").
56
- map {|branch| branch.sub(/refs\/\w+\//, '') }.uniq
58
+ map {|branch| branch.sub(/refs\/\w+\//, '') }.
59
+ uniq.
60
+ reject {|branch| branch =~ %r{\w+/HEAD} }
57
61
  end
58
62
 
59
- # returns the name of th currently checked out brnach, or nil if detached.
63
+ # Returns the name of the currently checked out branch, or nil if detached.
60
64
  def self.current_branch()
61
65
  ref = `git symbolic-ref -q HEAD`.strip
62
66
  ref.split('/').last
63
67
  end
64
68
 
65
- # returns the SHA1 hash that the specified branch or symbol points to
69
+ # Returns the SHA1 hash that the specified branch or symbol points to
66
70
  def self.branch_hash(branch)
67
71
  `git rev-parse --verify --quiet "#{branch}" 2>/dev/null`.strip
68
72
  end
69
73
 
70
- # Return formatted string containing:
71
- # commit_hash Authoe Name (relative date)
72
- # for the specifeid branch or commit
74
+ # Returns formatted string containing:
75
+ #
76
+ # commit_hash Author Name (relative date)
77
+ #
78
+ # for the specified branch or commit
73
79
  def self.branch_info(branch)
74
80
  # branch info format: hash author (relative date)
75
81
  format = "%h %an %Cgreen(%ar)%Creset"
@@ -78,10 +84,18 @@ module Git
78
84
  sprintf "%-30s %s", simple_branch, branch_info
79
85
  end
80
86
 
81
- def self.run_safe(command)
82
- puts "> #{command}"
83
- result = system(command)
84
- raise "Git command failed, aborting." if (!result)
87
+ def self.run_safe(commands)
88
+ while command = commands.shift
89
+ puts "> " + command
90
+ unless system(command)
91
+ puts "\tFailed on \`#{command}\`"
92
+ puts "\tWould have run:"
93
+ commands.each do |a|
94
+ puts "\t" + a
95
+ exit
96
+ end
97
+ end
98
+ end
85
99
  end
86
100
 
87
101
  def self.show_stashes_saved_on(branch = nil)
@@ -128,7 +142,7 @@ module Git
128
142
 
129
143
  def self.stashes
130
144
  # Do we even have a stash?
131
- if ! File.exist? '.git/refs/stash'
145
+ unless File.exist? '.git/refs/stash'
132
146
  return []
133
147
  end
134
148
 
@@ -146,19 +160,35 @@ module Git
146
160
  end
147
161
  end
148
162
 
163
+ ##
164
+ # Switch to the specified branch.
165
+ # Because we use submodules, we have to check for updates to those
166
+ # submodules when we checkout a branch
167
+ #
168
+ # args: --clean - remove every unstaged file, including non-existant
169
+ # submodules
170
+ #
149
171
  def self.switch_branch(branch)
150
- self.run_safe("git checkout \"#{branch}\"")
172
+ self.run_safe(["git checkout \"#{branch}\""])
151
173
  self.submodules_update
152
- self.run_safe("git clean -ffd") if ARGV.include?('--clean')
174
+ self.run_safe(["git clean -ffd"]) if ARGV.include?('--clean')
153
175
 
154
176
  self.show_stashes_saved_on(branch)
155
177
  end
156
178
 
157
- def self.submodules_update
179
+ ##
180
+ # Update / initialize submodules from the TLD
181
+ #
182
+ def self.submodules_update(mode = nil)
158
183
  # capture only the path, not the newline
159
184
  basedir = `git rev-parse --show-toplevel`.split("\n").first
185
+ command = "cd #{basedir} && git submodule --quiet update --init --recursive"
160
186
 
161
- Git::run_safe("cd #{basedir} && git submodule --quiet update --init --rebase --recursive")
187
+ if mode == "get"
188
+ return command
189
+ else
190
+ Git::run_safe([command])
191
+ end
162
192
  end
163
193
 
164
194
  ##
@@ -167,4 +197,8 @@ module Git
167
197
  def self.commit_message(ref)
168
198
  `git log -1 --format="%B" #{ref}`.strip
169
199
  end
200
+
201
+ def self.git_dir()
202
+ `git rev-parse --git-dir`.strip
203
+ end
170
204
  end
data/lib/github.rb CHANGED
@@ -54,7 +54,7 @@ module Github
54
54
  end
55
55
 
56
56
  ##
57
- # Returns a hash containing username and github oauth token
57
+ # Returns a hash containing the username and github oauth token
58
58
  #
59
59
  # Prompts the user for credentials if the token isn't stored in git config
60
60
  ##
@@ -73,11 +73,11 @@ module Github
73
73
 
74
74
  auth = auth || octokit.create_authorization(authorization_info)
75
75
 
76
- success =
76
+ success =
77
77
  system("git config --global github.user #{username}") &&
78
78
  system("git config --global github.token #{auth[:token]}")
79
79
 
80
- if !success
80
+ unless success
81
81
  puts "Couldn't set git config"
82
82
  exit
83
83
  end
@@ -154,7 +154,7 @@ Body of pull-request
154
154
 
155
155
  def self.get_pull_request_description_from_api(branch_name, into_branch)
156
156
  octokit = Github::api
157
- # Should succeed if authentication is setup.
157
+ # Should succeed if authentication is set up.
158
158
  pulls = octokit.pulls(Github::get_github_repo)
159
159
  pull = pulls.find {|pull| branch_name == pull[:head][:ref] }
160
160