package git import ( "bytes" "os" "strings" ) // File represents git file objects. type File struct { Name string Mode os.FileMode Blob } func newFile(name string, m os.FileMode, b *Blob) *File { return &File{Name: name, Mode: m, Blob: *b} } // Contents returns the contents of a file as a string. func (f *File) Contents() (content string, err error) { reader, err := f.Reader() if err != nil { return "", err } defer checkClose(reader, &err) buf := new(bytes.Buffer) buf.ReadFrom(reader) return buf.String(), nil } // Lines returns a slice of lines from the contents of a file, stripping // all end of line characters. If the last line is empty (does not end // in an end of line), it is also stripped. func (f *File) Lines() ([]string, error) { content, err := f.Contents() if err != nil { return nil, err } splits := strings.Split(content, "\n") // remove the last line if it is empty if splits[len(splits)-1] == "" { return splits[:len(splits)-1], nil } return splits, nil } type FileIter struct { w TreeWalker } func NewFileIter(r *Repository, t *Tree) *FileIter { return &FileIter{w: *NewTreeWalker(r, t)} } func (iter *FileIter) Next() (*File, error) { for { name, entry, obj, err := iter.w.Next() if err != nil { return nil, err } if blob, ok := obj.(*Blob); ok { return newFile(name, entry.Mode, blob), nil } } } func (iter *FileIter) Close() { iter.w.Close() }