extattr 0.1 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/HISTORY.ja.md +49 -0
- data/{LICENSE.txt → LICENSE.md} +5 -0
- data/QUICKREF.ja.md +112 -0
- data/README.md +84 -0
- data/Rakefile +212 -0
- data/ext/extattr-extattr.h +192 -0
- data/ext/extattr-windows.h +724 -0
- data/ext/extattr-xattr.h +229 -0
- data/ext/extattr.c +393 -206
- data/ext/extconf.rb +16 -12
- data/gemstub.rb +22 -0
- data/lib/extattr.rb +274 -0
- data/test/test_extattr.rb +75 -0
- metadata +70 -37
- data/README.txt +0 -53
- data/ext/extattr.bsd +0 -186
- data/ext/extattr.linux +0 -209
- data/ext/extattr.windows +0 -407
- data/rspecs/extattr.rb +0 -53
data/ext/extconf.rb
CHANGED
@@ -1,28 +1,32 @@
|
|
1
1
|
#!ruby
|
2
|
-
#vim: set fileencoding:utf-8
|
3
|
-
|
4
|
-
raise "require ruby-1.9.3+" unless RUBY_VERSION >= "1.9.3"
|
5
2
|
|
6
3
|
require "mkmf"
|
7
4
|
|
8
|
-
|
5
|
+
have_func("rb_ext_ractor_safe", "ruby.h")
|
9
6
|
|
10
7
|
case
|
11
8
|
when have_header("sys/extattr.h")
|
9
|
+
|
12
10
|
when have_header("attr/xattr.h")
|
11
|
+
$CPPFLAGS << " -DLINUX_XATTR_H=\\<attr/xattr.h\\>"
|
12
|
+
|
13
|
+
when have_header("sys/xattr.h")
|
14
|
+
$CPPFLAGS << " -DLINUX_XATTR_H=\\<sys/xattr.h\\>"
|
15
|
+
|
13
16
|
when have_header("winnt.h") && have_header("ntdef.h") && have_header("psapi.h") &&
|
14
17
|
have_header("ddk/ntifs.h") && have_header("ddk/winddk.h") &&
|
15
18
|
have_library("ntoskrnl") && have_library("ntdll") && have_library("psapi")
|
19
|
+
if RbConfig::CONFIG["arch"] =~ /mingw/
|
20
|
+
$LDFLAGS << " -static-libgcc -static-libstdc++"
|
21
|
+
end
|
22
|
+
|
16
23
|
else
|
17
|
-
|
24
|
+
$stderr.puts <<EOM
|
18
25
|
#$0: not supported target.
|
19
26
|
\tmust be available either ddk/ntifs.h, sys/extattr.h or attr/xattr.h on your system.
|
20
|
-
|
21
|
-
|
27
|
+
EOM
|
28
|
+
exit 1
|
22
29
|
end
|
23
30
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
#$CPPFLAGS << " -Wall -DFUSE_USE_VERSION=26"
|
28
|
-
|
31
|
+
ver = RUBY_VERSION.slice(/\d+\.\d+/)
|
32
|
+
create_makefile File.join(ver, "extattr")
|
data/gemstub.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
unless version = File.read("README.md").scan(/^\s*[\*\-]\s*version:{1,2}\s*(.+)/i).flatten[-1]
|
2
|
+
raise "バージョン情報が README.md に見つかりません"
|
3
|
+
end
|
4
|
+
|
5
|
+
DOC << "QUICKREF.ja.md"
|
6
|
+
|
7
|
+
GEMSTUB = Gem::Specification.new do |s|
|
8
|
+
s.name = "extattr"
|
9
|
+
s.version = version
|
10
|
+
s.summary = "extended file attribute manipurator"
|
11
|
+
s.description = <<-EOS
|
12
|
+
"extattr" is extended file attribute manipurator for Ruby.
|
13
|
+
Supported for FreeBSD (extattr), GNU/Linux (xattr) and Microsoft Windows (NTFS Alternative Data Stream (ADS) + NTFS Extended Attributes (EA)).
|
14
|
+
EOS
|
15
|
+
s.homepage = "https://github.com/dearblue/ruby-extattr"
|
16
|
+
s.license = "BSD-2-Clause"
|
17
|
+
s.author = "dearblue"
|
18
|
+
s.email = "dearblue@users.osdn.me"
|
19
|
+
|
20
|
+
s.add_development_dependency "rake", "~> 0"
|
21
|
+
s.add_development_dependency "test-unit", "~> 0"
|
22
|
+
end
|
data/lib/extattr.rb
ADDED
@@ -0,0 +1,274 @@
|
|
1
|
+
#!ruby
|
2
|
+
|
3
|
+
ver = RUBY_VERSION.slice(/\d+\.\d+/)
|
4
|
+
soname = File.basename(__FILE__, ".rb") << ".so"
|
5
|
+
lib = File.join(ver, soname)
|
6
|
+
begin
|
7
|
+
require_relative lib
|
8
|
+
rescue LoadError
|
9
|
+
require lib
|
10
|
+
end
|
11
|
+
|
12
|
+
#
|
13
|
+
# Add operation methods of filesystem extended attributes to File.
|
14
|
+
#
|
15
|
+
# === 名前空間の指定について
|
16
|
+
#
|
17
|
+
# 拡張属性の名前空間を指定する場合、以下の値が利用できます:
|
18
|
+
#
|
19
|
+
# * ExtAttr::USER, ExtAttr::SYSTEM
|
20
|
+
# * 文字列又はシンボルで +user+、+system+ (大文字小文字を区別しません)
|
21
|
+
#
|
22
|
+
# これらの値は内部で変換、または処理が分岐されます。
|
23
|
+
#
|
24
|
+
# extattr::
|
25
|
+
# 整数値に変換されて処理されます。
|
26
|
+
#
|
27
|
+
# xattr::
|
28
|
+
# 拡張属性名に "user." または "system." を追加して処理されます。
|
29
|
+
#
|
30
|
+
# Windows::
|
31
|
+
# ExtAttr::USER の場合は NTFS Alternative Data Stream (ADS) として処理されます。
|
32
|
+
#
|
33
|
+
# ExtAttr::SYSTEM の場合は NTFS Extended Attribute (EA) として処理されます。
|
34
|
+
#
|
35
|
+
module ExtAttr
|
36
|
+
ExtAttr = self
|
37
|
+
|
38
|
+
def self.open(path)
|
39
|
+
if path.kind_of?(File)
|
40
|
+
ea = ExtAttr::Accessor[path, path.to_path]
|
41
|
+
block_given? ? yield(ea) : ea
|
42
|
+
else
|
43
|
+
if block_given?
|
44
|
+
::File.open(path) do |file|
|
45
|
+
return yield(ExtAttr::Accessor[file, path])
|
46
|
+
end
|
47
|
+
else
|
48
|
+
ExtAttr::Accessor[::File.open(path), path]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# call-seq:
|
55
|
+
# each(path, namespace = ExtAttr::USER) -> Enumerator
|
56
|
+
# each(path, namespace = ExtAttr::USER) { |name| ... } -> path
|
57
|
+
#
|
58
|
+
def self.each(path, namespace = ExtAttr::USER, &block)
|
59
|
+
return to_enum(:each, path, namespace) unless block
|
60
|
+
|
61
|
+
list(path, namespace, &block)
|
62
|
+
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# call-seq:
|
68
|
+
# each!(path, namespace = ExtAttr::USER) -> Enumerator
|
69
|
+
# each!(path, namespace = ExtAttr::USER) { |name| ... } -> path
|
70
|
+
#
|
71
|
+
def self.each!(path, namespace = ExtAttr::USER, &block)
|
72
|
+
return to_enum(:each!, path, namespace) unless block
|
73
|
+
|
74
|
+
list!(path, namespace, &block)
|
75
|
+
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# call-seq:
|
81
|
+
# each_pair(path, namespace = ExtAttr::USER) -> Enumerator
|
82
|
+
# each_pair(path, namespace = ExtAttr::USER) { |name, data| ... } -> path
|
83
|
+
#
|
84
|
+
def self.each_pair(path, namespace = ExtAttr::USER, &block)
|
85
|
+
return to_enum(:each_pair, path, namespace) unless block
|
86
|
+
|
87
|
+
list(path, namespace) { |name| yield(name, get(path, namespace, name)) }
|
88
|
+
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
# call-seq:
|
94
|
+
# each_pair!(path, namespace = ExtAttr::USER) -> Enumerator
|
95
|
+
# each_pair!(path, namespace = ExtAttr::USER) { |name, data| ... } -> path
|
96
|
+
#
|
97
|
+
def self.each_pair!(path, namespace = ExtAttr::USER, &block)
|
98
|
+
return to_enum(:each_pair!, path, namespace) unless block
|
99
|
+
|
100
|
+
list!(path, namespace) { |name| yield(name, get!(path, namespace, name)) }
|
101
|
+
|
102
|
+
self
|
103
|
+
end
|
104
|
+
|
105
|
+
class Accessor < Struct.new(:obj, :path)
|
106
|
+
BasicStruct = superclass
|
107
|
+
VIRT_ENOATTR = (ExtAttr::IMPLEMENT == "windows" ? Errno::ENOENT : Errno::ENOATTR)
|
108
|
+
|
109
|
+
def [](name, namespace = ExtAttr::USER)
|
110
|
+
begin
|
111
|
+
ExtAttr.get(obj, namespace, name)
|
112
|
+
rescue VIRT_ENOATTR
|
113
|
+
nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def []=(name, namespace = ExtAttr::USER, data)
|
118
|
+
if data.nil?
|
119
|
+
ExtAttr.delete(obj, namespace, name)
|
120
|
+
else
|
121
|
+
ExtAttr.set(obj, namespace, name, data)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def each(namespace: ExtAttr::USER, &block)
|
126
|
+
ExtAttr.each(obj, namespace, &block)
|
127
|
+
end
|
128
|
+
|
129
|
+
def each_pair(namespace: ExtAttr::USER, &block)
|
130
|
+
ExtAttr.each_pair(obj, namespace, &block)
|
131
|
+
end
|
132
|
+
|
133
|
+
def list(namespace: ExtAttr::USER, &block)
|
134
|
+
ExtAttr.list(obj, namespace, &block)
|
135
|
+
end
|
136
|
+
|
137
|
+
def size(name, namespace: ExtAttr::USER)
|
138
|
+
ExtAttr.size(obj, namespace, name)
|
139
|
+
end
|
140
|
+
|
141
|
+
def get(name, namespace: ExtAttr::USER)
|
142
|
+
ExtAttr.get(obj, namespace, name)
|
143
|
+
end
|
144
|
+
|
145
|
+
def set(name, data, namespace: ExtAttr::USER)
|
146
|
+
ExtAttr.set(obj, namespace, name, data)
|
147
|
+
end
|
148
|
+
|
149
|
+
def delete(name, namespace: ExtAttr::USER)
|
150
|
+
ExtAttr.delete(obj, namespace, name)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
refine File do
|
155
|
+
def extattr
|
156
|
+
ExtAttr::Accessor[self, to_path]
|
157
|
+
end
|
158
|
+
|
159
|
+
#
|
160
|
+
# Enumeration file extattr.
|
161
|
+
#
|
162
|
+
def extattr_each(namespace: ExtAttr::USER, &block)
|
163
|
+
ExtAttr.each(self, namespace, &block)
|
164
|
+
end
|
165
|
+
|
166
|
+
#
|
167
|
+
# Enumeration file extattr.
|
168
|
+
#
|
169
|
+
def extattr_each_pair(namespace: ExtAttr::USER, &block)
|
170
|
+
ExtAttr.each_pair(self, namespace, &block)
|
171
|
+
end
|
172
|
+
|
173
|
+
#
|
174
|
+
# call-seq:
|
175
|
+
# extattr_list(namespace: ExtAttr::USER) -> array of strings
|
176
|
+
# extattr_list(namespace: ExtAttr::USER) { |name| ... } -> enumerator
|
177
|
+
#
|
178
|
+
# Get file extattr list.
|
179
|
+
#
|
180
|
+
def extattr_list(namespace: ExtAttr::USER, &block)
|
181
|
+
ExtAttr.list(self, namespace, &block)
|
182
|
+
end
|
183
|
+
|
184
|
+
#
|
185
|
+
# Get file extattr data size.
|
186
|
+
#
|
187
|
+
def extattr_size(name, namespace: ExtAttr::USER)
|
188
|
+
ExtAttr.size(self, namespace, name)
|
189
|
+
end
|
190
|
+
|
191
|
+
#
|
192
|
+
# Get file extattr data.
|
193
|
+
#
|
194
|
+
def extattr_get(name, namespace: ExtAttr::USER)
|
195
|
+
ExtAttr.get(self, namespace, name)
|
196
|
+
end
|
197
|
+
|
198
|
+
#
|
199
|
+
# Set file extattr data.
|
200
|
+
#
|
201
|
+
def extattr_set(name, value, namespace: ExtAttr::USER)
|
202
|
+
ExtAttr.set(self, namespace, name, value)
|
203
|
+
end
|
204
|
+
|
205
|
+
#
|
206
|
+
# Delete file extattr.
|
207
|
+
#
|
208
|
+
def extattr_delete(name, namespace: ExtAttr::USER)
|
209
|
+
ExtAttr.delete(self, namespace, name)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
refine File.singleton_class do
|
214
|
+
def extattr(path)
|
215
|
+
ExtAttr.open(path)
|
216
|
+
end
|
217
|
+
|
218
|
+
def extattr_each(path, namespace: ExtAttr::USER, &block)
|
219
|
+
ExtAttr.each(path, namespace, &block)
|
220
|
+
end
|
221
|
+
|
222
|
+
def extattr_each!(path, namespace: ExtAttr::USER, &block)
|
223
|
+
ExtAttr.each!(path, namespace, &block)
|
224
|
+
end
|
225
|
+
|
226
|
+
def extattr_each_pair(path, namespace: ExtAttr::USER, &block)
|
227
|
+
ExtAttr.each_pair(path, namespace, &block)
|
228
|
+
end
|
229
|
+
|
230
|
+
def extattr_each_pair!(path, namespace: ExtAttr::USER, &block)
|
231
|
+
ExtAttr.each_pair!(path, namespace, &block)
|
232
|
+
end
|
233
|
+
|
234
|
+
def extattr_list(path, namespace: ExtAttr::USER, &block)
|
235
|
+
ExtAttr.list(path, namespace, &block)
|
236
|
+
end
|
237
|
+
|
238
|
+
def extattr_list!(path, namespace: ExtAttr::USER, &block)
|
239
|
+
ExtAttr.list!(path, namespace, &block)
|
240
|
+
end
|
241
|
+
|
242
|
+
def extattr_get(path, name, namespace: ExtAttr::USER)
|
243
|
+
ExtAttr.get(path, namespace, name)
|
244
|
+
end
|
245
|
+
|
246
|
+
def extattr_get!(path, name, namespace: ExtAttr::USER)
|
247
|
+
ExtAttr.get(path, namespace, name)
|
248
|
+
end
|
249
|
+
|
250
|
+
def extattr_size(path, name, namespace: ExtAttr::USER)
|
251
|
+
ExtAttr.size(path, namespace, name)
|
252
|
+
end
|
253
|
+
|
254
|
+
def extattr_size!(path, name, namespace: ExtAttr::USER)
|
255
|
+
ExtAttr.size(path, namespace, name)
|
256
|
+
end
|
257
|
+
|
258
|
+
def extattr_set(path, name, value, namespace: ExtAttr::USER)
|
259
|
+
ExtAttr.set(path, namespace, name, value)
|
260
|
+
end
|
261
|
+
|
262
|
+
def extattr_set!(path, name, value, namespace: ExtAttr::USER)
|
263
|
+
ExtAttr.set(path, namespace, name, value)
|
264
|
+
end
|
265
|
+
|
266
|
+
def extattr_delete(path, name, namespace: ExtAttr::USER)
|
267
|
+
ExtAttr.delete(path, namespace, name)
|
268
|
+
end
|
269
|
+
|
270
|
+
def extattr_delete!(path, name, namespace: ExtAttr::USER)
|
271
|
+
ExtAttr.delete(path, namespace, name)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#!ruby
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "fileutils"
|
5
|
+
require "tmpdir"
|
6
|
+
|
7
|
+
include FileUtils
|
8
|
+
|
9
|
+
require "extattr"
|
10
|
+
|
11
|
+
using ExtAttr
|
12
|
+
|
13
|
+
class ExtAttr::Test < Test::Unit::TestCase
|
14
|
+
WORKDIR = Dir.mktmpdir(["", ".ruby-extattr.test-work"])
|
15
|
+
FILEPATH1 = File.join(WORKDIR, "file1")
|
16
|
+
FILEPATH2 = File.join(WORKDIR, "file2")
|
17
|
+
|
18
|
+
def self.startup
|
19
|
+
@@file = File.open(FILEPATH1, "a")
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.shutdown
|
23
|
+
@@file.close
|
24
|
+
@@file = nil
|
25
|
+
Dir.chdir "/" rescue nil
|
26
|
+
rmtree WORKDIR, secure: true, verbose: true #, noop: true
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_fd_extattr
|
30
|
+
extdata = "abcdefg"
|
31
|
+
|
32
|
+
assert_equal([], @@file.extattr_list)
|
33
|
+
assert_nil(@@file.extattr_set("ext1", extdata))
|
34
|
+
assert_equal(["ext1"], @@file.extattr_list())
|
35
|
+
assert_equal("ext1", `lsextattr -qq user #{@@file.to_path}`.chomp) if RUBY_PLATFORM =~ /freebsd/
|
36
|
+
assert_equal(extdata, @@file.extattr_get("ext1"))
|
37
|
+
assert_equal(extdata, `getextattr -qq user ext1 #{@@file.to_path}`) if RUBY_PLATFORM =~ /freebsd/
|
38
|
+
assert_nil(@@file.extattr_delete("ext1"))
|
39
|
+
assert_equal([], @@file.extattr_list())
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_extattr
|
43
|
+
extdata = "abcdefg"
|
44
|
+
File.open(FILEPATH2, "ab") {}
|
45
|
+
|
46
|
+
assert_equal([], File.extattr_list(FILEPATH2))
|
47
|
+
assert_nil(File.extattr_set(FILEPATH2, "ext1", extdata))
|
48
|
+
assert_equal(["ext1"], File.extattr_list(FILEPATH2))
|
49
|
+
assert_equal(extdata, File.extattr_get(FILEPATH2, "ext1"))
|
50
|
+
assert_nil(File.extattr_delete(FILEPATH2, "ext1"))
|
51
|
+
assert_equal([], File.extattr_list(FILEPATH2))
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_ractor_extattr
|
55
|
+
# Skip this test on Ruby < 3.0
|
56
|
+
return true unless defined?(Ractor)
|
57
|
+
|
58
|
+
# Ractor is still experimental in Ruby 3.0.x — suppress warning for this test.
|
59
|
+
old_warning_status = Warning[:experimental]
|
60
|
+
Warning[:experimental] = false
|
61
|
+
|
62
|
+
extdata = "abcdefg"
|
63
|
+
File.open(FILEPATH2, "ab") {}
|
64
|
+
|
65
|
+
assert_equal([], File.extattr_list(FILEPATH2))
|
66
|
+
assert_nil(File.extattr_set(FILEPATH2, "ext1", extdata))
|
67
|
+
|
68
|
+
assert_equal(["ext1"], Ractor.new(FILEPATH2) { |path| File.extattr_list(path) }.take)
|
69
|
+
assert_equal(extdata, Ractor.new(FILEPATH2) { |path| File.extattr_get(path, "ext1") }.take)
|
70
|
+
|
71
|
+
assert_nil(File.extattr_delete(FILEPATH2, "ext1"))
|
72
|
+
assert_equal([], File.extattr_list(FILEPATH2))
|
73
|
+
Warning[:experimental] = old_warning_status
|
74
|
+
end
|
75
|
+
end
|
metadata
CHANGED
@@ -1,66 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extattr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
5
|
-
prerelease:
|
4
|
+
version: '0.4'
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- dearblue
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
date: 2021-09-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: test-unit
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: |
|
42
|
+
"extattr" is extended file attribute manipurator for Ruby.
|
43
|
+
Supported for FreeBSD (extattr), GNU/Linux (xattr) and Microsoft Windows (NTFS Alternative Data Stream (ADS) + NTFS Extended Attributes (EA)).
|
44
|
+
email: dearblue@users.osdn.me
|
20
45
|
executables: []
|
21
46
|
extensions:
|
22
47
|
- ext/extconf.rb
|
23
48
|
extra_rdoc_files:
|
24
|
-
-
|
25
|
-
- LICENSE.
|
49
|
+
- HISTORY.ja.md
|
50
|
+
- LICENSE.md
|
51
|
+
- QUICKREF.ja.md
|
52
|
+
- README.md
|
53
|
+
- ext/extattr-extattr.h
|
54
|
+
- ext/extattr-windows.h
|
55
|
+
- ext/extattr-xattr.h
|
26
56
|
- ext/extattr.c
|
57
|
+
- lib/extattr.rb
|
27
58
|
files:
|
28
|
-
-
|
29
|
-
- LICENSE.
|
30
|
-
-
|
59
|
+
- HISTORY.ja.md
|
60
|
+
- LICENSE.md
|
61
|
+
- QUICKREF.ja.md
|
62
|
+
- README.md
|
63
|
+
- Rakefile
|
64
|
+
- ext/extattr-extattr.h
|
65
|
+
- ext/extattr-windows.h
|
66
|
+
- ext/extattr-xattr.h
|
31
67
|
- ext/extattr.c
|
32
|
-
- ext/
|
33
|
-
-
|
34
|
-
-
|
35
|
-
-
|
36
|
-
homepage:
|
68
|
+
- ext/extconf.rb
|
69
|
+
- gemstub.rb
|
70
|
+
- lib/extattr.rb
|
71
|
+
- test/test_extattr.rb
|
72
|
+
homepage: https://github.com/dearblue/ruby-extattr
|
37
73
|
licenses:
|
38
|
-
- 2-
|
39
|
-
|
74
|
+
- BSD-2-Clause
|
75
|
+
metadata: {}
|
76
|
+
post_install_message:
|
40
77
|
rdoc_options:
|
41
|
-
-
|
78
|
+
- "--charset"
|
42
79
|
- UTF-8
|
43
|
-
- -m
|
44
|
-
- README.
|
80
|
+
- "-m"
|
81
|
+
- README.md
|
45
82
|
require_paths:
|
46
83
|
- lib
|
47
84
|
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
-
none: false
|
49
85
|
requirements:
|
50
|
-
- -
|
86
|
+
- - ">="
|
51
87
|
- !ruby/object:Gem::Version
|
52
|
-
version:
|
88
|
+
version: '0'
|
53
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
-
none: false
|
55
90
|
requirements:
|
56
|
-
- -
|
91
|
+
- - ">="
|
57
92
|
- !ruby/object:Gem::Version
|
58
93
|
version: '0'
|
59
94
|
requirements: []
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
summary: extended attribute operation library for ruby
|
95
|
+
rubygems_version: 3.2.14
|
96
|
+
signing_key:
|
97
|
+
specification_version: 4
|
98
|
+
summary: extended file attribute manipurator
|
65
99
|
test_files: []
|
66
|
-
has_rdoc: false
|
data/README.txt
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
= extattr
|
2
|
-
|
3
|
-
extattr is extended attribute operation library for Windows and FreeBSD.
|
4
|
-
|
5
|
-
----
|
6
|
-
|
7
|
-
extattr は拡張属性を操作するライブラリで、Windows、FreeBSD に対応しています (GNU/Linux はコードを書いてみただけで、試験がまったくされていません)。
|
8
|
-
|
9
|
-
サポートされる環境で、統一的なメソッドを提供します。
|
10
|
-
|
11
|
-
クラスメソッドに『!』がついているものはシンボリックリンクに対する操作となります。
|
12
|
-
|
13
|
-
キーワード引数の <code>namespace</code> を与えると、拡張属性の名前空間を指定できます。規定値は <code>EXTATTR_NAMESPACE_USER</code> で、ほかの値は <code>EXTATTR_NAMESPACE_SYSTEM</code> のみが指定できます (Windows 版では <code>EXTATTR_NAMESPACE_USER</code> のみが指定可能です)。
|
14
|
-
|
15
|
-
|
16
|
-
== 拡張属性の属性名を取得:
|
17
|
-
|
18
|
-
- File#extattr_list(namespace: File::EXTATTR_NAMESPACE_USER) -> array
|
19
|
-
- File.extattr_list(path, namespace: File::EXTATTR_NAMESPACE_USER) -> array
|
20
|
-
- File.extattr_list!(path, namespace: File::EXTATTR_NAMESPACE_USER) -> array
|
21
|
-
|
22
|
-
== 拡張属性の要素の大きさを取得:
|
23
|
-
|
24
|
-
- File#extattr_size(name, namespace: File::EXTATTR_NAMESPACE_USER) -> size
|
25
|
-
- File.extattr_size(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> size
|
26
|
-
- File.extattr_size!(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> size
|
27
|
-
|
28
|
-
== 拡張属性の要素を取得:
|
29
|
-
|
30
|
-
- File#extattr_get(name, namespace: File::EXTATTR_NAMESPACE_USER) -> data (String)
|
31
|
-
- File.extattr_get(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> data (String)
|
32
|
-
- File.extattr_get!(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> data (String)
|
33
|
-
|
34
|
-
== 拡張属性の要素を設定:
|
35
|
-
|
36
|
-
- File#extattr_set(name, data, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
37
|
-
- File.extattr_set(path, name, data, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
38
|
-
- File.extattr_set!(path, name, data, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
39
|
-
|
40
|
-
== 拡張属性の要素を削除:
|
41
|
-
|
42
|
-
- File#extattr_delete(name, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
43
|
-
- File.extattr_delete(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
44
|
-
- File.extattr_delete!(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
45
|
-
|
46
|
-
|
47
|
-
== Microsoft Windows における諸注意
|
48
|
-
|
49
|
-
Windows 2000 以降でのみ動作します。Windows 9X シリーズでは <code>require "extattr"</code> の段階で例外が発生するでしょう。
|
50
|
-
|
51
|
-
リパースポイント (ジャンクションやシンボリックリンク) に対する ADS は要素の取得や設定、削除は出来ません。必ずリンク先に対する操作となります。
|
52
|
-
|
53
|
-
128 KiB を超える ADS は取得も設定も出来ません。これは『拡張属性』と捉えた場合、巨大なデータを扱えるべきではないという考えによるためです (本当のところは FreeBSD の拡張属性が最大 64KiB 弱であることが由来です)。巨大な ADS を扱いたい場合は、File.open で自由に読み書きできます (これは ruby に限ったことではなく、Windows による仕様です)。この場合の与えるファイル名は、path + ":" + name という形になります。
|