@@ -14,12 +14,19 @@ type PhotoFilesystem struct {
1414}
1515
1616type PhotoFile struct {
17+ name string
18+ }
19+
20+ type PhotoFileInfo struct {
21+ file * PhotoFile
1722}
1823
19- var PhotoFilesystemType fs.FilesystemType = "sushitrain.photos.v1"
20- var notImplementedErr = errors .New ("not implemented by photo filesystem" )
2124var _ fs.Filesystem = PhotoFilesystem {}
2225var _ fs.File = PhotoFile {}
26+ var _ fs.FileInfo = PhotoFileInfo {}
27+
28+ var PhotoFilesystemType fs.FilesystemType = "sushitrain.photos.v1"
29+ var errNotImplemented = errors .New ("not implemented by photo filesystem" )
2330
2431func init () {
2532 fs .RegisterFilesystemType (PhotoFilesystemType , func (uri string , _opts ... fs.Option ) (fs.Filesystem , error ) {
@@ -83,7 +90,7 @@ func (p PhotoFilesystem) PlatformData(name string, withOwnership bool, withXattr
8390}
8491
8592func (p PhotoFilesystem ) ReadSymlink (name string ) (string , error ) {
86- return "" , notImplementedErr
93+ return "" , errNotImplemented
8794}
8895
8996func (p PhotoFilesystem ) Type () fs.FilesystemType {
@@ -105,59 +112,59 @@ func (p PhotoFilesystem) Underlying() (fs.Filesystem, bool) {
105112
106113// Unimplemented parts of the Filesystem interface return an error. They should not normally be called
107114func (p PhotoFilesystem ) Chmod (name string , mode fs.FileMode ) error {
108- return notImplementedErr
115+ return errNotImplemented
109116}
110117
111118func (p PhotoFilesystem ) Chtimes (name string , atime time.Time , mtime time.Time ) error {
112- return notImplementedErr
119+ return errNotImplemented
113120}
114121
115122func (p PhotoFilesystem ) Create (name string ) (fs.File , error ) {
116- return nil , notImplementedErr
123+ return nil , errNotImplemented
117124}
118125
119126func (p PhotoFilesystem ) CreateSymlink (target string , name string ) error {
120- return notImplementedErr
127+ return errNotImplemented
121128}
122129
123130func (p PhotoFilesystem ) Hide (name string ) error {
124- return notImplementedErr
131+ return errNotImplemented
125132}
126133
127134func (p PhotoFilesystem ) Lchown (name string , uid string , gid string ) error {
128- return notImplementedErr
135+ return errNotImplemented
129136}
130137
131138func (p PhotoFilesystem ) Mkdir (name string , perm fs.FileMode ) error {
132- return notImplementedErr
139+ return errNotImplemented
133140}
134141
135142func (p PhotoFilesystem ) MkdirAll (name string , perm fs.FileMode ) error {
136- return notImplementedErr
143+ return errNotImplemented
137144}
138145
139146func (p PhotoFilesystem ) Remove (name string ) error {
140- return notImplementedErr
147+ return errNotImplemented
141148}
142149
143150func (p PhotoFilesystem ) RemoveAll (name string ) error {
144- return notImplementedErr
151+ return errNotImplemented
145152}
146153
147154func (p PhotoFilesystem ) Rename (oldname string , newname string ) error {
148- return notImplementedErr
155+ return errNotImplemented
149156}
150157
151158func (p PhotoFilesystem ) SetXattr (path string , xattrs []protocol.Xattr , xattrFilter fs.XattrFilter ) error {
152- return notImplementedErr
159+ return errNotImplemented
153160}
154161
155162func (p PhotoFilesystem ) Unhide (name string ) error {
156- return notImplementedErr
163+ return errNotImplemented
157164}
158165
159166func (p PhotoFilesystem ) Watch (path string , ignore fs.Matcher , ctx context.Context , ignorePerms bool ) (<- chan fs.Event , <- chan error , error ) {
160- return nil , nil , notImplementedErr
167+ return nil , nil , errNotImplemented
161168}
162169
163170// Photo file implementation
@@ -167,7 +174,7 @@ func (p PhotoFile) Close() error {
167174
168175// Name implements fs.File.
169176func (p PhotoFile ) Name () string {
170- panic ( "unimplemented" )
177+ return p . name
171178}
172179
173180// Read implements fs.File.
@@ -187,6 +194,7 @@ func (p PhotoFile) Seek(offset int64, whence int) (int64, error) {
187194
188195// Stat implements fs.File.
189196func (p PhotoFile ) Stat () (fs.FileInfo , error ) {
197+ return PhotoFileInfo {file : & p }, nil
190198 panic ("unimplemented" )
191199}
192200
@@ -197,13 +205,67 @@ func (p PhotoFile) Sync() error {
197205
198206// Unimplemented parts of fs.File for PhotoFile return an error
199207func (p PhotoFile ) Truncate (size int64 ) error {
200- return notImplementedErr
208+ return errNotImplemented
201209}
202210
203211func (PhotoFile ) Write (p []byte ) (n int , err error ) {
204- return 0 , notImplementedErr
212+ return 0 , errNotImplemented
205213}
206214
207215func (PhotoFile ) WriteAt (p []byte , off int64 ) (n int , err error ) {
208- return 0 , notImplementedErr
216+ return 0 , errNotImplemented
217+ }
218+
219+ // PhotoFileInfo implementation
220+ func (p PhotoFileInfo ) Group () int {
221+ return 0
222+ }
223+
224+ // InodeChangeTime implements fs.FileInfo.
225+ func (p PhotoFileInfo ) InodeChangeTime () time.Time {
226+ panic ("unimplemented" )
227+ }
228+
229+ // IsDir implements fs.FileInfo.
230+ func (p PhotoFileInfo ) IsDir () bool {
231+ panic ("unimplemented" )
232+ }
233+
234+ // IsRegular implements fs.FileInfo.
235+ func (p PhotoFileInfo ) IsRegular () bool {
236+ panic ("unimplemented" )
237+ }
238+
239+ // We don't do symlinks
240+ func (p PhotoFileInfo ) IsSymlink () bool {
241+ return false
242+ }
243+
244+ // ModTime implements fs.FileInfo.
245+ func (p PhotoFileInfo ) ModTime () time.Time {
246+ panic ("unimplemented" )
247+ }
248+
249+ func (p PhotoFileInfo ) Mode () fs.FileMode {
250+ if p .IsDir () {
251+ return 0555 // Read-only with execute bit to list dir
252+ }
253+ return 0444 // Read-only
254+ }
255+
256+ func (p PhotoFileInfo ) Name () string {
257+ return p .file .name
258+ }
259+
260+ func (p PhotoFileInfo ) Owner () int {
261+ return 0
262+ }
263+
264+ // Size implements fs.FileInfo.
265+ func (p PhotoFileInfo ) Size () int64 {
266+ panic ("unimplemented" )
267+ }
268+
269+ func (p PhotoFileInfo ) Sys () interface {} {
270+ return nil
209271}
0 commit comments