diff options
author | Alberto Cortés <alcortesm@gmail.com> | 2017-01-30 21:34:33 +0100 |
---|---|---|
committer | Máximo Cuadros <mcuadros@gmail.com> | 2017-01-30 21:34:33 +0100 |
commit | e80d7b7267ba9f2057f259be331c4de927a60ecb (patch) | |
tree | 7d7d6917576596d76c4be78ca099e039552ae4e0 /utils/merkletrie/internal/fsnoder/file.go | |
parent | 90c1bbd07862c6e1c3ce80306d69eee8ed277056 (diff) | |
download | go-git-e80d7b7267ba9f2057f259be331c4de927a60ecb.tar.gz |
delete old noder, create a new one in utils (#241)
Diffstat (limited to 'utils/merkletrie/internal/fsnoder/file.go')
-rw-r--r-- | utils/merkletrie/internal/fsnoder/file.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/utils/merkletrie/internal/fsnoder/file.go b/utils/merkletrie/internal/fsnoder/file.go new file mode 100644 index 0000000..c975a60 --- /dev/null +++ b/utils/merkletrie/internal/fsnoder/file.go @@ -0,0 +1,72 @@ +package fsnoder + +import ( + "bytes" + "fmt" + "hash/fnv" + + "gopkg.in/src-d/go-git.v4/utils/merkletrie/noder" +) + +// file values represent file-like noders in a merkle trie. +type file struct { + name string // relative + contents string + hash []byte // memoized +} + +// newFile returns a noder representing a file with the given contents. +func newFile(name, contents string) (*file, error) { + if name == "" { + return nil, fmt.Errorf("files cannot have empty names") + } + + return &file{ + name: name, + contents: contents, + }, nil +} + +// The hash of a file is just its contents. +// Empty files will have the fnv64 basis offset as its hash. +func (f *file) Hash() []byte { + if f.hash == nil { + h := fnv.New64a() + h.Write([]byte(f.contents)) // it nevers returns an error. + f.hash = h.Sum(nil) + } + + return f.hash +} + +func (f *file) Name() string { + return f.name +} + +func (f *file) IsDir() bool { + return false +} + +func (f *file) Children() ([]noder.Noder, error) { + return noder.NoChildren, nil +} + +func (f *file) NumChildren() (int, error) { + return 0, nil +} + +const ( + fileStartMark = '<' + fileEndMark = '>' +) + +// String returns a string formated as: name<contents>. +func (f *file) String() string { + var buf bytes.Buffer + buf.WriteString(f.name) + buf.WriteRune(fileStartMark) + buf.WriteString(f.contents) + buf.WriteRune(fileEndMark) + + return buf.String() +} |