gitswitch 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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