git-process 1.1.4 → 2.0.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 (58) hide show
  1. data/CHANGELOG.md +14 -1
  2. data/LICENSE +193 -22
  3. data/README.md +212 -71
  4. data/man/git-process.1 +371 -0
  5. metadata +52 -140
  6. data/Gemfile +0 -20
  7. data/Gemfile.lock +0 -53
  8. data/Rakefile +0 -16
  9. data/bin/git-new-fb +0 -58
  10. data/bin/git-pull-request +0 -107
  11. data/bin/git-sync +0 -73
  12. data/bin/git-to-master +0 -133
  13. data/git-process.gemspec +0 -25
  14. data/lib/git-process/abstract_error_builder.rb +0 -53
  15. data/lib/git-process/changed_file_helper.rb +0 -115
  16. data/lib/git-process/git_abstract_merge_error_builder.rb +0 -146
  17. data/lib/git-process/git_branch.rb +0 -105
  18. data/lib/git-process/git_branches.rb +0 -73
  19. data/lib/git-process/git_config.rb +0 -153
  20. data/lib/git-process/git_lib.rb +0 -512
  21. data/lib/git-process/git_logger.rb +0 -84
  22. data/lib/git-process/git_merge_error.rb +0 -28
  23. data/lib/git-process/git_process.rb +0 -172
  24. data/lib/git-process/git_process_error.rb +0 -18
  25. data/lib/git-process/git_process_options.rb +0 -99
  26. data/lib/git-process/git_rebase_error.rb +0 -30
  27. data/lib/git-process/git_remote.rb +0 -256
  28. data/lib/git-process/git_status.rb +0 -108
  29. data/lib/git-process/github_configuration.rb +0 -298
  30. data/lib/git-process/github_pull_request.rb +0 -151
  31. data/lib/git-process/new_fb.rb +0 -50
  32. data/lib/git-process/parked_changes_error.rb +0 -41
  33. data/lib/git-process/pull_request.rb +0 -134
  34. data/lib/git-process/pull_request_error.rb +0 -25
  35. data/lib/git-process/rebase_to_master.rb +0 -148
  36. data/lib/git-process/sync.rb +0 -136
  37. data/lib/git-process/uncommitted_changes_error.rb +0 -23
  38. data/lib/git-process/version.rb +0 -22
  39. data/spec/FileHelpers.rb +0 -19
  40. data/spec/GitRepoHelper.rb +0 -123
  41. data/spec/changed_file_helper_spec.rb +0 -127
  42. data/spec/git_abstract_merge_error_builder_spec.rb +0 -126
  43. data/spec/git_branch_spec.rb +0 -123
  44. data/spec/git_config_spec.rb +0 -45
  45. data/spec/git_lib_spec.rb +0 -176
  46. data/spec/git_logger_spec.rb +0 -66
  47. data/spec/git_process_spec.rb +0 -208
  48. data/spec/git_remote_spec.rb +0 -227
  49. data/spec/git_status_spec.rb +0 -122
  50. data/spec/github_configuration_spec.rb +0 -152
  51. data/spec/github_pull_request_spec.rb +0 -96
  52. data/spec/github_test_helper.rb +0 -49
  53. data/spec/new_fb_spec.rb +0 -130
  54. data/spec/pull_request_helper.rb +0 -94
  55. data/spec/pull_request_spec.rb +0 -128
  56. data/spec/rebase_to_master_spec.rb +0 -429
  57. data/spec/spec_helper.rb +0 -21
  58. data/spec/sync_spec.rb +0 -304
