automateit 0.70930 → 0.71003

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,10 @@
1
+ 0.71003:
2
+ Date: Wed, 03 Oct 2007 01:17:32 -0700
3
+ Desc:
4
+ - Fixed bug in #backup on JRuby because it lacks methods to query properties. It now copies the file and timestamp, but not the owner/group/mode because these can't be queried on JRuby.
5
+ - Improved #cp with new :preserve => :try option so that properties are preserved when possible, but no exception is thrown when these can't be preserved.
6
+ - Improved #touch with options for :like and :stamp options.
7
+
1
8
  0.70930:
2
9
  Date: Sun, 30 Sep 2007 15:10:43 -0700
3
10
  Desc:
@@ -15,7 +15,6 @@ require 'yaml'
15
15
 
16
16
  # Gems
17
17
  require 'rubygems'
18
- require 'open4'
19
18
  require 'erb'
20
19
 
21
20
  # Load ActiveSupport pieces individually to save ~0.5s
@@ -55,6 +55,7 @@ class ::AutomateIt::AccountManager::Passwd < ::AutomateIt::AccountManager::BaseD
55
55
  def _passwd_raw(user, password, opts={})
56
56
  quiet = (opts[:quiet] or not log.info?)
57
57
 
58
+ require 'open4'
58
59
  return Open4::popen4("passwd %s 2>&1" % user) do |pid, sin, sout, serr|
59
60
  $expect_verbose = ! quiet
60
61
  2.times do
@@ -85,6 +85,7 @@ class AutomateIt::PackageManager::Gem < AutomateIt::PackageManager::BaseDriver
85
85
  uninstall_needed = false
86
86
  begin
87
87
  require 'expect'
88
+ require 'open4'
88
89
  exitstruct = Open4::popen4(cmd) do |pid, sin, sout, serr|
89
90
  $expect_verbose = opts[:quiet] ? false : true
90
91
 
@@ -1,7 +1,7 @@
1
1
  # See AutomateIt::Interpreter for usage information.
2
2
  module AutomateIt # :nodoc:
3
3
  # AutomateIt version
4
- VERSION=Gem::Version.new("0.70930")
4
+ VERSION=Gem::Version.new("0.71003")
5
5
 
6
6
  # Instantiates a new Interpreter. See documentation for
7
7
  # Interpreter#setup.
@@ -195,8 +195,11 @@ class AutomateIt::ShellManager < AutomateIt::Plugin::Manager
195
195
  # +false+ if all are present.
196
196
  #
197
197
  # Options:
198
- # * :preserve -- preserve file modification time and ownership, boolean.
199
- # * :recursive -- copy files and directories recursively, boolean.
198
+ # * :preserve -- Preserve file modification time and ownership. Defaults to
199
+ # false. Can be +true+, +false+, or :try. If :try, the properties will be
200
+ # preserved if possible on the platform, whereas +true+ will raise an
201
+ # exception if not available.
202
+ # * :recursive -- Copy files and directories recursively, boolean.
200
203
  def cp(sources, target, opts={}) dispatch(sources, target, opts) end
201
204
 
202
205
  # Copy the +sources+ to the +target+ recursively. Returns an array of
@@ -250,7 +253,11 @@ class AutomateIt::ShellManager < AutomateIt::Plugin::Manager
250
253
  # Create the +targets+ as files if needed and update their modification
251
254
  # time. Unlike most other commands provided by ShellManager, this one will
252
255
  # always modify the targets. Returns an array of targets modified.
253
- def touch(targets) dispatch(targets) end
256
+ #
257
+ # Options:
258
+ # * :like -- Touch the targets like this file. Defaults to none.
259
+ # * :stamp -- Set the targets to the specified timestamp. Defaults to Time.now.
260
+ def touch(targets, opts={}) dispatch(targets, opts) end
254
261
  end
255
262
 
256
263
  # == ShellManager::BaseDriver
@@ -49,7 +49,7 @@ class AutomateIt::ShellManager::Portable < AutomateIt::ShellManager::BaseDriver
49
49
  if is_dir
50
50
  cp_opts = {}
51
51
  cp_opts[:recursive] = true if is_dir
52
- cp_opts[:preserve] = true if superuser?
52
+ cp_opts[:preserve] = :try
53
53
 
54
54
  source_children = _directory_contents(source)
55
55
  #puts "sc: %s" % source_children.inspect
@@ -210,8 +210,16 @@ class AutomateIt::ShellManager::Portable < AutomateIt::ShellManager::BaseDriver
210
210
  opt = opt.to_sym
211
211
  fu_opts[opt] = opts[opt] if opts[opt]
212
212
  end
213
- #fu_opts[:verbose] = true
214
- fu_opts_with_preserve = {:preserve => opts[:preserve]}.merge(fu_opts)
213
+
214
+ fu_opts_with_preserve = fu_opts.clone
215
+ fu_opts_with_preserve[:preserve] = \
216
+ if opts[:preserve] == :try
217
+ fsim = File::Stat.instance_methods
218
+ (fsim.include?("uid") and fsim.include?("gid") and
219
+ fsim.include?("mode") and fsim.include?("atime"))
220
+ else
221
+ opts[:preserve]
222
+ end
215
223
 
216
224
  changed = []
217
225
  sources_a = [sources].flatten
@@ -454,9 +462,48 @@ class AutomateIt::ShellManager::Portable < AutomateIt::ShellManager::BaseDriver
454
462
  end
