ruby-core

Mailing list archive

[#35027] [Ruby 1.9-Bug#4352][Open] [patch] Fix eval(s, b) backtrace; make eval(s, b) consistent with eval(s) — "James M. Lawrence" <redmine@...>

Bug #4352: [patch] Fix eval(s, b) backtrace; make eval(s, b) consistent w=

16 messages 2011/02/01

[#35114] [Ruby 1.9-Bug#4373][Open] http.rb:677: [BUG] Segmentation fault — Christian Fazzini <redmine@...>

Bug #4373: http.rb:677: [BUG] Segmentation fault

59 messages 2011/02/06

[#35171] [Ruby 1.9-Bug#4386][Open] encoding: directive does not affect regex expressions — mathew murphy <redmine@...>

Bug #4386: encoding: directive does not affect regex expressions

9 messages 2011/02/09

[#35237] [Ruby 1.9-Bug#4400][Open] nested at_exit hooks run in strange order — Suraj Kurapati <redmine@...>

Bug #4400: nested at_exit hooks run in strange order

12 messages 2011/02/15

[ruby-core:35044] File.directory?('...') behavior

From: Luis Lavena <luislavena@...>
Date: 2011-02-02 13:25:35 UTC
List: ruby-core #35044
Hello,

Some developers at RubyInstaller project and myself keep working to
reduce API calls of Ruby on Windows.

We have found that usage of GetFileAttributesEx [1] reduces
FindFirstFile & FindClose operations, and all test_file.rb and
test_dir.rb tests passes, except for one in test_file_exhaustive.rb:

 1) Failure:
test_directory_p(TestFileExhaustive) [ruby/test_file_exhaustive.rb:109]:
Failed assertion, no message given.

74 tests, 547 assertions, 1 failures, 0 errors, 0 skips

Further investigation shows this line:

    assert(!(File.directory?(@dir+"/...")))

Which evaluates File.directory?('...') existance.

On Linux, this fails, as ... is not an existing directory, and on
Windows using FindFirstFile failed too, but because it was performing
a name globing operation looking for something named "...", always
returning false.

But on Linux, you can create a directory named "...":

$ mkdir ...
$ ls -la
total 16
drwxr-xr-x  4 user user 4096 2011-02-02 10:04 .
drwxr-xr-x 18 user user 4096 2011-02-01 23:00 ..
drwxr-xr-x  2 user user 4096 2011-02-02 10:04 ...
-rw-r--r--  1 user user    0 2011-02-01 23:00 a.rb
drwxr-xr-x  2 user user 4096 2011-02-01 23:00 bar

$ ruby -ve "puts File.directory?('...')"
ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux]
true

Windows do not fail as expected, as "..." is actually undefined:

F:\tests>mkdir "..."
A subdirectory or file ... already exists.

F:\tests>dir "..."
 Volume in drive F is Virtual
 Volume Serial Number is 0A33-5C7A

 Directory of F:\tests\...

File Not Found

So GetFileAttributesEx for "..." works, since it identifies "..." but
it can't find it.

I was looking for any concrete example of this issue, but the revision
21447 that introduced that modification:

* win32/win32.c (winnt_stat): gets rid of strange behavior of
      GetFileAttributes().  [ruby-core:21269]

On this thread:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/21269

Presents the multiple dots example, disregard if the directories really exi=
st.

So, considering that "..." can be a directory under certain OS and
filesystems, is valid to say that File.directory?("...") needs to
return false regardless of it's existence?

According to Windows API for testing if a something is a directory [2]:

  path =3D "C:/Users/Luis";
  ret =3D PathIsDirectory(path);
  printf("PathIsDirectory: %s: %d\n", path, ret);

  path =3D "C:/Users/Luis/foo";
  ret =3D PathIsDirectory(path);
  printf("PathIsDirectory: %s: %d\n", path, ret);

  path =3D "C:/Users/Luis/...";
  ret =3D PathIsDirectory(path);
  printf("PathIsDirectory: %s: %d\n", path, ret);

>gcc test.c -o test.exe -lshlwapi.
>test.exe

PathIsDirectory: C:/Users/Luis: 16
PathIsDirectory: C:/Users/Luis/foo: 0
PathIsDirectory: C:/Users/Luis/...: 16

But, asking PathCanonicalize [3]:

  path =3D "C:\\Users\\Luis\\.......";
  ret =3D PathCanonicalize(buffer, path);
  printf("PathCanonicalize: %s: %d, out: %s\n", path, ret, buffer);

PathCanonicalize: C:\Users\Luis\.......: 1, out: C:\Users\Luis\

So I'm confused, it should be considered a bug of Ruby that it returns
true for a non-existing directory, or can we assume behaves following
the current platform support?

Thank you for your time reading this.

[1] http://msdn.microsoft.com/en-us/library/aa364946(v=3Dvs.85).aspx
[2] http://msdn.microsoft.com/en-us/library/bb773621(v=3Dvs.85).aspx
[3] http://msdn.microsoft.com/en-us/library/bb773569(v=3Dvs.85).aspx
--=20
Luis Lavena
AREA 17
-
Perfection in design is achieved not when there is nothing more to add,
but rather when there is nothing more to take away.
Antoine de Saint-Exup=E9ry

In This Thread

Prev Next