diff options
author | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-03-04 14:51:31 +0000 |
---|---|---|
committer | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-03-04 14:51:31 +0000 |
commit | ae73017cadc3114cf7dc4ef43f0a163414f0c50e (patch) | |
tree | ba8bc311178c8794ec70358521595fe9ce876fda | |
parent | c697a394f6328f9e43c48147c5ca7a0433a733cc (diff) |
* file.c (rb_file_s_utime): allow nil to set the current time.
* lib/fileutils.rb (touch): ditto, and added :mtime and :nocreate
options. fixed: [ruby-talk:219037]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@11987 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | file.c | 24 | ||||
-rw-r--r-- | lib/fileutils.rb | 17 |
3 files changed, 36 insertions, 12 deletions
@@ -1,3 +1,10 @@ +Sun Mar 4 23:46:40 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * file.c (rb_file_s_utime): allow nil to set the current time. + + * lib/fileutils.rb (touch): ditto, and added :mtime and :nocreate + options. fixed: [ruby-talk:219037] + Sun Mar 4 23:19:00 2007 WATANABE Hirofumi <eban@ruby-lang.org> * util.c (push_element): should return a int value. @@ -2008,13 +2008,16 @@ rb_file_s_utime(argc, argv) VALUE *argv; { VALUE atime, mtime, rest; - struct timeval tvp[2]; + struct timeval tvs[2], *tvp = NULL; long n; rb_scan_args(argc, argv, "2*", &atime, &mtime, &rest); - tvp[0] = rb_time_timeval(atime); - tvp[1] = rb_time_timeval(mtime); + if (!NIL_P(atime) || !NIL_P(mtime)) { + tvp = tvs; + tvp[0] = rb_time_timeval(atime); + tvp[1] = rb_time_timeval(mtime); + } n = apply2files(utime_internal, rest, tvp); return LONG2FIX(n); @@ -2047,16 +2050,19 @@ rb_file_s_utime(argc, argv) VALUE atime, mtime, rest; long n; struct timeval tv; - struct utimbuf utbuf; + struct utimbuf utbuf, *utp = NULL; rb_scan_args(argc, argv, "2*", &atime, &mtime, &rest); - tv = rb_time_timeval(atime); - utbuf.actime = tv.tv_sec; - tv = rb_time_timeval(mtime); - utbuf.modtime = tv.tv_sec; + if (!NIL_P(atime) || !NIL_P(mtime)) { + utp = &utbuf; + tv = rb_time_timeval(atime); + utp->actime = tv.tv_sec; + tv = rb_time_timeval(mtime); + utp->modtime = tv.tv_sec; + } - n = apply2files(utime_internal, rest, &utbuf); + n = apply2files(utime_internal, rest, utp); return LONG2FIX(n); } diff --git a/lib/fileutils.rb b/lib/fileutils.rb index 9aea507a19..9216c7477b 100644 --- a/lib/fileutils.rb +++ b/lib/fileutils.rb @@ -1013,22 +1013,33 @@ module FileUtils def touch(list, options = {}) fu_check_options options, OPT_TABLE['touch'] list = fu_list(list) - fu_output_message "touch #{list.join ' '}" if options[:verbose] + created = nocreate = options[:nocreate] + t = options[:mtime] + if options[:verbose] + fu_output_message "touch #{ + nocreate ? ' -c' : '' + }#{ + t ? t.strftime(' -t %Y%m%d%H%M.%S') : '' + }#{list.join ' '}" + end return if options[:noop] - t = Time.now list.each do |path| + created = nocreate begin File.utime(t, t, path) rescue Errno::ENOENT + raise if created File.open(path, 'a') { ; } + created = true + retry if t end end end module_function :touch - OPT_TABLE['touch'] = [:noop, :verbose] + OPT_TABLE['touch'] = [:noop, :verbose, :mtime, :nocreate] private |