git-process 1.0.11 → 1.1.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/CHANGELOG.md +37 -9
- data/Gemfile +2 -2
- data/Gemfile.lock +17 -17
- data/README.md +14 -7
- data/bin/git-new-fb +10 -2
- data/bin/git-pull-request +30 -6
- data/bin/git-sync +5 -2
- data/bin/git-to-master +62 -11
- data/git-process.gemspec +15 -15
- data/lib/git-process/abstract_error_builder.rb +0 -3
- data/lib/git-process/changed_file_helper.rb +30 -24
- data/lib/git-process/git_abstract_merge_error_builder.rb +31 -11
- data/lib/git-process/git_branch.rb +5 -0
- data/lib/git-process/git_config.rb +153 -0
- data/lib/git-process/git_lib.rb +212 -164
- data/lib/git-process/git_logger.rb +84 -0
- data/lib/git-process/git_merge_error.rb +3 -14
- data/lib/git-process/git_process.rb +44 -73
- data/lib/git-process/git_process_options.rb +6 -6
- data/lib/git-process/git_rebase_error.rb +4 -13
- data/lib/git-process/git_remote.rb +254 -0
- data/lib/git-process/github_configuration.rb +298 -0
- data/lib/git-process/github_pull_request.rb +65 -27
- data/lib/git-process/new_fb.rb +14 -4
- data/lib/git-process/parked_changes_error.rb +1 -1
- data/lib/git-process/pull_request.rb +100 -13
- data/lib/git-process/pull_request_error.rb +25 -0
- data/lib/git-process/rebase_to_master.rb +47 -27
- data/lib/git-process/sync.rb +48 -33
- data/lib/git-process/uncommitted_changes_error.rb +1 -1
- data/lib/git-process/version.rb +2 -2
- data/spec/GitRepoHelper.rb +48 -25
- data/spec/changed_file_helper_spec.rb +39 -58
- data/spec/git_abstract_merge_error_builder_spec.rb +42 -33
- data/spec/git_branch_spec.rb +30 -30
- data/spec/git_config_spec.rb +45 -0
- data/spec/git_lib_spec.rb +103 -122
- data/spec/git_logger_spec.rb +66 -0
- data/spec/git_process_spec.rb +81 -81
- data/spec/git_remote_spec.rb +188 -0
- data/spec/git_status_spec.rb +36 -36
- data/spec/github_configuration_spec.rb +152 -0
- data/spec/github_pull_request_spec.rb +39 -35
- data/spec/github_test_helper.rb +49 -0
- data/spec/new_fb_spec.rb +65 -24
- data/spec/pull_request_helper.rb +94 -0
- data/spec/pull_request_spec.rb +128 -0
- data/spec/rebase_to_master_spec.rb +241 -145
- data/spec/spec_helper.rb +20 -0
- data/spec/sync_spec.rb +115 -109
- metadata +34 -20
- data/lib/git-process/github_client.rb +0 -83
- data/lib/git-process/github_service.rb +0 -174
- data/spec/github_service_spec.rb +0 -211
@@ -0,0 +1,84 @@
|
|
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
|
@@ -15,25 +15,14 @@ require 'git-process/git_abstract_merge_error_builder'
|
|
15
15
|
module GitProc
|
16
16
|
|
17
17
|
class MergeError < GitProcessError
|
18
|
-
include AbstractMergeErrorBuilder
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def initialize(merge_error_message, lib)
|
24
|
-
@lib = lib
|
25
|
-
@error_message = merge_error_message
|
26
|
-
|
27
|
-
msg = build_message
|
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
|
28
22
|
|
29
23
|
super(msg)
|
30
24
|
end
|
31
25
|
|
32
|
-
|
33
|
-
def continue_command
|
34
|
-
'git commit'
|
35
|
-
end
|
36
|
-
|
37
26
|
end
|
38
27
|
|
39
28
|
end
|
@@ -19,13 +19,15 @@ require 'highline/import'
|
|
19
19
|
module GitProc
|
20
20
|
|
21
21
|
class Process
|
22
|
-
include GitLib
|
23
22
|
|
23
|
+
# @param [GitLib] gitlib
|
24
|
+
def initialize(gitlib, opts = {})
|
25
|
+
@gitlib = gitlib
|
26
|
+
end
|
24
27
|
|
25
|
-
def initialize(dir, opts = {})
|
26
|
-
@log_level = Process.log_level(opts)
|
27
28
|
|
28
|
-
|
29
|
+
def gitlib
|
30
|
+
@gitlib
|
29
31
|
end
|
30
32
|
|
31
33
|
|
@@ -48,51 +50,30 @@ module GitProc
|
|
48
50
|
end
|
49
51
|
|
50
52
|
|
51
|
-
def set_workdir(dir)
|
52
|
-
unless dir.nil?
|
53
|
-
@workdir = find_workdir(dir)
|
54
|
-
if @workdir.nil?
|
55
|
-
@workdir = dir
|
56
|
-
logger.info { "Initializing new repository at #{workdir}" }
|
57
|
-
command(:init)
|
58
|
-
else
|
59
|
-
logger.debug { "Opening existing repository at #{workdir}" }
|
60
|
-
end
|
61
|
-
else
|
62
|
-
logger.debug "Process dir is nil"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
53
|
def workdir
|
68
|
-
|
54
|
+
gitlib.workdir
|
69
55
|
end
|
70
56
|
|
71
57
|
|
72
|
-
def
|
73
|
-
|
58
|
+
def logger
|
59
|
+
gitlib.logger
|
74
60
|
end
|
75
61
|
|
76
62
|
|
77
|
-
def
|
78
|
-
|
63
|
+
def config
|
64
|
+
gitlib.config
|
79
65
|
end
|
80
66
|
|
81
67
|
|
82
|
-
def
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
def integration_branch
|
88
|
-
has_a_remote? ? remote_master_branch : master_branch
|
68
|
+
def remote
|
69
|
+
gitlib.remote
|
89
70
|
end
|
90
71
|
|
91
72
|
|
92
73
|
def verify_preconditions
|
93
|
-
if should_remove_master
|
74
|
+
if should_remove_master?
|
94
75
|
if ask_about_removing_master
|
95
|
-
|
76
|
+
delete_master_branch!
|
96
77
|
end
|
97
78
|
end
|
98
79
|
end
|
@@ -103,46 +84,47 @@ module GitProc
|
|
103
84
|
end
|
104
85
|
|
105
86
|
|
106
|
-
def
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
my_branches[integration_branch].contains_all_of(master_branch)
|
87
|
+
def fetch_remote_changes(remote_name = nil)
|
88
|
+
if remote.exists?
|
89
|
+
gitlib.fetch(remote_name || remote.name)
|
90
|
+
else
|
91
|
+
logger.debug 'Can not fetch latest changes because there is no remote defined'
|
92
|
+
end
|
113
93
|
end
|
114
94
|
|
115
95
|
|
116
|
-
def
|
117
|
-
|
96
|
+
def is_parked?
|
97
|
+
mybranches = gitlib.branches
|
98
|
+
mybranches.parking == mybranches.current
|
118
99
|
end
|
119
100
|
|
120
101
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
elsif opts[:verbose]
|
127
|
-
Logger::DEBUG
|
128
|
-
else
|
129
|
-
Logger::INFO
|
130
|
-
end
|
102
|
+
private
|
103
|
+
|
104
|
+
|
105
|
+
def delete_master_branch!
|
106
|
+
gitlib.branches[config.master_branch].delete!
|
131
107
|
end
|
132
108
|
|
133
109
|
|
134
|
-
def
|
135
|
-
|
136
|
-
|
110
|
+
def should_remove_master?
|
111
|
+
my_branches = gitlib.branches()
|
112
|
+
gitlib.has_a_remote? and
|
113
|
+
my_branches.include?(config.master_branch) and
|
114
|
+
my_branches.current.name != config.master_branch and
|
115
|
+
!keep_local_integration_branch? and
|
116
|
+
my_branches[config.integration_branch].contains_all_of(config.master_branch)
|
137
117
|
end
|
138
118
|
|
139
119
|
|
140
|
-
|
120
|
+
def keep_local_integration_branch?
|
121
|
+
keep_local_integration_branch_config_value.to_boolean
|
122
|
+
end
|
141
123
|
|
142
124
|
|
143
125
|
#noinspection RubyInstanceMethodNamingConvention
|
144
126
|
def keep_local_integration_branch_config_value
|
145
|
-
config
|
127
|
+
gitlib.config['gitProcess.keepLocalIntegrationBranch']
|
146
128
|
end
|
147
129
|
|
148
130
|
|
@@ -163,31 +145,20 @@ module GitProc
|
|
163
145
|
end
|
164
146
|
|
165
147
|
|
166
|
-
def find_workdir(dir)
|
167
|
-
if dir == File::SEPARATOR
|
168
|
-
nil
|
169
|
-
elsif File.directory?(File.join(dir, '.git'))
|
170
|
-
dir
|
171
|
-
else
|
172
|
-
find_workdir(File.expand_path("#{dir}/.."))
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
|
177
148
|
def proc_rebase(base, opts = {})
|
178
149
|
begin
|
179
|
-
rebase(base, opts)
|
150
|
+
gitlib.rebase(base, opts)
|
180
151
|
rescue GitExecuteError => rebase_error
|
181
|
-
raise RebaseError.new(rebase_error.message,
|
152
|
+
raise RebaseError.new(rebase_error.message, gitlib)
|
182
153
|
end
|
183
154
|
end
|
184
155
|
|
185
156
|
|
186
157
|
def proc_merge(base)
|
187
158
|
begin
|
188
|
-
merge(base)
|
159
|
+
gitlib.merge(base)
|
189
160
|
rescue GitExecuteError => merge_error
|
190
|
-
raise MergeError.new(merge_error.message,
|
161
|
+
raise MergeError.new(merge_error.message, gitlib)
|
191
162
|
end
|
192
163
|
end
|
193
164
|
|
@@ -53,18 +53,18 @@ module GitProc
|
|
53
53
|
|
54
54
|
|
55
55
|
def standard_opts(parser)
|
56
|
-
parser.opt :info,
|
57
|
-
parser.opt :quiet,
|
58
|
-
parser.opt :verbose,
|
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
59
|
parser.opt :version, "Print version (#{GitProc::Version::STRING}) and exit", :short => :none
|
60
|
-
parser.opt :help,
|
60
|
+
parser.opt :help, 'Show this message', :short => :h
|
61
61
|
|
62
62
|
parser.conflicts :verbose, :info, :quiet
|
63
63
|
end
|
64
64
|
|
65
65
|
|
66
66
|
def summary
|
67
|
-
|
67
|
+
'Default summary'
|
68
68
|
end
|
69
69
|
|
70
70
|
|
@@ -74,7 +74,7 @@ module GitProc
|
|
74
74
|
|
75
75
|
|
76
76
|
def description
|
77
|
-
|
77
|
+
'Default description'
|
78
78
|
end
|
79
79
|
|
80
80
|
|
@@ -15,25 +15,16 @@ require 'git-process/git_abstract_merge_error_builder'
|
|
15
15
|
module GitProc
|
16
16
|
|
17
17
|
class RebaseError < GitProcessError
|
18
|
-
|
18
|
+
attr_reader :error_builder
|
19
19
|
|
20
|
-
attr_reader :error_message, :lib
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
@error_message = rebase_error_message
|
26
|
-
|
27
|
-
msg = build_message
|
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
|
28
24
|
|
29
25
|
super(msg)
|
30
26
|
end
|
31
27
|
|
32
|
-
|
33
|
-
def continue_command
|
34
|
-
'git rebase --continue'
|
35
|
-
end
|
36
|
-
|
37
28
|
end
|
38
29
|
|
39
30
|
end
|
@@ -0,0 +1,254 @@
|
|
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 'git-process/git_branches'
|
15
|
+
#require 'git-process/git_status'
|
16
|
+
#require 'git-process/git_process_error'
|
17
|
+
|
18
|
+
|
19
|
+
class String
|
20
|
+
|
21
|
+
def to_boolean
|
22
|
+
return false if self == false || self.nil? || self =~ (/(false|f|no|n|0)$/i)
|
23
|
+
return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
|
24
|
+
raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
class NilClass
|
31
|
+
def to_boolean
|
32
|
+
false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
module GitProc
|
38
|
+
|
39
|
+
#
|
40
|
+
# Git Remote configuration
|
41
|
+
#
|
42
|
+
class GitRemote
|
43
|
+
|
44
|
+
# @param [GitProc::GitConfig] gitconfig
|
45
|
+
def initialize(gitconfig)
|
46
|
+
@gitconfig = gitconfig
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
# @return [#info, #warn, #debug, #error]
|
51
|
+
def logger
|
52
|
+
@logger ||= @gitconfig.logger
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
# @return [GitProc::GitConfig]
|
57
|
+
def config
|
58
|
+
@gitconfig
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
# @deprecated
|
63
|
+
# TODO: Remove
|
64
|
+
def server_name
|
65
|
+
@server_name ||= self.remote_name
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
# @return [Boolean] does this have a remote defined?
|
70
|
+
def exists?
|
71
|
+
if @has_remote.nil?
|
72
|
+
@has_remote = (config.gitlib.command(:remote) != '')
|
73
|
+
end
|
74
|
+
logger.debug { "Does a remote exist? #{@has_remote}" }
|
75
|
+
@has_remote
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def repo_name
|
80
|
+
unless @repo_name
|
81
|
+
url = config["remote.#{name}.url"]
|
82
|
+
raise GitProcessError.new("There is no #{name} url set up.") if url.nil? or url.empty?
|
83
|
+
@repo_name = url.sub(/^.*:(.*?)(.git)?$/, '\1')
|
84
|
+
end
|
85
|
+
@repo_name
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def name
|
90
|
+
unless @remote_name
|
91
|
+
@remote_name = config['gitProcess.remoteName']
|
92
|
+
if @remote_name.nil? or @remote_name.empty?
|
93
|
+
remotes = self.remote_names
|
94
|
+
if remotes.empty?
|
95
|
+
@remote_name = nil
|
96
|
+
else
|
97
|
+
@remote_name = remotes[0]
|
98
|
+
raise '!@remote_name.is_a? String' unless @remote_name.is_a? String
|
99
|
+
end
|
100
|
+
end
|
101
|
+
logger.debug { "Using remote name of '#{@remote_name}'" }
|
102
|
+
end
|
103
|
+
@remote_name
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
def master_branch_name
|
108
|
+
"#{self.name}/#{config.master_branch}"
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
def remote_names
|
113
|
+
remote_str = config.gitlib.command(:remote, [:show])
|
114
|
+
if remote_str.nil? or remote_str.empty?
|
115
|
+
[]
|
116
|
+
else
|
117
|
+
remote_str.split(/\n/)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
#
|
123
|
+
# Expands the git configuration server name to a url.
|
124
|
+
#
|
125
|
+
# Takes into account further expanding an SSH uri that uses SSH aliasing in .ssh/config
|
126
|
+
#
|
127
|
+
# @param [String] server_name the git configuration server name; defaults to 'origin'
|
128
|
+
#
|
129
|
+
# @option opts [String] :ssh_config_file the SSH config file to use; defaults to ~/.ssh/config
|
130
|
+
#
|
131
|
+
# @return the fully expanded URL; never nil
|
132
|
+
#
|
133
|
+
# @raise [GitHubService::NoRemoteRepository] there is not a URL set for the server name
|
134
|
+
# @raise [URI::InvalidURIError] the retrieved URL does not have a schema
|
135
|
+
# @raise [GitHubService::NoRemoteRepository] if could not figure out a host for the retrieved URL
|
136
|
+
# @raise [::ArgumentError] if a server name is not provided
|
137
|
+
def expanded_url(server_name = 'origin', raw_url = nil, opts = {})
|
138
|
+
if raw_url.nil?
|
139
|
+
raise ArgumentError.new('Need server_name') unless server_name
|
140
|
+
|
141
|
+
conf_key = "remote.#{server_name}.url"
|
142
|
+
url = config[conf_key]
|
143
|
+
|
144
|
+
raise GitHubService::NoRemoteRepository.new("There is no value set for '#{conf_key}'") if url.nil? or url.empty?
|
145
|
+
else
|
146
|
+
raise GitHubService::NoRemoteRepository.new("There is no value set for '#{raw_url}'") if raw_url.nil? or raw_url.empty?
|
147
|
+
url = raw_url
|
148
|
+
end
|
149
|
+
|
150
|
+
if /^\S+@/ =~ url
|
151
|
+
url.sub(/^(\S+@\S+?):(.*)$/, "ssh://\\1/\\2")
|
152
|
+
else
|
153
|
+
uri = URI.parse(url)
|
154
|
+
host = uri.host
|
155
|
+
scheme = uri.scheme
|
156
|
+
|
157
|
+
raise URI::InvalidURIError.new("Need a scheme in URI: '#{url}'") unless scheme
|
158
|
+
|
159
|
+
if scheme == 'file'
|
160
|
+
url
|
161
|
+
elsif host.nil?
|
162
|
+
# assume that the 'scheme' is the named configuration in ~/.ssh/config
|
163
|
+
rv = GitRemote.hostname_and_user_from_ssh_config(scheme, opts[:ssh_config_file] ||= "#{ENV['HOME']}/.ssh/config")
|
164
|
+
|
165
|
+
raise GitHubService::NoRemoteRepository.new("Could not determine a host from #{url}") if rv.nil?
|
166
|
+
|
167
|
+
host = rv[0]
|
168
|
+
user = rv[1]
|
169
|
+
url.sub(/^\S+:(\S+)$/, "ssh://#{user}@#{host}/\\1")
|
170
|
+
else
|
171
|
+
url
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
|
177
|
+
# @return [boolean]
|
178
|
+
def rerere_enabled?
|
179
|
+
re = config['rerere.enabled']
|
180
|
+
!re.nil? && re.to_boolean
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
# @return [void]
|
185
|
+
def rerere_enabled(re, global = true)
|
186
|
+
if global
|
187
|
+
config.set_global('rerere.enabled', re)
|
188
|
+
else
|
189
|
+
config['rerere.enabled'] = re
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
|
194
|
+
# @return [boolean]
|
195
|
+
def rerere_autoupdate?
|
196
|
+
re = config['rerere.autoupdate']
|
197
|
+
!re.nil? && re.to_boolean
|
198
|
+
end
|
199
|
+
|
200
|
+
|
201
|
+
# @return [void]
|
202
|
+
def rerere_autoupdate(re, global = true)
|
203
|
+
if global
|
204
|
+
config.set_global('rerere.autoupdate', re)
|
205
|
+
else
|
206
|
+
config['rerere.autoupdate'] = re
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
|
211
|
+
# @return [void]
|
212
|
+
def add_remote(remote_name, url)
|
213
|
+
config.gitlib.command(:remote, ['add', remote_name, url])
|
214
|
+
end
|
215
|
+
|
216
|
+
|
217
|
+
alias :add :add_remote
|
218
|
+
|
219
|
+
|
220
|
+
#noinspection RubyClassMethodNamingConvention
|
221
|
+
def self.hostname_and_user_from_ssh_config(host_alias, config_file)
|
222
|
+
if File.exists?(config_file)
|
223
|
+
config_lines = File.new(config_file).readlines
|
224
|
+
|
225
|
+
in_host_section = false
|
226
|
+
host_name = nil
|
227
|
+
user_name = nil
|
228
|
+
|
229
|
+
config_lines.each do |line|
|
230
|
+
line.chop!
|
231
|
+
if /^\s*Host\s+#{host_alias}\s*$/ =~ line
|
232
|
+
in_host_section = true
|
233
|
+
next
|
234
|
+
end
|
235
|
+
|
236
|
+
if in_host_section and (/^\s*HostName\s+\S+\s*$/ =~ line)
|
237
|
+
host_name = line.sub(/^\s*HostName\s+(\S+)\s*$/, '\1')
|
238
|
+
break unless user_name.nil?
|
239
|
+
elsif in_host_section and (/^\s*User\s+\S+\s*$/ =~ line)
|
240
|
+
user_name = line.sub(/^\s*User\s+(\S+)\s*$/, '\1')
|
241
|
+
break unless host_name.nil?
|
242
|
+
elsif in_host_section and (/^\s*Host\s+.*$/ =~ line)
|
243
|
+
break
|
244
|
+
end
|
245
|
+
end
|
246
|
+
host_name.nil? ? nil : [host_name, user_name]
|
247
|
+
else
|
248
|
+
nil
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
end
|