fsattr 0.0.2
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +21 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/fsattr.gemspec +56 -0
- data/lib/fsattr.rb +58 -0
- data/lib/fsattr/fsattr-linux.rb +78 -0
- data/lib/fsattr/fsattr-osx.rb +71 -0
- data/test/helper.rb +10 -0
- data/test/test_fsattr.rb +7 -0
- metadata +86 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2009 Yannick Koechlin
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
= fsattr
|
|
2
|
+
|
|
3
|
+
fsattr helps to set, get and list extended file attributes on os X and Linux.
|
|
4
|
+
|
|
5
|
+
Help on adding Windows compatibilty would be nice.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
|
|
9
|
+
f = File.open "/tmp/blah", "w"
|
|
10
|
+
|
|
11
|
+
f.fsattr_set "hello", "world"
|
|
12
|
+
|
|
13
|
+
f.fsattr_get "hello"
|
|
14
|
+
|
|
15
|
+
f.fsattr_list
|
|
16
|
+
|
|
17
|
+
f.close
|
|
18
|
+
|
|
19
|
+
== Copyright
|
|
20
|
+
|
|
21
|
+
Copyright (c) 2010 Yannick Koechlin. See LICENSE for details.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'rake'
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'jeweler'
|
|
6
|
+
Jeweler::Tasks.new do |gem|
|
|
7
|
+
gem.name = "fsattr"
|
|
8
|
+
gem.summary = %Q{modify extended filesystem attributes on linux and os x}
|
|
9
|
+
gem.description = %Q{modify extended filesystem attributes on linux and os x}
|
|
10
|
+
gem.email = "yannick@koechlin.info"
|
|
11
|
+
gem.homepage = "http://github.com/yannick/fsattr"
|
|
12
|
+
gem.authors = ["Yannick Koechlin"]
|
|
13
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
|
15
|
+
end
|
|
16
|
+
Jeweler::GemcutterTasks.new
|
|
17
|
+
rescue LoadError
|
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
require 'rake/testtask'
|
|
22
|
+
Rake::TestTask.new(:test) do |test|
|
|
23
|
+
test.libs << 'lib' << 'test'
|
|
24
|
+
test.pattern = 'test/**/test_*.rb'
|
|
25
|
+
test.verbose = true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
begin
|
|
29
|
+
require 'rcov/rcovtask'
|
|
30
|
+
Rcov::RcovTask.new do |test|
|
|
31
|
+
test.libs << 'test'
|
|
32
|
+
test.pattern = 'test/**/test_*.rb'
|
|
33
|
+
test.verbose = true
|
|
34
|
+
end
|
|
35
|
+
rescue LoadError
|
|
36
|
+
task :rcov do
|
|
37
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
task :test => :check_dependencies
|
|
42
|
+
|
|
43
|
+
task :default => :test
|
|
44
|
+
|
|
45
|
+
require 'rake/rdoctask'
|
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
|
48
|
+
|
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
50
|
+
rdoc.title = "fsattr #{version}"
|
|
51
|
+
rdoc.rdoc_files.include('README*')
|
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
53
|
+
end
|
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.0.2
|
data/fsattr.gemspec
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Generated by jeweler
|
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
|
4
|
+
# -*- encoding: utf-8 -*-
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |s|
|
|
7
|
+
s.name = %q{fsattr}
|
|
8
|
+
s.version = "0.0.2"
|
|
9
|
+
|
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
|
+
s.authors = ["Yannick Koechlin"]
|
|
12
|
+
s.date = %q{2010-04-30}
|
|
13
|
+
s.description = %q{modify extended filesystem attributes on linux and os x}
|
|
14
|
+
s.email = %q{yannick@koechlin.info}
|
|
15
|
+
s.extra_rdoc_files = [
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"README.rdoc"
|
|
18
|
+
]
|
|
19
|
+
s.files = [
|
|
20
|
+
".document",
|
|
21
|
+
".gitignore",
|
|
22
|
+
"LICENSE",
|
|
23
|
+
"README.rdoc",
|
|
24
|
+
"Rakefile",
|
|
25
|
+
"VERSION",
|
|
26
|
+
"fsattr.gemspec",
|
|
27
|
+
"lib/fsattr.rb",
|
|
28
|
+
"lib/fsattr/fsattr-linux.rb",
|
|
29
|
+
"lib/fsattr/fsattr-osx.rb",
|
|
30
|
+
"test/helper.rb",
|
|
31
|
+
"test/test_fsattr.rb"
|
|
32
|
+
]
|
|
33
|
+
s.homepage = %q{http://github.com/yannick/fsattr}
|
|
34
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
|
35
|
+
s.require_paths = ["lib"]
|
|
36
|
+
s.rubygems_version = %q{1.3.6}
|
|
37
|
+
s.summary = %q{modify extended filesystem attributes on linux and os x}
|
|
38
|
+
s.test_files = [
|
|
39
|
+
"test/helper.rb",
|
|
40
|
+
"test/test_fsattr.rb"
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
if s.respond_to? :specification_version then
|
|
44
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
|
45
|
+
s.specification_version = 3
|
|
46
|
+
|
|
47
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
|
48
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
|
49
|
+
else
|
|
50
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
|
51
|
+
end
|
|
52
|
+
else
|
|
53
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
data/lib/fsattr.rb
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'ffi'
|
|
2
|
+
require 'sysinfo'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
File.class_eval do
|
|
7
|
+
|
|
8
|
+
if (SysInfo.new.impl == :osx)
|
|
9
|
+
require 'lib/fsattr/fsattr-osx'
|
|
10
|
+
include FSattrOSX
|
|
11
|
+
end
|
|
12
|
+
if (SysInfo.new.impl == :linux)
|
|
13
|
+
require 'lib/fsattr/fsattr-linux'
|
|
14
|
+
include FSattrLinux
|
|
15
|
+
end
|
|
16
|
+
alias_method :fsattr_get, :fsattr_fget
|
|
17
|
+
alias_method :fsattr_set, :fsattr_fset
|
|
18
|
+
alias_method :fsattr_list, :fsattr_flist
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
#todo: not complete
|
|
24
|
+
class FSattr
|
|
25
|
+
|
|
26
|
+
include Enumerable
|
|
27
|
+
include FSattrOSX if (SysInfo.new.impl == :osx)
|
|
28
|
+
include FSattrLinux if (SysInfo.new.impl == :linux)
|
|
29
|
+
|
|
30
|
+
attr_accessor :path
|
|
31
|
+
|
|
32
|
+
alias_method :get, :fsattr_pget
|
|
33
|
+
alias_method :set, :fsattr_pset
|
|
34
|
+
alias_method :list, :fsattr_plist
|
|
35
|
+
|
|
36
|
+
def initialize(path)
|
|
37
|
+
@path = path
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def each
|
|
41
|
+
list
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def [](key)
|
|
45
|
+
get key
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def []=(key, val)
|
|
49
|
+
set key, val
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#provides bindings for hfs+ filesystem attributes via FFI
|
|
2
|
+
#TODO: difference between root and user attributes. currently only user attributes are supported
|
|
3
|
+
|
|
4
|
+
module FSattrLinux
|
|
5
|
+
|
|
6
|
+
extend FFI::Library
|
|
7
|
+
ffi_lib 'attr'
|
|
8
|
+
|
|
9
|
+
#ssize_t getxattr(const char *path, const char *name, void *value, size_t size, u_int32_t position, int options);
|
|
10
|
+
attach_function 'getxattr', [ :string, :string, :string, :size_t, :uint, :int ], :int
|
|
11
|
+
|
|
12
|
+
#ssize_t fgetxattr(int fd, const char *name, void *value, size_t size, u_int32_t position, int options);
|
|
13
|
+
attach_function 'fgetxattr', [ :int, :string, :string, :size_t, :uint, :int ], :int
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# int setxattr(const char *@path, const char *name, void *value, size_t size, u_int32_t position, int options);
|
|
17
|
+
attach_function 'setxattr', [ :string, :string, :string, :size_t, :uint, :int ], :int
|
|
18
|
+
|
|
19
|
+
# int fsetxattr(int fd, const char *name, void *value, size_t size, u_int32_t position, int options);
|
|
20
|
+
attach_function 'fsetxattr', [ :int, :string, :string, :size_t, :uint, :int ], :int
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
#ssize_t listxattr(const char *@path, char *namebuf, size_t size, int options);
|
|
24
|
+
attach_function 'listxattr', [:string, :string, :size_t, :int], :size_t
|
|
25
|
+
|
|
26
|
+
#ssize_t flistxattr(int fd, char *namebuf, size_t size, int options);
|
|
27
|
+
attach_function 'flistxattr', [:int, :string, :size_t, :int], :size_t
|
|
28
|
+
|
|
29
|
+
#see man 2 getxattr
|
|
30
|
+
def fsattr_pget(attribut)
|
|
31
|
+
attribut = "user." + attribut
|
|
32
|
+
size = getxattr(@path, attribut, nil, 0,0,0)
|
|
33
|
+
return "" if size < 0
|
|
34
|
+
result = " " * size
|
|
35
|
+
size = getxattr(@path, attribut, result, size, 0,0)
|
|
36
|
+
return result
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
#see man 2 setxattr
|
|
40
|
+
def fsattr_pset(attribute, value)
|
|
41
|
+
value = "user."+ value
|
|
42
|
+
err = setxattr(@path, attribute, value, value.bytesize, 0,0)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#see man 2 listxattr
|
|
46
|
+
def fsattr_plist()
|
|
47
|
+
size = listxattr(@path, nil, 0,0)
|
|
48
|
+
result = " " * size
|
|
49
|
+
err = listxattr(@path, result, size, 0)
|
|
50
|
+
#hack. remove the user. and root. and empty string prefixes
|
|
51
|
+
return (result.split("\x00").map {|att| att.gsub(/(user\.)|(root\.)|^(\s)+?$/, "")}).compact.reject { |s| s.empty? }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#man 2 getxattr
|
|
55
|
+
def fsattr_fget(attribut)
|
|
56
|
+
attribut = "user." + attribut
|
|
57
|
+
size = fgetxattr(fileno.to_i, attribut, nil, 0,0,0)
|
|
58
|
+
return "" if size < 0
|
|
59
|
+
result = " " * size
|
|
60
|
+
size = fgetxattr(fileno.to_i, attribut, result, size, 0,0)
|
|
61
|
+
return result
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
#see man 2 setxattr
|
|
65
|
+
def fsattr_fset(attribute, value)
|
|
66
|
+
value = "user."+ value
|
|
67
|
+
err = fsetxattr(fileno.to_i, attribute, value, value.bytesize, 0,0)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#see man 2 listxattr
|
|
71
|
+
def fsattr_flist()
|
|
72
|
+
size = flistxattr(fileno.to_i, nil, 0,0)
|
|
73
|
+
result = " " * size
|
|
74
|
+
err = flistxattr(fileno.to_i, result, size, 0)
|
|
75
|
+
return (result.split("\x00").map {|att| att.gsub(/(user\.)|(root\.)|^(\s)+?$/, "")}).compact.reject { |s| s.empty? }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#provides bindings for hfs+ filesystem attributes via FFI
|
|
2
|
+
module FSattrOSX
|
|
3
|
+
|
|
4
|
+
extend FFI::Library
|
|
5
|
+
ffi_lib 'System'
|
|
6
|
+
|
|
7
|
+
#ssize_t getxattr(const char *path, const char *name, void *value, size_t size, u_int32_t position, int options);
|
|
8
|
+
attach_function 'getxattr', [ :string, :string, :string, :size_t, :uint, :int ], :int
|
|
9
|
+
|
|
10
|
+
#ssize_t fgetxattr(int fd, const char *name, void *value, size_t size, u_int32_t position, int options);
|
|
11
|
+
attach_function 'fgetxattr', [ :int, :string, :string, :size_t, :uint, :int ], :int
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# int setxattr(const char *@path, const char *name, void *value, size_t size, u_int32_t position, int options);
|
|
15
|
+
attach_function 'setxattr', [ :string, :string, :string, :size_t, :uint, :int ], :int
|
|
16
|
+
|
|
17
|
+
# int fsetxattr(int fd, const char *name, void *value, size_t size, u_int32_t position, int options);
|
|
18
|
+
attach_function 'fsetxattr', [ :int, :string, :string, :size_t, :uint, :int ], :int
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
#ssize_t listxattr(const char *@path, char *namebuf, size_t size, int options);
|
|
22
|
+
attach_function 'listxattr', [:string, :string, :size_t, :int], :size_t
|
|
23
|
+
|
|
24
|
+
#ssize_t flistxattr(int fd, char *namebuf, size_t size, int options);
|
|
25
|
+
attach_function 'flistxattr', [:int, :string, :size_t, :int], :size_t
|
|
26
|
+
|
|
27
|
+
#see man 2 getxattr
|
|
28
|
+
def fsattr_pget(attribut)
|
|
29
|
+
size = getxattr(@path, attribut, nil, 0,0,0)
|
|
30
|
+
return "" if size < 0
|
|
31
|
+
result = " " * size
|
|
32
|
+
size = getxattr(@path, attribut, result, size, 0,0)
|
|
33
|
+
return result
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
#see man 2 setxattr
|
|
37
|
+
def fsattr_pset(attribute, value)
|
|
38
|
+
err = setxattr(@path, attribute, value, value.bytesize, 0,0)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#see man 2 listxattr
|
|
42
|
+
def fsattr_plist()
|
|
43
|
+
size = listxattr(@path, nil, 0,0)
|
|
44
|
+
result = " " * size
|
|
45
|
+
err = listxattr(@path, result, size, 0)
|
|
46
|
+
return result.split("\x00")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#man 2 getxattr
|
|
50
|
+
def fsattr_fget(attribut)
|
|
51
|
+
size = fgetxattr(fileno.to_i, attribut, nil, 0,0,0)
|
|
52
|
+
return "" if size < 0
|
|
53
|
+
result = " " * size
|
|
54
|
+
size = fgetxattr(fileno.to_i, attribut, result, size, 0,0)
|
|
55
|
+
return result
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
#see man 2 setxattr
|
|
59
|
+
def fsattr_fset(attribute, value)
|
|
60
|
+
err = fsetxattr(fileno.to_i, attribute, value, value.bytesize, 0,0)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#see man 2 listxattr
|
|
64
|
+
def fsattr_flist()
|
|
65
|
+
size = flistxattr(fileno.to_i, nil, 0,0)
|
|
66
|
+
result = " " * size
|
|
67
|
+
err = flistxattr(fileno.to_i, result, size, 0)
|
|
68
|
+
return result.split("\x00")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
data/test/helper.rb
ADDED
data/test/test_fsattr.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: fsattr
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
prerelease: false
|
|
5
|
+
segments:
|
|
6
|
+
- 0
|
|
7
|
+
- 0
|
|
8
|
+
- 2
|
|
9
|
+
version: 0.0.2
|
|
10
|
+
platform: ruby
|
|
11
|
+
authors:
|
|
12
|
+
- Yannick Koechlin
|
|
13
|
+
autorequire:
|
|
14
|
+
bindir: bin
|
|
15
|
+
cert_chain: []
|
|
16
|
+
|
|
17
|
+
date: 2010-04-30 00:00:00 +02:00
|
|
18
|
+
default_executable:
|
|
19
|
+
dependencies:
|
|
20
|
+
- !ruby/object:Gem::Dependency
|
|
21
|
+
name: thoughtbot-shoulda
|
|
22
|
+
prerelease: false
|
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - ">="
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
segments:
|
|
28
|
+
- 0
|
|
29
|
+
version: "0"
|
|
30
|
+
type: :development
|
|
31
|
+
version_requirements: *id001
|
|
32
|
+
description: modify extended filesystem attributes on linux and os x
|
|
33
|
+
email: yannick@koechlin.info
|
|
34
|
+
executables: []
|
|
35
|
+
|
|
36
|
+
extensions: []
|
|
37
|
+
|
|
38
|
+
extra_rdoc_files:
|
|
39
|
+
- LICENSE
|
|
40
|
+
- README.rdoc
|
|
41
|
+
files:
|
|
42
|
+
- .document
|
|
43
|
+
- .gitignore
|
|
44
|
+
- LICENSE
|
|
45
|
+
- README.rdoc
|
|
46
|
+
- Rakefile
|
|
47
|
+
- VERSION
|
|
48
|
+
- fsattr.gemspec
|
|
49
|
+
- lib/fsattr.rb
|
|
50
|
+
- lib/fsattr/fsattr-linux.rb
|
|
51
|
+
- lib/fsattr/fsattr-osx.rb
|
|
52
|
+
- test/helper.rb
|
|
53
|
+
- test/test_fsattr.rb
|
|
54
|
+
has_rdoc: true
|
|
55
|
+
homepage: http://github.com/yannick/fsattr
|
|
56
|
+
licenses: []
|
|
57
|
+
|
|
58
|
+
post_install_message:
|
|
59
|
+
rdoc_options:
|
|
60
|
+
- --charset=UTF-8
|
|
61
|
+
require_paths:
|
|
62
|
+
- lib
|
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
segments:
|
|
68
|
+
- 0
|
|
69
|
+
version: "0"
|
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
segments:
|
|
75
|
+
- 0
|
|
76
|
+
version: "0"
|
|
77
|
+
requirements: []
|
|
78
|
+
|
|
79
|
+
rubyforge_project:
|
|
80
|
+
rubygems_version: 1.3.6
|
|
81
|
+
signing_key:
|
|
82
|
+
specification_version: 3
|
|
83
|
+
summary: modify extended filesystem attributes on linux and os x
|
|
84
|
+
test_files:
|
|
85
|
+
- test/helper.rb
|
|
86
|
+
- test/test_fsattr.rb
|