// getFile builds the filepath from the TBuf information, and retrieves the // file from files. If the built filename is not already defined, then it calls // the os.OpenFile with the correct parameters depending on the state of args. func getFile(args *internal.ArgType, t *internal.TBuf) (*os.File, error) { var f *os.File var err error // determine filename var filename = strings.ToLower(t.Name) + args.Suffix if args.SingleFile { filename = args.Filename } filename = path.Join(args.Path, filename) // lookup file f, ok := files[filename] if ok { return f, nil } // default open mode mode := os.O_RDWR | os.O_CREATE | os.O_TRUNC // stat file to determine if file already exists fi, err := os.Stat(filename) if err == nil && fi.IsDir() { return nil, errors.New("filename cannot be directory") } else if _, ok = err.(*os.PathError); !ok && args.Append && t.TemplateType != internal.XOTemplate { // file exists so append if append is set and not XO type mode = os.O_APPEND | os.O_WRONLY } // skip if t.TemplateType == internal.XOTemplate && fi != nil { return nil, nil } // open file f, err = os.OpenFile(filename, mode, 0666) if err != nil { return nil, err } // file didn't originally exist, so add package header if fi == nil || !args.Append { err = args.TemplateSet().Execute(f, "xo_package.go.tpl", args) if err != nil { return nil, err } } // store file files[filename] = f return f, nil }