rfuse 1.0.3 → 1.0.4.RC0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.8.7"
4
+ - "1.9.3"
5
+ - "2.0.0"
6
+ before_install:
7
+ - sudo apt-get update -qq
8
+ - sudo apt-get install -qq libfuse-dev
data/CHANGES.md CHANGED
@@ -1,9 +1,20 @@
1
+ 1.0.4 -
2
+ ------------------
3
+
4
+
5
+ Bugfixes
6
+
7
+ * {RFuse.parse_options} fix if only local options supplied
8
+ * Fix for listing extended attributes
9
+ * Prevent old exceptions from raising at unmount
10
+
1
11
  1.0.3 - 2012/08/16
2
12
  ------------------
3
13
 
4
14
  Cleanup compile warnings
5
15
 
6
16
  Bugfixes
17
+
7
18
  * {RFuse::Fuse#statfs} potential segfault
8
19
  * {RFuse::Fuse#release} not receiving FileInfo
9
20
 
data/Rakefile CHANGED
@@ -2,9 +2,15 @@
2
2
  require "bundler/gem_tasks"
3
3
  require 'yard'
4
4
  require 'rspec/core/rake_task'
5
+ require 'rake/extensiontask'
5
6
 
6
7
  RSpec::Core::RakeTask.new(:spec)
7
8
 
8
9
  YARD::Rake::YardocTask.new
9
10
 
11
+ Rake::ExtensionTask.new('rfuse') do |ext|
12
+ ext.lib_dir = "lib/rfuse"
13
+ end
14
+
15
+ task :spec => :compile
10
16
  task :default => :spec
data/ext/rfuse/rfuse.c CHANGED
@@ -52,8 +52,11 @@ static int unsafe_return_error(VALUE *args)
52
52
  {
53
53
 
54
54
  if (rb_respond_to(rb_errinfo(),rb_intern("errno"))) {
55
+ VALUE res;
55
56
  //We expect these and they get passed on the fuse so be quiet...
56
- return rb_funcall(rb_errinfo(),rb_intern("errno"),0);
57
+ res = rb_funcall(rb_errinfo(),rb_intern("errno"),0);
58
+ rb_set_errinfo(Qnil);
59
+ return res;
57
60
  } else {
58
61
  VALUE info;
59
62
  VALUE bt_ary;
@@ -1003,7 +1006,7 @@ static int rf_setxattr(const char *path,const char *name,
1003
1006
  @param [String] name
1004
1007
 
1005
1008
  @return [String] attribute value
1006
- @raise [Errno]
1009
+ @raise [Errno] Errno::ENODATA if attribute does not exist
1007
1010
 
1008
1011
  */
1009
1012
  static VALUE unsafe_getxattr(VALUE *args)
data/lib/rfuse/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RFuse
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4.RC0"
3
3
  end
data/lib/rfuse.rb CHANGED
@@ -10,7 +10,7 @@ module RFuse
10
10
  def self.packxattr(xattrs)
11
11
  case xattrs
12
12
  when Array
13
- xattrs.join("\000")
13
+ xattrs.join("\000").concat("\000")
14
14
  when String
15
15
  #assume already \0 separated list of keys
16
16
  xattrs
@@ -81,6 +81,10 @@ module RFuse
81
81
  result[:help] = true
82
82
  end
83
83
 
84
+ if argv.include?("-d")
85
+ result[:debug] = true
86
+ end
87
+
84
88
  opt_index = ( argv.find_index("-o") || -1 ) + 1
85
89
 
86
90
  if opt_index > 1 && opt_index < argv.length
@@ -98,12 +102,25 @@ module RFuse
98
102
  local_opts.include?(opt_sym)
99
103
  end
100
104
 
101
- argv[opt_index] = options.join(",")
105
+ if options.empty?
106
+ argv.slice!(opt_index - 1,2)
107
+ else
108
+ argv[opt_index] = options.join(",")
109
+ end
102
110
  end
103
111
 
104
112
  result
105
113
  end
106
114
 
115
+ # Generate a usage string
116
+ #
117
+ # @param [String] device a description of how the device field should be used
118
+ # @param [String] exec the executable
119
+ # @return [String] the usage string
120
+ def self.usage(device=nil,exec=File.basename($0))
121
+ "Usage:\n\t #{exec} #{device} mountpoint [-h] [-o [opt,optkey=value,...]]\n"
122
+ end
123
+
107
124
  class Fuse
108
125
 
109
126
  # Main processing loop
data/rfuse.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.extra_rdoc_files = 'CHANGES.md'
23
23
 
24
24
  s.add_development_dependency("rake")
25
+ s.add_development_dependency("rake-compiler")
25
26
  s.add_development_dependency("rspec")
26
27
  s.add_development_dependency("yard")
27
28
  s.add_development_dependency("redcarpet")
data/spec/basic_spec.rb CHANGED
@@ -135,30 +135,44 @@ describe RFuse::Fuse do
135
135
 
136
136
  it "should read files" do
137
137
 
138
- file_stat.size = 11
139
- mockfs.stub(:getattr) { | ctx, path|
140
- case path
141
- when "/test"
142
- file_stat
143
- else
144
- raise Errno::ENOENT
145
- end
146
-
147
- }
138
+ file_stat.size = 12
139
+ mockfs.stub(:getattr).with(anything(),"/test").and_return(file_stat)
148
140
 
141
+
149
142
  reads = 0
150
143
  mockfs.stub(:read) { |ctx,path,size,offset,ffi|
151
144
  reads += 2
152
- "hello\000world"[offset,reads]
145
+ "hello\000world\000"[offset,reads]
153
146
  }
154
147
 
155
148
  with_fuse(mountpoint,mockfs) do
156
149
  File.open("#{mountpoint}/test") do |f|
157
150
  val = f.gets
158
- val.should == "hello\000world"
151
+ val.should == "hello\000world\000"
159
152
  end
160
153
  end
161
154
  end
155
+
156
+ it "should read over null characters in a real file" do
157
+ file_stat.size = 2
158
+ File.open("/tmp/nulltest","w") { |f| f.print "\000\000" }
159
+
160
+ mockfs.stub(:getattr).with(anything(),"/testnull").and_return(file_stat)
161
+
162
+ mockfs.stub(:read) { |ctx,path,size,offset,ffi|
163
+ IO.read("/tmp/nulltest",size,offset)
164
+ }
165
+
166
+ with_fuse(mountpoint,mockfs) do
167
+ File.open("#{mountpoint}/testnull") do |f|
168
+ val = f.gets
169
+ val.should == "\000\000"
170
+ val.size.should == 2
171
+ puts val
172
+ end
173
+ end
174
+ end
175
+
162
176
  end
163
177
 
164
178
  context "exceptions" do
data/spec/options_spec.rb CHANGED
@@ -67,6 +67,12 @@ describe RFuse do
67
67
  result[:debug].should be_true
68
68
  end
69
69
 
70
+ it "detects debug as -d" do
71
+ argv = [ "/mountpoint","-o","someopt","-d" ]
72
+ result = RFuse.parse_options(argv)
73
+ result[:debug].should be_true
74
+ end
75
+
70
76
  it "should remove local options" do
71
77
  argv = [ "/mountpoint","-o","debug,myoption" ]
72
78
 
@@ -75,7 +81,25 @@ describe RFuse do
75
81
  result[:debug].should be_true
76
82
  result[:myoption].should be_true
77
83
 
78
- argv[2].should == "debug"
84
+ argv.should == [ "/mountpoint", "-o", "debug" ]
85
+ end
86
+
87
+ it "should remove the only local option" do
88
+ argv = ["/mountpoint","-o","myoption" ]
89
+
90
+ result = RFuse.parse_options(argv,:myoption)
91
+
92
+ result[:myoption].should be_true
93
+ argv.should == [ "/mountpoint" ]
94
+ end
95
+
96
+
97
+ it "parses the value from the only local option" do
98
+ argv = [ "adevice", "/mountpoint", "-o","someopt=somevalue"]
99
+ result = RFuse.parse_options(argv,:someopt)
100
+
101
+ result[:someopt].should == "somevalue"
102
+ argv.should == [ "/mountpoint" ]
79
103
  end
80
104
 
81
105
  it "should parse values from options" do
@@ -104,8 +128,7 @@ describe RFuse do
104
128
  result[:debug].should be_true
105
129
  result[:default_permissions].should be_true
106
130
 
107
- argv.length.should == 3
108
- argv.join(" ").should == "/mountpoint -o rw,debug,default_permissions"
131
+ argv.should == [ "/mountpoint" , "-o", "rw,debug,default_permissions" ]
109
132
  end
110
133
 
111
134
  end
data/spec/xattr_spec.rb CHANGED
@@ -14,6 +14,8 @@ describe RFuse::Fuse do
14
14
  "1"
15
15
  when "user.two"
16
16
  "2"
17
+ else
18
+ ""
17
19
  end
18
20
  }
19
21
 
@@ -32,8 +34,14 @@ describe RFuse::Fuse do
32
34
  xattr['user.one'].should == "1"
33
35
  xattr['user.two'].should == "2"
34
36
  xattr['user.three']= "updated"
37
+ xattr['xxxxx'].should be_nil
35
38
  xattr.remove('user.one')
39
+ # And now with a non-ruby system #TODO. There'd be a way to guard this properly
40
+ if system("getfattr --version")
41
+ system("getfattr -d #{mountpoint}/myfile").should be_true
42
+ else
43
+ puts "Warning Skipping getfattr test"
44
+ end
36
45
  end
37
46
  end
38
-
39
47
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rfuse
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
5
- prerelease:
4
+ version: 1.0.4.RC0
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Grant Gardner
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-15 00:00:00.000000000 Z
12
+ date: 2013-12-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake-compiler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: rspec
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -101,6 +117,7 @@ extra_rdoc_files:
101
117
  - CHANGES.md
102
118
  files:
103
119
  - .gitignore
120
+ - .travis.yml
104
121
  - .yardopts
105
122
  - CHANGES.md
106
123
  - Gemfile
@@ -151,12 +168,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
151
168
  - - ! '>='
152
169
  - !ruby/object:Gem::Version
153
170
  version: '0'
171
+ segments:
172
+ - 0
173
+ hash: 927008359791353354
154
174
  required_rubygems_version: !ruby/object:Gem::Requirement
155
175
  none: false
156
176
  requirements:
157
- - - ! '>='
177
+ - - ! '>'
158
178
  - !ruby/object:Gem::Version
159
- version: '0'
179
+ version: 1.3.1
160
180
  requirements: []
161
181
  rubyforge_project:
162
182
  rubygems_version: 1.8.24