git_swap 1.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.
- checksums.yaml +7 -0
- data/bin/git-swap +4 -0
- data/lib/git_swap.rb +4 -0
- data/lib/git_swap/config.rb +130 -0
- data/lib/git_swap/git_helper.rb +44 -0
- data/lib/git_swap/options.rb +104 -0
- data/lib/git_swap/swapper.rb +118 -0
- data/lib/git_swap/version.rb +3 -0
- metadata +121 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a991bd670b579c23e29abdcc9a98b7400d85447f7f48508a628e15a4adff303c
|
4
|
+
data.tar.gz: ceb06a4bab1f1ccb5e337d68a35c58798d9bc5bfd6329e373e57dc9883b1586e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bcaea6bfa551bd6c58e8a1b93165046f7b77b121a73e0cb6c6b48cc5ea7d4d299fbc39d57bcdf34f3f88658de39d9ebd823047e20082d20f0d0a824eb2dceb9a
|
7
|
+
data.tar.gz: 4f11f20f56adbb64f8bc54589b38333444f00ed5cb0f2cba1849b54bc0e1d9b3656e4a97cc695898debb35b0b43d53e00d2254a316d7309cbd2edfca7262e885
|
data/bin/git-swap
ADDED
data/lib/git_swap.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module GitSwap
|
4
|
+
class Config
|
5
|
+
attr_reader :profiles, :selected_profile
|
6
|
+
def initialize(args)
|
7
|
+
@profiles = load!
|
8
|
+
@args = args
|
9
|
+
@selected_profile = get_profile(args)
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_profile(args)
|
13
|
+
args.detect {|a| !a.start_with? '-'}
|
14
|
+
end
|
15
|
+
|
16
|
+
def username
|
17
|
+
profiles[selected_profile]["username"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def email
|
21
|
+
profiles[selected_profile]["email"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def name
|
25
|
+
profiles[selected_profile]["name"]
|
26
|
+
end
|
27
|
+
|
28
|
+
def ssh
|
29
|
+
profiles[selected_profile]["ssh"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def ssh_command
|
33
|
+
"ssh -i #{ssh}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def profile
|
37
|
+
@selected_profile
|
38
|
+
end
|
39
|
+
|
40
|
+
def valid_profile?
|
41
|
+
if profiles.has_key?(selected_profile)
|
42
|
+
return true
|
43
|
+
else
|
44
|
+
puts "Profile '#{selected_profile}' not found!"
|
45
|
+
return false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def configure!
|
50
|
+
@profiles = build_profiles
|
51
|
+
write_profiles_to_config_file if @profiles.any?
|
52
|
+
end
|
53
|
+
|
54
|
+
def edit!
|
55
|
+
system("#{ENV['EDITOR']} '#{File.expand_path('~/.gitswap')}'")
|
56
|
+
end
|
57
|
+
|
58
|
+
def build_profiles
|
59
|
+
puts "How many profiles would you like to create?"
|
60
|
+
profile_count = STDIN.gets.chomp.to_i
|
61
|
+
profiles = Array.new(profile_count, {})
|
62
|
+
current = 1
|
63
|
+
profiles.map do |profile|
|
64
|
+
puts "\n#{ordinal(current)} profile name (e.g. 'work' or 'personal'):"
|
65
|
+
profile[:profile_name] = STDIN.gets.chomp
|
66
|
+
puts "Git username for #{profile[:profile_name]}:"
|
67
|
+
profile[:git_username] = STDIN.gets.chomp
|
68
|
+
puts "Git email for #{profile[:profile_name]}:"
|
69
|
+
profile[:git_email] = STDIN.gets.chomp
|
70
|
+
puts "Git name for #{profile[:profile_name]}:"
|
71
|
+
profile[:git_name] = STDIN.gets.chomp
|
72
|
+
puts "Path to ssh key for #{profile[:profile_name]} (e.g. '~/.ssh/id_rsa'):"
|
73
|
+
profile[:ssh_key] = STDIN.gets.chomp
|
74
|
+
|
75
|
+
current +=1
|
76
|
+
profile.dup
|
77
|
+
end
|
78
|
+
rescue Interrupt
|
79
|
+
return {}
|
80
|
+
end
|
81
|
+
|
82
|
+
def ordinal(number)
|
83
|
+
# Source: https://github.com/infertux/ordinalize_full
|
84
|
+
abs_number = number.abs
|
85
|
+
suffix = if (11..13).cover?(abs_number % 100)
|
86
|
+
"th"
|
87
|
+
else
|
88
|
+
case abs_number % 10
|
89
|
+
when 1 then "st"
|
90
|
+
when 2 then "nd"
|
91
|
+
when 3 then "rd"
|
92
|
+
else "th"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
"#{abs_number}#{suffix}"
|
96
|
+
end
|
97
|
+
|
98
|
+
def write_profiles_to_config_file
|
99
|
+
File.open(File.expand_path('~/.gitswap'), 'w') do |file|
|
100
|
+
profiles.each do |profile|
|
101
|
+
file.write "#{profile[:profile_name]}:\n"
|
102
|
+
file.write " username: #{profile[:git_username]}\n"
|
103
|
+
file.write " email: #{profile[:git_email]}\n"
|
104
|
+
file.write " name: #{profile[:git_name]}\n"
|
105
|
+
file.write " ssh: #{profile[:ssh_key]}\n"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def print_list
|
111
|
+
profiles = @profiles.map do |key, value|
|
112
|
+
prefix = value["username"] == current_git_username ? "=>" : " "
|
113
|
+
"#{prefix} #{key}"
|
114
|
+
end
|
115
|
+
puts profiles
|
116
|
+
puts "\n# => - current" if @profiles.any? {|key, value| value["username"] == current_git_username}
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
def load!
|
122
|
+
# TODO: RCR - Handle missing or empty config file
|
123
|
+
YAML.load_file(File.expand_path('~/.gitswap')) || {}
|
124
|
+
end
|
125
|
+
|
126
|
+
def current_git_username
|
127
|
+
`git config user.username`.chomp
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module GitSwap
|
2
|
+
class GitHelper
|
3
|
+
def self.git_repo?
|
4
|
+
!find_git_repo.nil?
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
# Copied from https://gist.github.com/nickmccurdy/8466084
|
9
|
+
# Script: Find the current git repository
|
10
|
+
# Based on https://github.com/mojombo/grit/pull/178 by https://github.com/derricks
|
11
|
+
|
12
|
+
# Returns true if the given path represents a root directory (/ or C:/)
|
13
|
+
def self.root_directory?(file_path)
|
14
|
+
# Implementation inspired by http://stackoverflow.com/a/4969416:
|
15
|
+
# Does file + ".." resolve to the same directory as file_path?
|
16
|
+
File.directory?(file_path) &&
|
17
|
+
File.expand_path(file_path) == File.expand_path(File.join(file_path, '..'))
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns the git root directory given a path inside the repo. Returns nil if
|
21
|
+
# the path is not in a git repo.
|
22
|
+
def self.find_git_repo(start_path = '.')
|
23
|
+
raise NoSuchPathError unless File.exists?(start_path)
|
24
|
+
|
25
|
+
current_path = File.expand_path(start_path)
|
26
|
+
|
27
|
+
# for clarity: set to an explicit nil and then just return whatever
|
28
|
+
# the current value of this variable is (nil or otherwise)
|
29
|
+
return_path = nil
|
30
|
+
|
31
|
+
until root_directory?(current_path)
|
32
|
+
if File.exists?(File.join(current_path, '.git'))
|
33
|
+
# done
|
34
|
+
return_path = current_path
|
35
|
+
break
|
36
|
+
else
|
37
|
+
# go up a directory and try again
|
38
|
+
current_path = File.dirname(current_path)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
return_path
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module GitSwap
|
2
|
+
class Options
|
3
|
+
attr_reader :args
|
4
|
+
def initialize(args)
|
5
|
+
@args = args
|
6
|
+
end
|
7
|
+
|
8
|
+
def flags
|
9
|
+
@flags ||= args.select do |arg|
|
10
|
+
arg.match(/\A\-[ceglv]{1}\z/) ||
|
11
|
+
arg.match(/\A\-\-(config|edit|global|list|verbose|version){1}\z/)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def valid_args?
|
16
|
+
if config?
|
17
|
+
return true
|
18
|
+
elsif edit?
|
19
|
+
return true
|
20
|
+
elsif list?
|
21
|
+
return true
|
22
|
+
elsif version?
|
23
|
+
return true
|
24
|
+
elsif verbose?
|
25
|
+
return true
|
26
|
+
elsif no_flags?
|
27
|
+
return true
|
28
|
+
elsif one_flag? && !flag_only?
|
29
|
+
return true
|
30
|
+
elsif usage?
|
31
|
+
return true
|
32
|
+
else
|
33
|
+
puts "Invalid args"
|
34
|
+
return false
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def usage?
|
39
|
+
args.count == 0
|
40
|
+
end
|
41
|
+
|
42
|
+
def config?
|
43
|
+
config_flag? && args.count == 1
|
44
|
+
end
|
45
|
+
|
46
|
+
def edit?
|
47
|
+
edit_flag? && args.count == 1
|
48
|
+
end
|
49
|
+
|
50
|
+
def list?
|
51
|
+
list_flag? && args.count == 1
|
52
|
+
end
|
53
|
+
|
54
|
+
def version?
|
55
|
+
version_flag? && args.count == 1
|
56
|
+
end
|
57
|
+
|
58
|
+
def global?
|
59
|
+
(flags.include? '-g') || (flags.include? '--global')
|
60
|
+
end
|
61
|
+
|
62
|
+
def verbose?
|
63
|
+
verbose_flag? && args.count > 1
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def config_flag?
|
69
|
+
(flags.include? '-c') || (flags.include? '--config')
|
70
|
+
end
|
71
|
+
|
72
|
+
def edit_flag?
|
73
|
+
(flags.include? '-e') || (flags.include? '--edit')
|
74
|
+
end
|
75
|
+
|
76
|
+
def list_flag?
|
77
|
+
(flags.include? '-l') || (flags.include? '--list')
|
78
|
+
end
|
79
|
+
|
80
|
+
def version_flag?
|
81
|
+
((flags.include? '-v') && args.count == 1) || (flags.include? '--version')
|
82
|
+
end
|
83
|
+
|
84
|
+
def verbose_flag?
|
85
|
+
((flags.include? '-v') && args.count > 1) || (flags.include? '--verbose')
|
86
|
+
end
|
87
|
+
|
88
|
+
def no_flags?
|
89
|
+
args.length == 1 && flag_count(args) == 0
|
90
|
+
end
|
91
|
+
|
92
|
+
def one_flag?
|
93
|
+
args.length == 2 && flag_count(args) == 1
|
94
|
+
end
|
95
|
+
|
96
|
+
def flag_only?
|
97
|
+
list_flag? || config_flag? || version_flag?
|
98
|
+
end
|
99
|
+
|
100
|
+
def flag_count(args)
|
101
|
+
args.count {|a| a.start_with? '-'}
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require_relative './version'
|
2
|
+
require 'active_support/core_ext/module/delegation'
|
3
|
+
|
4
|
+
module GitSwap
|
5
|
+
class Swapper
|
6
|
+
attr_reader :config, :options
|
7
|
+
delegate :usage?, :config?, :edit?, :list?, :version?, :global?, to: :options
|
8
|
+
delegate :profile, :name, :username, :email, :ssh, :ssh_command, :print_list, :configure!, :edit!, :valid_profile?, to: :config
|
9
|
+
|
10
|
+
def initialize(args)
|
11
|
+
raise ArgumentError unless args.is_a? Array
|
12
|
+
@options = GitSwap::Options.new(args)
|
13
|
+
@config = GitSwap::Config.new(args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
return unless options.valid_args?
|
18
|
+
if usage?
|
19
|
+
print_usage
|
20
|
+
elsif config?
|
21
|
+
configure!
|
22
|
+
elsif edit?
|
23
|
+
edit!
|
24
|
+
elsif list?
|
25
|
+
print_list
|
26
|
+
elsif version?
|
27
|
+
print_version
|
28
|
+
else
|
29
|
+
set!
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def git_repo?
|
34
|
+
if GitHelper.git_repo? || global?
|
35
|
+
return true
|
36
|
+
else
|
37
|
+
puts "Not a git repo. Please run from a git repo or run with `-g` to update global settings."
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def set!
|
43
|
+
return unless valid_profile? && git_repo?
|
44
|
+
|
45
|
+
set_git_config
|
46
|
+
set_ssh
|
47
|
+
print_settings
|
48
|
+
end
|
49
|
+
|
50
|
+
def print_usage
|
51
|
+
puts usage
|
52
|
+
end
|
53
|
+
|
54
|
+
def print_version
|
55
|
+
puts GitSwap::VERSION
|
56
|
+
end
|
57
|
+
|
58
|
+
def print_settings
|
59
|
+
if options.verbose?
|
60
|
+
puts "\nGit Config:"
|
61
|
+
puts `git config #{git_config_flag} -l --show-origin | grep user`
|
62
|
+
puts "\nSSH:"
|
63
|
+
puts `ssh-add -l`
|
64
|
+
else
|
65
|
+
puts "Swapped to profile #{profile}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def git_config_flag
|
72
|
+
@git_config_flag ||= global? ? '--global' : ''
|
73
|
+
end
|
74
|
+
|
75
|
+
def set_git_config
|
76
|
+
`git config #{git_config_flag} user.name "#{name}"`
|
77
|
+
`git config #{git_config_flag} user.username "#{username}"`
|
78
|
+
`git config #{git_config_flag} user.email "#{email}"`
|
79
|
+
end
|
80
|
+
|
81
|
+
def set_ssh
|
82
|
+
`git config #{git_config_flag} core.sshCommand "#{ssh_command}"`
|
83
|
+
if options.verbose?
|
84
|
+
`ssh-add #{ssh}`
|
85
|
+
else
|
86
|
+
`ssh-add #{ssh} 2>/dev/null`
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def usage
|
91
|
+
<<~USAGE
|
92
|
+
usage: git swap [-c | --config] [-e | --edit] [-l | --list] [-v | --version]
|
93
|
+
<profile> [-v | --verbose] [-g | --global]
|
94
|
+
|
95
|
+
configure profiles
|
96
|
+
git swap -c
|
97
|
+
|
98
|
+
open configuration file in editor
|
99
|
+
git swap -e
|
100
|
+
|
101
|
+
swap to a profile for local development only
|
102
|
+
git swap <profile>
|
103
|
+
|
104
|
+
swap to a profile globally
|
105
|
+
git swap -g <profile>
|
106
|
+
|
107
|
+
swap to a profile and see all output
|
108
|
+
git swap -v <profile>
|
109
|
+
|
110
|
+
see available profiles
|
111
|
+
git swap -l
|
112
|
+
|
113
|
+
view installed gem version
|
114
|
+
git swap -v
|
115
|
+
USAGE
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: git_swap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Randall Reed, Jr.
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-07-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.1.4
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.1.4
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec_junit_formatter
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.4.1
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.4.1
|
83
|
+
description: Easily swap between git profiles (name, username, email) and ssh keys
|
84
|
+
email:
|
85
|
+
- randallreedjr@gmail.com
|
86
|
+
executables:
|
87
|
+
- git-swap
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- bin/git-swap
|
92
|
+
- lib/git_swap.rb
|
93
|
+
- lib/git_swap/config.rb
|
94
|
+
- lib/git_swap/git_helper.rb
|
95
|
+
- lib/git_swap/options.rb
|
96
|
+
- lib/git_swap/swapper.rb
|
97
|
+
- lib/git_swap/version.rb
|
98
|
+
homepage: https://www.github.com/randallreedjr/git_swap
|
99
|
+
licenses:
|
100
|
+
- MIT
|
101
|
+
metadata: {}
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubygems_version: 3.0.3
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: Swap between git profiles
|
121
|
+
test_files: []
|