// syncedErrs couples GoPath's error handling with errStore's error handling. // When the GoPath contained an error, it will be stored in the errStore, so // that all following ops become no-ops. // When however the errStore contains an error, an errorneous GoPath will be // returned. func (s *errStore) syncedErrs(p gopath.GoPath) gopath.GoPath { if s.hasErr() { return gopath.FromErr(s.err) } if p.HasErr() { s.setErr(p.Err()) } return p }
// NewFilesystemLoader creates a new instance with templates located in the // given root path. func NewFilesystemLoader(root gopath.GoPath) *FilesystemLoader { if root.HasErr() { panic(fmt.Sprintf("NewFilesystemLoader: root has error: %s", root.Err())) } if !root.IsExists() { panic(fmt.Sprintf("NewFilesystemLoader: root %s does not exist", root.Path())) } watcher, err := fsnotify.NewWatcher() if err != nil { panic(fmt.Sprintf("NewFilesystemLoader: can't open watcher: %s", err)) } var loader = &FilesystemLoader{ root, watcher, make(map[string]chan *template.Template), make(map[string]string)} go loader.processEvents() return loader }
// assertPathValidForWriteAccess sets the error flag when the path may not be // opened for writing by this process. func (i *pathIO) assertPathValidForWriteAccess(p gopath.GoPath) { if i.hasErr() { return } if p.HasErr() { i.setErr(p.Err()) return } if p.IsExists() { if !p.IsRegular() || !isPathWriteable(p) { i.setErr(store.NewAccessDeniedError(fmt.Sprintf( "path '%s' with mode %s denotes no regular file or no writeable directory", p.Path(), p.FileMode()))) } } else { var d = p.Dir() if !isPathWriteable(d) { i.setErr(store.NewAccessDeniedError( "parent directory of '" + p.Path() + "' is not writeable")) } } }