lib/git/configure.rb (79 lines of code) (raw):
# frozen_string_literal: true
module Git
class Configure
def initialize(global: false)
@global = global
end
def run!
recommendations.each do |rec|
GDK::Output.puts(rec.description)
GDK::Output.puts("Possible input: #{rec.possible_values.join(',')} (default: #{rec.default})")
input = $stdin.gets.chomp
input = rec.default if input.empty?
GDK::Output.abort("Invalid input: #{input}, possible values: #{rec.possible_values}") unless rec.valid_input_value?(input)
set_config(rec.key, input)
GDK::Output.puts # New line to separate each recommendation
end
end
private
def recommendations
[
Recommendation.new(
'rerere.enabled',
true,
'While rebases, remember how previous conflicts were resolved and apply the same resolution'
),
Recommendation.new(
'help.autocorrect',
0,
'Let git auto correct commands after some deciseconds, e.g. git branhc <something> will be executed as if you typed git branch (0 = disabled, -1 = execute immediately, 50 = wait 5 secs)',
[0, -1, 5]
),
Recommendation.new(
'fetch.prune',
true,
'Prune references in remotes/<remote_name> if these are removed on the server'
),
Recommendation.new(
'tag.sort',
'-v:refname',
'Reverse sort the tags by name, meaning that v1.1 is listed before v1.0',
%w[-v:refname v:refname]
)
]
end
def gdk_repositories
@gdk_repositories ||= GDK.config.git_repositories
end
def set_config(key, value)
if @global
run_git(%W[config --global #{key} #{value}])
else
gdk_repositories.each do |repo|
run_git(%W[config #{key} #{value}], repo_path: repo)
end
end
end
def run_git(args, repo_path: nil)
# Passing an array to IO.popen guards against sh -c.
# https://gitlab.com/gitlab-org/gitlab/blob/master/doc/development/shell_commands.md#bypass-the-shell-by-splitting-commands-into-separate-tokens
raise 'command must be an array' unless args.is_a?(Array)
args.unshift('git')
if repo_path
system(*args, chdir: repo_path)
else
system(*args)
end
end
end
class Recommendation
attr_reader :key, :default, :possible_values, :description
def initialize(key, default, desc, possible_values = [true, false])
@key = key
@default = default
@description = desc
@possible_values = possible_values
raise 'default value is not valid for the recommendation' unless valid_input_value?(default)
end
def valid_input_value?(value)
possible_values.map(&:to_s).include?(value.to_s)
end
end
end