gitsu 0.0.1

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/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # GitSu
2
+
3
+ GitSu helps to manage your Git users, by making it easy to switch
4
+ between users.
5
+
6
+ ## Installation
7
+
8
+ $ gem install gitsu
9
+
10
+ ## Usage
11
+
12
+ GitSu is intended to be used from the command line, through Git.
13
+
14
+ To switch the configured Git user:
15
+
16
+ $ git su "John Galt <jgalt@tcmc.com>"
17
+
18
+ Switched local user to John Galt <jgalt@tcmc.com>
19
+
20
+ To make it easier to switch users, tell GitSu about some users.
21
+
22
+ $ git su --add "John Galt <jgalt@tcmc.com>"
23
+ $ git su --add "Raphe Rackstraw <rack@hp.royalnavy.mod.uk>"
24
+ $ git su jg
25
+
26
+ Switched to user John Galt <jgalt@tcmc.com>
27
+
28
+ $ git su raphe
29
+
30
+ Switched to user Raphe Rackstraw <rack@hp.royalnavy.mod.uk>
31
+
32
+ ## Contributing
33
+
34
+ 1. Fork it
35
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
36
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
37
+ 4. Push to the branch (`git push origin my-new-feature`)
38
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task :default => :install
data/TODO ADDED
@@ -0,0 +1,10 @@
1
+ Features
2
+ --------
3
+ Make colors configurable because people like that stuff
4
+ Support multiple users at once for pairing
5
+
6
+ Bugs
7
+ -------
8
+
9
+ Tests
10
+ -------
data/bin/git-su ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib_path = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include? lib_path
5
+ require 'gitsu'
6
+
7
+ factory = GitSu::Factory.new(STDOUT)
8
+ git_su = factory.git_su
9
+ runner = factory.runner
10
+
11
+ runner.run do
12
+ git_su.go ARGV
13
+ end
data/bin/git-whoami ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib_path = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include? lib_path
5
+ require 'gitsu'
6
+
7
+ factory = GitSu::Factory.new(STDOUT)
8
+ switcher = factory.switcher
9
+ runner = factory.runner
10
+
11
+ runner.run do
12
+ switcher.print_current :derived
13
+ end
@@ -0,0 +1,26 @@
1
+ Feature: Add user
2
+ As a new user
3
+ I want to add myself to the GitSu config
4
+ So that I can quickly switch back to myself
5
+
6
+ Scenario: Add user
7
+ Given no user is selected
8
+ When I type "git su --add 'John Galt <jgalt@example.com>'"
9
+ Then I should see "User 'John Galt <jgalt@example.com>' added to users"
10
+
11
+ Scenario: Try to add existing user
12
+ Given user list is
13
+ """
14
+ jgalt@example.com: John Galt
15
+ """
16
+ When I type "git su --add 'John Galt <jgalt@example.com>'"
17
+ Then I should see "User 'John Galt <jgalt@example.com>' already in user list"
18
+ And user list should be
19
+ """
20
+ jgalt@example.com: John Galt
21
+ """
22
+
23
+ Scenario: Try to add invalid user
24
+ Given no user is selected
25
+ When I type "git su --add xxx"
26
+ Then I should see "Couldn't parse 'xxx' as user (expected user in format: 'John Smith <jsmith@example.com>')"
@@ -0,0 +1,24 @@
1
+ Feature: Change user in different scopes
2
+ As a user with multiple projects
3
+ I want to change my user in different scopes
4
+ So that I have greater control over repositories
5
+
6
+ Scenario Outline: change user in scope
7
+ Given no user is selected in any scope
8
+ When I type "git su 'John Galt <jgalt@example.com>' --<selected>"
9
+ Then user "John Galt <jgalt@example.com>" should be selected in "<selected>" scope
10
+ And no user should be selected in "<not_selected>" scope
11
+ And no user should be selected in "<also_not_selected>" scope
12
+
13
+ Scenarios:
14
+ | selected | not_selected | also_not_selected |
15
+ | local | global | system |
16
+ | global | local | system |
17
+ | system | local | global |
18
+
19
+ Scenario: change user in multiple scopes
20
+ Given no user is selected in any scope
21
+ When I type "git su 'John Galt <jgalt@example.com>' --local --global"
22
+ Then user "John Galt <jgalt@example.com>" should be selected in "local" scope
23
+ And user "John Galt <jgalt@example.com>" should be selected in "global" scope
24
+ And no user should be selected in "system" scope
@@ -0,0 +1,28 @@
1
+ Feature: Clear user
2
+ As a user
3
+ I want to clear my Git configured user
4
+ So that I can make sure others don't commit code as me
5
+
6
+ Scenario: Clear user in specified scope
7
+ Given user "John Galt <jgalt@example.com>" is selected in "local" scope
8
+ When I type "git su --clear --local"
9
+ Then I should see "Clearing Git user in local scope"
10
+ And no user should be selected in "local" scope
11
+
12
+ Scenario: Clear user in multiple specified scopes
13
+ Given user "John Galt <jgalt@example.com>" is selected in "local" scope
14
+ And user "John Galt <jgalt@example.com>" is selected in "global" scope
15
+ When I type "git su --clear --local --global"
16
+ Then I should see "Clearing Git users in local and global scopes"
17
+ And no user should be selected in "local" scope
18
+ And no user should be selected in "global" scope
19
+
20
+ Scenario: Clear all users
21
+ Given user "Joe Local <jlocal@example.com>" is selected in "local" scope
22
+ And user "Joe Global <jglobal@example.com>" is selected in "global" scope
23
+ And user "Joe System <jsystem@example.com>" is selected in "system" scope
24
+ When I type "git su --clear"
25
+ Then I should see "Clearing Git users in all scopes"
26
+ And no user should be selected in "local" scope
27
+ And no user should be selected in "global" scope
28
+ And no user should be selected in "system" scope
@@ -0,0 +1,9 @@
1
+ Feature: Configure default scope
2
+ As a user of a shared environment
3
+ I want to configure the default scope
4
+ So that I can change the user for all projects at once
5
+
6
+ Scenario: Default to global scope
7
+ Given the Git configuration has "git-su.defaultSelectScope" set to "global"
8
+ When I type "git su 'John Galt <jgalt@example.com>'"
9
+ Then I should see "Switched global user to John Galt <jgalt@example.com>"
@@ -0,0 +1,8 @@
1
+ Feature: Edit config file
2
+ As a user
3
+ I want to quickly open the config file in an editor
4
+ So that I can quickly edit the configured users
5
+
6
+ Scenario: Edit config
7
+ When I type "git su --edit"
8
+ Then the config file should be open in an editor
@@ -0,0 +1,16 @@
1
+ Feature: List users
2
+ As a user
3
+ I want to list all users
4
+ So that I can see if the user I want is in the config
5
+
6
+ Scenario: list users
7
+ Given user list contains user "John Galt" with email "jgalt@example.com"
8
+ And user list contains user "Raphe Rackstraw" with email "rrack@github.com"
9
+ When I type "git su --list"
10
+ Then I should see "John Galt <jgalt@example.com>"
11
+ And I should see "Raphe Rackstraw <rrack@github.com>"
12
+
13
+ Scenario: no users configured yet
14
+ Given user list is empty
15
+ When I type "git su --list"
16
+ Then I shouldn't see anything
@@ -0,0 +1,60 @@
1
+ Feature: Print the current user
2
+ As a user
3
+ I want to see who is currently logged in
4
+ So that I know if I need to switch users
5
+
6
+ Scenario Outline: Print current user in different scopes
7
+ Given user "Johnny System <jsystem@gitsu.com>" is selected in "system" scope
8
+ And user "Johnny Global <jglobal@gitsu.com>" is selected in "global" scope
9
+ And user "Johnny Local <jlocal@gitsu.com>" is selected in "local" scope
10
+ When I type "git su --<scope>"
11
+ Then I should see "<output>"
12
+
13
+ Scenarios: Selected Users
14
+ | scope | output |
15
+ | system | Johnny System <jsystem@gitsu.com> |
16
+ | global | Johnny Global <jglobal@gitsu.com> |
17
+ | local | Johnny Local <jlocal@gitsu.com> |
18
+
19
+ Scenario: Print all users
20
+ Given user "Johnny System <jsystem@gitsu.com>" is selected in "system" scope
21
+ And user "Johnny Global <jglobal@gitsu.com>" is selected in "global" scope
22
+ And user "Johnny Local <jlocal@gitsu.com>" is selected in "local" scope
23
+ When I type "git su"
24
+ Then I should see
25
+ """
26
+ Current user: Johnny Local <jlocal@gitsu.com>
27
+
28
+ Local: Johnny Local <jlocal@gitsu.com>
29
+ Global: Johnny Global <jglobal@gitsu.com>
30
+ System: Johnny System <jsystem@gitsu.com>
31
+ """
32
+
33
+ Scenario: No user is selected
34
+ Given no user is selected in any scope
35
+ When I type "git su"
36
+ Then I should see "Current user: (none)"
37
+
38
+ Scenario: No user is selected in the specified scope
39
+ Given no user is selected in any scope
40
+ When I type "git su --local"
41
+ Then I shouldn't see anything
42
+
43
+ Scenario: No user is selected in a specified scope
44
+ Given user "Johnny System <jsystem@gitsu.com>" is selected in "system" scope
45
+ When I type "git su --local --system"
46
+ Then I should see
47
+ """
48
+ Johnny System <jsystem@gitsu.com>
49
+ """
50
+
51
+ Scenario: Multiple scopes specified
52
+ Given user "Johnny System <jsystem@gitsu.com>" is selected in "system" scope
53
+ And user "Johnny Global <jglobal@gitsu.com>" is selected in "global" scope
54
+ And user "Johnny Local <jlocal@gitsu.com>" is selected in "local" scope
55
+ When I type "git su --local --system"
56
+ Then I should see
57
+ """
58
+ Johnny Local <jlocal@gitsu.com>
59
+ Johnny System <jsystem@gitsu.com>
60
+ """
@@ -0,0 +1,8 @@
1
+ Feature: Print options
2
+ As a user
3
+ I want to view Gitsu's options
4
+ So that I know how to use it
5
+
6
+ Scenario: Print options
7
+ When I type "git su --help"
8
+ Then I should see "Usage: git-su"
@@ -0,0 +1,193 @@
1
+ Given /^no user is selected$/ do
2
+ step "no user is selected in any scope"
3
+ end
4
+
5
+ Given /^no user is selected in any scope$/ do
6
+ git.clear_users
7
+ end
8
+
9
+ Given /^user "(.*?)" is selected$/ do |user|
10
+ git.select_user(GitSu::User.parse(user), :global)
11
+ end
12
+
13
+ Given /^user "(.*?)" is selected in "(.*?)" scope$/ do |user, scope|
14
+ git.select_user(GitSu::User.parse(user), scope.to_sym)
15
+ end
16
+
17
+ Given /^the Git configuration has "(.*?)" set to "(.*?)"$/ do |key, value|
18
+ git.set_config(:global, key, value)
19
+ end
20
+
21
+ Given /^user list is empty$/ do
22
+ write_user_list("\n")
23
+ end
24
+
25
+ Given /^user list is$/ do |user_list|
26
+ write_user_list user_list
27
+ end
28
+
29
+ Then /^user list should be$/ do |user_list|
30
+ read_user_list.should eq user_list
31
+ end
32
+
33
+ And /^user list contains user "(.*?)" with email "(.*?)"$/ do |name, email|
34
+ user_list.add GitSu::User.new(name, email)
35
+ end
36
+
37
+ def split_args_with_shell(arg_line)
38
+ `for arg in #{arg_line}; do echo $arg; done`.strip.split("\n")
39
+ end
40
+
41
+ When /^I type "(.*?)"$/ do |command_line|
42
+ arg_line = command_line.gsub(/^git su/, "")
43
+ args = split_args_with_shell(arg_line)
44
+ gitsu.go args
45
+ end
46
+
47
+ Then /^I should see$/ do |expected_output|
48
+ output.messages.join("\n").should eq expected_output
49
+ end
50
+
51
+ Then /^I should see "(.*?)"$/ do |expected_output|
52
+ matching_messages = output.messages.select {|e| e.include? expected_output}
53
+ if matching_messages.empty?
54
+ fail "Expected [#{output.messages}] to contain '#{expected_output}'"
55
+ end
56
+ end
57
+
58
+ Then /^I shouldn't see anything$/ do
59
+ output.messages.should be_empty
60
+ end
61
+
62
+ Then /^user "(.*?)" should be selected$/ do |user|
63
+ step %[user "#{user}" should be selected in "global" scope]
64
+ end
65
+
66
+ Then /^user "(.*?)" should be selected in "(.*?)" scope$/ do |user, scope|
67
+ git.selected_user(scope.to_sym).should == GitSu::User.parse(user)
68
+ end
69
+
70
+ Then /^no user should be selected$/ do
71
+ step 'no user should be selected in "global" scope'
72
+ end
73
+
74
+ Then /^no user should be selected in "(.*?)" scope$/ do |scope|
75
+ git.selected_user(scope.to_sym).should be GitSu::User::NONE
76
+ end
77
+
78
+ Then /^the config file should be open in an editor$/ do
79
+ git.editing?.should be true
80
+ end
81
+
82
+ class Output
83
+ def messages
84
+ @messages ||= []
85
+ end
86
+
87
+ def puts(message = nil)
88
+ messages << "#{message}"
89
+ end
90
+ end
91
+
92
+ class StubGit < GitSu::Git
93
+
94
+ attr_accessor :users
95
+
96
+ def initialize
97
+ clear_users
98
+ @editing = false
99
+ end
100
+
101
+ def get_config(scope, key)
102
+ if scope == :derived
103
+ config(:local)[key] || config(:global)[key] || config(:system)[key] || ""
104
+ else
105
+ config(scope)[key] || ""
106
+ end
107
+ end
108
+
109
+ def set_config(scope, key, value)
110
+ config(scope)[key] = value
111
+ end
112
+
113
+ def unset_config(scope, key)
114
+ config(scope).delete key
115
+ end
116
+
117
+ def list_config(scope)
118
+ config(scope).map {|k,v| "#{k}=#{v}"}
119
+ end
120
+
121
+ def remove_config_section(scope, section)
122
+ config(scope).reject! {|k,v| k =~ /^#{section}\./ }
123
+ end
124
+
125
+ def clear_users
126
+ [:local, :global, :system].each do |scope|
127
+ clear_user(scope)
128
+ end
129
+ end
130
+
131
+ def config(scope)
132
+ @config ||= {}
133
+ @config[scope] ||= {}
134
+ end
135
+
136
+ def edit_gitsu_config
137
+ @editing = true
138
+ end
139
+
140
+ def color_output?
141
+ false
142
+ end
143
+
144
+ def render(user)
145
+ user.to_s
146
+ end
147
+
148
+ def render_user(scope)
149
+ render selected_user(scope)
150
+ end
151
+
152
+ def editing?
153
+ @editing
154
+ end
155
+ end
156
+
157
+ def output
158
+ @output ||= Output.new
159
+ end
160
+
161
+ def git
162
+ @git ||= StubGit.new
163
+ end
164
+
165
+ def gitsu
166
+ @gitsu ||= GitSu::Gitsu.new(switcher, output)
167
+ end
168
+
169
+ def switcher
170
+ @switcher ||= GitSu::Switcher.new(git, user_list, output)
171
+ end
172
+
173
+ def user_list
174
+ @user_list ||= GitSu::UserList.new(user_list_file)
175
+ end
176
+
177
+ def user_list_file
178
+ @user_list_file ||= "/tmp/#{rand}"
179
+ end
180
+
181
+ def write_user_list(content)
182
+ File.open(user_list_file, "w") do |f|
183
+ f.write content
184
+ end
185
+ end
186
+
187
+ def read_user_list
188
+ File.read user_list_file
189
+ end
190
+
191
+ After do
192
+ File.delete user_list_file if File.exist? user_list_file
193
+ end