1
0

logfs.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // Copyright (C) 2016 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package fs
  7. import (
  8. "context"
  9. "fmt"
  10. "path/filepath"
  11. "runtime"
  12. "time"
  13. )
  14. type logFilesystem struct {
  15. Filesystem
  16. // Number of filesystem layers on top of logFilesystem to skip when looking
  17. // for the true caller of the filesystem
  18. layers int
  19. }
  20. func newLogFilesystem(fs Filesystem, layers int) *logFilesystem {
  21. return &logFilesystem{
  22. Filesystem: fs,
  23. layers: layers,
  24. }
  25. }
  26. func (fs *logFilesystem) getCaller() string {
  27. _, file, line, ok := runtime.Caller(fs.layers + 1)
  28. if !ok {
  29. return "unknown"
  30. }
  31. return fmt.Sprintf("%s:%d", filepath.Base(file), line)
  32. }
  33. func (fs *logFilesystem) Chmod(name string, mode FileMode) error {
  34. err := fs.Filesystem.Chmod(name, mode)
  35. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Chmod", name, mode, err)
  36. return err
  37. }
  38. func (fs *logFilesystem) Chtimes(name string, atime time.Time, mtime time.Time) error {
  39. err := fs.Filesystem.Chtimes(name, atime, mtime)
  40. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Chtimes", name, atime, mtime, err)
  41. return err
  42. }
  43. func (fs *logFilesystem) Create(name string) (File, error) {
  44. file, err := fs.Filesystem.Create(name)
  45. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Create", name, file, err)
  46. return file, err
  47. }
  48. func (fs *logFilesystem) CreateSymlink(target, name string) error {
  49. err := fs.Filesystem.CreateSymlink(target, name)
  50. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "CreateSymlink", target, name, err)
  51. return err
  52. }
  53. func (fs *logFilesystem) DirNames(name string) ([]string, error) {
  54. names, err := fs.Filesystem.DirNames(name)
  55. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "DirNames", name, names, err)
  56. return names, err
  57. }
  58. func (fs *logFilesystem) Lstat(name string) (FileInfo, error) {
  59. info, err := fs.Filesystem.Lstat(name)
  60. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Lstat", name, info, err)
  61. return info, err
  62. }
  63. func (fs *logFilesystem) Mkdir(name string, perm FileMode) error {
  64. err := fs.Filesystem.Mkdir(name, perm)
  65. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Mkdir", name, perm, err)
  66. return err
  67. }
  68. func (fs *logFilesystem) MkdirAll(name string, perm FileMode) error {
  69. err := fs.Filesystem.MkdirAll(name, perm)
  70. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "MkdirAll", name, perm, err)
  71. return err
  72. }
  73. func (fs *logFilesystem) Open(name string) (File, error) {
  74. file, err := fs.Filesystem.Open(name)
  75. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Open", name, file, err)
  76. return file, err
  77. }
  78. func (fs *logFilesystem) OpenFile(name string, flags int, mode FileMode) (File, error) {
  79. file, err := fs.Filesystem.OpenFile(name, flags, mode)
  80. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "OpenFile", name, flags, mode, file, err)
  81. return file, err
  82. }
  83. func (fs *logFilesystem) ReadSymlink(name string) (string, error) {
  84. target, err := fs.Filesystem.ReadSymlink(name)
  85. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "ReadSymlink", name, target, err)
  86. return target, err
  87. }
  88. func (fs *logFilesystem) Remove(name string) error {
  89. err := fs.Filesystem.Remove(name)
  90. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Remove", name, err)
  91. return err
  92. }
  93. func (fs *logFilesystem) RemoveAll(name string) error {
  94. err := fs.Filesystem.RemoveAll(name)
  95. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "RemoveAll", name, err)
  96. return err
  97. }
  98. func (fs *logFilesystem) Rename(oldname, newname string) error {
  99. err := fs.Filesystem.Rename(oldname, newname)
  100. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Rename", oldname, newname, err)
  101. return err
  102. }
  103. func (fs *logFilesystem) Stat(name string) (FileInfo, error) {
  104. info, err := fs.Filesystem.Stat(name)
  105. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Stat", name, info, err)
  106. return info, err
  107. }
  108. func (fs *logFilesystem) SymlinksSupported() bool {
  109. supported := fs.Filesystem.SymlinksSupported()
  110. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "SymlinksSupported", supported)
  111. return supported
  112. }
  113. func (fs *logFilesystem) Walk(root string, walkFn WalkFunc) error {
  114. err := fs.Filesystem.Walk(root, walkFn)
  115. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Walk", root, walkFn, err)
  116. return err
  117. }
  118. func (fs *logFilesystem) Watch(path string, ignore Matcher, ctx context.Context, ignorePerms bool) (<-chan Event, <-chan error, error) {
  119. evChan, errChan, err := fs.Filesystem.Watch(path, ignore, ctx, ignorePerms)
  120. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Watch", path, ignore, ignorePerms, err)
  121. return evChan, errChan, err
  122. }
  123. func (fs *logFilesystem) Unhide(name string) error {
  124. err := fs.Filesystem.Unhide(name)
  125. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Unhide", name, err)
  126. return err
  127. }
  128. func (fs *logFilesystem) Hide(name string) error {
  129. err := fs.Filesystem.Hide(name)
  130. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Hide", name, err)
  131. return err
  132. }
  133. func (fs *logFilesystem) Glob(name string) ([]string, error) {
  134. names, err := fs.Filesystem.Glob(name)
  135. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Glob", name, names, err)
  136. return names, err
  137. }
  138. func (fs *logFilesystem) Roots() ([]string, error) {
  139. roots, err := fs.Filesystem.Roots()
  140. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Roots", roots, err)
  141. return roots, err
  142. }
  143. func (fs *logFilesystem) Usage(name string) (Usage, error) {
  144. usage, err := fs.Filesystem.Usage(name)
  145. l.Debugln(fs.getCaller(), fs.Type(), fs.URI(), "Usage", name, usage, err)
  146. return usage, err
  147. }
  148. func (fs *logFilesystem) underlying() (Filesystem, bool) {
  149. return fs.Filesystem, true
  150. }