Project

General

Profile

Backport #6385

mtime vie File.stat(filename).utime vs File.open(filename, 'r').mtime in Windows

Added by kolmanv (Kolman Vornovitsky) about 7 years ago. Updated over 6 years ago.

Status:
Closed
Priority:
Normal
[ruby-core:44776]

Description

=begin
Seems that File.stat is not working well under Windows, specifically the mtime member.
This thing maybe related to local time (timezones) which should not because time which is used is unixtime.
On Mac works fine.

Windows: ruby 1.9.3p194 (2012-04-20) [i386-mingw32]
Mac: ruby 1.9.3p202 (2012-04-27 revision 35484) [x86_64-darwin11.3.0]

To reproduce:
RESOURCES_DIR = File.expand_path(File.dirname(FILE) + "/test")
MOD_TIME_CONTENTS = Time.at 1306527039

def test_local_os
Dir.mkdir(RESOURCES_DIR) unless (File.exists?(RESOURCES_DIR))
file_path = "#{RESOURCES_DIR}/local_os_test.test"
file = File.open(file_path, "w", 0777) do |file|
file.puts("kuku")
end
file_stats = File.stat(file_path)
p "MOD_TIME_CONTENTS: #{MOD_TIME_CONTENTS}."
p "MOD_TIME_CONTENTS: #{MOD_TIME_CONTENTS.to_i}."
p "file_stat.mtime: #{file_stats.mtime}."
p "file_stat.mtime: #{file_stats.mtime.to_i}."
p "File.mtime: #{File.mtime(file_path)}."
p "File.mtime: #{File.mtime(file_path).to_i}."
File.utime File.atime(file_path), MOD_TIME_CONTENTS, file_path
file_stats = File.stat(file_path)
p "file_stat.mtime: #{file_stats.mtime}."
p "file_stat.mtime: #{file_stats.mtime.to_i}."
p "File.mtime: #{File.mtime(file_path)}."
p "File.mtime: #{File.mtime(file_path).to_i}."

file_mtime = nil
file = File.open(file_path, 'r') do |file|
  p "file.open.mtime = #{file.mtime}"
  p "file.open.mtime = #{file.mtime.to_i}"
  file_mtime = file.mtime
end

assert_equal(MOD_TIME_CONTENTS, file_mtime)

# !!! This fails on windows with different timezone
assert_equal(MOD_TIME_CONTENTS, file_stats.mtime)

end

Second assertion fails:
1) Failure:
test_local_os(BBFS::FileUtils::Test::TestTimeModification) [test/file_utils/time_modification_test.rb:89]:
expected but was
.


Related issues

Related to Ruby master - Bug #7276: TestFile#test_utime failureClosed11/05/2012Actions

Associated revisions

Revision b32388d5
Added by nobu (Nobuyoshi Nakada) about 7 years ago

