module V1gittools
A hash with indifferent access and magic predicates.
hash = Thor::CoreExt::HashWithIndifferentAccess.new 'foo' => 'bar', 'baz' => 'bee', 'force' => true hash[:foo] #=> 'bar' hash['foo'] #=> 'bar' hash.foo? #=> true
Constants
- VERSION
Public Class Methods
config()
click to toggle source
# File lib/v1gittools/config.rb, line 10 def self.config if @config.nil? # load config from file load_config_file end @config end
default_config_file()
click to toggle source
# File lib/v1gittools/config.rb, line 19 def self.default_config_file '~/.v1git.conf' end
generate_repo_config(config_path)
click to toggle source
# File lib/v1gittools/config.rb, line 64 def self.generate_repo_config config_path return if File.exists?(config_path) puts "NOTICE: v1git has never been used for this project before. Generating default config...\n\n" `git status` if $?.to_i == 128 puts "Your current working directory isn't even a git repository! Goodbye!" exit end # guessing github address from git remote origin url git_remote_url = `git config --get remote.origin.url`.strip if git_remote_url.start_with?('http') # http connection is easy! github_url=git_remote_url.chomp('.git') elsif git_remote_url.start_with?('git') github_host, github_project_uri = git_remote_url.match(/git@(.+?):(.+?)\.git/).captures github_url = "https://#{github_host}/#{github_project_uri}" else github_url='' end url_parts = github_url.split('/') github_repo = url_parts.pop github_owner = url_parts.pop default_config_hash = { github_url: github_url, github_owner: github_owner, github_repo: github_repo, develop_branch: 'develop', github_remote: 'origin', branches: {} } write_repo_config(config_path,default_config_hash) if github_url == '' raise "ERROR: Couldn't guess github config options. Please modify github config options manually in '#{config_path}'" else puts "Config generated with the following guessed/assumed values:\n\n" puts "Develop branch: #{default_config_hash[:develop_branch]}" puts "github_url: #{github_url}\n\n" puts "github_remote: #{default_config_hash[:github_remote]}\n\n" puts "github_owner: #{github_owner}\n\n" puts "github_repo: #{github_repo}\n\n" puts "If these values are not correct, please correct it in \"#{config_path}\".\n\n" end end
initialize_github()
click to toggle source
# File lib/v1gittools/config.rb, line 126 def self.initialize_github if config[:github] && config[:github][:oauth_token] == 'AUTOGENERATE' print 'V1git requires a github access token for creating PRs. We will be requesting github for an access token' puts 'using your credentials. This will only be a one time operation.' if config[:github] && config[:github][:endpoint] endpoint = config[:github][:endpoint] puts "\nV1Git is configured to connect to: #{endpoint}\n" else endpoint = nil puts "\nV1Git is configured to connect to: api.github.com\n\n" end print "\nGithub Username: " username = STDIN.gets.chomp print "Github Password (no echo): " password = STDIN.noecho(&:gets).chomp puts "\nAutogenerating github repo authtoken with #{username} credentials..." gh = Github.new basic_auth: "#{username}:#{password}", endpoint: endpoint token = gh.oauth.create scopes: ['repo'], note: "v1gittools token for computer #{Socket.gethostname}" # load the file as a string config_data = File.read(File.expand_path(default_config_file)) # globally substitute "install" for "latest" filtered_data = config_data.gsub(/oauth_token: *"AUTOGENERATE"/, "oauth_token: \"#{token.token}\"") # open the file for writing File.open(File.expand_path(default_config_file), "w") do |f| f.write(filtered_data) end @config = nil # need to force reload of the config params after writing to it. puts "Credential generated and written to #{default_config_file} config file." end end
load_config_file(filename=nil)
click to toggle source
# File lib/v1gittools/config.rb, line 23 def self.load_config_file filename=nil filename = V1gittools::default_config_file if filename.nil? filename = File.expand_path(filename) unless File.exists?(filename) raise "Config file #{filename} must exist and be properly configured before running this tool! Please refer to v1git.conf.example." end @config = DeepHashWithIndifferentAccess.convert_hash(YAML::load(File.open(filename))) end
load_repo_config()
click to toggle source
# File lib/v1gittools/config.rb, line 53 def self.load_repo_config config_path = repo_config_path unless File.exists?(config_path) puts "v1git has not been setup for this repository yet. Please run #{$0} init to initialize and setup v1git." exit end @repo_config = DeepHashWithIndifferentAccess.convert_hash(YAML::load(File.open(config_path))) end
repo_config()
click to toggle source
# File lib/v1gittools/config.rb, line 34 def self.repo_config if @repo_config.nil? load_repo_config end @repo_config end
repo_config_path()
click to toggle source
# File lib/v1gittools/config.rb, line 43 def self.repo_config_path if @repo_config_path.nil? git_root_path = `git rev-parse --show-toplevel`.strip raise git_root_path if $?.to_i != 0 @repo_config_path = git_root_path + '/.git/v1git.conf' end @repo_config_path end
update_repo_config()
click to toggle source
# File lib/v1gittools/config.rb, line 115 def self.update_repo_config write_repo_config(V1gittools::repo_config_path, @repo_config) end
validate_config()
click to toggle source
# File lib/v1gittools/config.rb, line 166 def self.validate_config # write some checks here to make sure that # - v1 works response = Faraday.get "https://#{config[:v1config][:hostname]}/#{config[:v1config][:instance]}/Account.mvc/LogIn" if response.status == 200 puts 'Validating VersionOne URL... PASSED' else puts 'Validating VersionOne URL... FAILED' puts 'Please verify that the VersionOne (v1config block) hostname and instance is correct.' exit end print 'Validating VersionOne credentials... ' response = VersiononeSdk::Client.new(config[:v1config]).getAssets('State') # run a test query if response.empty? puts 'FAILED' puts 'Please validate that the VersionOne credentials is correct (you may need to regenerate a new token).' else puts 'PASSED' end # - git works `git status` if $?.to_i == 128 puts 'Validating git config... FAILED' puts "Your current working directory isn't even a git repository! Please make sure you're in the correct directory." exit else puts 'Validating git config... PASSED' end # - github works print 'Validating github endpoint... ' response = Faraday.get config[:github][:endpoint] begin json_response = JSON.parse(response.body) rescue puts 'FAILED' puts 'Please verify that github[:endpoint] config option is set correctly. Could not contact github.' exit end if json_response['message'] == 'Must authenticate to access this API.' || json_response['current_user_url'] != nil puts 'PASSED' else puts 'FAILED' puts 'Please verify that github[:endpoint] config option is set correctly. Could not contact github.' exit end print 'Validating github credentials...' github = Github.new(Hash[config[:github].map{ |k, v| [k.to_sym, v] }]) begin response = github.pull_requests.list(repo_config[:github_owner], repo_config[:github_repo]) rescue ArgumentError puts 'FAILED' puts "Please verify that github_owner and github_repo in #{repo_config_path} is set." exit rescue Github::Error::NotFound puts 'FAILED' puts 'Please verify that your github endpoint and credentials are correct:' puts ' - Did you put github.com creds when you meant to use github enterprise creds or visa versa?' exit rescue Github::Error::Unauthorized puts 'FAILED' puts "Please verify that the github oauth configuration setting is set correctly in #{default_config_file}" exit end puts 'PASSED' end
write_repo_config(config_path, config_hash)
click to toggle source
# File lib/v1gittools/config.rb, line 119 def self.write_repo_config config_path, config_hash File.open(config_path,'w') do |f| f.write("# This file is autogenerated and updated by v1git! Comments and formatting will be lost!\n\n") f.write(config_hash.to_yaml) end end