automateit 0.70930 → 0.71003

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.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