test for Bug #6385

  • test/ruby/test_file.rb (TestFile#test_utime): test for [Bug #6385].

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 35651
Added by nobu (Nobuyoshi Nakada) about 7 years ago

test for Bug #6385

  • test/ruby/test_file.rb (TestFile#test_utime): test for [Bug #6385].

Revision 35651
Added by nobu (Nobuyoshi Nakada) about 7 years ago

test for Bug #6385

  • test/ruby/test_file.rb (TestFile#test_utime): test for [Bug #6385].

Revision 35651
Added by nobu (Nobuyoshi Nakada) about 7 years ago

test for Bug #6385

  • test/ruby/test_file.rb (TestFile#test_utime): test for [Bug #6385].

Revision 35651
Added by nobu (Nobuyoshi Nakada) about 7 years ago

test for Bug #6385

  • test/ruby/test_file.rb (TestFile#test_utime): test for [Bug #6385].

Revision 35651
Added by nobu (Nobuyoshi Nakada) about 7 years ago

test for Bug #6385

  • test/ruby/test_file.rb (TestFile#test_utime): test for [Bug #6385].

Revision 35651
Added by nobu (Nobuyoshi Nakada) about 7 years ago

test for Bug #6385

  • test/ruby/test_file.rb (TestFile#test_utime): test for [Bug #6385].

Revision 9310a593
Added by nobu (Nobuyoshi Nakada) about 7 years ago

merge revision(s) 35109,35110,35651: [Backport #6385]

    * win32/win32.c (rb_w32_fstat, rb_w32_fstati64): convert FILETIME
      to time_t directly, not to be affected by TZ unnecessarily.

    * win32/win32.c (unixtime_to_filetime): convert time_t to FILETIME
      simply.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@35678 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 35678
Added by nobu (Nobuyoshi Nakada) about 7 years ago

merge revision(s) 35109,35110,35651: [Backport #6385]

* win32/win32.c (rb_w32_fstat, rb_w32_fstati64): convert FILETIME
  to time_t directly, not to be affected by TZ unnecessarily.

* win32/win32.c (unixtime_to_filetime): convert time_t to FILETIME
  simply.

History

Updated by mame (Yusuke Endoh) about 7 years ago

  • Status changed from Open to Assigned
  • Assignee set to usa (Usaku NAKAMURA)

Updated by nobu (Nobuyoshi Nakada) about 7 years ago

  • Description updated (diff)
  • Category set to core
  • Status changed from Assigned to Feedback

=begin
I can't reproduce this issue in JST, which does not have DST.
In what timezone are you?
=end

Updated by jonforums (Jon Forums) about 7 years ago

This oddity on Win7 32bit may be related...

C:\Users\Jon\Documents\RubyDev\sandbox>ruby --version
ruby 1.9.3p202 (2012-04-27 revision 35484) [i386-mingw32]

C:\Users\Jon\Documents\RubyDev\sandbox>ripl

open('tst', 'w') { |f| f.write '123' }
=> 3
atime = Time.utc(2012)
=> 2012-01-01 00:00:00 UTC
mtime = Time.utc(2011)
=> 2011-01-01 00:00:00 UTC
File.utime(atime, mtime, 'tst')
=> 1
s = File.stat('tst')
=> #
atime
=> 2012-01-01 00:00:00 UTC
s.atime
=> 2011-12-31 18:00:00 -0500
mtime
=> 2011-01-01 00:00:00 UTC
s.mtime
=> 2010-12-31 18:00:00 -0500

And I've noticed this as part of make test-all TESTS='pathname'

14) Failure:
test_utime(TestPathname) [c:/Users/Jon/Documents/RubyDev/ruby-git/test/pathname/test_pathname.rb:934]:
expected but was
.

Updated by kolmanv (Kolman Vornovitsky) about 7 years ago

Here is my run on the same code seems to work :\
Maybe the problem is at Time.at
kolman@KOLMAN-PC ~
$ irb
irb(main):001:0> open('tst', 'w') { |f| f.write '123' }
=> 3
irb(main):002:0> atime = Time.utc(2012)
=> 2012-01-01 00:00:00 UTC
irb(main):003:0> mtime = Time.utc(2011)
=> 2011-01-01 00:00:00 UTC
irb(main):004:0> File.utime(atime, mtime, 'tst')
=> 1
irb(main):005:0> s = File.stat('tst')
=> #
irb(main):006:0> atime
=> 2012-01-01 00:00:00 UTC
irb(main):007:0> s.atime
=> 2012-01-01 02:00:00 +0200
irb(main):008:0> mtime
=> 2011-01-01 00:00:00 UTC
irb(main):009:0> s.mtime
=> 2011-01-01 02:00:00 +0200
irb(main):010:0> s.mtime.utc
=> 2011-01-01 00:00:00 UTC

Updated by nobu (Nobuyoshi Nakada) about 7 years ago

=begin
: kolmanv (Kolman Vornovitsky) wrote:
Here is my run on the same code seems to work :\
Maybe the problem is at Time.at
kolman@KOLMAN-PC ~
$ irb
irb(main):001:0> open('tst', 'w') { |f| f.write '123' }
=> 3
irb(main):002:0> atime = Time.utc(2012)
=> 2012-01-01 00:00:00 UTC
irb(main):003:0> mtime = Time.utc(2011)
=> 2011-01-01 00:00:00 UTC
irb(main):004:0> File.utime(atime, mtime, 'tst')
=> 1
irb(main):005:0> s = File.stat('tst')
=> #
irb(main):006:0> atime
=> 2012-01-01 00:00:00 UTC
irb(main):007:0> s.atime
=> 2012-01-01 02:00:00 +0200
irb(main):008:0> mtime
=> 2011-01-01 00:00:00 UTC
irb(main):009:0> s.mtime
=> 2011-01-01 02:00:00 +0200
irb(main):010:0> s.mtime.utc
=> 2011-01-01 00:00:00 UTC

Thank you, I could reproduce it with 1.9.3p179, by changing the system
timezone to "((%(UTC+02:00) Athens, Bucharest%))".

But it seems fixed already in the trunk.

=end

#7

Updated by nobu (Nobuyoshi Nakada) about 7 years ago

  • Tracker changed from Bug to Backport
  • Project changed from Ruby master to Backport193
  • Category deleted (core)
  • Status changed from Feedback to Assigned
  • Assignee changed from usa (Usaku NAKAMURA) to luislavena (Luis Lavena)
#8

Updated by nobu (Nobuyoshi Nakada) about 7 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r35678.
Kolman, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


merge revision(s) 35109,35110,35651: [Backport #6385]

* win32/win32.c (rb_w32_fstat, rb_w32_fstati64): convert FILETIME
  to time_t directly, not to be affected by TZ unnecessarily.

* win32/win32.c (unixtime_to_filetime): convert time_t to FILETIME
  simply.

Also available in: Atom PDF