@@ -1,84 +0,0 @@
1
- # Licensed under the Apache License, Version 2.0 (the "License");
2
- # you may not use this file except in compliance with the License.
3
- # You may obtain a copy of the License at
4
- #
5
- # http://www.apache.org/licenses/LICENSE-2.0
6
- #
7
- # Unless required by applicable law or agreed to in writing, software
8
- # distributed under the License is distributed on an "AS IS" BASIS,
9
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
- # See the License for the specific language governing permissions and
11
- # limitations under the License.
12
-
13
- require 'logger'
14
-
15
- module GitProc
16
-
17
- #
18
- # Provides a Logger for Git commands
19
- #
20
- class GitLogger
21
-
22
- DEBUG = Logger::DEBUG
23
- INFO = Logger::INFO
24
- WARN = Logger::WARN
25
- ERROR = Logger::ERROR
26
-
27
-
28
- def initialize(log_level = nil, out = STDOUT)
29
- if out.nil?
30
- @logger = ::Logger.new(RUBY_PLATFORM =~ /mswin|mingw/ ? 'NUL:' : '/dev/null')
31
- else
32
- @logger = ::Logger.new(out)
33
- end
34
- @logger.level = log_level.nil? ? GitLogger::WARN : log_level
35
- @logger.datetime_format = '%Y-%m-%d %H:%M:%S'
36
- @logger.formatter = proc do |_, _, _, msg|
37
- "#{msg}\n"
38
- end
39
- end
40
-
41
-
42
- def level
43
- @logger.level
44
- end
45
-
46
-
47
- def debug(msg = nil, &block)
48
- if msg.nil?
49
- @logger.debug(&block)
50
- else
51
- @logger.debug(msg)
52
- end
53
- end
54
-
55
-
56
- def info(msg = nil, &block)
57
- if msg.nil?
58
- @logger.info(&block)
59
- else
60
- @logger.info(msg)
61
- end
62
- end
63
-
64
-
65
- def warn(msg = nil, &block)
66
- if msg.nil?
67
- @logger.send(:warn, &block)
68
- else
69
- @logger.send(:warn, msg)
70
- end
71
- end
72
-
73
-
74
- def error(msg = nil, &block)
75
- if msg.nil?
76
- @logger.error(&block)
77
- else
78
- @logger.error(msg)
79
- end
80
- end
81
-
82
- end
83
-
84
- end
@@ -1,28 +0,0 @@
1
- # Licensed under the Apache License, Version 2.0 (the "License");
2
- # you may not use this file except in compliance with the License.
3
- # You may obtain a copy of the License at
4
- #
5
- # http://www.apache.org/licenses/LICENSE-2.0
6
- #
7
- # Unless required by applicable law or agreed to in writing, software
8
- # distributed under the License is distributed on an "AS IS" BASIS,
9
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
- # See the License for the specific language governing permissions and
11
- # limitations under the License.
12
-
13
- require 'git-process/git_abstract_merge_error_builder'
14
-
15
- module GitProc
16
-
17
- class MergeError < GitProcessError
18
-
19
- def initialize(merge_error_message, gitlib)
20
- @error_builder = GitProc::AbstractMergeErrorBuilder.new(gitlib, merge_error_message, 'git commit')
21
- msg = error_builder.build_message
22
-
23
- super(msg)
24
- end
25
-
26
- end
27
-
28
- end
@@ -1,172 +0,0 @@
1
- # Licensed under the Apache License, Version 2.0 (the "License");
2
- # you may not use this file except in compliance with the License.
3
- # You may obtain a copy of the License at
4
- #
5
- # http://www.apache.org/licenses/LICENSE-2.0
6
- #
7
- # Unless required by applicable law or agreed to in writing, software
8
- # distributed under the License is distributed on an "AS IS" BASIS,
9
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
- # See the License for the specific language governing permissions and
11
- # limitations under the License.
12
-
13
- require 'git-process/git_lib'
14
- require 'git-process/git_rebase_error'
15
- require 'git-process/git_merge_error'
16
- require 'highline/import'
17
-
18
-
19
- module GitProc
20
-
21
- class Process
22
-
23
- # @param [GitLib] gitlib
24
- def initialize(gitlib, opts = {})
25
- @gitlib = gitlib
26
- end
27
-
28
-
29
- def gitlib
30
- @gitlib
31
- end
32
-
33
-
34
- def run
35
- begin
36
- verify_preconditions
37
-
38
- runner
39
- rescue GitProc::GitProcessError => exp
40
- puts exp.message
41
- exit(-1)
42
- ensure
43
- cleanup
44
- end
45
- end
46
-
47
-
48
- def runner
49
- # extension point - does nothing by default
50
- end
51
-
52
-
53
- def workdir
54
- gitlib.workdir
55
- end
56
-
57
-
58
- def logger
59
- gitlib.logger
60
- end
61
-
62
-
63
- def config
64
- gitlib.config
65
- end
66
-
67
-
68
- def master_branch
69
- gitlib.config.master_branch
70
- end
71
-
72
-
73
- def remote
74
- gitlib.remote
75
- end
76
-
77
-
78
- def verify_preconditions
79
- if should_remove_master?
80
- if ask_about_removing_master
81
- delete_master_branch!
82
- end
83
- end
84
- end
85
-
86
-
87
- def cleanup
88
- # extension point
89
- end
90
-
91
-
92
- def fetch_remote_changes(remote_name = nil)
93
- if remote.exists?
94
- gitlib.fetch(remote_name || remote.name)
95
- else
96
- logger.debug 'Can not fetch latest changes because there is no remote defined'
97
- end
98
- end
99
-
100
-
101
- def is_parked?
102
- mybranches = gitlib.branches
103
- mybranches.parking == mybranches.current
104
- end
105
-
106
-
107
- private
108
-
109
-
110
- def delete_master_branch!
111
- gitlib.branches[config.master_branch].delete!
112
- end
113
-
114
-
115
- def should_remove_master?
116
- my_branches = gitlib.branches()
117
- gitlib.has_a_remote? and
118
- my_branches.include?(config.master_branch) and
119
- my_branches.current.name != config.master_branch and
120
- !keep_local_integration_branch? and
121
- my_branches[config.integration_branch].contains_all_of(config.master_branch)
122
- end
123
-
124
-
125
- def keep_local_integration_branch?
126
- keep_local_integration_branch_config_value.to_boolean
127
- end
128
-
129
-
130
- #noinspection RubyInstanceMethodNamingConvention
131
- def keep_local_integration_branch_config_value
132
- gitlib.config['gitProcess.keepLocalIntegrationBranch']
133
- end
134
-
135
-
136
- def ask_about_removing_master
137
- resp = ask("You should remove your obsolete <%= color('local', [:bold]) %> branch, '#{config.master_branch}'. Should I remove it for you? (Yn) ") do |q|
138
- q.responses[:not_valid] = 'Please respond with either (y)es or (n)o. Defaults to (y)es.'
139
- q.case = :down
140
- q.default = 'Y'
141
- q.validate = /y|n/i
142
- end
143
-
144
- if resp == 'n'
145
- say("(You can turn off this message using \"git config gitProcess.keepLocalIntegrationBranch true\").")
146
- false
147
- else
148
- true
149
- end
150
- end
151
-
152
-
153
- def proc_rebase(base, opts = {})
154
- begin
155
- gitlib.rebase(base, opts)
156
- rescue GitExecuteError => rebase_error
157
- raise RebaseError.new(rebase_error.message, gitlib)
158
- end
159
- end
160
-
161
-
162
- def proc_merge(base)
163
- begin
164
- gitlib.merge(base)
165
- rescue GitExecuteError => merge_error
166
- raise MergeError.new(merge_error.message, gitlib)
167
- end
168
- end
169
-
170
- end
171
-
172
- end
@@ -1,18 +0,0 @@
1
- # Licensed under the Apache License, Version 2.0 (the "License");
2
- # you may not use this file except in compliance with the License.
3
- # You may obtain a copy of the License at
4
- #
5
- # http://www.apache.org/licenses/LICENSE-2.0
6
- #
7
- # Unless required by applicable law or agreed to in writing, software
8
- # distributed under the License is distributed on an "AS IS" BASIS,
9
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
- # See the License for the specific language governing permissions and
11
- # limitations under the License.
12
-
13
- module GitProc
14
-
15
- class GitProcessError < RuntimeError
16
- end
17
-
18
- end
@@ -1,99 +0,0 @@
1
- # Licensed under the Apache License, Version 2.0 (the "License");
2
- # you may not use this file except in compliance with the License.
3
- # You may obtain a copy of the License at
4
- #
5
- # http://www.apache.org/licenses/LICENSE-2.0
6
- #
7
- # Unless required by applicable law or agreed to in writing, software
8
- # distributed under the License is distributed on an "AS IS" BASIS,
9
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
- # See the License for the specific language governing permissions and
11
- # limitations under the License.
12
-
13
- require 'optparse'
14
- require 'trollop'
15
- require 'git-process/version'
16
-
17
- module GitProc
18
-
19
- module GitProcessOptions
20
-
21
- DEBUG = false
22
-
23
-
24
- def parse_cli(filename, argv)
25
- parser = Trollop::Parser.new
26
- parser.version "#{filename} #{GitProc::Version::STRING}"
27
-
28
- parser.banner "#{summary}\n\n"
29
- parser.banner "\nUsage:\n #{usage(filename)}\n\nWhere [options] are:"
30
-
31
- extend_opts(parser)
32
- standard_opts(parser)
33
-
34
- parser.banner "\n#{description}"
35
-
36
- opts = Trollop::with_standard_exception_handling parser do
37
- raise Trollop::HelpNeeded if ARGV.empty? and !empty_argv_ok?
38
- parser.parse argv
39
- end
40
-
41
- opts[:info] = false if opts[:verbose] || opts[:quiet]
42
- opts[:info] = true if opts[:info_given]
43
-
44
- post_parse(opts, argv)
45
-
46
- if DEBUG
47
- puts "\n\n#{opts.map { |k, v| "#{k}:#{v}" }.join(', ')}"
48
- puts "\nargs: #{argv.join(', ')}"
49
- end
50
-
51
- opts
52
- end
53
-
54
-
55
- def standard_opts(parser)
56
- parser.opt :info, 'Informational messages; show the major things this is doing', :default => true, :short => :none
57
- parser.opt :quiet, 'Quiet messages; only show errors', :short => :q
58
- parser.opt :verbose, 'Verbose messages; show lots of details on what this is doing', :short => :v
59
- parser.opt :version, "Print version (#{GitProc::Version::STRING}) and exit", :short => :none
60
- parser.opt :help, 'Show this message', :short => :h
61
-
62
- parser.conflicts :verbose, :info, :quiet
63
- end
64
-
65
-
66
- def summary
67
- 'Default summary'
68
- end
69
-
70
-
71
- def usage(filename)
72
- "#{filename} [options]"
73
- end
74
-
75
-
76
- def description
77
- 'Default description'
78
- end
79
-
80
-
81
- def empty_argv_ok?
82
- true
83
- end
84
-
85
-
86
- #noinspection RubyUnusedLocalVariable
87
- def extend_opts(parser)
88
- # extension point - does nothing by default
89
- end
90
-
91
-
92
- #noinspection RubyUnusedLocalVariable
93
- def post_parse(opts, argv)
94
- # extension point - does nothing by default
95
- end
96
-
97
- end
98
-
99
- end
@@ -1,30 +0,0 @@
1
- # Licensed under the Apache License, Version 2.0 (the "License");
2
- # you may not use this file except in compliance with the License.
3
- # You may obtain a copy of the License at
4
- #
5
- # http://www.apache.org/licenses/LICENSE-2.0
6
- #
7
- # Unless required by applicable law or agreed to in writing, software
8
- # distributed under the License is distributed on an "AS IS" BASIS,
9
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
- # See the License for the specific language governing permissions and
11
- # limitations under the License.
12
-
13
- require 'git-process/git_abstract_merge_error_builder'
14
-
15
- module GitProc
16
-
17
- class RebaseError < GitProcessError
18
- attr_reader :error_builder
19
-
20
-
21
- def initialize(rebase_error_message, gitlib)
22
- @error_builder = GitProc::AbstractMergeErrorBuilder.new(gitlib, rebase_error_message, 'git rebase --continue')
23
- msg = error_builder.build_message
24
-
25
- super(msg)
26
- end
27
-
28
- end
29
-
30
- end
@@ -1,256 +0,0 @@
1
- # Licensed under the Apache License, Version 2.0 (the "License");
2
- # you may not use this file except in compliance with the License.
3
- # You may obtain a copy of the License at
4
- #
5
- # http://www.apache.org/licenses/LICENSE-2.0
6
- #
7
- # Unless required by applicable law or agreed to in writing, software
8
- # distributed under the License is distributed on an "AS IS" BASIS,
9
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
- # See the License for the specific language governing permissions and
11
- # limitations under the License.
12
-
13
- require 'git-process/git_config'
14
- require 'addressable/uri'
15
- #require 'git-process/git_branches'
16
- #require 'git-process/git_status'
17
- #require 'git-process/git_process_error'
18
-
19
-
20
- class String
21
-
22
- def to_boolean
23
- return false if self == false || self.nil? || self =~ (/(false|f|no|n|0)$/i)
24
- return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
25
- raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
26
- end
27
-
28
- end
29
-
30
-
31
- class NilClass
32
- def to_boolean
33
- false
34
- end
35
- end
36
-
37
-
38
- module GitProc
39
-
40
- #
41
- # Git Remote configuration
42
- #
43
- class GitRemote
44
-
45
- # @param [GitProc::GitConfig] gitconfig
46
- def initialize(gitconfig)
47
- @gitconfig = gitconfig
48
- end
49
-
50
-
51
- # @return [#info, #warn, #debug, #error]
52
- def logger
53
- @logger ||= @gitconfig.logger
54
- end
55
-
56
-
57
- # @return [GitProc::GitConfig]
58
- def config
59
- @gitconfig
60
- end
61
-
62
-
63
- # @deprecated
64
- # TODO: Remove
65
- def server_name
66
- @server_name ||= self.remote_name
67
- end
68
-
69
-
70
- # @return [Boolean] does this have a remote defined?
71
- def exists?
72
- if @has_remote.nil?
73
- @has_remote = (config.gitlib.command(:remote) != '')
74
- end
75
- logger.debug { "Does a remote exist? #{@has_remote}" }
76
- @has_remote
77
- end
78
-
79
-
80
- def repo_name
81
- unless @repo_name
82
- url = config["remote.#{name}.url"]
83
- raise GitProcessError.new("There is no #{name} url set up.") if url.nil? or url.empty?
84
- uri = Addressable::URI.parse(url)
85
- @repo_name = uri.path.sub(/\.git/, '').sub(/^\//, '')
86
- end
87
- @repo_name
88
- end
89
-
90
-
91
- def name
92
- unless @remote_name
93
- @remote_name = config['gitProcess.remoteName']
94
- if @remote_name.nil? or @remote_name.empty?
95
- remotes = self.remote_names
96
- if remotes.empty?
97
- @remote_name = nil
98
- else
99
- @remote_name = remotes[0]
100
- raise '!@remote_name.is_a? String' unless @remote_name.is_a? String
101
- end
102
- end
103
- logger.debug { "Using remote name of '#{@remote_name}'" }
104
- end
105
- @remote_name
106
- end
107
-
108
-
109
- def master_branch_name
110
- "#{self.name}/#{config.master_branch}"
111
- end
112
-
113
-
114
- def remote_names
115
- remote_str = config.gitlib.command(:remote, [:show])
116
- if remote_str.nil? or remote_str.empty?
117
- []
118
- else
119
- remote_str.split(/\n/)
120
- end
121
- end
122
-
123
-
124
- #
125
- # Expands the git configuration server name to a url.
126
- #
127
- # Takes into account further expanding an SSH uri that uses SSH aliasing in .ssh/config
128
- #
129
- # @param [String] server_name the git configuration server name; defaults to 'origin'
130
- #
131
- # @option opts [String] :ssh_config_file the SSH config file to use; defaults to ~/.ssh/config
132
- #
133
- # @return the fully expanded URL; never nil
134
- #
135
- # @raise [GitHubService::NoRemoteRepository] there is not a URL set for the server name
136
- # @raise [URI::InvalidURIError] the retrieved URL does not have a schema
137
- # @raise [GitHubService::NoRemoteRepository] if could not figure out a host for the retrieved URL
138
- # @raise [::ArgumentError] if a server name is not provided
139
- def expanded_url(server_name = 'origin', raw_url = nil, opts = {})
140
- if raw_url.nil?
141
- raise ArgumentError.new('Need server_name') unless server_name
142
-
143
- conf_key = "remote.#{server_name}.url"
144
- url = config[conf_key]
145
-
146
- raise GitHubService::NoRemoteRepository.new("There is no value set for '#{conf_key}'") if url.nil? or url.empty?
147
- else
148
- raise GitHubService::NoRemoteRepository.new("There is no value set for '#{raw_url}'") if raw_url.nil? or raw_url.empty?
149
- url = raw_url
150
- end
151
-
152
- if /^\S+@/ =~ url
153
- url.sub(/^(\S+@\S+?):(.*)$/, "ssh://\\1/\\2")
154
- else
155
- uri = URI.parse(url)
156
- host = uri.host
157
- scheme = uri.scheme
158
-
159
- raise URI::InvalidURIError.new("Need a scheme in URI: '#{url}'") unless scheme
160
-
161
- if scheme == 'file'
162
- url
163
- elsif host.nil?
164
- # assume that the 'scheme' is the named configuration in ~/.ssh/config
165
- rv = GitRemote.hostname_and_user_from_ssh_config(scheme, opts[:ssh_config_file] ||= "#{ENV['HOME']}/.ssh/config")
166
-
167
- raise GitHubService::NoRemoteRepository.new("Could not determine a host from #{url}") if rv.nil?
168
-
169
- host = rv[0]
170
- user = rv[1]
171
- url.sub(/^\S+:(\S+)$/, "ssh://#{user}@#{host}/\\1")
172
- else
173
- url
174
- end
175
- end
176
- end
177
-
178
-
179
- # @return [boolean]
180
- def rerere_enabled?
181
- re = config['rerere.enabled']
182
- !re.nil? && re.to_boolean
183
- end
184
-
185
-
186
- # @return [void]
187
- def rerere_enabled(re, global = true)
188
- if global
189
- config.set_global('rerere.enabled', re)
190
- else
191
- config['rerere.enabled'] = re
192
- end
193
- end
194
-
195
-
196
- # @return [boolean]
197
- def rerere_autoupdate?
198
- re = config['rerere.autoupdate']
199
- !re.nil? && re.to_boolean
200
- end
201
-
202
-
203
- # @return [void]
204
- def rerere_autoupdate(re, global = true)
205
- if global
206
- config.set_global('rerere.autoupdate', re)
207
- else
208
- config['rerere.autoupdate'] = re
209
- end
210
- end
211
-
212
-
213
- # @return [void]
214
- def add_remote(remote_name, url)
215
- config.gitlib.command(:remote, ['add', remote_name, url])
216
- end
217
-
218
-
219
- alias :add :add_remote
220
-
221
-
222
- #noinspection RubyClassMethodNamingConvention
223
- def self.hostname_and_user_from_ssh_config(host_alias, config_file)
224
- if File.exists?(config_file)
225
- config_lines = File.new(config_file).readlines
226
-
227
- in_host_section = false
228
- host_name = nil
229
- user_name = nil
230
-
231
- config_lines.each do |line|
232
- line.chop!
233
- if /^\s*Host\s+#{host_alias}\s*$/ =~ line
234
- in_host_section = true
235
- next
236
- end
237
-
238
- if in_host_section and (/^\s*HostName\s+\S+\s*$/ =~ line)
239
- host_name = line.sub(/^\s*HostName\s+(\S+)\s*$/, '\1')
240
- break unless user_name.nil?
241
- elsif in_host_section and (/^\s*User\s+\S+\s*$/ =~ line)
242
- user_name = line.sub(/^\s*User\s+(\S+)\s*$/, '\1')
243
- break unless host_name.nil?
244
- elsif in_host_section and (/^\s*Host\s+.*$/ =~ line)
245
- break
246
- end
247
- end
248
- host_name.nil? ? nil : [host_name, user_name]
249
- else
250
- nil
251
- end
252
- end
253
-
254
- end
255
-
256
- end