ruby-changes:37591
From: naruse <ko1@a...>
Date: Sat, 21 Feb 2015 13:48:44 +0900 (JST)
Subject: [ruby-changes:37591] naruse:r49672 (ruby_2_2): merge revision(s) 49634, 49658, 49663: [Backport #10865]
naruse 2015-02-21 13:48:28 +0900 (Sat, 21 Feb 2015) New Revision: 49672 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49672 Log: merge revision(s) 49634,49658,49663: [Backport #10865] * win32/win32.c (wrename): return EXDEV if moving a directory to another drive, since MoveFileExW does not set proper error code. [ruby-core:68162] [Bug #10865] * win32/win32.c (different_device_p): compare by volume serial numbers, not by path names. numbers, not by path names. [ruby-core:68162] [Bug #10865] Modified directories: branches/ruby_2_2/ Modified files: branches/ruby_2_2/ChangeLog branches/ruby_2_2/version.h branches/ruby_2_2/win32/win32.c Index: ruby_2_2/ChangeLog =================================================================== --- ruby_2_2/ChangeLog (revision 49671) +++ ruby_2_2/ChangeLog (revision 49672) @@ -1,3 +1,14 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_2/ChangeLog#L1 +Sat Feb 21 13:48:11 2015 Nobuyoshi Nakada <nobu@r...> + + * win32/win32.c (different_device_p): compare by volume serial + numbers, not by path names. [ruby-core:68162] [Bug #10865] + +Sat Feb 21 13:48:11 2015 Nobuyoshi Nakada <nobu@r...> + + * win32/win32.c (wrename): return EXDEV if moving a directory to + another drive, since MoveFileExW does not set proper error code. + [ruby-core:68162] [Bug #10865] + Sat Feb 21 12:46:51 2015 Nobuyoshi Nakada <nobu@r...> * win32/file.c (rb_file_expand_path_internal): neither the drive Index: ruby_2_2/win32/win32.c =================================================================== --- ruby_2_2/win32/win32.c (revision 49671) +++ ruby_2_2/win32/win32.c (revision 49672) @@ -4701,6 +4701,31 @@ rb_w32_getenv(const char *name) https://github.com/ruby/ruby/blob/trunk/ruby_2_2/win32/win32.c#L4701 return w32_getenv(name, CP_ACP); } +/* License: Ruby's */ +static DWORD +get_volume_serial_number(const WCHAR *path) +{ + const DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE; + const DWORD creation = OPEN_EXISTING; + const DWORD flags = FILE_FLAG_BACKUP_SEMANTICS; + BY_HANDLE_FILE_INFORMATION st = {0}; + HANDLE h = CreateFileW(path, 0, share_mode, NULL, creation, flags, NULL); + BOOL ret; + + if (h == INVALID_HANDLE_VALUE) return 0; + ret = GetFileInformationByHandle(h, &st); + CloseHandle(h); + if (!ret) return 0; + return st.dwVolumeSerialNumber; +} + +/* License: Ruby's */ +static int +different_device_p(const WCHAR *oldpath, const WCHAR *newpath) +{ + return get_volume_serial_number(oldpath) != get_volume_serial_number(newpath); +} + /* License: Artistic or GPL */ static int wrename(const WCHAR *oldpath, const WCHAR *newpath) @@ -4724,8 +4749,14 @@ wrename(const WCHAR *oldpath, const WCHA https://github.com/ruby/ruby/blob/trunk/ruby_2_2/win32/win32.c#L4749 if (!MoveFileExW(oldpath, newpath, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED)) res = -1; - if (res) - errno = map_errno(GetLastError()); + if (res) { + DWORD e = GetLastError(); + if ((e == ERROR_ACCESS_DENIED) && (oldatts & FILE_ATTRIBUTE_DIRECTORY) && + different_device_p(oldpath, newpath)) + errno = EXDEV; + else + errno = map_errno(e); + } else SetFileAttributesW(newpath, oldatts); }); Index: ruby_2_2/version.h =================================================================== --- ruby_2_2/version.h (revision 49671) +++ ruby_2_2/version.h (revision 49672) @@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_2/version.h#L1 #define RUBY_VERSION "2.2.0" #define RUBY_RELEASE_DATE "2015-02-21" -#define RUBY_PATCHLEVEL 72 +#define RUBY_PATCHLEVEL 73 #define RUBY_RELEASE_YEAR 2015 #define RUBY_RELEASE_MONTH 2 Property changes on: ruby_2_2 ___________________________________________________________________ Modified: svn:mergeinfo Merged /trunk:r49634,49658,49663 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/