455
463
 
456
464
  # See ShellManager#touch
457
- def touch(targets)
458
- log.info(PEXEC+"touch #{String === targets ? targets : targets.join(' ')}")
459
- FileUtils.touch(targets, _fileutils_opts)
460
- return targets
465
+ def touch(targets, opts={})
466
+ like = opts.delete(:like)
467
+ stamp = opts.delete(:stamp)
468
+ quiet = opts.delete(:quiet) == true ? true : false
469
+ time = \
470
+ if stamp
471
+ stamp
472
+ elsif like
473
+ begin
474
+ File.stat(like).mtime
475
+ rescue Errno::ENOENT => e
476
+ if preview?
477
+ Time.now
478
+ else
479
+ raise e
480
+ end
481
+ end
482
+ else
483
+ Time.now
484
+ end
485
+
486
+ unless quiet
487
+ msg = PEXEC << "touch"
488
+ msg << " --reference %s" % like if like
489
+ msg << " --stamp %s" % stamp if stamp
490
+ msg << " " << [targets].flatten.join(" ")
491
+ log.info(msg)
492
+ end
493
+
494
+ results = []
495
+ for target in [targets].flatten
496
+ begin
497
+ stat = File.stat(target)
498
+ next if stat.mtime.to_i == time.to_i
499
+ rescue Errno::ENOENT
500
+ File.open(target, "a"){} unless preview?
501
+ end
502
+ File.utime(time, time, target) unless preview?
503
+ results << target
504
+ end
505
+
506
+ return false if results.empty?
507
+ return targets.is_a?(String) ? results.first : results
461
508
  end
462
509
  end
@@ -371,6 +371,10 @@ describe AutomateIt::ShellManager, " in general" do
371
371
  File.exists?(dir).should be_false
372
372
  end
373
373
  end
374
+ end
375
+
376
+ describe AutomateIt::ShellManager, " when touching files" do
377
+ it_should_behave_like "AutomateIt::ShellManager"
374
378
 
375
379
  it "should create files and change their timestamps (touch)" do
376
380
  @m.mktempdircd do
@@ -386,6 +390,79 @@ describe AutomateIt::ShellManager, " in general" do
386
390
  before.should <= after
387
391
  end
388
392
  end
393
+
394
+ it "should touch files with a specific timestamp (touch)" do
395
+ @m.mktempdircd do
396
+ target = "foo"
397
+ stamp = Time.now - 60
398
+ stamp.should_not == Time.now
399
+
400
+ @m.touch(target, :stamp => stamp).should == target
401
+ stat = File.stat(target)
402
+ stamp.to_i.should == stat.mtime.to_i
403
+
404
+ @m.touch(target, :stamp => stamp).should be_false
405
+ end
406
+ end
407
+
408
+ it "should touch files with a timestamp like other files (touch)" do
409
+ @m.mktempdircd do
410
+ source = "foo"
411
+ target = "bar"
412
+ stamp = Time.now - 60
413
+ stamp.should_not == Time.now
414
+ @m.touch(source, :stamp => stamp)
415
+
416
+ @m.touch(target, :like => source).should == target
417
+ stat = File.stat(target)
418
+ stamp.to_i.should == stat.mtime.to_i
419
+
420
+ @m.touch(target, :like => source).should be_false
421
+ end
422
+ end
423
+
424
+ it "should not change timestamps in preview mode (touch)" do
425
+ @m.mktempdircd do
426
+ target = "foo"
427
+ @m.touch(target)
428
+ stamp = File.stat(target).mtime
429
+
430
+ begin
431
+ @m.preview = true
432
+ @m.touch(target)
433
+ File.stat(target).mtime.to_i == stamp.to_i
434
+ ensure
435
+ @m.preview = false
436
+ end
437
+ end
438
+ end
439
+
440
+ it "should raise errors when setting timestamps like non-existing files (touch)" do
441
+ @m.mktempdircd do
442
+ source = "source"
443
+ target = "target"
444
+ File.exists?(source).should be_false
445
+ File.exists?(target).should be_false
446
+
447
+ lambda { @m.touch(target, :like => source) }.should raise_error(Errno::ENOENT)
448
+ end
449
+ end
450
+
451
+ it "should not raise errors when setting timestamps like non-existing files in preview mode (touch)" do
452
+ @m.mktempdircd do
453
+ source = "source"
454
+ target = "target"
455
+ File.exists?(source).should be_false
456
+ File.exists?(target).should be_false
457
+
458
+ begin
459
+ @m.preview = true
460
+ @m.touch(target, :like => source).should == target
461
+ ensure
462
+ @m.preview = false
463
+ end
464
+ end
465
+ end
389
466
  end
390
467
 
391
468
  describe AutomateIt::ShellManager, " when managing modes" do
@@ -428,7 +505,7 @@ describe AutomateIt::ShellManager, " when managing modes" do
428
505
  end
429
506
  end
430
507
 
431
- #it "should set the default mask (umask)" # TODO
508
+ #it "should set the default mask (umask)" # TODO
432
509
  end
433
510
 
434
511
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: automateit
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.70930"
7
- date: 2007-10-01 00:00:00 -07:00
6
+ version: "0.71003"
7
+ date: 2007-10-04 00:00:00 -07:00
8
8
  summary: AutomateIt is an open-source tool for automating the setup and maintenance of UNIX-like systems
9
9
  require_paths:
10
10
  - lib
metadata.gz.sig CHANGED
Binary file