Skip to content

Commit ff67cb9

Browse files
committed
Merge branch 'metafex-symlink-walk' into develop
2 parents 1645f97 + 9fad73e commit ff67cb9

File tree

4 files changed

+57
-58
lines changed

4 files changed

+57
-58
lines changed

i18n.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,19 +104,18 @@ func getUnknownValueFormat() string {
104104
func loadMessages(path string) {
105105
messages = make(map[string]*config.Config)
106106

107-
// Read in messages from the modules
108-
// Load the module messges first,
107+
// Read in messages from the modules. Load the module messges first,
109108
// so that it can be override in parent application
110109
for _, module := range Modules {
111110
TRACE.Println("Importing messages from ", filepath.Join(module.Path, messageFilesDirectory))
112-
if err := filepath.Walk(filepath.Join(module.Path, messageFilesDirectory), loadMessageFile); err != nil &&
111+
if err := Walk(filepath.Join(module.Path, messageFilesDirectory), loadMessageFile); err != nil &&
113112
!os.IsNotExist(err) {
114113
ERROR.Println("Error reading messages files from module:", err)
115114
}
116115
}
117116

118-
if error := filepath.Walk(path, loadMessageFile); error != nil && !os.IsNotExist(error) {
119-
ERROR.Println("Error reading messages files:", error)
117+
if err := Walk(path, loadMessageFile); err != nil && !os.IsNotExist(err) {
118+
ERROR.Println("Error reading messages files:", err)
120119
}
121120
}
122121

template.go

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -231,33 +231,6 @@ func (loader *TemplateLoader) Refresh() *Error {
231231
return nil
232232
}
233233

234-
// is it a symlinked template?
235-
link, err := os.Lstat(path)
236-
if err == nil && link.Mode()&os.ModeSymlink == os.ModeSymlink {
237-
TRACE.Println("symlink template:", path)
238-
// lookup the actual target & check for goodness
239-
targetPath, err := filepath.EvalSymlinks(path)
240-
if err != nil {
241-
ERROR.Println("Failed to read symlink", err)
242-
return err
243-
}
244-
targetInfo, err := os.Stat(targetPath)
245-
if err != nil {
246-
ERROR.Println("Failed to stat symlink target", err)
247-
return err
248-
}
249-
250-
// set the template path to the target of the symlink
251-
path = targetPath
252-
info = targetInfo
253-
254-
// need to save state and restore for recursive call to Walk on symlink
255-
tmp := fullSrcDir
256-
fullSrcDir = filepath.Dir(targetPath)
257-
filepath.Walk(targetPath, templateWalker)
258-
fullSrcDir = tmp
259-
}
260-
261234
// Walk into watchable directories
262235
if info.IsDir() {
263236
if !loader.WatchDir(info) {
@@ -361,13 +334,13 @@ func (loader *TemplateLoader) Refresh() *Error {
361334
return nil
362335
}
363336

364-
if _, err = os.Stat(fullSrcDir); os.IsNotExist(err) {
337+
if _, err = os.Lstat(fullSrcDir); os.IsNotExist(err) {
365338
// #1058 Given views/template path is not exists
366339
// so no need to walk, move on to next path
367340
continue
368341
}
369342

370-
funcErr := filepath.Walk(fullSrcDir, templateWalker)
343+
funcErr := Walk(fullSrcDir, templateWalker)
371344

372345
// If there was an error with the Funcs, set it and return immediately.
373346
if funcErr != nil {

util.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"net/http"
1010
"net/url"
1111
"os"
12+
"path/filepath"
1213
"reflect"
1314
"regexp"
1415
"strings"
@@ -208,6 +209,12 @@ func ClientIP(r *http.Request) string {
208209
return ""
209210
}
210211

212+
// Walk method extends filepath.Walk to also follow symlinks.
213+
// Always returns the path of the file or directory.
214+
func Walk(root string, walkFn filepath.WalkFunc) error {
215+
return fsWalk(root, root, root, walkFn)
216+
}
217+
211218
// createDir method creates nested directories if not exists
212219
func createDir(path string) error {
213220
if _, err := os.Stat(path); err != nil {
@@ -222,6 +229,44 @@ func createDir(path string) error {
222229
return nil
223230
}
224231

232+
func fsWalk(path string, dirName string, linkDirName string, walkFn filepath.WalkFunc) error {
233+
fsWalkFunc := func(path string, info os.FileInfo, err error) error {
234+
if err != nil {
235+
return err
236+
}
237+
238+
var name string
239+
name, err = filepath.Rel(dirName, path)
240+
if err != nil {
241+
return err
242+
}
243+
244+
path = filepath.Join(linkDirName, name)
245+
246+
if err == nil && info.Mode()&os.ModeSymlink == os.ModeSymlink {
247+
var symlinkPath string
248+
symlinkPath, err = filepath.EvalSymlinks(path)
249+
if err != nil {
250+
return err
251+
}
252+
253+
// https://github.com/golang/go/blob/master/src/path/filepath/path.go#L392
254+
info, err = os.Lstat(symlinkPath)
255+
if err != nil {
256+
return walkFn(path, info, err)
257+
}
258+
259+
if info.IsDir() {
260+
return fsWalk(symlinkPath, symlinkPath, path, walkFn)
261+
}
262+
}
263+
264+
return walkFn(path, info, err)
265+
}
266+
267+
return filepath.Walk(path, fsWalkFunc)
268+
}
269+
225270
func init() {
226271
OnAppStart(LoadMimeConfig)
227272
}

watcher.go

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package revel
22

33
import (
4-
"gopkg.in/fsnotify.v1"
54
"os"
65
"path"
76
"path/filepath"
87
"strings"
98
"sync"
9+
10+
"gopkg.in/fsnotify.v1"
1011
)
1112

1213
// Listener is an interface for receivers of filesystem events.
@@ -90,28 +91,6 @@ func (w *Watcher) Listen(listener Listener, roots ...string) {
9091
return nil
9192
}
9293

93-
// is it a symlinked template?
94-
link, err := os.Lstat(path)
95-
if err == nil && link.Mode()&os.ModeSymlink == os.ModeSymlink {
96-
TRACE.Println("Watcher symlink: ", path)
97-
// lookup the actual target & check for goodness
98-
targetPath, err := filepath.EvalSymlinks(path)
99-
if err != nil {
100-
ERROR.Println("Failed to read symlink", err)
101-
return err
102-
}
103-
targetInfo, err := os.Stat(targetPath)
104-
if err != nil {
105-
ERROR.Println("Failed to stat symlink target", err)
106-
return err
107-
}
108-
109-
// set the template path to the target of the symlink
110-
path = targetPath
111-
info = targetInfo
112-
filepath.Walk(path, watcherWalker)
113-
}
114-
11594
if info.IsDir() {
11695
if dl, ok := listener.(DiscerningListener); ok {
11796
if !dl.WatchDir(info) {
@@ -128,7 +107,10 @@ func (w *Watcher) Listen(listener Listener, roots ...string) {
128107
}
129108

130109
// Else, walk the directory tree.
131-
filepath.Walk(p, watcherWalker)
110+
err = Walk(p, watcherWalker)
111+
if err != nil {
112+
ERROR.Println("Failed to walk directory", p, ":", err)
113+
}
132114
}
133115

134116
if w.eagerRebuildEnabled() {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy