gitswitch 0.2.5 → 0.3.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/.gitignore CHANGED
@@ -5,17 +5,12 @@
5
5
  *.tmproj
6
6
  tmtags
7
7
 
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
8
  ## PROJECT::GENERAL
17
9
  coverage
18
10
  rdoc
19
- pkg
11
+ pkg/*
12
+ *.gem
13
+ .bundle
14
+ Gemfile.lock
20
15
 
21
16
  ## PROJECT::SPECIFIC
data/Gemfile CHANGED
@@ -1,12 +1,2 @@
1
- # A sample Gemfile
2
1
  source "http://rubygems.org"
3
-
4
- group :development do
5
- # gem "rake"
6
- gem "rspec", "~> 2.0.0.beta.22"
7
- gem "bundler", "~> 1.0.0"
8
- gem "jeweler", "~> 1.4.0"
9
- # gem "rcov", ">= 0"
10
- # gem "test-construct"
11
- end
12
-
2
+ gemspec
data/README.rdoc CHANGED
@@ -4,7 +4,7 @@ Easily set/switch your current git user info for a git repo .git/config or your
4
4
 
5
5
  This gem should come in handy if you have work and personal repositories. It also might help with switching between users while pair programming.
6
6
 
7
- Would you rather type "git config user.email 'me@work.com'", etc. or type "gitswitch -r work"? If you answered the latter, check out this gem.
7
+ Would you rather type "git config user.email 'me@work.com'", etc. or type "gitswitch switch work"? If you answered the latter, check out this gem.
8
8
 
9
9
  == Install
10
10
 
@@ -12,8 +12,8 @@ Would you rather type "git config user.email 'me@work.com'", etc. or type "gitsw
12
12
 
13
13
  == Usage
14
14
 
15
- Simply run the script to establish a default ~/.gitswitch file using the git info you already have in your ~/.gitconfig file
16
- # gitswitch
15
+ First, establish a default ~/.gitswitch file using the git info you already have in your ~/.gitconfig file
16
+ # gitswitch init
17
17
 
18
18
  Gitswitch users file ~/.gitswitch not found. Would you like to create one? (y/n): y
19
19
  Adding your global .gitconfig user info to the "default" tag...
@@ -21,22 +21,22 @@ Simply run the script to establish a default ~/.gitswitch file using the git inf
21
21
  Name: Joe Alba
22
22
  E-mail: joe@home.com
23
23
 
24
- Add a new git user tag
25
- # gitswitch -a
24
+ Now, add a new git user tag
25
+ # gitswitch add
26
26
 
27
27
  Enter a tag to describe this git user entry: work
28
28
  E-mail address: jalba@work.com
29
29
  Name (ENTER to use "Joe Alba"): Joseph M. Alba
30
30
 
31
31
  Set specific user info to your current git repository by updating .git/config
32
- # gitswitch -r work # Update .git/config with your 'work' git user info
32
+ # gitswitch switch work # Update .git/config with your 'work' git user info
33
33
  Switching git user to "work" tag for the current repository (Joseph M. Alba <jalba@work.com>).
34
34
 
35
- # gitswitch -r # User info from your 'default' tag is used if you don't specify a tag
35
+ # gitswitch switch # User info from your 'default' tag is used if you don't specify a tag
36
36
  Switching git user to "default" tag for the current repository (Joe Alba <joe@home.com>).
37
37
 
38
38
  List all the gitswitch user tags/info you have stored
39
- # gitswitch -l
39
+ # gitswitch list
40
40
 
41
41
  Current git user options --
42
42
  default:
@@ -46,6 +46,22 @@ List all the gitswitch user tags/info you have stored
46
46
  Name: Joseph M. Alba
47
47
  E-mail: jalba@work.com
48
48
 
49
+ Update a current entry. [TAG] parameter is optional. If omitted, you'll see a list.
50
+ # gitswitch update [TAG]
51
+
52
+ Delete a current entry. [TAG] parameter is optional. If omitted, you'll see a list.
53
+ # gitswitch delete [TAG]
54
+
55
+ Update your global .git user instead of your current repository
56
+ # gitswitch global work
57
+
58
+ Show your current git user info. If you are in a git repo directory, it will show you the info associated with the current repository. Outside a repo (or if you use the --global option), it will show you the info from your global .git config.
59
+ # gitswitch info
60
+
61
+ == What's with all the aliases?
62
+
63
+ I initially wrote the gem using optparse and used the '-r' style params to keep the commands as short as possible. Now, I've decided to lean toward a rake-style descriptive method of passing commands -- which meshes well with the way Thor likes to do things. But the old command line options still work fine in case you got used to it.
64
+
49
65
  == Copyright
50
66
 
51
67
  Copyright (c) 2010 Joe Alba. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,37 +1,8 @@
1
- require 'rubygems'
2
- require 'rake'
3
- require 'rspec/core'
1
+ require 'bundler'
2
+ require 'rspec'
4
3
  require 'rspec/core/rake_task'
5
4
 
6
-
7
- begin
8
- require 'jeweler'
9
- Jeweler::Tasks.new do |gem|
10
- gem.name = "gitswitch"
11
- gem.summary = %Q{Easy git user switching}
12
- gem.description = %Q{Easily switch your git name/e-mail user info -- Handy for work vs. personal and for pair programming}
13
- gem.email = "joe@joealba.com"
14
- gem.homepage = "http://github.com/joealba/gitswitch"
15
- gem.authors = ["Joe Alba"]
16
- # gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
17
- # gem.add_development_dependency "rspec", ">= 0"
18
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
- end
20
- Jeweler::GemcutterTasks.new
21
- rescue LoadError
22
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
- end
24
-
25
-
26
- require 'rake/rdoctask'
27
- Rake::RDocTask.new do |rdoc|
28
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
29
-
30
- rdoc.rdoc_dir = 'rdoc'
31
- rdoc.title = "gitswitch #{version}"
32
- rdoc.rdoc_files.include('README*')
33
- rdoc.rdoc_files.include('lib/**/*.rb')
34
- end
5
+ Bundler::GemHelper.install_tasks
35
6
 
36
7
 
37
8
  desc 'Default: Run specs'
@@ -42,4 +13,3 @@ RSpec::Core::RakeTask.new(:spec) do |t|
42
13
  t.pattern = FileList["spec/**/*_spec.rb"]
43
14
  end
44
15
 
45
-
data/bin/gitswitch CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "gitswitch"
4
- GitSwitch.run ARGV
4
+ Gitswitch::CLI.start
data/gitswitch.gemspec CHANGED
@@ -1,58 +1,37 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "gitswitch/version"
5
4
 
6
5
  Gem::Specification.new do |s|
7
6
  s.name = %q{gitswitch}
8
- s.version = "0.2.5"
7
+ s.version = Gitswitch::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
10
  s.authors = ["Joe Alba"]
12
- s.date = %q{2010-09-23}
11
+ s.date = %q{2010-09-27}
13
12
  s.default_executable = %q{gitswitch}
13
+ s.homepage = %q{http://github.com/joealba/gitswitch}
14
14
  s.description = %q{Easily switch your git name/e-mail user info -- Handy for work vs. personal and for pair programming}
15
+ s.summary = %q{Easy git user switching}
15
16
  s.email = %q{joe@joealba.com}
16
- s.executables = ["gitswitch"]
17
+
17
18
  s.extra_rdoc_files = [
18
19
  "LICENSE",
19
- "README.rdoc"
20
- ]
21
- s.files = [
22
- ".bundle/config",
23
- ".document",
24
- ".gitignore",
25
- ".rspec",
26
- "Gemfile",
27
- "Gemfile.lock",
28
- "LICENSE",
29
- "README.rdoc",
30
- "Rakefile",
31
- "VERSION",
32
- "bin/gitswitch",
33
- "gitswitch.gemspec",
34
- "lib/gitswitch.rb",
35
- "spec/gitswitch_spec.rb",
36
- "spec/spec_helper.rb"
20
+ "README.rdoc"
37
21
  ]
38
- s.homepage = %q{http://github.com/joealba/gitswitch}
39
- s.rdoc_options = ["--charset=UTF-8"]
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
40
26
  s.require_paths = ["lib"]
27
+
28
+ s.rdoc_options = ["--charset=UTF-8"]
41
29
  s.rubygems_version = %q{1.3.7}
42
- s.summary = %q{Easy git user switching}
43
- s.test_files = [
44
- "spec/gitswitch_spec.rb",
45
- "spec/spec_helper.rb"
46
- ]
47
30
 
48
- if s.respond_to? :specification_version then
49
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
- s.specification_version = 3
51
31
 
52
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
- else
54
- end
55
- else
56
- end
32
+ s.add_dependency('rake')
33
+ s.add_dependency('thor')
34
+ s.add_development_dependency(%q<rspec>, [">= 2.3.0"])
35
+
57
36
  end
58
37
 
@@ -0,0 +1,150 @@
1
+ require 'thor'
2
+
3
+
4
+ class Gitswitch
5
+ class CLI < Thor
6
+
7
+
8
+ ######################################################################
9
+ desc "init", "Initialize your .gitswitch file"
10
+ def init
11
+ if !Gitswitch::gitswitch_file_exists
12
+ if yes?("Gitswitch users file ~/.gitswitch not found. Would you like to create one? (y/n): ")
13
+ Gitswitch::new.create_fresh_gitswitch_file
14
+ else
15
+ puts "Ok, that's fine. Exiting."
16
+ exit
17
+ end
18
+ else
19
+ if yes?("Gitswitch users file ~/.gitswitch already exists. Would you like to wipe it out and create a fresh one? (y/n): ")
20
+ Gitswitch::new.create_fresh_gitswitch_file
21
+ end
22
+ end
23
+ end
24
+
25
+
26
+ ######################################################################
27
+ desc "version", "Show the gitswitch version"
28
+ map ["-v","--version"] => :version
29
+ def version
30
+ puts Gitswitch::VERSION
31
+ end
32
+
33
+
34
+ ######################################################################
35
+ desc "info", "Show the current git user"
36
+ map "-i" => :info
37
+ method_option :global, :type => :boolean
38
+ def info
39
+ puts Gitswitch.current_user_info(options)
40
+ end
41
+
42
+
43
+ ######################################################################
44
+ desc "list", "Show all the git user tags you have configured"
45
+ map ["-l","--list"] => :list
46
+ def list
47
+ puts Gitswitch.new.list_users
48
+ end
49
+
50
+
51
+ ######################################################################
52
+ desc "switch [TAG]", "Switch git user"
53
+ map "-r" => :switch
54
+ method_option :global, :type => :boolean, :aliases => ["-s","--global"] ## To support the deprecated behavior
55
+ method_option :repository, :type => :boolean, :aliases => "-r"
56
+ def switch(tag = 'default')
57
+ options[:global] ? switch_global(tag) : Gitswitch.new.switch_repo_user(tag)
58
+ puts Gitswitch.current_user_info
59
+ end
60
+
61
+
62
+ ######################################################################
63
+ desc "global [TAG]", "Switch global git user"
64
+ map "-s" => :switch_global
65
+ def switch_global(tag = 'default')
66
+ Gitswitch.new.switch_global_user(tag)
67
+ puts Gitswitch.current_user_info
68
+ end
69
+
70
+
71
+ ######################################################################
72
+ desc "add [TAG]", "Add a new tagged user entry"
73
+ map ["-a","--add"] => :add
74
+ def add(tag = '')
75
+ gs = Gitswitch.new
76
+
77
+ tag.gsub!(/\W+/,'')
78
+ tag = ask("Enter a tag to describe this git user entry: ").gsub(/\W+/,'') if (tag.nil? || tag.empty?)
79
+
80
+ if tag.empty?
81
+ puts "You must enter a short tag to describe the git user entry you would like to save."
82
+ exit
83
+ end
84
+
85
+ puts "Adding a new gitswitch user entry for tag '#{tag}'"
86
+ (email, name) = prompt_for_email_and_name
87
+ gs.set_gitswitch_entry(tag, email, name)
88
+ end
89
+
90
+
91
+ ######################################################################
92
+ desc "update [TAG]", "Update a tagged user entry"
93
+ map ["-o","--overwrite"] => :add
94
+ def update(tag = '')
95
+ gs = Gitswitch.new
96
+ tag_table = gs.get_tag_display
97
+
98
+ tag.gsub!(/\W+/,'')
99
+ if (tag.nil? || tag.empty?)
100
+ tag = ask("Which tag would you like to update: \n#{tag_table}").gsub(/\W+/,'')
101
+ end
102
+
103
+ puts "Updating #{tag} entry..."
104
+ (email, name) = prompt_for_email_and_name
105
+ Gitswitch.new.set_gitswitch_entry(tag, email, name)
106
+ end
107
+
108
+
109
+ ######################################################################
110
+ desc "delete [TAG]", "Delete a tagged user entry"
111
+ def delete(tag = '')
112
+ gs = Gitswitch.new
113
+
114
+ tag_table = gs.get_tag_display
115
+
116
+ tag.gsub!(/\W+/,'')
117
+ if (tag.nil? || tag.empty?)
118
+ tag = ask("Which tag would you like to delete: \n#{tag_table}").gsub(/\W+/,'')
119
+ end
120
+
121
+ Gitswitch.new.delete_gitswitch_entry(tag)
122
+ end
123
+
124
+
125
+ private
126
+
127
+
128
+ ######################################################################
129
+ def prompt_for_email_and_name
130
+ email = ask(" E-mail address: ").chomp
131
+ ## TODO: Validate e-mail
132
+ if email.nil?
133
+ puts "No name provided"
134
+ exit
135
+ end
136
+
137
+ name = ask(" Name: (ENTER to use \"" + Gitswitch::get_git_user_info({:global => true})[:name] + "\") ").chomp
138
+ name = Gitswitch::get_git_user_info({:global => true})[:name] if name.empty?
139
+
140
+ if name.nil?
141
+ puts "No name provided"
142
+ exit
143
+ end
144
+
145
+ return [email, name]
146
+ end
147
+
148
+
149
+ end
150
+ end
@@ -0,0 +1,171 @@
1
+ require 'yaml'
2
+ require 'shellwords' if !String.new.methods.include?('shellescape')
3
+
4
+
5
+ class Gitswitch
6
+ GITSWITCH_CONFIG_FILE = File.join ENV["HOME"], ".gitswitch"
7
+ GIT_BIN = '/usr/bin/env git'
8
+
9
+ attr_reader :users
10
+
11
+
12
+ ##############################################################
13
+ def initialize
14
+ @users = {}
15
+ if Gitswitch::gitswitch_file_exists
16
+ @users = YAML::load_file GITSWITCH_CONFIG_FILE
17
+ if @users.nil?
18
+ puts "Error loading .gitswitch file. Delete the file and start fresh."
19
+ exit
20
+ end
21
+ end
22
+ end
23
+
24
+
25
+ ##############################################################
26
+ # Create a .gitswitch file with the current user defaults
27
+ def create_fresh_gitswitch_file
28
+ @users = {}
29
+ user = Gitswitch::get_git_user_info({:global => true})
30
+ if user[:name].empty? && user[:email].empty?
31
+ puts "ERROR: You must set up a default git user.name and user.email first."
32
+ else
33
+ puts "Adding your global .gitconfig user info to the \"default\" tag..."
34
+ set_gitswitch_entry('default', user[:email], user[:name])
35
+ save_gitswitch_file
36
+ end
37
+ end
38
+
39
+ def self.gitswitch_file_exists
40
+ File.exists? GITSWITCH_CONFIG_FILE
41
+ end
42
+
43
+ def save_gitswitch_file
44
+ if fh = File.open(GITSWITCH_CONFIG_FILE, 'w')
45
+ fh.write(@users.to_yaml)
46
+ fh.close
47
+ else
48
+ puts "ERROR: Could not open/write the gitswitch config file: #{GITSWITCH_CONFIG_FILE}"
49
+ end
50
+ end
51
+
52
+
53
+ ##############################################################
54
+ # Set git user parameters for a tag
55
+ # ==== Parameters
56
+ # * +tag+ - Required. The tag you want to add to your .gitswitch file
57
+ # * +email+ - Required
58
+ # * +name+ - Required
59
+ def set_gitswitch_entry(tag, email, name)
60
+ @users[tag] = {:name => name, :email => email}
61
+ save_gitswitch_file
62
+ end
63
+
64
+ def delete_gitswitch_entry(tag)
65
+ if tag == 'default'
66
+ puts "Cannot delete the default tag. Use the update command instead"
67
+ exit
68
+ end
69
+ @users.delete(tag)
70
+ save_gitswitch_file
71
+ end
72
+
73
+ def get_user(tag)
74
+ if !@users.empty? && @users[tag] && !@users[tag].empty?
75
+ @users[tag]
76
+ end
77
+ end
78
+
79
+ def get_tags
80
+ @users.keys
81
+ end
82
+
83
+ def get_tag_display
84
+ max_length = @users.keys.sort{|x,y| y.length <=> x.length }.first.length
85
+ @users.each_pair.map {|key,value| sprintf(" %#{max_length}s %s\n", key, value[:email]) }
86
+ end
87
+
88
+ def list_users
89
+ response = ''
90
+ response << "\nCurrent git user options --\n"
91
+ @users.each do |key, user|
92
+ response << "#{key}:\n"
93
+ response << " Name: #{user[:name]}\n" if !user[:name].to_s.empty?
94
+ response << " E-mail: #{user[:email]}\n\n"
95
+ end
96
+ response
97
+ end
98
+
99
+ ## Return active user information.
100
+ ## If you're in a git repo, show that user info. Otherwise, display the global info.
101
+ def self.current_user_info(options = {})
102
+ response = !Gitswitch::in_a_git_repo || options[:global] ? "Your git user information from your global config:\n" : "Your git user information from the current repository:\n"
103
+ current_git_user = Gitswitch::get_git_user_info(options)
104
+ response << "Name: #{current_git_user[:name]}\n"
105
+ response << "E-mail: #{current_git_user[:email]}\n"
106
+ response
107
+ end
108
+
109
+ def self.in_a_git_repo
110
+ %x(#{GIT_BIN} status 2>&1 | head -n 1).to_s =~ /^fatal/i ? false : true
111
+ end
112
+
113
+
114
+ ##############################################################
115
+ def git_config(user, options = {})
116
+ git_args = 'config --replace-all'
117
+ git_args += ' --global' if options[:global]
118
+
119
+ %x(#{GIT_BIN} #{git_args} user.email #{user[:email].to_s.shellescape})
120
+ %x(#{GIT_BIN} #{git_args} user.name #{user[:name].to_s.shellescape}) if !user[:name].to_s.empty?
121
+ end
122
+
123
+
124
+ ##############################################################
125
+ # Switch git user in your global .gitconfig file
126
+ # ==== Parameters
127
+ # * +tag+ - The tag associated with your desired git info in .gitswitch. Defaults to "default".
128
+ def switch_global_user tag = "default"
129
+ if user = get_user(tag)
130
+ puts "Switching your .gitconfig user info to \"#{tag}\" tag (#{user[:name]} <#{user[:email]}>)."
131
+ git_config(user, {:global => true})
132
+ else
133
+ puts "ERROR: Could not find info for tag \"#{tag}\" in your .gitswitch file"
134
+ end
135
+ end
136
+
137
+
138
+ # Set the git user information for current repository
139
+ # ==== Parameters
140
+ # * +tag+ - The tag associated with your desired git info in .gitswitch. Defaults to "default".
141
+ def switch_repo_user(tag = "default")
142
+ ## TODO: See if we're actually in a git repo
143
+ if !Gitswitch::in_a_git_repo
144
+ puts "You do not appear to currently be in a git repository directory"
145
+ false
146
+ else
147
+ if user = get_user(tag)
148
+ puts "Switching git user to \"#{tag}\" tag for the current repository (#{user[:name]} <#{user[:email]}>)."
149
+ git_config(user) or raise "Could not change the git user settings to your repository."
150
+ else
151
+ puts "ERROR: Could not find info for tag \"#{tag}\" in your .gitswitch file"
152
+ end
153
+ end
154
+ end
155
+
156
+
157
+
158
+ private
159
+
160
+ # Show the current git user info
161
+ def self.get_git_user_info(options = {})
162
+ git_args = 'config --get'
163
+ git_args += ' --global' if options[:global]
164
+
165
+ {
166
+ :name => %x(#{GIT_BIN} #{git_args} user.name).to_s.chomp,
167
+ :email => %x(#{GIT_BIN} #{git_args} user.email).to_s.chomp
168
+ }
169
+ end
170
+
171
+ end
@@ -0,0 +1,3 @@
1
+ class Gitswitch
2
+ VERSION = "0.3.0"
3
+ end
data/lib/gitswitch.rb CHANGED
@@ -1,250 +1,6 @@
1
- require 'optparse'
2
- require 'yaml'
3
- require 'shellwords' if !String.new.methods.include?('shellescape')
1
+ require 'gitswitch/version'
2
+ require 'gitswitch/commands'
3
+ require 'gitswitch/cli'
4
+ #Gitswitch::CLI.start ## If we decide to use Thor
4
5
 
5
6
 
6
- class GitSwitch
7
- GITSWITCH_CONFIG_FILE = File.join ENV["HOME"], ".gitswitch"
8
- GIT_BIN = '/usr/bin/env git'
9
- VERSION_FILE = File.join File.dirname(__FILE__), "..", "VERSION"
10
-
11
-
12
- def self.run args = ARGV
13
- gitswitch = GitSwitch.new
14
- gitswitch.parse_args args
15
- end
16
-
17
-
18
- def initialize
19
- @users = {}
20
- if File.exists? GITSWITCH_CONFIG_FILE
21
- @users = YAML::load_file GITSWITCH_CONFIG_FILE
22
- if @users.nil?
23
- puts "Error loading .gitswitch file"
24
- exit
25
- end
26
- else
27
- print "Gitswitch users file ~/.gitswitch not found. Would you like to create one? (y/n): "
28
- if gets.chomp =~ /^y/i
29
- create_gitswitch_file
30
- else
31
- puts "Ok, that's fine. Exiting."
32
- exit
33
- end
34
- end
35
- end
36
-
37
-
38
- # Read and parse the supplied command line arguments.
39
- def parse_args args = ARGV
40
- args = ["-h"] if args.empty?
41
-
42
- parser = OptionParser.new do |o|
43
- o.banner = "Usage: gitswitch [options]"
44
-
45
- o.on "-l", "--list", "Show all git users you have configured" do
46
- list_users
47
- exit
48
- end
49
-
50
- o.on "-i", "--info", "Show the current git user info." do
51
- print_info
52
- exit
53
- end
54
-
55
- o.on "-s", "--switch [TAG]", String, "Switch git user to the specified tag in your user's global git configuration" do |tag|
56
- tag ||= 'default'
57
- switch_global_user(tag)
58
- print_info
59
- exit
60
- end
61
-
62
- o.on "-r", "--repo [TAG]", String, "Switch git user to the specified tag for the current directory's git repository" do |tag|
63
- tag ||= 'default'
64
- switch_repo_user(tag)
65
- exit
66
- end
67
-
68
- o.on "-h", "--help", "Show this help message." do
69
- print_info
70
- puts parser
71
- exit
72
- end
73
-
74
- o.on "-o", "--overwrite", "Overwrite/create a .gitswitch file using your global git user info as default" do
75
- create_gitswitch_file
76
- print_info
77
- exit
78
- end
79
-
80
- o.on "-a", "--add [TAG]", "Add a new gitswitch entry" do |tag|
81
- add_gitswitch_entry(tag)
82
- exit
83
- end
84
-
85
- o.on("-v", "--version", "Show the current version.") do
86
- print_version
87
- exit
88
- end
89
- end
90
-
91
- begin
92
- parser.parse! args
93
- rescue OptionParser::InvalidOption => error
94
- puts error.message.capitalize
95
- rescue OptionParser::MissingArgument => error
96
- puts error.message.capitalize
97
- end
98
- end
99
-
100
-
101
-
102
- # Create a .gitswitch file with the current user defaults
103
- def create_gitswitch_file
104
- user = get_git_user_info({:global => true})
105
- if user[:name].empty? && user[:email].empty?
106
- puts "ERROR: You must set up a default git user.name and user.email first."
107
- else
108
- puts "Adding your global .gitconfig user info to the \"default\" tag..."
109
- set_gitswitch_entry('default', user[:email], user[:name])
110
- save_gitswitch_file
111
- end
112
- end
113
-
114
-
115
- def save_gitswitch_file
116
- if fh = File.open(GITSWITCH_CONFIG_FILE, 'w')
117
- fh.write(@users.to_yaml)
118
- fh.close
119
- else
120
- puts "ERROR: Could not open/write the gitswitch config file: #{GITSWITCH_CONFIG_FILE}"
121
- end
122
- end
123
-
124
-
125
- # Set git user parameters for a tag
126
- # ==== Parameters
127
- # * +tag+ - Required. The tag you want to add to your .gitswitch file
128
- # * +email+ - Required
129
- # * +name+ - Required
130
- def set_gitswitch_entry(tag, email, name)
131
- @users[tag] = {:name => name, :email => email}
132
- save_gitswitch_file
133
- end
134
-
135
-
136
- def get_user(tag)
137
- if !@users.empty? && @users[tag] && !@users[tag].empty?
138
- @users[tag]
139
- end
140
- end
141
-
142
-
143
- def git_config(user, args = {})
144
- git_args = 'config --replace-all'
145
- git_args += ' --global' if args[:global]
146
-
147
- %x(#{GIT_BIN} #{git_args} user.email #{user[:email].to_s.shellescape})
148
- %x(#{GIT_BIN} #{git_args} user.name #{user[:name].to_s.shellescape}) if !user[:name].to_s.empty?
149
- end
150
-
151
-
152
- # Switch git user in your global .gitconfig file
153
- # ==== Parameters
154
- # * +tag+ - The tag associated with your desired git info in .gitswitch. Defaults to "default".
155
- def switch_global_user tag = "default"
156
- if user = get_user(tag)
157
- puts "Switching your .gitconfig user info to \"#{tag}\" tag (#{user[:name]} <#{user[:email]}>)."
158
- git_config(user, {:global => true})
159
- else
160
- puts "ERROR: Could not find info for tag \"#{tag}\" in your .gitswitch file"
161
- end
162
- end
163
-
164
-
165
- # Set the git user information for current repository
166
- # ==== Parameters
167
- # * +tag+ - The tag associated with your desired git info in .gitswitch. Defaults to "default".
168
- def switch_repo_user(tag = "default")
169
- ## TODO: See if we're actually in a git repo
170
- if user = get_user(tag)
171
- puts "Switching git user to \"#{tag}\" tag for the current repository (#{user[:name]} <#{user[:email]}>)."
172
- git_config(user) or raise "Could not change the git user settings to your repository."
173
- else
174
- puts "ERROR: Could not find info for tag \"#{tag}\" in your .gitswitch file"
175
- end
176
- end
177
-
178
-
179
- # Add a user entry to your .gitswitch file
180
- def add_gitswitch_entry(tag = '')
181
- if (!tag.nil? && !tag.empty?)
182
- tag.gsub!(/\W+/,'')
183
- else
184
- print "Enter a tag to describe this git user entry: "
185
- tag = gets.gsub(/\W+/,'')
186
- end
187
-
188
- if tag.empty?
189
- puts "You must enter a short tag to describe the git user entry you would like to save."
190
- exit
191
- end
192
-
193
- puts "Adding a new gitswitch user entry for tag '#{tag}'"
194
- print " E-mail address: "
195
- email = gets.chomp
196
-
197
- print " Name: (ENTER to use \"" + get_git_user_info({:global => true})[:name] + "\") "
198
- name = gets.chomp
199
- name = get_git_user_info({:global => true})[:name] if name.empty?
200
-
201
- set_gitswitch_entry(tag, email, name)
202
- end
203
-
204
-
205
- def list_users
206
- puts "\nCurrent git user options --"
207
- @users.each do |key, user|
208
- puts "#{key}:"
209
- puts " Name: #{user[:name]}" if !user[:name].to_s.empty?
210
- puts " E-mail: #{user[:email]}\n"
211
- end
212
- end
213
-
214
-
215
- # Print active account information.
216
- def print_info
217
- current_git_user = get_git_user_info
218
- puts "Current git user information:\n"
219
- puts "Name: #{current_git_user[:name]}"
220
- puts "E-mail: #{current_git_user[:email]}"
221
- puts
222
- end
223
-
224
-
225
- # Print version information.
226
- def print_version
227
- if fh = File.open(VERSION_FILE,'r')
228
- puts "GitSwitch " + fh.gets
229
- fh.close
230
- else
231
- puts "Version information not found"
232
- end
233
- # puts "GitSwitch " + GitSwitch::VERSION.to_s
234
- end
235
-
236
-
237
- private
238
-
239
- # Show the current git user info
240
- def get_git_user_info(args = {})
241
- git_args = 'config --get'
242
- git_args += ' --global' if args[:global]
243
-
244
- {
245
- :name => %x(#{GIT_BIN} #{git_args} user.name).to_s.chomp,
246
- :email => %x(#{GIT_BIN} #{git_args} user.email).to_s.chomp
247
- }
248
- end
249
-
250
- end
@@ -1,16 +1,68 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe GitSwitch do
3
+ describe Gitswitch do
4
4
 
5
5
  describe "basics" do
6
6
  it "should have a VERSION" do
7
- VERSION.should_not == ''
7
+ Gitswitch::VERSION.should_not == ''
8
8
  end
9
9
 
10
10
  it "should find the git executable" do
11
- result = %x[#{GitSwitch::GIT_BIN} --version]
11
+ result = %x[#{Gitswitch::GIT_BIN} --version]
12
12
  $?.exitstatus.should == 0
13
13
  end
14
14
  end
15
15
 
16
- end
16
+
17
+ describe "read-only" do
18
+ it "should show the current git user credentials" do
19
+ Gitswitch.current_user_info.should =~ /^Your git user/
20
+ end
21
+ it "should show the current list of available gitswitch tags" do
22
+ pending
23
+ end
24
+ end
25
+
26
+
27
+ describe "write methods" do
28
+
29
+ it "should allow you to add a new user entry" do
30
+ pending
31
+ end
32
+
33
+ it "should allow you to update a user entry" do
34
+ pending
35
+ end
36
+
37
+ it "should allow you to delete a user entry" do
38
+ pending
39
+ end
40
+
41
+ it "should allow you to overwrite the current .gitswitch file and start fresh" do
42
+ pending
43
+ end
44
+
45
+ end
46
+
47
+
48
+ describe "git proxy methods" do
49
+
50
+ it "should allow you to change the global git user credentials" do
51
+ pending
52
+ end
53
+
54
+ it "should allow you to change a specific repository's user credentials" do
55
+ pending
56
+ end
57
+ end
58
+
59
+
60
+ describe "weird outlier cases" do
61
+
62
+ it "in a git repo directory with no user info specified, show the global config header and user info" do
63
+ pending
64
+ end
65
+
66
+ end
67
+
68
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitswitch
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 5
10
- version: 0.2.5
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joe Alba
@@ -15,10 +15,53 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-23 00:00:00 -04:00
18
+ date: 2010-09-27 00:00:00 -04:00
19
19
  default_executable: gitswitch
20
- dependencies: []
21
-
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rake
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: thor
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: rspec
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 2
60
+ - 3
61
+ - 0
62
+ version: 2.3.0
63
+ type: :development
64
+ version_requirements: *id003
22
65
  description: Easily switch your git name/e-mail user info -- Handy for work vs. personal and for pair programming
23
66
  email: joe@joealba.com
24
67
  executables:
@@ -34,14 +77,15 @@ files:
34
77
  - .gitignore
35
78
  - .rspec
36
79
  - Gemfile
37
- - Gemfile.lock
38
80
  - LICENSE
39
81
  - README.rdoc
40
82
  - Rakefile
41
- - VERSION
42
83
  - bin/gitswitch
43
84
  - gitswitch.gemspec
44
85
  - lib/gitswitch.rb
86
+ - lib/gitswitch/cli.rb
87
+ - lib/gitswitch/commands.rb
88
+ - lib/gitswitch/version.rb
45
89
  - spec/gitswitch_spec.rb
46
90
  - spec/spec_helper.rb
47
91
  has_rdoc: true
data/Gemfile.lock DELETED
@@ -1,31 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- diff-lcs (1.1.2)
5
- gemcutter (0.6.1)
6
- git (1.2.5)
7
- jeweler (1.4.0)
8
- gemcutter (>= 0.1.0)
9
- git (>= 1.2.5)
10
- rubyforge (>= 2.0.0)
11
- json_pure (1.4.6)
12
- rspec (2.0.0.beta.22)
13
- rspec-core (= 2.0.0.beta.22)
14
- rspec-expectations (= 2.0.0.beta.22)
15
- rspec-mocks (= 2.0.0.beta.22)
16
- rspec-core (2.0.0.beta.22)
17
- rspec-expectations (2.0.0.beta.22)
18
- diff-lcs (>= 1.1.2)
19
- rspec-mocks (2.0.0.beta.22)
20
- rspec-core (= 2.0.0.beta.22)
21
- rspec-expectations (= 2.0.0.beta.22)
22
- rubyforge (2.0.4)
23
- json_pure (>= 1.1.7)
24
-
25
- PLATFORMS
26
- ruby
27
-
28
- DEPENDENCIES
29
- bundler (~> 1.0.0)
30
- jeweler (~> 1.4.0)
31
- rspec (~> 2.0.0.beta.22)
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.2.5