package notes import ( "bufio" "bytes" "errors" "fmt" "io" "io/ioutil" "local/notes-server/filetree" "os" "path" "strings" ) func (n *Notes) Comment(urlPath string, lineno int, comment string) error { p := filetree.NewPathFromURL(urlPath) if stat, err := os.Stat(p.Local); err != nil { return errors.New("cannot comment as it does not exist") } else if stat.IsDir() { return errors.New("cannot comment on a dir") } f, err := os.Open(p.Local) if err != nil { return err } defer f.Close() f2, err := ioutil.TempFile(os.TempDir(), path.Base(p.Local)+".*") if err != nil { return err } defer f2.Close() reader := bufio.NewReader(f) writer := io.Writer(f2) for i := 0; i < lineno+1; i++ { line, _, err := reader.ReadLine() if err == io.EOF { break } if err != nil { return err } _, err = io.Copy(writer, bytes.NewReader(line)) if err != nil { return err } _, err = writer.Write([]byte("\n")) if err != nil { return err } } formatted := fmt.Sprintf("> *%s*\n\n", comment) _, err = io.Copy(writer, strings.NewReader(formatted)) if err != nil { return err } _, err = io.Copy(writer, reader) if err != nil && err != io.EOF { return err } f2.Close() return os.Rename(f2.Name(), p.Local) }