jeni 0.2.1 → 0.2.3
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/History.txt +12 -0
- data/lib/jeni/actions.rb +1 -1
- data/lib/jeni/options.rb +5 -0
- data/lib/jeni/optparse.rb +9 -0
- data/lib/jeni/utils.rb +15 -2
- data/lib/jeni/version.rb +12 -9
- data/lib/jeni.rb +4 -0
- data/spec/jeni_utils_spec.rb +8 -2
- data/test/examples/target/jeni_template.rb +1 -1
- metadata +4 -15
- data/test/examples/target2/coati.conf +0 -36
- data/test/examples/target2/coati.haml.conf +0 -37
- data/test/examples/target2/executable +0 -3
- data/test/examples/target2/jeni-diff.rb +0 -64
- data/test/examples/target2/jeni.rb +0 -63
- data/test/examples/target2/jeni_link.rb +0 -63
- data/test/examples/target2/jeni_template.rb +0 -10
- data/test/examples/target2/jeni_test.rb +0 -63
- data/test/examples/target2/shebang.rb +0 -3
- data/test/examples/target2/std_template.rb +0 -12
- data/test/examples/target2/template.haml.rb +0 -10
data/History.txt
CHANGED
@@ -4,6 +4,18 @@
|
|
4
4
|
== History
|
5
5
|
|
6
6
|
|
7
|
+
[jeni-0.2.3 21-Nov-2012]
|
8
|
+
|
9
|
+
Generate templates to /tmp directory before transferring to target. Allow users to
|
10
|
+
generate to an alternative target directory, either with target= method or optparse.
|
11
|
+
Allow a block for optparse that passes through the optparse object to allow custom
|
12
|
+
options to be added. Add classify method so templates can convert e.g. project name
|
13
|
+
into a Ruby class (my_project -> MyProject).
|
14
|
+
|
15
|
+
[jeni-0.2.2 15-Nov-2012]
|
16
|
+
|
17
|
+
Ensure new users/groups are remember for subsequent user/group tests
|
18
|
+
|
7
19
|
[jeni-0.2.1 26-Oct-2012]
|
8
20
|
|
9
21
|
Added relative paths to targets that can take /usr/ or /usr/local as their root.
|
data/lib/jeni/actions.rb
CHANGED
@@ -153,7 +153,7 @@ module Jeni
|
|
153
153
|
puts target if @verbose
|
154
154
|
|
155
155
|
# and write it out to the target, but make it a temp
|
156
|
-
temp_file = target_file + "._temp"
|
156
|
+
temp_file = File.join('/tmp', File.basename(target_file) + "._temp")
|
157
157
|
File.open(temp_file, 'w') do |tfile|
|
158
158
|
target.each_line do |tline|
|
159
159
|
tfile.puts tline
|
data/lib/jeni/options.rb
CHANGED
data/lib/jeni/optparse.rb
CHANGED
@@ -73,6 +73,15 @@ module Jeni
|
|
73
73
|
@target_root = '/usr/'
|
74
74
|
end
|
75
75
|
|
76
|
+
opts.on('-t', '--target [PATH]', String, 'set the default target to value given') do |t|
|
77
|
+
@target_root = t
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
if block_given? then
|
82
|
+
yield(opts)
|
83
|
+
end
|
84
|
+
|
76
85
|
opts.on_tail('-h', '--help', 'you are looking at it') do
|
77
86
|
puts opts
|
78
87
|
exit 0
|
data/lib/jeni/utils.rb
CHANGED
@@ -79,13 +79,13 @@ module Jeni
|
|
79
79
|
def check_user(user)
|
80
80
|
Etc.getpwnam(user)
|
81
81
|
rescue ArgumentError
|
82
|
-
@errors[:no_user] = "User does not exist: #{user}"
|
82
|
+
@errors[:no_user] = "User does not exist: #{user}" unless @new_users.include?(user)
|
83
83
|
end
|
84
84
|
|
85
85
|
def check_group(group)
|
86
86
|
Etc.getgrnam(group)
|
87
87
|
rescue ArgumentError
|
88
|
-
@errors[:group] = "Group does not exist: #{group}"
|
88
|
+
@errors[:group] = "Group does not exist: #{group}" unless @new_groups.include?(group)
|
89
89
|
end
|
90
90
|
|
91
91
|
# check there is no user
|
@@ -114,6 +114,8 @@ module Jeni
|
|
114
114
|
return skip
|
115
115
|
rescue ArgumentError
|
116
116
|
# will get here if user does NOT exist
|
117
|
+
@new_users << user
|
118
|
+
@new_groups << user if opts.has_key?(:user_group)
|
117
119
|
return false # do not skip!
|
118
120
|
end
|
119
121
|
|
@@ -134,6 +136,7 @@ module Jeni
|
|
134
136
|
return skip
|
135
137
|
rescue ArgumentError
|
136
138
|
# will get here if user does NOT exist
|
139
|
+
@new_groups << group
|
137
140
|
return false
|
138
141
|
end
|
139
142
|
|
@@ -151,6 +154,16 @@ module Jeni
|
|
151
154
|
end
|
152
155
|
end
|
153
156
|
|
157
|
+
# convert a filename etc to a proper class name
|
158
|
+
# For example, converts 'my_service' to 'MyService'
|
159
|
+
#
|
160
|
+
# @param [String] string to convert to a classname
|
161
|
+
# @return [String] converted classname
|
162
|
+
def classify(string)
|
163
|
+
string = string.sub(/^[a-z\d]*/) { $&.capitalize }
|
164
|
+
string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
|
165
|
+
end
|
166
|
+
|
154
167
|
|
155
168
|
# helper to add commands for options
|
156
169
|
def process_options(opts, target)
|
data/lib/jeni/version.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
# Created by Jevoom
|
2
2
|
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
3
|
+
# 21-Nov-2012
|
4
|
+
# Generate templates to /tmp directory before transferring to target. Allow users to
|
5
|
+
# generate to an alternative target directory, either with target= method or optparse.
|
6
|
+
# Allow a block for optparse that passes through the optparse object to allow custom
|
7
|
+
# options to be added. Add classify method so templates can convert e.g. project name
|
8
|
+
# into a Ruby class (my_project -> MyProject).
|
6
9
|
|
7
10
|
module Jeni
|
8
|
-
# version set to 0.2.
|
9
|
-
Version = '0.2.
|
10
|
-
# date set to
|
11
|
-
Version_Date = '
|
12
|
-
#ident string set to: jeni-0.2.
|
13
|
-
Ident = 'jeni-0.2.
|
11
|
+
# version set to 0.2.3
|
12
|
+
Version = '0.2.3'
|
13
|
+
# date set to 21-Nov-2012
|
14
|
+
Version_Date = '21-Nov-2012'
|
15
|
+
#ident string set to: jeni-0.2.3 21-Nov-2012
|
16
|
+
Ident = 'jeni-0.2.3 21-Nov-2012'
|
14
17
|
end
|
data/lib/jeni.rb
CHANGED
@@ -70,6 +70,9 @@ module Jeni
|
|
70
70
|
@errors = {}
|
71
71
|
@owner = nil
|
72
72
|
@gem_dir = nil
|
73
|
+
# record any new users and groups requested
|
74
|
+
@new_users = Array.new
|
75
|
+
@new_groups = Array.new
|
73
76
|
if block_given? then
|
74
77
|
yield self
|
75
78
|
else
|
@@ -255,6 +258,7 @@ module Jeni
|
|
255
258
|
# @option opts [String] :home path to home directory for user, defaults to /home/$user
|
256
259
|
# @option opts [String] :shell path to shell for user, defaults to /bin/bash
|
257
260
|
# @option opts [Boolean] :skip set true to skip if user exists else fail
|
261
|
+
# @option opts [Boolean] :user_group to create a user group for this user
|
258
262
|
#
|
259
263
|
def user(name, opts={})
|
260
264
|
skip = opts[:skip]
|
data/spec/jeni_utils_spec.rb
CHANGED
@@ -29,6 +29,8 @@ class JeniUtils
|
|
29
29
|
@app_name = 'jeni'
|
30
30
|
@errors = {}
|
31
31
|
@commands = []
|
32
|
+
@new_users = Array.new
|
33
|
+
@new_groups = Array.new
|
32
34
|
@source_root = File.expand_path(File.dirname(__FILE__) + '/../test/examples')
|
33
35
|
end
|
34
36
|
attr_accessor :errors
|
@@ -238,9 +240,11 @@ describe Jeni do
|
|
238
240
|
puts err
|
239
241
|
end
|
240
242
|
@jeni.errors?.should be_false
|
241
|
-
@jeni.check_new_user("
|
243
|
+
@jeni.check_new_user("peppapiglet", {:uid=>10101}, false)
|
242
244
|
@jeni.errors?.should be_false
|
243
|
-
@jeni.check_new_user("
|
245
|
+
@jeni.check_new_user("peppapiglet", {:uid=>10101, :home=>'/home/peppa', :shell=>'/bin/bourne'}, false)
|
246
|
+
@jeni.errors?.should be_false
|
247
|
+
@jeni.check_user("peppapiglet")
|
244
248
|
@jeni.errors?.should be_false
|
245
249
|
end
|
246
250
|
|
@@ -268,6 +272,8 @@ describe Jeni do
|
|
268
272
|
@jeni.errors?.should be_false
|
269
273
|
@jeni.check_new_group("piglets", {:gid=>10101}, false)
|
270
274
|
@jeni.errors?.should be_false
|
275
|
+
@jeni.check_group("piglets")
|
276
|
+
@jeni.errors?.should be_false
|
271
277
|
end
|
272
278
|
|
273
279
|
it "should throw errors for invalid groups" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jeni
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dr Robert
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-11-21 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :runtime
|
@@ -119,17 +119,6 @@ files:
|
|
119
119
|
- test/examples/target/jeni_template.rb
|
120
120
|
- test/examples/target/shebang.rb
|
121
121
|
- test/examples/target2/subfiles/subfile_1.rb
|
122
|
-
- test/examples/target2/jeni_test.rb
|
123
|
-
- test/examples/target2/jeni.rb
|
124
|
-
- test/examples/target2/shebang.rb
|
125
|
-
- test/examples/target2/executable
|
126
|
-
- test/examples/target2/template.haml.rb
|
127
|
-
- test/examples/target2/coati.haml.conf
|
128
|
-
- test/examples/target2/jeni-diff.rb
|
129
|
-
- test/examples/target2/jeni_template.rb
|
130
|
-
- test/examples/target2/coati.conf
|
131
|
-
- test/examples/target2/std_template.rb
|
132
|
-
- test/examples/target2/jeni_link.rb
|
133
122
|
homepage:
|
134
123
|
licenses:
|
135
124
|
- Open Software Licence v3.0
|
@@ -1,36 +0,0 @@
|
|
1
|
-
upstream coati {
|
2
|
-
server unix:/home/robert/dev/rails/coati/tmp/.sock fail_timeout=0;
|
3
|
-
}
|
4
|
-
|
5
|
-
|
6
|
-
server {
|
7
|
-
listen 192.168.0.20:80;
|
8
|
-
server_name coati.lucius.osburn-sharp.ath.cx;
|
9
|
-
|
10
|
-
access_log /home/robert/dev/rails/coati/log/access.log;
|
11
|
-
error_log /home/robert/dev/rails/coati/log/error.log;
|
12
|
-
|
13
|
-
root /home/robert/dev/rails/coati/public/;
|
14
|
-
index index.html;
|
15
|
-
|
16
|
-
location / {
|
17
|
-
proxy_set_header X-Real-IP $remote_addr;
|
18
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
19
|
-
proxy_set_header Host $http_host;
|
20
|
-
proxy_redirect off;
|
21
|
-
|
22
|
-
if (-f $request_filename/index.html) {
|
23
|
-
rewrite (.*) $1/index.html break;
|
24
|
-
}
|
25
|
-
|
26
|
-
if (-f $request_filename.html) {
|
27
|
-
rewrite (.*) $1.html break;
|
28
|
-
}
|
29
|
-
|
30
|
-
if (!-f $request_filename) {
|
31
|
-
proxy_pass http://coati;
|
32
|
-
break;
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
}
|
@@ -1,37 +0,0 @@
|
|
1
|
-
upstream coati {
|
2
|
-
server unix:#{root}/tmp/.sock fail_timeout=0;
|
3
|
-
}
|
4
|
-
|
5
|
-
|
6
|
-
server {
|
7
|
-
listen 192.168.0.20:80;
|
8
|
-
server_name #{app_name}.lucius.osburn-sharp.ath.cx;
|
9
|
-
|
10
|
-
access_log #{root}/log/access.log;
|
11
|
-
error_log #{root}/log/error.log;
|
12
|
-
|
13
|
-
root #{root}/public/;
|
14
|
-
index index.html;
|
15
|
-
|
16
|
-
location / {
|
17
|
-
proxy_set_header X-Real-IP $remote_addr;
|
18
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
19
|
-
proxy_set_header Host $http_host;
|
20
|
-
proxy_redirect off;
|
21
|
-
|
22
|
-
if (-f $request_filename/index.html) {
|
23
|
-
rewrite (.*) $1/index.html break;
|
24
|
-
}
|
25
|
-
|
26
|
-
if (-f $request_filename.html) {
|
27
|
-
rewrite (.*) $1.html break;
|
28
|
-
}
|
29
|
-
|
30
|
-
if (!-f $request_filename) {
|
31
|
-
proxy_pass http://coati;
|
32
|
-
break;
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
}
|
37
|
-
|
@@ -1,64 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: R.J.Sharp
|
3
|
-
# Email:: robert(a)osburn-sharp.ath.cx
|
4
|
-
# Copyright:: Copyright (c) 2012
|
5
|
-
# License:: Open Software Licence v3.0
|
6
|
-
#
|
7
|
-
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
-
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
-
# and in the file LICENCE. Under the terms of this licence, all derivative works
|
10
|
-
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# [requires go here]
|
14
|
-
require 'rubygems'
|
15
|
-
require 'jerbil'
|
16
|
-
|
17
|
-
# = Jeni
|
18
|
-
#
|
19
|
-
# [Description of the main module]
|
20
|
-
module Jeni
|
21
|
-
class Installer
|
22
|
-
|
23
|
-
def initialize(gem_name)
|
24
|
-
@gem_name = gem_name
|
25
|
-
@gem_spec = Gem::Specification.find_by_name(@gem_name)
|
26
|
-
@commands = []
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.construct(gem_name, options={}, &block)
|
30
|
-
@pretend = options[:pretend] || true # JUST FOR NOW!
|
31
|
-
installer = self.new(gem_name)
|
32
|
-
block.call(installer)
|
33
|
-
return self
|
34
|
-
end
|
35
|
-
|
36
|
-
def run!(pretent=false)
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
# copy a file from the source, relative to the gem home to the target
|
41
|
-
# which is absolute
|
42
|
-
def file(source, target, opts={})
|
43
|
-
@commands << {:file => {source => target}}
|
44
|
-
if opts.has_key?(:chown) then
|
45
|
-
@commands << {:chown => opts[:chown]}
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# copy all of the files in a directory
|
50
|
-
def directory(source, target, opts={})
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
# create a wrapper at target to call source
|
55
|
-
def wrapper(source, target)
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
def link(source, target)
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: R.J.Sharp
|
3
|
-
# Email:: robert(a)osburn-sharp.ath.cx
|
4
|
-
# Copyright:: Copyright (c) 2012
|
5
|
-
# License:: Open Software Licence v3.0
|
6
|
-
#
|
7
|
-
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
-
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
-
# and in the file LICENCE. Under the terms of this licence, all derivative works
|
10
|
-
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# [requires go here]
|
14
|
-
require 'rubygems'
|
15
|
-
|
16
|
-
# = Jeni
|
17
|
-
#
|
18
|
-
# [Description of the main module]
|
19
|
-
module Jeni
|
20
|
-
class Installer
|
21
|
-
|
22
|
-
def initialize(gem_name)
|
23
|
-
@gem_name = gem_name
|
24
|
-
@gem_spec = Gem::Specification.find_by_name(@gem_name)
|
25
|
-
@commands = []
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.construct(gem_name, options={}, &block)
|
29
|
-
@pretend = options[:pretend] || true # JUST FOR NOW!
|
30
|
-
installer = self.new(gem_name)
|
31
|
-
block.call(installer)
|
32
|
-
return self
|
33
|
-
end
|
34
|
-
|
35
|
-
def run!(pretent=false)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
# copy a file from the source, relative to the gem home to the target
|
40
|
-
# which is absolute
|
41
|
-
def file(source, target, opts={})
|
42
|
-
@commands << {:file => {source => target}}
|
43
|
-
if opts.has_key?(:chown) then
|
44
|
-
@commands << {:chown => opts[:chown]}
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# copy all of the files in a directory
|
49
|
-
def directory(source, target, opts={})
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
# create a wrapper at target to call source
|
54
|
-
def wrapper(source, target)
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
def link(source, target)
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: R.J.Sharp
|
3
|
-
# Email:: robert(a)osburn-sharp.ath.cx
|
4
|
-
# Copyright:: Copyright (c) 2012
|
5
|
-
# License:: Open Software Licence v3.0
|
6
|
-
#
|
7
|
-
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
-
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
-
# and in the file LICENCE. Under the terms of this licence, all derivative works
|
10
|
-
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# [requires go here]
|
14
|
-
require 'rubygems'
|
15
|
-
|
16
|
-
# = Jeni
|
17
|
-
#
|
18
|
-
# [Description of the main module]
|
19
|
-
module Jeni
|
20
|
-
class Installer
|
21
|
-
|
22
|
-
def initialize(gem_name)
|
23
|
-
@gem_name = gem_name
|
24
|
-
@gem_spec = Gem::Specification.find_by_name(@gem_name)
|
25
|
-
@commands = []
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.construct(gem_name, options={}, &block)
|
29
|
-
@pretend = options[:pretend] || true # JUST FOR NOW!
|
30
|
-
installer = self.new(gem_name)
|
31
|
-
block.call(installer)
|
32
|
-
return self
|
33
|
-
end
|
34
|
-
|
35
|
-
def run!(pretent=false)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
# copy a file from the source, relative to the gem home to the target
|
40
|
-
# which is absolute
|
41
|
-
def file(source, target, opts={})
|
42
|
-
@commands << {:file => {source => target}}
|
43
|
-
if opts.has_key?(:chown) then
|
44
|
-
@commands << {:chown => opts[:chown]}
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# copy all of the files in a directory
|
49
|
-
def directory(source, target, opts={})
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
# create a wrapper at target to call source
|
54
|
-
def wrapper(source, target)
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
def link(source, target)
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: R.J.Sharp
|
3
|
-
# Email:: robert(a)osburn-sharp.ath.cx
|
4
|
-
# Copyright:: Copyright (c) 2012
|
5
|
-
# License:: Open Software Licence v3.0
|
6
|
-
#
|
7
|
-
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
-
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
-
# and in the file LICENCE. Under the terms of this licence, all derivative works
|
10
|
-
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# [requires go here]
|
14
|
-
require 'rubygems'
|
15
|
-
|
16
|
-
# = Jeni
|
17
|
-
#
|
18
|
-
# [Description of the main module]
|
19
|
-
module Jeni
|
20
|
-
class Installer
|
21
|
-
|
22
|
-
def initialize(gem_name)
|
23
|
-
@gem_name = gem_name
|
24
|
-
@gem_spec = Gem::Specification.find_by_name(@gem_name)
|
25
|
-
@commands = []
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.construct(gem_name, options={}, &block)
|
29
|
-
@pretend = options[:pretend] || true # JUST FOR NOW!
|
30
|
-
installer = self.new(gem_name)
|
31
|
-
block.call(installer)
|
32
|
-
return self
|
33
|
-
end
|
34
|
-
|
35
|
-
def run!(pretent=false)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
# copy a file from the source, relative to the gem home to the target
|
40
|
-
# which is absolute
|
41
|
-
def file(source, target, opts={})
|
42
|
-
@commands << {:file => {source => target}}
|
43
|
-
if opts.has_key?(:chown) then
|
44
|
-
@commands << {:chown => opts[:chown]}
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# copy all of the files in a directory
|
49
|
-
def directory(source, target, opts={})
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
# create a wrapper at target to call source
|
54
|
-
def wrapper(source, target)
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
def link(source, target)
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|