package git import ( "io" "strings" ) // countLines returns the number of lines in a string à la git, this is // The newline character is assumed to be '\n'. The empty string // contains 0 lines. If the last line of the string doesn't end with a // newline, it will still be considered a line. func countLines(s string) int { if s == "" { return 0 } nEOL := strings.Count(s, "\n") if strings.HasSuffix(s, "\n") { return nEOL } return nEOL + 1 } // checkClose is used with defer to close the given io.Closer and check its // returned error value. If Close returns an error and the given *error // is not nil, *error is set to the error returned by Close. // // checkClose is typically used with named return values like so: // // func do(obj *Object) (err error) { // w, err := obj.Writer() // if err != nil { // return nil // } // defer checkClose(w, &err) // // work with w // } func checkClose(c io.Closer, err *error) { if cerr := c.Close(); cerr != nil && *err == nil { *err = cerr } }