brownbeagle-gitauth 0.0.4.3 → 0.0.4.5
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.rdoc +38 -12
- data/USAGE +65 -22
- data/bin/gitauth +6 -2
- data/lib/gitauth.rb +3 -4
- data/lib/gitauth/saveable_class.rb +24 -35
- data/lib/gitauth/web_app.rb +5 -1
- data/public/gitauth.css +6 -2
- data/views/clone_repo.erb +5 -3
- data/views/index.erb +4 -0
- metadata +3 -4
- data/lib/gitauth/settings.rb +0 -49
data/README.rdoc
CHANGED
@@ -15,6 +15,16 @@ Getting started is relatively simple. First of, you'll need to log onto the remo
|
|
15
15
|
|
16
16
|
sudo gem install brownbeagle-gitauth --source http://gems.github.com/
|
17
17
|
|
18
|
+
Or, if you want to avoid the gems approach, you can use simply clone the repository
|
19
|
+
as follows and use the git submodule setup in order to vendor rack, sinatra and perennial:
|
20
|
+
|
21
|
+
git clone git://github.com/brownbeagle/gitauth.git
|
22
|
+
cd gitauth
|
23
|
+
git submodule init
|
24
|
+
git submodule update
|
25
|
+
|
26
|
+
With the gitauth binary being in the bin folder.
|
27
|
+
|
18
28
|
Once that's done, the +gitauth+ and +gitauth-shell+ commands should be in your path.
|
19
29
|
Next, you'll want to (in most cases anyway) use a specific +git+ user to host repositories.
|
20
30
|
|
@@ -23,25 +33,25 @@ Using the example of ubuntu, we'll add a git user under which all actions will n
|
|
23
33
|
sudo adduser --disabled-password --shell /bin/bash --group --home /home/git --system --gecos 'gitauth user for version control' git
|
24
34
|
|
25
35
|
Now, whenever you run the +gitauth+ executable, you'll do so as the user you just created
|
26
|
-
above. For
|
27
|
-
|
36
|
+
above. For example purposes, I suggest using the following in order to run all commands
|
37
|
+
as the 'git' user:
|
28
38
|
|
29
|
-
|
39
|
+
sudo -H -u git -i
|
30
40
|
|
31
41
|
And finally, to create a settings file and initialize .ssh and authorized_keys, perform the
|
32
42
|
following:
|
33
43
|
|
34
|
-
|
44
|
+
gitauth install
|
35
45
|
|
36
46
|
Note that when it asks you for the gitauth shell path, the default will lock
|
37
47
|
it to the current gitauth version SO if you want it to stay up to date between gem versions
|
38
48
|
point it to the path for always-current executable (e.g. on Ubuntu 9.04 w/ apt-get ruby + gems,
|
39
49
|
+/var/lib/gems/1.8/bin/gitauth-shell+)
|
40
50
|
|
41
|
-
Also, Note that if
|
51
|
+
Also, Note that if use the --admin option with path to a public key to the end of the install command,
|
42
52
|
it will initialize a new +admin+ user who can also login via SSH. e.g.
|
43
53
|
|
44
|
-
|
54
|
+
gitauth install --admin id_rsa.pub
|
45
55
|
|
46
56
|
Would initialize an admin user with the given public key.
|
47
57
|
|
@@ -52,17 +62,23 @@ git (via the admin user and ssh) or by being prefixed with asgit or "sudo -H -u
|
|
52
62
|
|
53
63
|
To start the web interface, just run:
|
54
64
|
|
55
|
-
gitauth
|
65
|
+
gitauth web-app
|
56
66
|
|
57
67
|
The first time you boot the web app, you will be prompted
|
58
68
|
to enter a username and a password. Please do so
|
59
69
|
and then surf to http://your-server-ip:8998/
|
60
70
|
|
71
|
+
For people running passenger, you can simply point it at
|
72
|
+
the public subdirectory and it will act as any normal passenger
|
73
|
+
web app. It's worth noting that in this approach you need
|
74
|
+
to run gitauth web-app at least once to setup a username and
|
75
|
+
password.
|
76
|
+
|
61
77
|
=== Adding Users
|
62
78
|
|
63
79
|
Whenever you want to add a user, it's as simple as:
|
64
80
|
|
65
|
-
gitauth
|
81
|
+
gitauth add-user user-name path-to-public-key
|
66
82
|
|
67
83
|
Note that if the --admin option is specified, the user will
|
68
84
|
be able to log in to the shell via SSH and will also be able
|
@@ -72,14 +88,22 @@ to access any repository.
|
|
72
88
|
|
73
89
|
Adding a repository is a two step process. First, you create it:
|
74
90
|
|
75
|
-
gitauth
|
91
|
+
gitauth add-repo repo-name
|
92
|
+
|
93
|
+
If you wish to initialize the repository with a blank commit (so
|
94
|
+
git clone works straight away), simply pass --make-empty / -m as
|
95
|
+
an option. e.g.:
|
96
|
+
|
97
|
+
gitauth add-repo repo-name --make-empty
|
76
98
|
|
77
99
|
Then, for every user who needs access, you do:
|
78
100
|
|
79
|
-
gitauth permissions repo-name user-name permission-type
|
101
|
+
gitauth permissions repo-name user-name --type=permission-type
|
80
102
|
|
81
103
|
Where permission type is read, write or all. If permission
|
82
|
-
type isn't specified, it will default to all.
|
104
|
+
type isn't specified, it will default to all. If you wish
|
105
|
+
to remove a user from a repository, you can simply pass
|
106
|
+
use the type as none.
|
83
107
|
|
84
108
|
=== Accessing repos:
|
85
109
|
|
@@ -95,7 +119,8 @@ Or
|
|
95
119
|
Either form working just as well.
|
96
120
|
|
97
121
|
Note that for the first time you push, you will need
|
98
|
-
to use the full form
|
122
|
+
to use the full form (as below) unless you've used
|
123
|
+
the --make-empty / -m option when you created the repo.
|
99
124
|
|
100
125
|
git push origin master
|
101
126
|
|
@@ -113,3 +138,4 @@ on your local PC (due to the way git handles remote repositories):
|
|
113
138
|
git commit -m "Added blank readme"
|
114
139
|
git add remote origin git@your-server:my-repo.git
|
115
140
|
git push origin master
|
141
|
+
|
data/USAGE
CHANGED
@@ -1,27 +1,70 @@
|
|
1
|
-
GitAuth is
|
1
|
+
GitAuth is a tool to provide authenticated git hosting from any unix like
|
2
|
+
box using ruby, git-shell and a whole lot of awesomeness.
|
2
3
|
|
3
|
-
|
4
|
-
Pass in a valid SSH public key that will be used by the GitAuth administrator
|
4
|
+
Available commands include:
|
5
5
|
|
6
|
-
|
7
|
-
REPO: the repository name you wish to set permissions on
|
8
|
-
USER/GROUP: the user or group name you with to give permissions
|
9
|
-
PERMISSION:
|
10
|
-
Default = all
|
11
|
-
The level of permissions you want to give the user or group on the repository in question
|
12
|
-
all = read and write
|
13
|
-
read = the user can see the repository and pull it, but cannot push changes
|
14
|
-
write = user can push changes but can't pull it.
|
15
|
-
|
16
|
-
gitauth addrepo NAME PATH
|
17
|
-
NAME: the name you want your repository to have
|
18
|
-
PATH: the part path you want the repository to have, will be ~REPOBASE~/PATH
|
6
|
+
ls-users - Lists all users handled by GitAuth
|
19
7
|
|
20
|
-
|
21
|
-
NAME: the name of your new user
|
22
|
-
PUBLIC_KEY: a valid path to a copy of the users SSH public key file
|
8
|
+
ls-groups - Lists all groups handled by GitAuth
|
23
9
|
|
24
|
-
|
10
|
+
ls-repos - Lists all repositories handled by GitAuth
|
25
11
|
|
26
|
-
|
27
|
-
|
12
|
+
show-user - Shows information about a user with a given name
|
13
|
+
e.g: gitauth show-user darcy
|
14
|
+
|
15
|
+
show-group - Shows information about a group with a given name
|
16
|
+
e.g: gitauth show-group brownbeagle
|
17
|
+
or,: gitauth show-group @brownbeagle
|
18
|
+
|
19
|
+
show-repo - Shows information about a repository with a given name
|
20
|
+
e.g: gitauth show-repo project-a
|
21
|
+
|
22
|
+
add-user - adds a user with a specific name and ssh key
|
23
|
+
e.g. gitauth add-user darcy ~/id_rsa-one.pub
|
24
|
+
or,: gitauth add-user sutto ~/id_rsa-two.pub --admin
|
25
|
+
|
26
|
+
Would create two users, one an admin and one a normal user.
|
27
|
+
|
28
|
+
add-group - Adds a group with a specified name.
|
29
|
+
e.g: gitauth add-group brownbeagle
|
30
|
+
or,: gitauth add-group brownbeagle
|
31
|
+
|
32
|
+
From there on in, you can refer to the group as @brownbeagle
|
33
|
+
|
34
|
+
add-repo - Adds a repository with a specific name and an optional path
|
35
|
+
e.g: gitauth add-repo project-a
|
36
|
+
or,: gitauth add-repo project-b --make-empty
|
37
|
+
or,: gitauth add-repo project-c my-path-to-repo.git
|
38
|
+
or,: gitauth add-repo project-d my-path-to-other-repo --make-empty
|
39
|
+
|
40
|
+
--make-empty initializes it with a blank commit whilst
|
41
|
+
a second argument sets the path for the created repository.
|
42
|
+
The path is only ever used internally, the user refers to
|
43
|
+
it externally. e.g, project-c above would be accessible by:
|
44
|
+
user@your-server.com:project-c or user@your-server.com:project-c.git
|
45
|
+
|
46
|
+
rm-user - Removes a user with the given name
|
47
|
+
e.g: gitauth rm-user darcy
|
48
|
+
|
49
|
+
rm-group - Removes a specific group from GitAuth
|
50
|
+
e.g: gitauth rm-group brownbeagle
|
51
|
+
or,: gitauth rm-group @brownbeagle
|
52
|
+
|
53
|
+
rm-repo - Removes a repository from gitauth (destroys it on the filesystem as well)
|
54
|
+
e.g: gitauth rm-repo project-a
|
55
|
+
|
56
|
+
permissions - Set the permissions for a given user or group on a specific repository.
|
57
|
+
e.g: gitauth permissions project-a darcy
|
58
|
+
or,: gitauth permissions project-b darcy --type read
|
59
|
+
or,: gitauth permissions project-c darcy --type none
|
60
|
+
or,: gitauth permissions project-a @brownbeagle -t read
|
61
|
+
or,: gitauth permissions project-b @brownbeagle
|
62
|
+
|
63
|
+
The first argument being the repository name, the second a target -
|
64
|
+
either a user (e.g. darcy), or, if prefixed with an @-symbol, a group.
|
65
|
+
An optional --type argument specifies what permissions to use (all, read, write
|
66
|
+
or none - defaulting to all).
|
67
|
+
|
68
|
+
web-app - Starts up the web app, serving on port 8998
|
69
|
+
e.g: gitauth web-app
|
70
|
+
|
data/bin/gitauth
CHANGED
@@ -198,9 +198,13 @@ GitAuth::Application.processing(ARGV) do |a|
|
|
198
198
|
end
|
199
199
|
|
200
200
|
a.add("usage", "Prints out the sample usage instructions") do |options|
|
201
|
-
|
202
|
-
|
201
|
+
pager = nil
|
202
|
+
if ENV.has_key?('PAGER')
|
203
|
+
pager = ENV['PAGER'].blank? ? 'cat' : ENV['PAGER']
|
204
|
+
else
|
205
|
+
pager = "less"
|
203
206
|
end
|
207
|
+
exec "#{pager} '#{GitAuth::BASE_DIR.join("USAGE")}'"
|
204
208
|
end
|
205
209
|
|
206
210
|
a.add("show-repo NAME", "Shows information for a repository with a given name") do |name, options|
|
data/lib/gitauth.rb
CHANGED
@@ -21,7 +21,7 @@ require 'ostruct'
|
|
21
21
|
|
22
22
|
module GitAuth
|
23
23
|
|
24
|
-
VERSION = [0, 0, 4,
|
24
|
+
VERSION = [0, 0, 4, 5]
|
25
25
|
BASE_DIR = Pathname.new(__FILE__).dirname.join("..").expand_path
|
26
26
|
LIB_DIR = BASE_DIR.join("lib", "gitauth")
|
27
27
|
GITAUTH_DIR = Pathname.new("~/.gitauth/").expand_path
|
@@ -43,8 +43,6 @@ module GitAuth
|
|
43
43
|
include Perennial
|
44
44
|
include Loggable
|
45
45
|
|
46
|
-
require LIB_DIR.join("settings")
|
47
|
-
|
48
46
|
%w(message saveable_class repo user command client group).each do |file|
|
49
47
|
require LIB_DIR.join(file)
|
50
48
|
end
|
@@ -55,6 +53,7 @@ module GitAuth
|
|
55
53
|
manifest do |m, l|
|
56
54
|
Settings.root = File.dirname(__FILE__)
|
57
55
|
Settings.default_settings_path = GITAUTH_DIR.join("settings.yml")
|
56
|
+
Settings.lookup_key_path = []
|
58
57
|
Logger.default_logger_path = GITAUTH_DIR.join("gitauth.log")
|
59
58
|
l.before_run { GitAuth.each_model(:load!) }
|
60
59
|
l.register_controller :web_app, 'GitAuth::WebApp'
|
@@ -63,7 +62,7 @@ module GitAuth
|
|
63
62
|
class << self
|
64
63
|
|
65
64
|
def prepare
|
66
|
-
Settings.setup
|
65
|
+
GitAuth::Settings.setup!
|
67
66
|
reload_models!
|
68
67
|
end
|
69
68
|
|
@@ -17,47 +17,36 @@
|
|
17
17
|
#++
|
18
18
|
|
19
19
|
module GitAuth
|
20
|
-
|
21
|
-
|
22
|
-
path_name = "#{kind.to_s.upcase}_PATH"
|
23
|
-
yaml_file_name = "#{kind}.yml"
|
24
|
-
|
25
|
-
saveable_class_def = <<-END
|
20
|
+
|
21
|
+
class BasicSaveable
|
26
22
|
|
27
|
-
|
28
|
-
|
29
|
-
class << self
|
23
|
+
class_inheritable_accessor :all, :store_path
|
30
24
|
|
31
|
-
|
32
|
-
@@all_#{kind} ||= nil
|
33
|
-
end
|
25
|
+
class << self
|
34
26
|
|
35
|
-
|
36
|
-
|
37
|
-
|
27
|
+
def load!
|
28
|
+
self.all = YAML.load(File.read(store_path)) rescue nil if File.file?(store_path)
|
29
|
+
self.all = [] unless all.is_a?(Array)
|
30
|
+
end
|
38
31
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
def save!
|
45
|
-
load! if self.all.nil?
|
46
|
-
File.open(#{path_name}, "w+") do |f|
|
47
|
-
f.write self.all.to_yaml
|
48
|
-
end
|
49
|
-
end
|
32
|
+
def save!
|
33
|
+
load! if all.nil?
|
34
|
+
File.open(store_path, "w+") { |f| f.write all.to_yaml }
|
35
|
+
end
|
50
36
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
end
|
56
|
-
|
37
|
+
def add_item(item)
|
38
|
+
load! if all.nil?
|
39
|
+
all << item
|
40
|
+
save!
|
57
41
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.SaveableClass(kind)
|
47
|
+
klass = Class.new(BasicSaveable)
|
48
|
+
klass.store_path = GitAuth::GITAUTH_DIR.join("#{kind}.yml").to_s
|
49
|
+
klass.all = nil
|
61
50
|
return klass
|
62
51
|
end
|
63
52
|
end
|
data/lib/gitauth/web_app.rb
CHANGED
@@ -52,6 +52,7 @@ module GitAuth
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def self.check_auth
|
55
|
+
GitAuth.prepare
|
55
56
|
if !has_auth?
|
56
57
|
if $stderr.tty?
|
57
58
|
logger.verbose = true
|
@@ -82,6 +83,7 @@ module GitAuth
|
|
82
83
|
if current_server.present?
|
83
84
|
current_server.respond_to?(:stop!) ? current_server.stop! : current_server.stop
|
84
85
|
end
|
86
|
+
exit!
|
85
87
|
logger.debug "Stopped Server."
|
86
88
|
end
|
87
89
|
|
@@ -181,8 +183,10 @@ module GitAuth
|
|
181
183
|
path = params[:repo][:path]
|
182
184
|
path = name if path.to_s.strip.empty?
|
183
185
|
if repo = GitAuth::Repo.create(name, path)
|
186
|
+
make_empty = (params[:repo][:make_empty] == "1")
|
187
|
+
repo.make_empty! if make_empty
|
184
188
|
if repo.execute_post_create_hook!
|
185
|
-
redirect "/?repo_name=#{URI.encode(name)}"
|
189
|
+
redirect "/?repo_name=#{URI.encode(name)}&made_empty=#{make_empty ? "yes" : "no"}"
|
186
190
|
else
|
187
191
|
redirect root_with_message("Repository added but the post-create hook exited unsuccessfully.")
|
188
192
|
end
|
data/public/gitauth.css
CHANGED
@@ -181,6 +181,7 @@ div.message {
|
|
181
181
|
.section ul {
|
182
182
|
line-height: 1.8em;
|
183
183
|
margin: 0.5em 1em;
|
184
|
+
font-family: Helvetica, Arial, Sans-Serif;
|
184
185
|
}
|
185
186
|
|
186
187
|
.section ul li {
|
@@ -193,12 +194,15 @@ div.message {
|
|
193
194
|
width: 4em;
|
194
195
|
color: white;
|
195
196
|
background: #666;
|
196
|
-
font-size: 0.
|
197
|
+
font-size: 0.65em;
|
197
198
|
text-transform: uppercase;
|
198
199
|
font-weight: bold;
|
199
200
|
text-align: center;
|
200
|
-
padding: 0 0.
|
201
|
+
padding: 0 0.5em;
|
201
202
|
margin-right: 0.5em;
|
203
|
+
-moz-border-radius: 0.6em;
|
204
|
+
-webkit-border-radius: 0.6em;
|
205
|
+
font-family: Helvetica, Arial, Sans-Serif;
|
202
206
|
}
|
203
207
|
|
204
208
|
#users .tag.admin {
|
data/views/clone_repo.erb
CHANGED
@@ -6,17 +6,19 @@
|
|
6
6
|
</p>
|
7
7
|
<code> cd your-repo
|
8
8
|
git remote add origin <%= repo_url %>
|
9
|
-
git push origin master
|
9
|
+
git push origin master<%= " --force" if params[:made_empty] == "yes" %></code>
|
10
10
|
<p>
|
11
11
|
Otherwise, to initialize an empty repository:
|
12
12
|
</p>
|
13
|
-
|
13
|
+
<% if params[:made_empty] == "yes" %>
|
14
|
+
<code>git clone <%= repo_url %></code>
|
15
|
+
<% else %><code> mkdir your-repo
|
14
16
|
cd your-repo
|
15
17
|
git init
|
16
18
|
touch .gitignore
|
17
19
|
git add .gitignore
|
18
20
|
git commit -m "Added blank .gitignore to initialize repository"
|
19
21
|
git remote add origin <%= repo_url %>
|
20
|
-
git push origin master</code
|
22
|
+
git push origin master</code><% end %>
|
21
23
|
<p>And you should be good to go! <a href="#" onclick="$('#repository-details').slideUp(); return false;">(close instructions)</a></p>
|
22
24
|
</div>
|
data/views/index.erb
CHANGED
@@ -13,6 +13,10 @@
|
|
13
13
|
<label for="repo_path">Path: (optional)</label>
|
14
14
|
<input type="text" name="repo[path]" id="repo_path" />
|
15
15
|
</div>
|
16
|
+
<div class="row">
|
17
|
+
<label for="repo_make_empty">Initial Commit?</label>
|
18
|
+
<input type="checkbox" name="repo[make_empty]" id="repo_make_empty" value="1" />
|
19
|
+
</div>
|
16
20
|
<div class="buttons">
|
17
21
|
<input type="submit" value="Add Repository" /> or <a href="#" onclick="hideForm('repo'); return false;">Cancel</a>
|
18
22
|
</div>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brownbeagle-gitauth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.4.
|
4
|
+
version: 0.0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darcy Laycock
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-07 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.2.3
|
43
|
+
version: 0.2.3.1
|
44
44
|
version:
|
45
45
|
- !ruby/object:Gem::Dependency
|
46
46
|
name: thoughtbot-shoulda
|
@@ -107,7 +107,6 @@ files:
|
|
107
107
|
- lib/gitauth/message.rb
|
108
108
|
- lib/gitauth/repo.rb
|
109
109
|
- lib/gitauth/saveable_class.rb
|
110
|
-
- lib/gitauth/settings.rb
|
111
110
|
- lib/gitauth/user.rb
|
112
111
|
- lib/gitauth/web_app.rb
|
113
112
|
- public/gitauth.css
|
data/lib/gitauth/settings.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright (C) 2009 Brown Beagle Software
|
3
|
-
# Copyright (C) 2009 Darcy Laycock <sutto@sutto.net>
|
4
|
-
#
|
5
|
-
# This program is free software: you can redistribute it and/or modify
|
6
|
-
# it under the terms of the GNU Affero General Public License as published by
|
7
|
-
# the Free Software Foundation, either version 3 of the License, or
|
8
|
-
# (at your option) any later version.
|
9
|
-
#
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU Affero General Public License for more details.
|
14
|
-
#
|
15
|
-
# You should have received a copy of the GNU Affero General Public License
|
16
|
-
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
-
#++
|
18
|
-
|
19
|
-
|
20
|
-
module GitAuth
|
21
|
-
class Settings < Perennial::Settings
|
22
|
-
|
23
|
-
def self.setup!(options = {})
|
24
|
-
@@configuration = {}
|
25
|
-
settings_file = self.default_settings_path
|
26
|
-
if File.exist?(settings_file)
|
27
|
-
loaded_yaml = YAML.load(File.read(settings_file))
|
28
|
-
# We don't use the default namespace etc.
|
29
|
-
@@configuration.merge!(loaded_yaml || {})
|
30
|
-
end
|
31
|
-
@@configuration.merge! options
|
32
|
-
@@configuration.symbolize_keys!
|
33
|
-
# Generate a module
|
34
|
-
mod = generate_settings_accessor_mixin
|
35
|
-
extend mod
|
36
|
-
include mod
|
37
|
-
@@setup = true
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.update!(hash)
|
41
|
-
settings_file = self.default_settings_path
|
42
|
-
settings = File.file?(settings_file) ? YAML.load(File.read(settings_file)) : {}
|
43
|
-
hash.each_pair { |k,v| settings[k.to_s] = v }
|
44
|
-
File.open(settings_file, "w+") { |f| f.write(settings.to_yaml) }
|
45
|
-
setup!
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
end
|