Codebase list golang-github-go-ini-ini / 8a83917
Avoid using temp file during write (#115) Ethan Koenig authored 6 years ago 无闻 committed 6 years ago
1 changed file(s) with 32 addition(s) and 37 deletion(s). Raw diff Collapse all Expand all
2323 "os"
2424 "regexp"
2525 "runtime"
26 "strconv"
2726 "strings"
2827 "sync"
29 "time"
3028 )
3129
3230 const (
397395 return f.Reload()
398396 }
399397
400 // WriteToIndent writes content into io.Writer with given indention.
401 // If PrettyFormat has been set to be true,
402 // it will align "=" sign with spaces under each section.
403 func (f *File) WriteToIndent(w io.Writer, indent string) (n int64, err error) {
398 func (f *File) writeToBuffer(indent string) (*bytes.Buffer, error) {
404399 equalSign := "="
405400 if PrettyFormat {
406401 equalSign = " = "
414409 if sec.Comment[0] != '#' && sec.Comment[0] != ';' {
415410 sec.Comment = "; " + sec.Comment
416411 }
417 if _, err = buf.WriteString(sec.Comment + LineBreak); err != nil {
418 return 0, err
412 if _, err := buf.WriteString(sec.Comment + LineBreak); err != nil {
413 return nil, err
419414 }
420415 }
421416
422417 if i > 0 || DefaultHeader {
423 if _, err = buf.WriteString("[" + sname + "]" + LineBreak); err != nil {
424 return 0, err
418 if _, err := buf.WriteString("[" + sname + "]" + LineBreak); err != nil {
419 return nil, err
425420 }
426421 } else {
427422 // Write nothing if default section is empty
431426 }
432427
433428 if sec.isRawSection {
434 if _, err = buf.WriteString(sec.rawBody); err != nil {
435 return 0, err
429 if _, err := buf.WriteString(sec.rawBody); err != nil {
430 return nil, err
436431 }
437432 continue
438433 }
468463 if key.Comment[0] != '#' && key.Comment[0] != ';' {
469464 key.Comment = "; " + key.Comment
470465 }
471 if _, err = buf.WriteString(key.Comment + LineBreak); err != nil {
472 return 0, err
466 if _, err := buf.WriteString(key.Comment + LineBreak); err != nil {
467 return nil, err
473468 }
474469 }
475470
487482 }
488483
489484 for _, val := range key.ValueWithShadows() {
490 if _, err = buf.WriteString(kname); err != nil {
491 return 0, err
485 if _, err := buf.WriteString(kname); err != nil {
486 return nil, err
492487 }
493488
494489 if key.isBooleanType {
509504 } else if !f.options.IgnoreInlineComment && strings.ContainsAny(val, "#;") {
510505 val = "`" + val + "`"
511506 }
512 if _, err = buf.WriteString(equalSign + val + LineBreak); err != nil {
513 return 0, err
507 if _, err := buf.WriteString(equalSign + val + LineBreak); err != nil {
508 return nil, err
514509 }
515510 }
516511 }
517512
518513 if PrettySection {
519514 // Put a line between sections
520 if _, err = buf.WriteString(LineBreak); err != nil {
521 return 0, err
522 }
523 }
524 }
525
515 if _, err := buf.WriteString(LineBreak); err != nil {
516 return nil, err
517 }
518 }
519 }
520
521 return buf, nil
522 }
523
524 // WriteToIndent writes content into io.Writer with given indention.
525 // If PrettyFormat has been set to be true,
526 // it will align "=" sign with spaces under each section.
527 func (f *File) WriteToIndent(w io.Writer, indent string) (int64, error) {
528 buf, err := f.writeToBuffer(indent)
529 if err != nil {
530 return 0, err
531 }
526532 return buf.WriteTo(w)
527533 }
528534
535541 func (f *File) SaveToIndent(filename, indent string) error {
536542 // Note: Because we are truncating with os.Create,
537543 // so it's safer to save to a temporary file location and rename afte done.
538 tmpPath := filename + "." + strconv.Itoa(time.Now().Nanosecond()) + ".tmp"
539 defer os.Remove(tmpPath)
540
541 fw, err := os.Create(tmpPath)
544 buf, err := f.writeToBuffer(indent);
542545 if err != nil {
543546 return err
544547 }
545548
546 if _, err = f.WriteToIndent(fw, indent); err != nil {
547 fw.Close()
548 return err
549 }
550 fw.Close()
551
552 // Remove old file and rename the new one.
553 os.Remove(filename)
554 return os.Rename(tmpPath, filename)
549 return ioutil.WriteFile(filename, buf.Bytes(), 0666)
555550 }
556551
557552 // SaveTo writes content to file system.