func findFile(p string) (*File, error) { stat, err := os.Lstat(p) if err != nil { if os.IsNotExist(err) { return nil, nil } } actual := &File{} actual.Path = p actual.Mode = fi.String(fi.FileModeToString(stat.Mode() & os.ModePerm)) uid := int(stat.Sys().(*syscall.Stat_t).Uid) owner, err := fi.LookupUserById(uid) if err != nil { return nil, err } if owner != nil { actual.Owner = fi.String(owner.Name) } else { actual.Owner = fi.String(strconv.Itoa(uid)) } gid := int(stat.Sys().(*syscall.Stat_t).Gid) group, err := fi.LookupGroupById(gid) if err != nil { return nil, err } if group != nil { actual.Group = fi.String(group.Name) } else { actual.Group = fi.String(strconv.Itoa(gid)) } if (stat.Mode() & os.ModeSymlink) != 0 { target, err := os.Readlink(p) if err != nil { return nil, fmt.Errorf("error reading symlink target: %v", err) } actual.Type = FileType_Symlink actual.Symlink = fi.String(target) } else if (stat.Mode() & os.ModeDir) != 0 { actual.Type = FileType_Directory } else { actual.Type = FileType_File actual.Contents = fi.NewFileResource(p) } return actual, nil }
func (r *Loader) handleFile(i *loader.TreeWalkItem) error { var task *nodetasks.File defaultFileType := nodetasks.FileType_File var err error if strings.HasSuffix(i.RelativePath, ".template") { contents, err := i.ReadString() if err != nil { return err } // TODO: Use template resource here to defer execution? destPath := "/" + strings.TrimSuffix(i.RelativePath, ".template") name := strings.TrimSuffix(i.Name, ".template") expanded, err := r.executeTemplate(name, contents) if err != nil { return fmt.Errorf("error executing template %q: %v", i.RelativePath, err) } task, err = nodetasks.NewFileTask(name, fi.NewStringResource(expanded), destPath, i.Meta) } else if strings.HasSuffix(i.RelativePath, ".asset") { contents, err := i.ReadBytes() if err != nil { return err } destPath := "/" + strings.TrimSuffix(i.RelativePath, ".asset") name := strings.TrimSuffix(i.Name, ".asset") def := &nodetasks.AssetDefinition{} err = json.Unmarshal(contents, def) if err != nil { return fmt.Errorf("error parsing json for asset %q: %v", name, err) } asset, err := r.assets.Find(name, def.AssetPath) if err != nil { return fmt.Errorf("error trying to locate asset %q: %v", name, err) } if asset == nil { return fmt.Errorf("unable to locate asset %q", name) } task, err = nodetasks.NewFileTask(i.Name, asset, destPath, i.Meta) } else { stat, err := os.Stat(i.Path) if err != nil { return fmt.Errorf("error doing stat on %q: %v", i.Path, err) } var contents fi.Resource if stat.IsDir() { defaultFileType = nodetasks.FileType_Directory } else { contents = fi.NewFileResource(i.Path) } task, err = nodetasks.NewFileTask(i.Name, contents, "/"+i.RelativePath, i.Meta) } if task.Type == "" { task.Type = defaultFileType } if err != nil { return fmt.Errorf("error building task %q: %v", i.RelativePath, err) } glog.V(2).Infof("path %q -> task %v", i.Path, task) if task != nil { key := "file/" + i.RelativePath r.tasks[key] = task } return nil }