recls-ruby 2.9.1 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/recls/api.rb +20 -35
- data/lib/recls/combine_paths_1.rb +8 -4
- data/lib/recls/combine_paths_2plus.rb +12 -13
- data/lib/recls/entry.rb +35 -4
- data/lib/recls/file_search.rb +21 -21
- data/lib/recls/flags.rb +20 -4
- data/lib/recls/foreach.rb +38 -6
- data/lib/recls/obsolete.rb +99 -0
- data/lib/recls/recls.rb +27 -56
- data/lib/recls/stat.rb +71 -28
- data/lib/recls/util.rb +71 -4
- data/lib/recls/version.rb +8 -3
- data/lib/recls/ximpl/os.rb +16 -13
- data/lib/recls/ximpl/unix.rb +15 -12
- data/lib/recls/ximpl/util.rb +81 -17
- data/lib/recls/ximpl/windows.rb +18 -13
- data/test/unit/tc_recls_ximpl_util.rb +107 -101
- metadata +7 -6
data/lib/recls/util.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
# Purpose: Utility module functions for recls library
|
5
5
|
#
|
6
6
|
# Created: 17th February 2014
|
7
|
-
# Updated:
|
7
|
+
# Updated: 14th April 2019
|
8
8
|
#
|
9
9
|
# Author: Matthew Wilson
|
10
10
|
#
|
@@ -36,33 +36,64 @@
|
|
36
36
|
# ######################################################################### #
|
37
37
|
|
38
38
|
|
39
|
+
require 'recls/stat'
|
39
40
|
require 'recls/ximpl/util'
|
40
41
|
require 'recls/ximpl/os'
|
41
42
|
|
43
|
+
=begin
|
44
|
+
=end
|
45
|
+
|
46
|
+
class Object; end # :nodoc:
|
47
|
+
|
42
48
|
module Recls
|
43
49
|
|
44
50
|
# Obtains the absolute form of the given path
|
51
|
+
#
|
52
|
+
# === Signature
|
53
|
+
#
|
54
|
+
# * *Parameters:*
|
55
|
+
# - +path+ (String, Recls::Entry) The path
|
56
|
+
#
|
57
|
+
# === Return
|
58
|
+
# (String) The absolute form of the path
|
45
59
|
def self.absolute_path(path)
|
46
60
|
|
47
61
|
return path.path if 'Recls::Entry' === path.class.to_s
|
48
62
|
|
49
|
-
|
63
|
+
Recls::Ximpl.absolute_path path
|
50
64
|
end
|
51
65
|
|
52
66
|
# Canonicalises the given path, by removing dots ('.' and '..')
|
53
67
|
# directories
|
68
|
+
#
|
69
|
+
# === Signature
|
70
|
+
#
|
71
|
+
# * *Parameters:*
|
72
|
+
# - +path+ (String, Recls::Entry) The path
|
73
|
+
#
|
74
|
+
# === Return
|
75
|
+
# (String) The canonical form of the path
|
54
76
|
def self.canonicalise_path(path)
|
55
77
|
|
56
78
|
path = path.path if 'Recls::Entry' === path.class.to_s
|
57
79
|
|
58
|
-
|
80
|
+
Recls::Ximpl.canonicalise_path path
|
59
81
|
end
|
60
82
|
|
61
83
|
# Derives a given path relative to an origin, unless the path is
|
62
84
|
# absolute
|
85
|
+
#
|
86
|
+
# === Signature
|
87
|
+
#
|
88
|
+
# * *Parameters:*
|
89
|
+
# - +origin+ (String, Recls::Entry) The path against which +path+ will be evaluated
|
90
|
+
# - +path+ (String, Recls::Entry) The path to evaluate
|
91
|
+
#
|
92
|
+
# === Return
|
93
|
+
# (String) The relative form of the path
|
63
94
|
def self.derive_relative_path(origin, path)
|
64
95
|
|
65
|
-
|
96
|
+
Recls::Ximpl.derive_relative_path origin, path
|
66
97
|
end
|
67
98
|
end # module Recls
|
68
99
|
|
@@ -74,6 +105,42 @@ else
|
|
74
105
|
require 'recls/combine_paths_1'
|
75
106
|
end
|
76
107
|
|
108
|
+
module Recls
|
109
|
+
|
110
|
+
# Indicates whether the given path exists, obtaining a Recls::Entry
|
111
|
+
# instance if so
|
112
|
+
#
|
113
|
+
# === Signature
|
114
|
+
#
|
115
|
+
# * *Parameters:*
|
116
|
+
# - +path+ (String, Recls::Entry) The path
|
117
|
+
#
|
118
|
+
# === Return
|
119
|
+
# (Recls::Entry, nil) The entry if +path+ exists; +nil+ otherwise
|
120
|
+
def self.exist?(path)
|
121
|
+
|
122
|
+
return nil if path.nil?
|
123
|
+
|
124
|
+
Recls.stat(path)
|
125
|
+
end
|
126
|
+
|
127
|
+
# Indicates whether the given path is absolute
|
128
|
+
#
|
129
|
+
# === Signature
|
130
|
+
#
|
131
|
+
# * *Parameters:*
|
132
|
+
# - +path+ (String, Recls::Entry) The path
|
133
|
+
#
|
134
|
+
# === Return
|
135
|
+
# (boolean) +true+ if +path+ is absolute; +false+ otherwise
|
136
|
+
def self.absolute_path?(path)
|
137
|
+
|
138
|
+
return nil if path.nil?
|
139
|
+
|
140
|
+
Recls::Ximpl.absolute_path? path
|
141
|
+
end
|
142
|
+
end # module Recls
|
143
|
+
|
77
144
|
# ############################## end of file ############################# #
|
78
145
|
|
79
146
|
|
data/lib/recls/version.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
# Purpose: Version for recls library
|
5
5
|
#
|
6
6
|
# Created: 14th February 2014
|
7
|
-
# Updated:
|
7
|
+
# Updated: 14th April 2019
|
8
8
|
#
|
9
9
|
# Author: Matthew Wilson
|
10
10
|
#
|
@@ -36,10 +36,15 @@
|
|
36
36
|
# ######################################################################### #
|
37
37
|
|
38
38
|
|
39
|
+
=begin
|
40
|
+
=end
|
41
|
+
|
42
|
+
class Object; end # :nodoc:
|
43
|
+
|
39
44
|
module Recls
|
40
45
|
|
41
46
|
# Current version of the recls.Ruby library
|
42
|
-
VERSION = '2.
|
47
|
+
VERSION = '2.10.0'
|
43
48
|
|
44
49
|
private
|
45
50
|
VERSION_PARTS_ = VERSION.split(/[.]/).collect { |n| n.to_i } # :nodoc:
|
@@ -47,7 +52,7 @@ module Recls
|
|
47
52
|
VERSION_MAJOR = VERSION_PARTS_[0] # :nodoc:
|
48
53
|
VERSION_MINOR = VERSION_PARTS_[1] # :nodoc:
|
49
54
|
VERSION_REVISION = VERSION_PARTS_[2] # :nodoc:
|
50
|
-
end
|
55
|
+
end # module Recls
|
51
56
|
|
52
57
|
# ############################## end of file ############################# #
|
53
58
|
|
data/lib/recls/ximpl/os.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# ######################################################################### #
|
2
|
-
# File:
|
2
|
+
# File: recls/ximpl/os.rb
|
3
3
|
#
|
4
|
-
# Purpose:
|
5
|
-
#
|
4
|
+
# Purpose: Operating system internal implementation constructs for the
|
5
|
+
# recls library.
|
6
6
|
#
|
7
|
-
# Created:
|
8
|
-
# Updated:
|
7
|
+
# Created: 16th February 2014
|
8
|
+
# Updated: 14th April 2019
|
9
9
|
#
|
10
|
-
# Author:
|
10
|
+
# Author: Matthew Wilson
|
11
11
|
#
|
12
|
-
# Copyright (c) 2012-
|
12
|
+
# Copyright (c) 2012-2019, Matthew Wilson and Synesis Software
|
13
13
|
# All rights reserved.
|
14
14
|
#
|
15
15
|
# Redistribution and use in source and binary forms, with or without
|
@@ -37,11 +37,14 @@
|
|
37
37
|
# ######################################################################### #
|
38
38
|
|
39
39
|
|
40
|
-
|
40
|
+
=begin
|
41
|
+
=end
|
41
42
|
|
42
|
-
|
43
|
+
module Recls # :nodoc:
|
43
44
|
|
44
|
-
|
45
|
+
module Ximpl # :nodoc: all
|
46
|
+
|
47
|
+
module OS # :nodoc: all
|
45
48
|
|
46
49
|
OS_IS_WINDOWS = (RUBY_PLATFORM =~ /(mswin|mingw|bccwin|wince)/i) ? true : false
|
47
50
|
|
@@ -77,9 +80,9 @@ module Recls
|
|
77
80
|
|
78
81
|
return false
|
79
82
|
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
+
end # module OS
|
84
|
+
end # module Ximpl
|
85
|
+
end # module Recls
|
83
86
|
|
84
87
|
# ############################## end of file ############################# #
|
85
88
|
|
data/lib/recls/ximpl/unix.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# ######################################################################### #
|
2
|
-
# File:
|
2
|
+
# File: recls/ximpl/unix.rb
|
3
3
|
#
|
4
|
-
# Purpose:
|
4
|
+
# Purpose: UNIX-specific constructs for the recls library.
|
5
5
|
#
|
6
|
-
# Created:
|
7
|
-
# Updated:
|
6
|
+
# Created: 19th February 2014
|
7
|
+
# Updated: 14th April 2019
|
8
8
|
#
|
9
|
-
# Author:
|
9
|
+
# Author: Matthew Wilson
|
10
10
|
#
|
11
|
-
# Copyright (c) 2012-
|
11
|
+
# Copyright (c) 2012-2019, Matthew Wilson and Synesis Software
|
12
12
|
# All rights reserved.
|
13
13
|
#
|
14
14
|
# Redistribution and use in source and binary forms, with or without
|
@@ -38,11 +38,14 @@
|
|
38
38
|
|
39
39
|
require 'recls/ximpl/util'
|
40
40
|
|
41
|
-
|
41
|
+
=begin
|
42
|
+
=end
|
42
43
|
|
43
|
-
|
44
|
+
module Recls # :nodoc:
|
44
45
|
|
45
|
-
|
46
|
+
module Ximpl # :nodoc: all
|
47
|
+
|
48
|
+
class FileStat < File::Stat # :nodoc:
|
46
49
|
|
47
50
|
private
|
48
51
|
def initialize(path)
|
@@ -73,9 +76,9 @@ module Recls
|
|
73
76
|
Recls::Ximpl::FileStat.new(path)
|
74
77
|
|
75
78
|
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
+
end # class FileStat
|
80
|
+
end # module Ximpl
|
81
|
+
end # module Recls
|
79
82
|
|
80
83
|
# ############################## end of file ############################# #
|
81
84
|
|
data/lib/recls/ximpl/util.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# ######################################################################### #
|
2
|
-
# File:
|
2
|
+
# File: recls/ximpl/util.rb
|
3
3
|
#
|
4
|
-
# Purpose:
|
4
|
+
# Purpose: Internal implementation constructs for the recls library.
|
5
5
|
#
|
6
|
-
# Created:
|
7
|
-
# Updated:
|
6
|
+
# Created: 24th July 2012
|
7
|
+
# Updated: 14th April 2019
|
8
8
|
#
|
9
|
-
# Author:
|
9
|
+
# Author: Matthew Wilson
|
10
10
|
#
|
11
11
|
# Copyright (c) 2012-2019, Matthew Wilson and Synesis Software
|
12
12
|
# All rights reserved.
|
@@ -41,11 +41,14 @@ require 'recls/flags'
|
|
41
41
|
|
42
42
|
require 'pathname'
|
43
43
|
|
44
|
-
|
44
|
+
=begin
|
45
|
+
=end
|
46
|
+
|
47
|
+
module Recls # :nodoc:
|
45
48
|
|
46
|
-
module Ximpl
|
49
|
+
module Ximpl # :nodoc: all
|
47
50
|
|
48
|
-
module Util
|
51
|
+
module Util # :nodoc: all
|
49
52
|
|
50
53
|
def self.is_path_name_separator(c)
|
51
54
|
|
@@ -271,10 +274,6 @@ module Recls
|
|
271
274
|
|
272
275
|
newParts = []
|
273
276
|
|
274
|
-
=begin
|
275
|
-
trailing_slash = parts.empty? ? nil : self.get_trailing_slash(parts[-1])
|
276
|
-
=end
|
277
|
-
|
278
277
|
lastSingleDots = nil
|
279
278
|
|
280
279
|
path_is_rooted = nil
|
@@ -423,7 +422,7 @@ module Recls
|
|
423
422
|
|
424
423
|
[ newParts.join(''), consume_basename ]
|
425
424
|
end
|
426
|
-
end
|
425
|
+
end # module Util
|
427
426
|
|
428
427
|
# Canonicalises a path
|
429
428
|
#
|
@@ -435,6 +434,8 @@ module Recls
|
|
435
434
|
return nil if not path
|
436
435
|
return '' if path.empty?
|
437
436
|
|
437
|
+
path = File.expand_path(path) if '~' == path[0].to_s
|
438
|
+
|
438
439
|
f1_windows_root, f2_directory, f3_basename, dummy1, dummy2, directory_parts, dummy3 = Util.split_path(path)
|
439
440
|
|
440
441
|
# suppress unused warnings
|
@@ -454,6 +455,39 @@ module Recls
|
|
454
455
|
return "#{f1_windows_root}#{canonicalised_directory}#{f3_basename}"
|
455
456
|
end
|
456
457
|
|
458
|
+
def self.absolute_path?(path)
|
459
|
+
|
460
|
+
case path
|
461
|
+
when nil
|
462
|
+
|
463
|
+
return nil
|
464
|
+
when ::String
|
465
|
+
|
466
|
+
return nil if path.empty?
|
467
|
+
|
468
|
+
path = File.expand_path(path) if '~' == path[0]
|
469
|
+
when ::Recls::Entry
|
470
|
+
|
471
|
+
return path
|
472
|
+
else
|
473
|
+
|
474
|
+
raise TypeError, "parameter path ('#{path}') is of type #{path.class} must be nil or an instance of #{::String} or #{::Recls::Entry}"
|
475
|
+
end
|
476
|
+
|
477
|
+
f1_windows_root, f2_directory, dummy1, dummy2, dummy3, dummy4, dummy5 = Util.split_path(path)
|
478
|
+
|
479
|
+
dummy1 = dummy2 = dummy3 = dummy4 = dummy5 = nil
|
480
|
+
|
481
|
+
unless f1_windows_root
|
482
|
+
|
483
|
+
return nil unless f2_directory
|
484
|
+
|
485
|
+
return nil unless Util.is_path_name_separator(f2_directory[0])
|
486
|
+
end
|
487
|
+
|
488
|
+
Recls::Ximpl.stat_prep(path, nil, Recls::DETAILS_LATER)
|
489
|
+
end
|
490
|
+
|
457
491
|
# determines the absolute path of a given path
|
458
492
|
def self.absolute_path(path, refdir = nil)
|
459
493
|
|
@@ -463,7 +497,10 @@ module Recls
|
|
463
497
|
return nil
|
464
498
|
when ::String
|
465
499
|
|
466
|
-
path
|
500
|
+
path = File.expand_path(path) if '~' == path[0]
|
501
|
+
when ::Recls::Entry
|
502
|
+
|
503
|
+
return path.path
|
467
504
|
else
|
468
505
|
|
469
506
|
raise TypeError, "parameter path ('#{path}') is of type #{path.class} must be an instance of #{::String} or Recls::Entry"
|
@@ -649,10 +686,16 @@ module Recls
|
|
649
686
|
path = self.canonicalise_path path
|
650
687
|
origin = self.canonicalise_path origin
|
651
688
|
|
689
|
+
path = self.absolute_path path
|
690
|
+
origin = self.absolute_path origin
|
691
|
+
|
692
|
+
return path if /^\.[\\\/]*$/ =~ origin
|
693
|
+
|
652
694
|
path_splits = Util.split_path(path)
|
653
695
|
origin_splits = Util.split_path(origin)
|
654
696
|
|
655
697
|
# if different windows root, then cannot provide relative
|
698
|
+
|
656
699
|
if path_splits[0] and origin_splits[0]
|
657
700
|
|
658
701
|
return path if path_splits[0] != origin_splits[0]
|
@@ -663,7 +706,7 @@ module Recls
|
|
663
706
|
path_parts = path_splits[6]
|
664
707
|
origin_parts = origin_splits[6]
|
665
708
|
|
666
|
-
|
709
|
+
loop do
|
667
710
|
|
668
711
|
break if path_parts.empty?
|
669
712
|
break if origin_parts.empty?
|
@@ -702,6 +745,8 @@ module Recls
|
|
702
745
|
paths = [ paths ] unless ::Array === paths
|
703
746
|
abs_ix = 0
|
704
747
|
|
748
|
+
paths = paths.map { |path| '~' == path[0].to_s ? File.expand_path(path) : path }
|
749
|
+
|
705
750
|
paths.each_with_index do |path, index|
|
706
751
|
|
707
752
|
dummy1, f2_directory, dummy2, dummy3, dummy4, dummy5, dummy6 = Util.split_path(path)
|
@@ -770,8 +815,27 @@ module Recls
|
|
770
815
|
return []
|
771
816
|
end
|
772
817
|
end
|
773
|
-
|
774
|
-
|
818
|
+
|
819
|
+
def self.stat_prep(path, search_root, flags)
|
820
|
+
|
821
|
+
begin
|
822
|
+
|
823
|
+
Recls::Entry.new(path, Recls::Ximpl::FileStat.stat(path), search_root, flags)
|
824
|
+
rescue Errno::ENOENT, Errno::ENXIO => x
|
825
|
+
|
826
|
+
x = x # suppress warning
|
827
|
+
|
828
|
+
if 0 != (flags & Recls::DETAILS_LATER)
|
829
|
+
|
830
|
+
Recls::Entry.new(path, nil, search_root, flags)
|
831
|
+
else
|
832
|
+
|
833
|
+
nil
|
834
|
+
end
|
835
|
+
end
|
836
|
+
end
|
837
|
+
end # module Ximpl
|
838
|
+
end # module Recls
|
775
839
|
|
776
840
|
# ############################## end of file ############################# #
|
777
841
|
|
data/lib/recls/ximpl/windows.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# ######################################################################### #
|
2
|
-
# File:
|
2
|
+
# File: recls/ximpl/windows.rb
|
3
3
|
#
|
4
|
-
# Purpose:
|
4
|
+
# Purpose: Windows-specific constructs for the recls library.
|
5
5
|
#
|
6
|
-
# Created:
|
7
|
-
# Updated:
|
6
|
+
# Created: 19th February 2014
|
7
|
+
# Updated: 14th April 2019
|
8
8
|
#
|
9
|
-
# Author:
|
9
|
+
# Author: Matthew Wilson
|
10
10
|
#
|
11
|
-
# Copyright (c) 2012-
|
11
|
+
# Copyright (c) 2012-2019, Matthew Wilson and Synesis Software
|
12
12
|
# All rights reserved.
|
13
13
|
#
|
14
14
|
# Redistribution and use in source and binary forms, with or without
|
@@ -38,11 +38,14 @@
|
|
38
38
|
|
39
39
|
require 'Win32API'
|
40
40
|
|
41
|
-
|
41
|
+
=begin
|
42
|
+
=end
|
42
43
|
|
43
|
-
|
44
|
+
module Recls # :nodoc:
|
44
45
|
|
45
|
-
|
46
|
+
module Ximpl # :nodoc: all
|
47
|
+
|
48
|
+
class FileStat < File::Stat # :nodoc:
|
46
49
|
|
47
50
|
private
|
48
51
|
GetFileAttributes = Win32API.new('kernel32', 'GetFileAttributes', [ 'P' ], 'I')
|
@@ -70,7 +73,7 @@ module Recls
|
|
70
73
|
|
71
74
|
BHFI_pack_string = 'LQQQLLLLLL'
|
72
75
|
|
73
|
-
class ByHandleInformation
|
76
|
+
class ByHandleInformation # :nodoc:
|
74
77
|
|
75
78
|
def initialize(path)
|
76
79
|
|
@@ -121,8 +124,10 @@ module Recls
|
|
121
124
|
attributes = GetFileAttributes.call("#{path}")
|
122
125
|
|
123
126
|
if 0xffffffff == attributes
|
127
|
+
|
124
128
|
@attributes = 0
|
125
129
|
else
|
130
|
+
|
126
131
|
@attributes = attributes
|
127
132
|
end
|
128
133
|
|
@@ -190,9 +195,9 @@ module Recls
|
|
190
195
|
|
191
196
|
Recls::Ximpl::FileStat.new(path)
|
192
197
|
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
198
|
+
end # class FileStat
|
199
|
+
end # module Ximpl
|
200
|
+
end # module Recls
|
196
201
|
|
197
202
|
# ############################## end of file ############################# #
|
198
203
|
|