win32-xpath 1.0.4 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGES +7 -0
- data/MANIFEST +1 -1
- data/README +2 -8
- data/appveyor.yml +35 -0
- data/certs/djberg96_pub.pem +21 -21
- data/ext/win32/xpath.c +55 -15
- data/test/test_win32_xpath.rb +6 -0
- data/win32-xpath.gemspec +2 -2
- metadata +5 -7
- metadata.gz.sig +0 -0
- data/futzing/futz.rb +0 -71
- data/futzing/test.rb +0 -90
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a356787d2a824c84435d4e0030d2332bc0e608c7
|
4
|
+
data.tar.gz: aa3c03d68d1cf089ec4cf98e459305d1b23e5f83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 319c66c30e057d2b7dfdc0fd92146981939e8231dc8337d8d6e8232ccc9ec49678de0713ea7ebcd631e33ffa95839b2bd0773c0bf665c6d8a47dd20ef5b57f27
|
7
|
+
data.tar.gz: 3d56bec08b78598926082214bed54e7631147c22e676d0f09fc794d5b05ef919d44263ad0d7a28e456dd426296a5e95c9419b831dcf8aecebce96dd1b09786c1
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGES
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
= 1.1.0 - 11-Jun-2016
|
2
|
+
* Changed license to Apache 2.0.
|
3
|
+
* Use PathCchXXX functions wherever I could that had not already been
|
4
|
+
put into place.
|
5
|
+
* Removed the "futzing" directory and contents.
|
6
|
+
* Added an appveyor.yml file.
|
7
|
+
|
1
8
|
= 1.0.4 - 26-Nov-2015
|
2
9
|
* This gem is now signed.
|
3
10
|
|
data/MANIFEST
CHANGED
data/README
CHANGED
@@ -45,16 +45,10 @@
|
|
45
45
|
Park Heesob for encoding advice and help.
|
46
46
|
|
47
47
|
== License
|
48
|
-
|
48
|
+
Apache 2.0
|
49
49
|
|
50
|
-
== Contributions
|
51
|
-
Although this library is free, please consider having your company
|
52
|
-
setup a gittip if used by your company professionally.
|
53
|
-
|
54
|
-
http://www.gittip.com/djberg96/
|
55
|
-
|
56
50
|
== Copyright
|
57
|
-
(C) 2003-
|
51
|
+
(C) 2003-2016 Daniel J. Berger, All Rights Reserved
|
58
52
|
|
59
53
|
== Warranty
|
60
54
|
This package is provided "as is" and without any express or
|
data/appveyor.yml
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
version: '{build}'
|
2
|
+
branches:
|
3
|
+
only:
|
4
|
+
- master
|
5
|
+
skip_tags: true
|
6
|
+
environment:
|
7
|
+
matrix:
|
8
|
+
- ruby_version: 21
|
9
|
+
ruby_dir: 2.1.0
|
10
|
+
- ruby_version: 21-x64
|
11
|
+
ruby_dir: 2.1.0
|
12
|
+
- ruby_version: 22
|
13
|
+
ruby_dir: 2.2.0
|
14
|
+
- ruby_version: 22-x64
|
15
|
+
ruby_dir: 2.2.0
|
16
|
+
install:
|
17
|
+
- ps: >-
|
18
|
+
$env:path = "C:\Ruby" + $env:ruby_version + "\bin;" + $env:path
|
19
|
+
|
20
|
+
$tpath = "C:\Ruby" + $env:ruby_version + "\lib\ruby\" + $env:ruby_dir + "\test"
|
21
|
+
|
22
|
+
if ((test-path $tpath) -eq $True){ rm -recurse -force $tpath }
|
23
|
+
|
24
|
+
gem update --system > $null
|
25
|
+
|
26
|
+
if ((gem query -i test-unit -v ">= 3.0") -eq $False){ gem install test-unit --no-document }
|
27
|
+
cache:
|
28
|
+
- C:\Ruby21\lib\ruby\gems\2.1.0
|
29
|
+
- C:\Ruby21-x64\lib\ruby\gems\2.1.0
|
30
|
+
- C:\Ruby22\lib\ruby\gems\2.2.0
|
31
|
+
- C:\Ruby22-x64\lib\ruby\gems\2.2.0
|
32
|
+
build: off
|
33
|
+
test_script:
|
34
|
+
- cmd: rake
|
35
|
+
deploy: off
|
data/certs/djberg96_pub.pem
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
2
|
-
MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MREwDwYDVQQDDAhkamJl
|
3
|
-
cmc5NjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
|
4
|
-
MB4XDTE1MDkwMjIwNDkxOFoXDTE2MDkwMTIwNDkxOFowPzERMA8GA1UEAwwIZGpi
|
5
|
-
ZXJnOTYxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
|
6
|
-
bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMyTkvXqRp6hLs9eoJOS
|
7
|
-
Hmi8kRYbq9Vkf15/hMxJpotYMgJVHHWrmDcC5Dye2PbnXjTkKf266Zw0PtT9h+lI
|
8
|
-
S3ts9HO+vaCFSMwFFZmnWJSpQ3CNw2RcHxjWkk9yF7imEM8Kz9ojhiDXzBetdV6M
|
9
|
-
gr0lV/alUr7TNVBDngbXEfTWscyXh1qd7xZ4EcOdsDktCe5G45N/o3662tPQvJsi
|
10
|
-
FOF0CM/KuBsa/HL1/eoEmF4B3EKIRfTHrQ3hu20Kv3RJ88QM4ec2+0dd97uX693O
|
11
|
-
zv6981fyEg+aXLkxrkViM/tz2qR2ZE0jPhHTREPYeMEgptRkTmWSKAuLVWrJEfgl
|
12
|
-
DtkCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFEwe
|
13
|
-
nn6bfJADmuIDiMSOzedOrL+xMB0GA1UdEQQWMBSBEmRqYmVyZzk2QGdtYWlsLmNv
|
14
|
-
bTAdBgNVHRIEFjAUgRJkamJlcmc5NkBnbWFpbC5jb20wDQYJKoZIhvcNAQEFBQAD
|
15
|
-
ggEBAHmNOCWoDVD75zHFueY0viwGDVP1BNGFC+yXcb7u2GlK+nEMCORqzURbYPf7
|
16
|
-
tL+/hzmePIRz7i30UM//64GI1NLv9jl7nIwjhPpXpf7/lu2I9hOTsvwSumb5UiKC
|
17
|
-
/sqBxI3sfj9pr79Wpv4MuikX1XPik7Ncb7NPsJPw06Lvyc3Hkg5X2XpPtLtS+Gr2
|
18
|
-
wKJnmzb5rIPS1cmsqv0M9LPWflzfwoZ/SpnmhagP+g05p8bRNKjZSA2iImM/GyYZ
|
19
|
-
EJYzxdPOrx2n6NYR3Hk+vHP0U7UBSveI6+qx+ndQYaeyCn+GRX2PKS9h66YF/Q1V
|
20
|
-
tGSHgAmcLlkdGgan182qsE/4kKM=
|
21
|
-
-----END CERTIFICATE-----
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MREwDwYDVQQDDAhkamJl
|
3
|
+
cmc5NjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
|
4
|
+
MB4XDTE1MDkwMjIwNDkxOFoXDTE2MDkwMTIwNDkxOFowPzERMA8GA1UEAwwIZGpi
|
5
|
+
ZXJnOTYxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
|
6
|
+
bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMyTkvXqRp6hLs9eoJOS
|
7
|
+
Hmi8kRYbq9Vkf15/hMxJpotYMgJVHHWrmDcC5Dye2PbnXjTkKf266Zw0PtT9h+lI
|
8
|
+
S3ts9HO+vaCFSMwFFZmnWJSpQ3CNw2RcHxjWkk9yF7imEM8Kz9ojhiDXzBetdV6M
|
9
|
+
gr0lV/alUr7TNVBDngbXEfTWscyXh1qd7xZ4EcOdsDktCe5G45N/o3662tPQvJsi
|
10
|
+
FOF0CM/KuBsa/HL1/eoEmF4B3EKIRfTHrQ3hu20Kv3RJ88QM4ec2+0dd97uX693O
|
11
|
+
zv6981fyEg+aXLkxrkViM/tz2qR2ZE0jPhHTREPYeMEgptRkTmWSKAuLVWrJEfgl
|
12
|
+
DtkCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFEwe
|
13
|
+
nn6bfJADmuIDiMSOzedOrL+xMB0GA1UdEQQWMBSBEmRqYmVyZzk2QGdtYWlsLmNv
|
14
|
+
bTAdBgNVHRIEFjAUgRJkamJlcmc5NkBnbWFpbC5jb20wDQYJKoZIhvcNAQEFBQAD
|
15
|
+
ggEBAHmNOCWoDVD75zHFueY0viwGDVP1BNGFC+yXcb7u2GlK+nEMCORqzURbYPf7
|
16
|
+
tL+/hzmePIRz7i30UM//64GI1NLv9jl7nIwjhPpXpf7/lu2I9hOTsvwSumb5UiKC
|
17
|
+
/sqBxI3sfj9pr79Wpv4MuikX1XPik7Ncb7NPsJPw06Lvyc3Hkg5X2XpPtLtS+Gr2
|
18
|
+
wKJnmzb5rIPS1cmsqv0M9LPWflzfwoZ/SpnmhagP+g05p8bRNKjZSA2iImM/GyYZ
|
19
|
+
EJYzxdPOrx2n6NYR3Hk+vHP0U7UBSveI6+qx+ndQYaeyCn+GRX2PKS9h66YF/Q1V
|
20
|
+
tGSHgAmcLlkdGgan182qsE/4kKM=
|
21
|
+
-----END CERTIFICATE-----
|
data/ext/win32/xpath.c
CHANGED
@@ -10,9 +10,10 @@
|
|
10
10
|
|
11
11
|
#ifdef HAVE_PATHCCH_H
|
12
12
|
#include <pathcch.h>
|
13
|
-
#
|
14
|
-
|
13
|
+
#define MAX_WPATH PATHCCH_MAX_CCH
|
14
|
+
#else
|
15
15
|
#define MAX_WPATH MAX_PATH * sizeof(wchar_t)
|
16
|
+
#endif
|
16
17
|
|
17
18
|
// Equivalent to raise SystemCallError.new(string, errnum)
|
18
19
|
void rb_raise_syserr(const char* msg, DWORD errnum){
|
@@ -119,6 +120,9 @@ wchar_t* expand_tilde(){
|
|
119
120
|
wchar_t* temp;
|
120
121
|
const wchar_t* env2 = L"HOMEPATH";
|
121
122
|
env = L"HOMEDRIVE";
|
123
|
+
#ifdef HAVE_PATHCCH_H
|
124
|
+
HRESULT hr;
|
125
|
+
#endif
|
122
126
|
|
123
127
|
// If neither are found then raise an error
|
124
128
|
size = GetEnvironmentVariableW(env, NULL, 0);
|
@@ -140,8 +144,20 @@ wchar_t* expand_tilde(){
|
|
140
144
|
rb_raise_syserr("GetEnvironmentVariable", GetLastError());
|
141
145
|
}
|
142
146
|
|
143
|
-
|
147
|
+
#ifdef HAVE_PATHCCH_H
|
148
|
+
hr = PathCchAppendEx(home, MAX_WPATH, temp, 1);
|
149
|
+
if(hr != S_OK){
|
150
|
+
ruby_xfree(home);
|
151
|
+
ruby_xfree(temp);
|
152
|
+
rb_raise_syserr("PathCchAppendEx", hr);
|
153
|
+
}
|
154
|
+
#else
|
155
|
+
if(!PathAppendW(home, temp)){
|
156
|
+
ruby_xfree(home);
|
157
|
+
ruby_xfree(temp);
|
144
158
|
rb_raise_syserr("PathAppend", GetLastError());
|
159
|
+
}
|
160
|
+
#endif
|
145
161
|
}
|
146
162
|
else{
|
147
163
|
home = (wchar_t*)ruby_xmalloc(MAX_WPATH);
|
@@ -204,7 +220,7 @@ static VALUE rb_xpath(int argc, VALUE* argv, VALUE self){
|
|
204
220
|
rb_econv_close(ec);
|
205
221
|
}
|
206
222
|
|
207
|
-
rb_str_modify_expand(v_path,
|
223
|
+
rb_str_modify_expand(v_path, MAX_WPATH);
|
208
224
|
|
209
225
|
// Make our path a wide string for later functions
|
210
226
|
length = MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(v_path), -1, NULL, 0);
|
@@ -229,17 +245,15 @@ static VALUE rb_xpath(int argc, VALUE* argv, VALUE self){
|
|
229
245
|
}
|
230
246
|
else{
|
231
247
|
#ifdef HAVE_PATHCCHAPPENDEX
|
232
|
-
HRESULT
|
233
|
-
|
234
|
-
|
235
|
-
wcscpy_s(buffer, PATHCCH_MAX_CCH, expand_tilde(path));
|
236
|
-
|
237
|
-
result = PathCchAppendEx(buffer, MAX_PATH, ++ptr, PATHCCH_ALLOW_LONG_PATHS);
|
248
|
+
HRESULT hr;
|
249
|
+
home = expand_tilde(path);
|
238
250
|
|
239
|
-
|
240
|
-
rb_raise_syserr("PathCchAppend", result);
|
251
|
+
hr = PathCchAppendEx(home, MAX_WPATH, ++ptr, 1);
|
241
252
|
|
242
|
-
|
253
|
+
if(hr != S_OK){
|
254
|
+
ruby_xfree(home);
|
255
|
+
rb_raise_syserr("PathCchAppendEx", hr);
|
256
|
+
}
|
243
257
|
#else
|
244
258
|
home = expand_tilde(path);
|
245
259
|
|
@@ -258,6 +272,9 @@ static VALUE rb_xpath(int argc, VALUE* argv, VALUE self){
|
|
258
272
|
wchar_t* dir;
|
259
273
|
VALUE v_dir;
|
260
274
|
rb_encoding* dir_encoding;
|
275
|
+
#ifdef HAVE_PATHCCH_H
|
276
|
+
HRESULT hr;
|
277
|
+
#endif
|
261
278
|
|
262
279
|
dir_encoding = rb_enc_get(v_dir_orig);
|
263
280
|
|
@@ -272,10 +289,10 @@ static VALUE rb_xpath(int argc, VALUE* argv, VALUE self){
|
|
272
289
|
}
|
273
290
|
|
274
291
|
// Prep string for modification
|
275
|
-
rb_str_modify_expand(v_dir,
|
292
|
+
rb_str_modify_expand(v_dir, MAX_WPATH);
|
276
293
|
|
277
294
|
length = MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(v_dir), -1, NULL, 0);
|
278
|
-
dir = (wchar_t*)ruby_xmalloc(
|
295
|
+
dir = (wchar_t*)ruby_xmalloc(MAX_WPATH * sizeof(wchar_t));
|
279
296
|
|
280
297
|
if (!MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(v_dir), -1, dir, length)){
|
281
298
|
ruby_xfree(dir);
|
@@ -292,10 +309,19 @@ static VALUE rb_xpath(int argc, VALUE* argv, VALUE self){
|
|
292
309
|
else{
|
293
310
|
dir = expand_tilde();
|
294
311
|
|
312
|
+
#ifdef HAVE_PATHCCH_H
|
313
|
+
hr = PathCchAppendEx(dir, MAX_WPATH, ++ptr, 1);
|
314
|
+
|
315
|
+
if(hr != S_OK){
|
316
|
+
ruby_xfree(dir);
|
317
|
+
rb_raise_syserr("PathCchAppendEx", hr);
|
318
|
+
}
|
319
|
+
#else
|
295
320
|
if (!PathAppendW(dir, ++ptr)){
|
296
321
|
ruby_xfree(dir);
|
297
322
|
rb_raise_syserr("PathAppend", GetLastError());
|
298
323
|
}
|
324
|
+
#endif
|
299
325
|
}
|
300
326
|
}
|
301
327
|
|
@@ -303,10 +329,20 @@ static VALUE rb_xpath(int argc, VALUE* argv, VALUE self){
|
|
303
329
|
path = dir;
|
304
330
|
|
305
331
|
if (PathIsRelativeW(path)){
|
332
|
+
|
333
|
+
#ifdef HAVE_PATHCCH_H
|
334
|
+
hr = PathCchAppendEx(dir, MAX_WPATH, path, 1);
|
335
|
+
|
336
|
+
if(hr != S_OK){
|
337
|
+
ruby_xfree(dir);
|
338
|
+
rb_raise_syserr("PathCchAppendEx", hr);
|
339
|
+
}
|
340
|
+
#else
|
306
341
|
if(!PathAppendW(dir, path)){
|
307
342
|
ruby_xfree(dir);
|
308
343
|
rb_raise_syserr("PathAppend", GetLastError());
|
309
344
|
}
|
345
|
+
#endif
|
310
346
|
|
311
347
|
// Remove leading slashes from relative paths
|
312
348
|
if (dir[0] == L'\\')
|
@@ -350,7 +386,11 @@ static VALUE rb_xpath(int argc, VALUE* argv, VALUE self){
|
|
350
386
|
}
|
351
387
|
|
352
388
|
// Strip all trailing backslashes
|
389
|
+
#ifdef HAVE_PATHCCH_H
|
390
|
+
while (PathCchRemoveBackslash(path, wcslen(path)+1) == S_OK);
|
391
|
+
#else
|
353
392
|
while (!*PathRemoveBackslashW(path));
|
393
|
+
#endif
|
354
394
|
|
355
395
|
// First call, get the length
|
356
396
|
length = GetFullPathNameW(path, 0, buffer, NULL);
|
data/test/test_win32_xpath.rb
CHANGED
@@ -65,6 +65,12 @@ class Test_XPath < Test::Unit::TestCase
|
|
65
65
|
assert_equal(File.join(@root, 'foo.rb'), File.expand_path("#{@root}foo.rb/"))
|
66
66
|
end
|
67
67
|
|
68
|
+
test "removes trailing slashes from relative path" do
|
69
|
+
assert_equal(File.join(@pwd, 'foo'), File.expand_path("foo/"))
|
70
|
+
assert_equal(File.join(@pwd, 'foo'), File.expand_path("foo//"))
|
71
|
+
assert_equal(File.join(@pwd, 'foo'), File.expand_path("foo\\\\\\"))
|
72
|
+
end
|
73
|
+
|
68
74
|
test "removes trailing spaces from absolute path" do
|
69
75
|
assert_equal(File.join(@root, 'foo'), File.expand_path("#{@root}foo "))
|
70
76
|
end
|
data/win32-xpath.gemspec
CHANGED
@@ -2,9 +2,9 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'win32-xpath'
|
5
|
-
spec.version = '1.0
|
5
|
+
spec.version = '1.1.0'
|
6
6
|
spec.author = 'Daniel J. Berger'
|
7
|
-
spec.license = '
|
7
|
+
spec.license = 'Apache 2.0'
|
8
8
|
spec.email = 'djberg96@gmail.com'
|
9
9
|
spec.homepage = 'http://github.com/djberg96/win32-xpath'
|
10
10
|
spec.summary = 'Revamped File.expand_path for Windows'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: win32-xpath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Berger
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
EJYzxdPOrx2n6NYR3Hk+vHP0U7UBSveI6+qx+ndQYaeyCn+GRX2PKS9h66YF/Q1V
|
31
31
|
tGSHgAmcLlkdGgan182qsE/4kKM=
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date:
|
33
|
+
date: 2016-06-12 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: rake
|
@@ -73,6 +73,7 @@ extra_rdoc_files:
|
|
73
73
|
- CHANGES
|
74
74
|
- MANIFEST
|
75
75
|
files:
|
76
|
+
- appveyor.yml
|
76
77
|
- bench
|
77
78
|
- bench/bench_win32_xpath.rb
|
78
79
|
- certs
|
@@ -82,9 +83,6 @@ files:
|
|
82
83
|
- ext/extconf.rb
|
83
84
|
- ext/win32
|
84
85
|
- ext/win32/xpath.c
|
85
|
-
- futzing
|
86
|
-
- futzing/futz.rb
|
87
|
-
- futzing/test.rb
|
88
86
|
- MANIFEST
|
89
87
|
- Rakefile
|
90
88
|
- README
|
@@ -93,7 +91,7 @@ files:
|
|
93
91
|
- win32-xpath.gemspec
|
94
92
|
homepage: http://github.com/djberg96/win32-xpath
|
95
93
|
licenses:
|
96
|
-
-
|
94
|
+
- Apache 2.0
|
97
95
|
metadata: {}
|
98
96
|
post_install_message:
|
99
97
|
rdoc_options: []
|
@@ -111,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
109
|
version: '0'
|
112
110
|
requirements: []
|
113
111
|
rubyforge_project:
|
114
|
-
rubygems_version: 2.4
|
112
|
+
rubygems_version: 2.6.4
|
115
113
|
signing_key:
|
116
114
|
specification_version: 4
|
117
115
|
summary: Revamped File.expand_path for Windows
|
metadata.gz.sig
CHANGED
Binary file
|
data/futzing/futz.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'win32/xpath'
|
2
|
-
require 'tmpdir'
|
3
|
-
|
4
|
-
#p File.expand_path("~djberge", "foo")
|
5
|
-
#p File.expand_path("~/foo")
|
6
|
-
#p File.expand_path("", "~djberge")
|
7
|
-
#p File.expand_path("~djberge")
|
8
|
-
#p File.expand_path("~djberge/foo/bar")
|
9
|
-
#p File.expand_path("~bogus")
|
10
|
-
|
11
|
-
ENV['HOME'] = nil
|
12
|
-
ENV['USERPROFILE'] = nil
|
13
|
-
ENV['HOMEDRIVE'] = "D:/"
|
14
|
-
#ENV['USERPROFILE'] = "C:/bogus"
|
15
|
-
p File.expand_path("~")
|
16
|
-
|
17
|
-
#p File.expand_path("foo", "~")
|
18
|
-
#p File.expand_path("foo", "~")
|
19
|
-
#p File.expand_path("", "~")
|
20
|
-
#p File.expand_path("", "~")
|
21
|
-
#p File.expand_path("foo", "~/bar")
|
22
|
-
#p File.expand_path("foo", "~/bar")
|
23
|
-
#p File.expand_path("")
|
24
|
-
#p File.expand_path("C:/foo/bar")
|
25
|
-
#p File.expand_path("C:/foo/bar///")
|
26
|
-
#p File.expand_path('foo', Dir.tmpdir)
|
27
|
-
#p File.expand_path("C:/foo/bar", "D:/foo")
|
28
|
-
#p File.expand_path("foo")
|
29
|
-
#p File.expand_path("foo", "bar")
|
30
|
-
|
31
|
-
#ENV['HOME'] = nil
|
32
|
-
#ENV['USERPROFILE'] = nil
|
33
|
-
#p File.expand_path("~")
|
34
|
-
|
35
|
-
#path = "../a"
|
36
|
-
#tmp = Dir.tmpdir
|
37
|
-
|
38
|
-
#p path
|
39
|
-
#p tmp
|
40
|
-
|
41
|
-
#100.times{
|
42
|
-
# File.expand_path(path, tmp)
|
43
|
-
# File.expand_path('foo', tmp)
|
44
|
-
#}
|
45
|
-
|
46
|
-
#p path
|
47
|
-
#p tmp
|
48
|
-
|
49
|
-
#p File.expand_path('../a', tmp)
|
50
|
-
|
51
|
-
#p File.expand_path('../a', 'foo')
|
52
|
-
#p File.expand_path('../a', 'foo')
|
53
|
-
#p File.expand_path('../a', 'C:/foo')
|
54
|
-
#p File.expand_path('../a', 'C:/foo')
|
55
|
-
|
56
|
-
|
57
|
-
=begin
|
58
|
-
p File.expand_path("/foo").tainted?
|
59
|
-
p File.expand_path("foo").tainted? # True
|
60
|
-
p File.expand_path("foo".taint).tainted? # True
|
61
|
-
p File.expand_path("C:/foo").tainted? # False
|
62
|
-
p File.expand_path("C:/foo".taint).tainted? # True
|
63
|
-
=end
|
64
|
-
|
65
|
-
=begin
|
66
|
-
p File.expand_path("~")
|
67
|
-
p File.expand_path("~/foo")
|
68
|
-
p File.expand_path("//foo/bar")
|
69
|
-
p File.expand_path("//foo/bar//")
|
70
|
-
p File.expand_path("//foo/bar//")
|
71
|
-
=end
|
data/futzing/test.rb
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
require 'ffi'
|
2
|
-
|
3
|
-
class Windows
|
4
|
-
extend FFI::Library
|
5
|
-
typedef :ulong, :dword
|
6
|
-
|
7
|
-
ffi_lib :shlwapi
|
8
|
-
|
9
|
-
attach_function :PathCanonicalizeA, [:buffer_out, :string], :bool
|
10
|
-
attach_function :PathStripToRootA, [:pointer], :bool
|
11
|
-
attach_function :PathIsRelativeA, [:string], :bool
|
12
|
-
attach_function :PathAppendA, [:buffer_out, :string], :bool
|
13
|
-
attach_function :PathSkipRootA, [:string], :string
|
14
|
-
attach_function :PathIsNetworkPathA, [:string], :bool
|
15
|
-
|
16
|
-
ffi_lib :kernel32
|
17
|
-
attach_function :GetFullPathNameA, [:string, :dword, :buffer_out, :pointer], :dword
|
18
|
-
|
19
|
-
def xpath(path, dir=nil)
|
20
|
-
path = path.tr("/", "\\")
|
21
|
-
|
22
|
-
buf = 0.chr * 512
|
23
|
-
|
24
|
-
p path
|
25
|
-
p PathIsRelativeA(path)
|
26
|
-
|
27
|
-
if !PathCanonicalizeA(buf, path)
|
28
|
-
raise
|
29
|
-
end
|
30
|
-
|
31
|
-
p buf.strip
|
32
|
-
|
33
|
-
#p dir
|
34
|
-
#p path
|
35
|
-
|
36
|
-
#regex = /\A(\w):([^\\]+)(.*)/i
|
37
|
-
=begin
|
38
|
-
if m = regex.match(path)
|
39
|
-
drive = m.captures[0]
|
40
|
-
path = m.captures[1..-1].join
|
41
|
-
p drive
|
42
|
-
p path
|
43
|
-
end
|
44
|
-
=end
|
45
|
-
|
46
|
-
#p PathIsNetworkPathA(path)
|
47
|
-
#p PathSkipRootA(path)
|
48
|
-
#p PathIsRelativeA(path)
|
49
|
-
|
50
|
-
=begin
|
51
|
-
buf = 0.chr * 1024
|
52
|
-
|
53
|
-
if GetFullPathNameA(path, buf.size, buf, nil) == 0
|
54
|
-
raise SystemCallError.new('GetFullPathName', FFI.errno)
|
55
|
-
end
|
56
|
-
|
57
|
-
p buf.strip
|
58
|
-
=end
|
59
|
-
|
60
|
-
=begin
|
61
|
-
ptr = FFI::MemoryPointer.from_string(path)
|
62
|
-
|
63
|
-
p PathIsRelativeA(path)
|
64
|
-
|
65
|
-
unless PathStripToRootA(ptr)
|
66
|
-
raise SystemCallError.new('PathStripToRoot', FFI.errno)
|
67
|
-
end
|
68
|
-
|
69
|
-
p ptr.read_string
|
70
|
-
=end
|
71
|
-
|
72
|
-
=begin
|
73
|
-
unless PathCanonicalizeA(buf, path)
|
74
|
-
raise SystemCallError.new('PathCanonicalize', FFI.errno)
|
75
|
-
end
|
76
|
-
|
77
|
-
buf.strip
|
78
|
-
=end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
if $0 == __FILE__
|
83
|
-
Windows.new.xpath("/../../a", "foo")
|
84
|
-
#p Windows.new.xpath("C:/foo/../bar")
|
85
|
-
#p Windows.new.xpath("C:foo")
|
86
|
-
#Windows.new.xpath("C:foo")
|
87
|
-
#Windows.new.xpath("C:foo/bar")
|
88
|
-
#Windows.new.xpath("C:/foo")
|
89
|
-
#Windows.new.xpath("foo")
|
90
|
-
end
|