aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plumbing/filemode/filemode.go188
-rw-r--r--plumbing/filemode/filemode_test.go348
-rw-r--r--plumbing/format/idxfile/decoder.go8
-rw-r--r--plumbing/format/index/decoder_test.go8
-rw-r--r--plumbing/format/index/index.go4
-rw-r--r--plumbing/object/change_adaptor_test.go20
-rw-r--r--plumbing/object/change_test.go10
-rw-r--r--plumbing/object/difftree.go11
-rw-r--r--plumbing/object/difftree_test.go8
-rw-r--r--plumbing/object/file.go8
-rw-r--r--plumbing/object/file_test.go5
-rw-r--r--plumbing/object/object_test.go5
-rw-r--r--plumbing/object/tree.go44
-rw-r--r--plumbing/object/tree_test.go333
-rw-r--r--plumbing/object/treenoder.go20
-rw-r--r--utils/binary/read.go2
-rw-r--r--worktree.go49
-rw-r--r--worktree_test.go6
18 files changed, 789 insertions, 288 deletions
diff --git a/plumbing/filemode/filemode.go b/plumbing/filemode/filemode.go
new file mode 100644
index 0000000..0994bc4
--- /dev/null
+++ b/plumbing/filemode/filemode.go
@@ -0,0 +1,188 @@
+package filemode
+
+import (
+ "encoding/binary"
+ "fmt"
+ "os"
+ "strconv"
+)
+
+// A FileMode represents the kind of tree entries used by git. It
+// resembles regular file systems modes, although FileModes are
+// considerably simpler (there are not so many), and there are some,
+// like Submodule that has no file system equivalent.
+type FileMode uint32
+
+const (
+ // Empty is used as the FileMode of tree elements when comparing
+ // trees in the following situations:
+ //
+ // - the mode of tree elements before their creation. - the mode of
+ // tree elements after their deletion. - the mode of unmerged
+ // elements when checking the index.
+ //
+ // Empty has no file system equivalent. As Empty is the zero value
+ // of FileMode, it is also returned by New and
+ // NewFromOsNewFromOSFileMode along with an error, when they fail.
+ Empty FileMode = 0
+ // Dir represent a Directory.
+ Dir FileMode = 0040000
+ // Regular represent non-executable files. Please note this is not
+ // the same as golang regular files, which include executable files.
+ Regular FileMode = 0100644
+ // Deprecated represent non-executable files with the group writable
+ // bit set. This mode was supported by the first versions of git,
+ // but it has been deprecatred nowadays. This library uses them
+ // internally, so you can read old packfiles, but will treat them as
+ // Regulars when interfacing with the outside world. This is the
+ // standard git behaviuor.
+ Deprecated FileMode = 0100664
+ // Executable represents executable files.
+ Executable FileMode = 0100755
+ // Symlink represents symbolic links to files.
+ Symlink FileMode = 0120000
+ // Submodule represents git submodules. This mode has no file system
+ // equivalent.
+ Submodule FileMode = 0160000
+)
+
+// New takes the octal string representation of a FileMode and returns
+// the FileMode and a nil error. If the string can not be parsed to a
+// 32 bit unsigned octal number, it returns Empty and the parsing error.
+//
+// Example: "40000" means Dir, "100644" means Regular.
+//
+// Please note this function does not check if the returned FileMode
+// is valid in git or if it is malformed. For instance, "1" will
+// return the malformed FileMode(1) and a nil error.
+func New(s string) (FileMode, error) {
+ n, err := strconv.ParseUint(s, 8, 32)
+ if err != nil {
+ return Empty, err
+ }
+
+ return FileMode(n), nil
+}
+
+// NewFromOSFileMode returns the FileMode used by git to represent
+// the provided file system modes and a nil error on success. If the
+// file system mode cannot be mapped to any valid git mode (as with
+// sockets or named pipes), it will return Empty and an error.
+//
+// Note that some git modes cannot be generated from os.FileModes, like
+// Deprecated and Submodule; while Empty will be returned, along with an
+// error, only when the method fails.
+func NewFromOSFileMode(m os.FileMode) (FileMode, error) {
+ if m.IsRegular() {
+ if isSetTemporary(m) {
+ return Empty, fmt.Errorf("no equivalent git mode for %s", m)
+ }
+ if isSetCharDevice(m) {
+ return Empty, fmt.Errorf("no equivalent git mode for %s", m)
+ }
+ if isSetUserExecutable(m) {
+ return Executable, nil
+ }
+ return Regular, nil
+ }
+
+ if m.IsDir() {
+ return Dir, nil
+ }
+
+ if isSetSymLink(m) {
+ return Symlink, nil
+ }
+
+ return Empty, fmt.Errorf("no equivalent git mode for %s", m)
+}
+
+func isSetCharDevice(m os.FileMode) bool {
+ return m&os.ModeCharDevice != 0
+}
+
+func isSetTemporary(m os.FileMode) bool {
+ return m&os.ModeTemporary != 0
+}
+
+func isSetUserExecutable(m os.FileMode) bool {
+ return m&0100 != 0
+}
+
+func isSetSymLink(m os.FileMode) bool {
+ return m&os.ModeSymlink != 0
+}
+
+// Bytes return a slice of 4 bytes with the mode in little endian
+// encoding.
+func (m FileMode) Bytes() []byte {
+ ret := make([]byte, 4)
+ binary.LittleEndian.PutUint32(ret, uint32(m))
+ return ret[:]
+}
+
+// IsMalformed returns if the FileMode should not appear in a git packfile,
+// this is: Empty and any other mode not mentioned as a constant in this
+// package.
+func (m FileMode) IsMalformed() bool {
+ return m != Dir &&
+ m != Regular &&
+ m != Deprecated &&
+ m != Executable &&
+ m != Symlink &&
+ m != Submodule
+}
+
+// String returns the FileMode as a string in the standatd git format,
+// this is, an octal number padded with ceros to 7 digits. Malformed
+// modes are printed in that same format, for easier debugging.
+//
+// Example: Regular is "0100644", Empty is "0000000".
+func (m FileMode) String() string {
+ return fmt.Sprintf("%07o", uint32(m))
+}
+
+// IsRegular returns if the FileMode represents that of a regular file,
+// this is, either Regular or Deprecated. Please note that Executable
+// are not regular even though in the UNIX tradition, they usually are:
+// See the IsFile method.
+func (m FileMode) IsRegular() bool {
+ return m == Regular ||
+ m == Deprecated
+}
+
+// IsFile returns if the FileMode represents that of a file, this is,
+// Regular, Deprecated, Excutable or Link.
+func (m FileMode) IsFile() bool {
+ return m == Regular ||
+ m == Deprecated ||
+ m == Executable ||
+ m == Symlink
+}
+
+// ToOSFileMode returns the os.FileMode to be used when creating file
+// system elements with the given git mode and a nil error on success.
+//
+// When the provided mode cannot be mapped to a valid file system mode
+// (e.g. Submodule) it returns os.FileMode(0) and an error.
+//
+// The returned file mode does not take into account the umask.
+func (m FileMode) ToOSFileMode() (os.FileMode, error) {
+ switch m {
+ case Dir:
+ return os.ModePerm | os.ModeDir, nil
+ case Submodule:
+ return os.ModePerm | os.ModeDir, nil
+ case Regular:
+ return os.FileMode(0644), nil
+ // Deprecated is no longer allowed: treated as a Regular instead
+ case Deprecated:
+ return os.FileMode(0644), nil
+ case Executable:
+ return os.FileMode(0755), nil
+ case Symlink:
+ return os.ModePerm | os.ModeSymlink, nil
+ }
+
+ return os.FileMode(0), fmt.Errorf("malformed mode (%s)", m)
+}
diff --git a/plumbing/filemode/filemode_test.go b/plumbing/filemode/filemode_test.go
new file mode 100644
index 0000000..299c96a
--- /dev/null
+++ b/plumbing/filemode/filemode_test.go
@@ -0,0 +1,348 @@
+package filemode
+
+import (
+ "os"
+ "testing"
+
+ . "gopkg.in/check.v1"
+)
+
+func Test(t *testing.T) { TestingT(t) }
+
+type ModeSuite struct{}
+
+var _ = Suite(&ModeSuite{})
+
+func (s *ModeSuite) TestNew(c *C) {
+ for _, test := range [...]struct {
+ input string
+ expected FileMode
+ }{
+ // these are the ones used in the packfile codification
+ // of the tree entries
+ {input: "40000", expected: Dir},
+ {input: "100644", expected: Regular},
+ {input: "100664", expected: Deprecated},
+ {input: "100755", expected: Executable},
+ {input: "120000", expected: Symlink},
+ {input: "160000", expected: Submodule},
+ // these are are not used by standard git to codify modes in
+ // packfiles, but they often appear when parsing some git
+ // outputs ("git diff-tree", for instance).
+ {input: "000000", expected: Empty},
+ {input: "040000", expected: Dir},
+ // these are valid inputs, but probably means there is a bug
+ // somewhere.
+ {input: "0", expected: Empty},
+ {input: "42", expected: FileMode(042)},
+ {input: "00000000000100644", expected: Regular},
+ } {
+ comment := Commentf("input = %q", test.input)
+ obtained, err := New(test.input)
+ c.Assert(obtained, Equals, test.expected, comment)
+ c.Assert(err, IsNil, comment)
+ }
+}
+
+func (s *ModeSuite) TestNewErrors(c *C) {
+ for _, input := range [...]string{
+ "0x81a4", // Regular in hex
+ "-rw-r--r--", // Regular in default UNIX representation
+ "",
+ "-42",
+ "9", // this is no octal
+ "09", // looks like octal, but it is not
+ "mode",
+ "-100644",
+ "+100644",
+ } {
+ comment := Commentf("input = %q", input)
+ obtained, err := New(input)
+ c.Assert(obtained, Equals, Empty, comment)
+ c.Assert(err, Not(IsNil), comment)
+ }
+}
+
+// fixtures for testing NewModeFromOSFileMode
+type fixture struct {
+ input os.FileMode
+ expected FileMode
+ err string // error regexp, empty string for nil error
+}
+
+func (f fixture) test(c *C) {
+ obtained, err := NewFromOSFileMode(f.input)
+ comment := Commentf("input = %s (%07o)", f.input, uint32(f.input))
+ c.Assert(obtained, Equals, f.expected, comment)
+ if f.err != "" {
+ c.Assert(err, ErrorMatches, f.err, comment)
+ } else {
+ c.Assert(err, IsNil, comment)
+ }
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeSimplePerms(c *C) {
+ for _, f := range [...]fixture{
+ {os.FileMode(0755) | os.ModeDir, Dir, ""}, // drwxr-xr-x
+ {os.FileMode(0700) | os.ModeDir, Dir, ""}, // drwx------
+ {os.FileMode(0500) | os.ModeDir, Dir, ""}, // dr-x------
+ {os.FileMode(0644), Regular, ""}, // -rw-r--r--
+ {os.FileMode(0660), Regular, ""}, // -rw-rw----
+ {os.FileMode(0640), Regular, ""}, // -rw-r-----
+ {os.FileMode(0600), Regular, ""}, // -rw-------
+ {os.FileMode(0400), Regular, ""}, // -r--------
+ {os.FileMode(0000), Regular, ""}, // ----------
+ {os.FileMode(0755), Executable, ""}, // -rwxr-xr-x
+ {os.FileMode(0700), Executable, ""}, // -rwx------
+ {os.FileMode(0500), Executable, ""}, // -r-x------
+ {os.FileMode(0744), Executable, ""}, // -rwxr--r--
+ {os.FileMode(0540), Executable, ""}, // -r-xr-----
+ {os.FileMode(0550), Executable, ""}, // -r-xr-x---
+ {os.FileMode(0777) | os.ModeSymlink, Symlink, ""}, // Lrwxrwxrwx
+ } {
+ f.test(c)
+ }
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeAppend(c *C) {
+ // append files are just regular files
+ fixture{
+ input: os.FileMode(0644) | os.ModeAppend, // arw-r--r--
+ expected: Regular, err: "",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeExclusive(c *C) {
+ // exclusive files are just regular or executable files
+ fixture{
+ input: os.FileMode(0644) | os.ModeExclusive, // lrw-r--r--
+ expected: Regular, err: "",
+ }.test(c)
+
+ fixture{
+ input: os.FileMode(0755) | os.ModeExclusive, // lrwxr-xr-x
+ expected: Executable, err: "",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeTemporary(c *C) {
+ // temporaty files are ignored
+ fixture{
+ input: os.FileMode(0644) | os.ModeTemporary, // Trw-r--r--
+ expected: Empty, err: "no equivalent.*",
+ }.test(c)
+
+ fixture{
+ input: os.FileMode(0755) | os.ModeTemporary, // Trwxr-xr-x
+ expected: Empty, err: "no equivalent.*",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeDevice(c *C) {
+ // device files has no git equivalent
+ fixture{
+ input: os.FileMode(0644) | os.ModeDevice, // Drw-r--r--
+ expected: Empty, err: "no equivalent.*",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestNewFromOsFileNamedPipe(c *C) {
+ // named pipes files has not git equivalent
+ fixture{
+ input: os.FileMode(0644) | os.ModeNamedPipe, // prw-r--r--
+ expected: Empty, err: "no equivalent.*",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeSocket(c *C) {
+ // sockets has no git equivalent
+ fixture{
+ input: os.FileMode(0644) | os.ModeSocket, // Srw-r--r--
+ expected: Empty, err: "no equivalent.*",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeSetuid(c *C) {
+ // Setuid are just executables
+ fixture{
+ input: os.FileMode(0755) | os.ModeSetuid, // urwxr-xr-x
+ expected: Executable, err: "",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeSetgid(c *C) {
+ // Setguid are regular or executables, depending on the owner perms
+ fixture{
+ input: os.FileMode(0644) | os.ModeSetgid, // grw-r--r--
+ expected: Regular, err: "",
+ }.test(c)
+
+ fixture{
+ input: os.FileMode(0755) | os.ModeSetgid, // grwxr-xr-x
+ expected: Executable, err: "",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeCharDevice(c *C) {
+ // char devices has no git equivalent
+ fixture{
+ input: os.FileMode(0644) | os.ModeCharDevice, // crw-r--r--
+ expected: Empty, err: "no equivalent.*",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestNewFromOsFileModeSticky(c *C) {
+ // dirs with the sticky bit are just dirs
+ fixture{
+ input: os.FileMode(0755) | os.ModeDir | os.ModeSticky, // dtrwxr-xr-x
+ expected: Dir, err: "",
+ }.test(c)
+}
+
+func (s *ModeSuite) TestByte(c *C) {
+ for _, test := range [...]struct {
+ input FileMode
+ expected []byte
+ }{
+ {FileMode(0), []byte{0x00, 0x00, 0x00, 0x00}},
+ {FileMode(1), []byte{0x01, 0x00, 0x00, 0x00}},
+ {FileMode(15), []byte{0x0f, 0x00, 0x00, 0x00}},
+ {FileMode(16), []byte{0x10, 0x00, 0x00, 0x00}},
+ {FileMode(255), []byte{0xff, 0x00, 0x00, 0x00}},
+ {FileMode(256), []byte{0x00, 0x01, 0x00, 0x00}},
+ {Empty, []byte{0x00, 0x00, 0x00, 0x00}},
+ {Dir, []byte{0x00, 0x40, 0x00, 0x00}},
+ {Regular, []byte{0xa4, 0x81, 0x00, 0x00}},
+ {Deprecated, []byte{0xb4, 0x81, 0x00, 0x00}},
+ {Executable, []byte{0xed, 0x81, 0x00, 0x00}},
+ {Symlink, []byte{0x00, 0xa0, 0x00, 0x00}},
+ {Submodule, []byte{0x00, 0xe0, 0x00, 0x00}},
+ } {
+ c.Assert(test.input.Bytes(), DeepEquals, test.expected,
+ Commentf("input = %s", test.input))
+ }
+}
+
+func (s *ModeSuite) TestIsMalformed(c *C) {
+ for _, test := range [...]struct {
+ mode FileMode
+ expected bool
+ }{
+ {Empty, true},
+ {Dir, false},
+ {Regular, false},
+ {Deprecated, false},
+ {Executable, false},
+ {Symlink, false},
+ {Submodule, false},
+ {FileMode(01), true},
+ {FileMode(010), true},
+ {FileMode(0100), true},
+ {FileMode(01000), true},
+ {FileMode(010000), true},
+ {FileMode(0100000), true},
+ } {
+ c.Assert(test.mode.IsMalformed(), Equals, test.expected)
+ }
+}
+
+func (s *ModeSuite) TestString(c *C) {
+ for _, test := range [...]struct {
+ mode FileMode
+ expected string
+ }{
+ {Empty, "0000000"},
+ {Dir, "0040000"},
+ {Regular, "0100644"},
+ {Deprecated, "0100664"},
+ {Executable, "0100755"},
+ {Symlink, "0120000"},
+ {Submodule, "0160000"},
+ {FileMode(01), "0000001"},
+ {FileMode(010), "0000010"},
+ {FileMode(0100), "0000100"},
+ {FileMode(01000), "0001000"},
+ {FileMode(010000), "0010000"},
+ {FileMode(0100000), "0100000"},
+ } {
+ c.Assert(test.mode.String(), Equals, test.expected)
+ }
+}
+
+func (s *ModeSuite) TestIsRegular(c *C) {
+ for _, test := range [...]struct {
+ mode FileMode
+ expected bool
+ }{
+ {Empty, false},
+ {Dir, false},
+ {Regular, true},
+ {Deprecated, true},
+ {Executable, false},
+ {Symlink, false},
+ {Submodule, false},
+ {FileMode(01), false},
+ {FileMode(010), false},
+ {FileMode(0100), false},
+ {FileMode(01000), false},
+ {FileMode(010000), false},
+ {FileMode(0100000), false},
+ } {
+ c.Assert(test.mode.IsRegular(), Equals, test.expected)
+ }
+}
+
+func (s *ModeSuite) TestIsFile(c *C) {
+ for _, test := range [...]struct {
+ mode FileMode
+ expected bool
+ }{
+ {Empty, false},
+ {Dir, false},
+ {Regular, true},
+ {Deprecated, true},
+ {Executable, true},
+ {Symlink, true},
+ {Submodule, false},
+ {FileMode(01), false},
+ {FileMode(010), false},
+ {FileMode(0100), false},
+ {FileMode(01000), false},
+ {FileMode(010000), false},
+ {FileMode(0100000), false},
+ } {
+ c.Assert(test.mode.IsFile(), Equals, test.expected)
+ }
+}
+
+func (s *ModeSuite) TestToOSFileMode(c *C) {
+ for _, test := range [...]struct {
+ input FileMode
+ expected os.FileMode
+ errRegExp string // empty string for nil error
+ }{
+ {Empty, os.FileMode(0), "malformed.*"},
+ {Dir, os.ModePerm | os.ModeDir, ""},
+ {Regular, os.FileMode(0644), ""},
+ {Deprecated, os.FileMode(0644), ""},
+ {Executable, os.FileMode(0755), ""},
+ {Symlink, os.ModePerm | os.ModeSymlink, ""},
+ {Submodule, os.ModePerm | os.ModeDir, ""},
+ {FileMode(01), os.FileMode(0), "malformed.*"},
+ {FileMode(010), os.FileMode(0), "malformed.*"},
+ {FileMode(0100), os.FileMode(0), "malformed.*"},
+ {FileMode(01000), os.FileMode(0), "malformed.*"},
+ {FileMode(010000), os.FileMode(0), "malformed.*"},
+ {FileMode(0100000), os.FileMode(0), "malformed.*"},
+ } {
+ obtained, err := test.input.ToOSFileMode()
+ comment := Commentf("input = %s", test.input)
+ if test.errRegExp != "" {
+ c.Assert(obtained, Equals, os.FileMode(0), comment)
+ c.Assert(err, ErrorMatches, test.errRegExp, comment)
+ } else {
+ c.Assert(obtained, Equals, test.expected, comment)
+ c.Assert(err, IsNil, comment)
+ }
+ }
+}
diff --git a/plumbing/format/idxfile/decoder.go b/plumbing/format/idxfile/decoder.go
index 020c997..c1269a1 100644
--- a/plumbing/format/idxfile/decoder.go
+++ b/plumbing/format/idxfile/decoder.go
@@ -57,7 +57,7 @@ func (d *Decoder) Decode(idx *Idxfile) error {
func validateHeader(r io.Reader) error {
var h = make([]byte, 4)
- if _, err := r.Read(h); err != nil {
+ if _, err := io.ReadFull(r, h); err != nil {
return err
}
@@ -99,7 +99,7 @@ func readObjectNames(idx *Idxfile, r io.Reader) error {
c := int(idx.ObjectCount)
for i := 0; i < c; i++ {
var ref plumbing.Hash
- if _, err := r.Read(ref[:]); err != nil {
+ if _, err := io.ReadFull(r, ref[:]); err != nil {
return err
}
@@ -135,11 +135,11 @@ func readOffsets(idx *Idxfile, r io.Reader) error {
}
func readChecksums(idx *Idxfile, r io.Reader) error {
- if _, err := r.Read(idx.PackfileChecksum[:]); err != nil {
+ if _, err := io.ReadFull(r, idx.PackfileChecksum[:]); err != nil {
return err
}
- if _, err := r.Read(idx.IdxChecksum[:]); err != nil {
+ if _, err := io.ReadFull(r, idx.IdxChecksum[:]); err != nil {
return err
}
diff --git a/plumbing/format/index/decoder_test.go b/plumbing/format/index/decoder_test.go
index 1ffbe75..3a6e0d4 100644
--- a/plumbing/format/index/decoder_test.go
+++ b/plumbing/format/index/decoder_test.go
@@ -3,9 +3,11 @@ package index
import (
"testing"
- . "gopkg.in/check.v1"
- "github.com/src-d/go-git-fixtures"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
+
+ "github.com/src-d/go-git-fixtures"
+ . "gopkg.in/check.v1"
)
func Test(t *testing.T) { TestingT(t) }
@@ -53,7 +55,7 @@ func (s *IndexSuite) TestDecodeEntries(c *C) {
c.Assert(e.Size, Equals, uint32(189))
c.Assert(e.Hash.String(), Equals, "32858aad3c383ed1ff0a0f9bdf231d54a00c9e88")
c.Assert(e.Name, Equals, ".gitignore")
- c.Assert(e.Mode.String(), Equals, "-rw-r--r--")
+ c.Assert(e.Mode, Equals, filemode.Regular)
e = idx.Entries[1]
c.Assert(e.Name, Equals, "CHANGELOG")
diff --git a/plumbing/format/index/index.go b/plumbing/format/index/index.go
index a95dba2..e706058 100644
--- a/plumbing/format/index/index.go
+++ b/plumbing/format/index/index.go
@@ -2,10 +2,10 @@ package index
import (
"errors"
- "os"
"time"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
)
var (
@@ -62,7 +62,7 @@ type Entry struct {
// Dev and Inode of the tracked path
Dev, Inode uint32
// Mode of the path
- Mode os.FileMode
+ Mode filemode.FileMode
// UID and GID, userid and group id of the owner
UID, GID uint32
// Size is the length in bytes for regular files
diff --git a/plumbing/object/change_adaptor_test.go b/plumbing/object/change_adaptor_test.go
index fb2636b..b42a3b3 100644
--- a/plumbing/object/change_adaptor_test.go
+++ b/plumbing/object/change_adaptor_test.go
@@ -1,10 +1,10 @@
package object
import (
- "os"
"sort"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/plumbing/storer"
"srcd.works/go-git.v4/storage/filesystem"
"srcd.works/go-git.v4/utils/merkletrie"
@@ -51,7 +51,7 @@ func newPath(nn ...noder.Noder) noder.Path { return noder.Path(nn) }
func (s *ChangeAdaptorSuite) TestTreeNoderHashHasMode(c *C) {
hash := plumbing.NewHash("aaaa")
- mode := FileMode
+ mode := filemode.Regular
treeNoder := &treeNoder{
hash: hash,
@@ -64,8 +64,8 @@ func (s *ChangeAdaptorSuite) TestTreeNoderHashHasMode(c *C) {
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
- 0xa4, 0x81, 0x00, 0x00, // object.FileMode in little endian
}
+ expected = append(expected, filemode.Regular.Bytes()...)
c.Assert(treeNoder.Hash(), DeepEquals, expected)
}
@@ -74,7 +74,7 @@ func (s *ChangeAdaptorSuite) TestNewChangeInsert(c *C) {
tree := &Tree{}
entry := TreeEntry{
Name: "name",
- Mode: os.FileMode(42),
+ Mode: filemode.FileMode(42),
Hash: plumbing.NewHash("aaaaa"),
}
path := newPath(newNoder(tree, entry))
@@ -100,7 +100,7 @@ func (s *ChangeAdaptorSuite) TestNewChangeDelete(c *C) {
tree := &Tree{}
entry := TreeEntry{
Name: "name",
- Mode: os.FileMode(42),
+ Mode: filemode.FileMode(42),
Hash: plumbing.NewHash("aaaaa"),
}
path := newPath(newNoder(tree, entry))
@@ -126,7 +126,7 @@ func (s *ChangeAdaptorSuite) TestNewChangeModify(c *C) {
treeA := &Tree{}
entryA := TreeEntry{
Name: "name",
- Mode: os.FileMode(42),
+ Mode: filemode.FileMode(42),
Hash: plumbing.NewHash("aaaaa"),
}
pathA := newPath(newNoder(treeA, entryA))
@@ -136,7 +136,7 @@ func (s *ChangeAdaptorSuite) TestNewChangeModify(c *C) {
treeB := &Tree{}
entryB := TreeEntry{
Name: "name",
- Mode: os.FileMode(42),
+ Mode: filemode.FileMode(42),
Hash: plumbing.NewHash("bbbb"),
}
pathB := newPath(newNoder(treeB, entryB))
@@ -295,7 +295,7 @@ func (s *ChangeAdaptorSuite) TestChangeEntryFromSortPath(c *C) {
tree := &Tree{}
entry := TreeEntry{
Name: "name",
- Mode: os.FileMode(42),
+ Mode: filemode.FileMode(42),
Hash: plumbing.NewHash("aaaaa"),
}
path := newPath(newNoder(tree, entry))
@@ -312,14 +312,14 @@ func (s *ChangeAdaptorSuite) TestChangeEntryFromLongPath(c *C) {
treeA := &Tree{}
entryA := TreeEntry{
Name: "nameA",
- Mode: os.FileMode(42),
+ Mode: filemode.FileMode(42),
Hash: plumbing.NewHash("aaaa"),
}
treeB := &Tree{}
entryB := TreeEntry{
Name: "nameB",
- Mode: os.FileMode(24),
+ Mode: filemode.FileMode(24),
Hash: plumbing.NewHash("bbbb"),
}
diff --git a/plumbing/object/change_test.go b/plumbing/object/change_test.go
index b47e92a..4a144fa 100644
--- a/plumbing/object/change_test.go
+++ b/plumbing/object/change_test.go
@@ -1,10 +1,10 @@
package object
import (
- "os"
"sort"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/plumbing/storer"
"srcd.works/go-git.v4/storage/filesystem"
"srcd.works/go-git.v4/utils/merkletrie"
@@ -48,7 +48,7 @@ func (s *ChangeSuite) TestInsert(c *C) {
path := "examples/clone/main.go"
name := "main.go"
- mode := os.FileMode(100644)
+ mode := filemode.Regular
blob := plumbing.NewHash("f95dc8f7923add1a8b9f72ecb1e8db1402de601a")
tree := plumbing.NewHash("6efca3ff41cab651332f9ebc0c96bb26be809615")
@@ -94,7 +94,7 @@ func (s *ChangeSuite) TestDelete(c *C) {
path := "utils/difftree/difftree.go"
name := "difftree.go"
- mode := os.FileMode(100644)
+ mode := filemode.Regular
blob := plumbing.NewHash("e2cb9a5719daf634d45a063112b4044ee81da13e")
tree := plumbing.NewHash("f3d11566401ce4b0808aab9dd6fad3d5abf1481a")
@@ -142,7 +142,7 @@ func (s *ChangeSuite) TestModify(c *C) {
path := "utils/difftree/difftree.go"
name := "difftree.go"
- mode := os.FileMode(100644)
+ mode := filemode.Regular
fromBlob := plumbing.NewHash("05f583ace3a9a078d8150905a53a4d82567f125f")
fromTree := plumbing.NewHash("b1f01b730b855c82431918cb338ad47ed558999b")
toBlob := plumbing.NewHash("de927fad935d172929aacf20e71f3bf0b91dd6f9")
@@ -215,7 +215,7 @@ func (s *ChangeSuite) TestErrorsFindingChildsAreDetected(c *C) {
path := "utils/difftree/difftree.go"
name := "difftree.go"
- mode := os.FileMode(100644)
+ mode := filemode.Regular
fromBlob := plumbing.NewHash("aaaa") // does not exists
fromTree := plumbing.NewHash("b1f01b730b855c82431918cb338ad47ed558999b")
toBlob := plumbing.NewHash("bbbb") // does not exists
diff --git a/plumbing/object/difftree.go b/plumbing/object/difftree.go
index e6e0cb0..bcc78ad 100644
--- a/plumbing/object/difftree.go
+++ b/plumbing/object/difftree.go
@@ -2,8 +2,8 @@ package object
import (
"bytes"
- "os"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/utils/merkletrie"
"srcd.works/go-git.v4/utils/merkletrie/noder"
)
@@ -49,14 +49,11 @@ func equivalentMode(a, b []byte) bool {
}
var (
- file = modeToBytes(FileMode)
- fileDeprecated = modeToBytes(FileModeDeprecated)
- // remove this by fixing plumbing.Object mode ASAP
- fileGoGit = modeToBytes(os.FileMode(0644))
+ file = filemode.Regular.Bytes()
+ fileDeprecated = filemode.Deprecated.Bytes()
)
func isFilish(b []byte) bool {
return bytes.Equal(b, file) ||
- bytes.Equal(b, fileDeprecated) ||
- bytes.Equal(b, fileGoGit)
+ bytes.Equal(b, fileDeprecated)
}
diff --git a/plumbing/object/difftree_test.go b/plumbing/object/difftree_test.go
index 594c49d..fa996c2 100644
--- a/plumbing/object/difftree_test.go
+++ b/plumbing/object/difftree_test.go
@@ -1,10 +1,10 @@
package object
import (
- "os"
"sort"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/plumbing/format/packfile"
"srcd.works/go-git.v4/plumbing/storer"
"srcd.works/go-git.v4/storage/filesystem"
@@ -362,11 +362,11 @@ func (s *DiffTreeSuite) TestIssue279(c *C) {
// mode to a 100644 or vice versa.
from := &treeNoder{
hash: plumbing.NewHash("d08e895238bac36d8220586fdc28c27e1a7a76d3"),
- mode: os.FileMode(0100664),
+ mode: filemode.Regular,
}
to := &treeNoder{
hash: plumbing.NewHash("d08e895238bac36d8220586fdc28c27e1a7a76d3"),
- mode: os.FileMode(0100644),
+ mode: filemode.Regular,
}
c.Assert(hashEqual(from, to), Equals, true)
c.Assert(hashEqual(to, from), Equals, true)
@@ -374,7 +374,7 @@ func (s *DiffTreeSuite) TestIssue279(c *C) {
// but should detect if the contents of the file also changed.
to = &treeNoder{
hash: plumbing.NewHash("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
- mode: os.FileMode(0100644),
+ mode: filemode.Regular,
}
c.Assert(hashEqual(from, to), Equals, false)
c.Assert(hashEqual(to, from), Equals, false)
diff --git a/plumbing/object/file.go b/plumbing/object/file.go
index 4866777..5f24cf0 100644
--- a/plumbing/object/file.go
+++ b/plumbing/object/file.go
@@ -3,9 +3,9 @@ package object
import (
"bytes"
"io"
- "os"
"strings"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/plumbing/storer"
"srcd.works/go-git.v4/utils/ioutil"
)
@@ -16,13 +16,13 @@ type File struct {
// depending of the function that generates it.
Name string
// Mode is the file mode.
- Mode os.FileMode
+ Mode filemode.FileMode
// Blob with the contents of the file.
Blob
}
// NewFile returns a File based on the given blob object
-func NewFile(name string, m os.FileMode, b *Blob) *File {
+func NewFile(name string, m filemode.FileMode, b *Blob) *File {
return &File{Name: name, Mode: m, Blob: *b}
}
@@ -81,7 +81,7 @@ func (iter *FileIter) Next() (*File, error) {
return nil, err
}
- if entry.Mode.IsDir() || entry.Mode == SubmoduleMode {
+ if entry.Mode == filemode.Dir || entry.Mode == filemode.Submodule {
continue
}
diff --git a/plumbing/object/file_test.go b/plumbing/object/file_test.go
index c482541..573664b 100644
--- a/plumbing/object/file_test.go
+++ b/plumbing/object/file_test.go
@@ -3,11 +3,12 @@ package object
import (
"io"
- "github.com/src-d/go-git-fixtures"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/plumbing/storer"
"srcd.works/go-git.v4/storage/filesystem"
+ "github.com/src-d/go-git-fixtures"
. "gopkg.in/check.v1"
)
@@ -58,7 +59,7 @@ func (s *FileSuite) TestIter(c *C) {
exp := t.files[k]
file, err := iter.Next()
c.Assert(err, IsNil, Commentf("subtest %d, iter %d, err=%v", i, k, err))
- c.Assert(file.Mode.String(), Equals, "-rw-r--r--")
+ c.Assert(file.Mode, Equals, filemode.Regular)
c.Assert(file.Hash.IsZero(), Equals, false)
c.Assert(file.Hash, Equals, file.ID())
c.Assert(file.Name, Equals, exp.Name, Commentf("subtest %d, iter %d, name=%s, expected=%s", i, k, file.Name, exp.Hash))
diff --git a/plumbing/object/object_test.go b/plumbing/object/object_test.go
index 426baed..46b0065 100644
--- a/plumbing/object/object_test.go
+++ b/plumbing/object/object_test.go
@@ -6,11 +6,12 @@ import (
"testing"
"time"
- "github.com/src-d/go-git-fixtures"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/plumbing/storer"
"srcd.works/go-git.v4/storage/filesystem"
+ "github.com/src-d/go-git-fixtures"
. "gopkg.in/check.v1"
)
@@ -91,7 +92,7 @@ func (s *ObjectsSuite) TestParseTree(c *C) {
tree.buildMap()
c.Assert(tree.m, HasLen, 8)
c.Assert(tree.m[".gitignore"].Name, Equals, ".gitignore")
- c.Assert(tree.m[".gitignore"].Mode.String(), Equals, "-rw-r--r--")
+ c.Assert(tree.m[".gitignore"].Mode, Equals, filemode.Regular)
c.Assert(tree.m[".gitignore"].Hash.String(), Equals, "32858aad3c383ed1ff0a0f9bdf231d54a00c9e88")
count := 0
diff --git a/plumbing/object/tree.go b/plumbing/object/tree.go
index ef5e140..071d064 100644
--- a/plumbing/object/tree.go
+++ b/plumbing/object/tree.go
@@ -5,12 +5,11 @@ import (
"errors"
"fmt"
"io"
- "os"
"path"
- "strconv"
"strings"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/plumbing/storer"
"srcd.works/go-git.v4/utils/ioutil"
)
@@ -18,13 +17,6 @@ import (
const (
maxTreeDepth = 1024
startingStackSize = 8
-
- FileMode os.FileMode = 0100644
- FileModeDeprecated os.FileMode = 0100664
- ExecutableMode os.FileMode = 0100755
- SubmoduleMode os.FileMode = 0160000
- SymlinkMode os.FileMode = 0120000
- TreeMode os.FileMode = 0040000
)
// New errors defined by this package.
@@ -68,7 +60,7 @@ func DecodeTree(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (*Tree,
// TreeEntry represents a file
type TreeEntry struct {
Name string
- Mode os.FileMode
+ Mode filemode.FileMode
Hash plumbing.Hash
}
@@ -202,7 +194,7 @@ func (t *Tree) Decode(o plumbing.EncodedObject) (err error) {
r := bufio.NewReader(reader)
for {
- mode, err := r.ReadString(' ')
+ str, err := r.ReadString(' ')
if err != nil {
if err == io.EOF {
break
@@ -210,9 +202,10 @@ func (t *Tree) Decode(o plumbing.EncodedObject) (err error) {
return err
}
+ str = str[:len(str)-1] // strip last byte (' ')
- fm, err := t.decodeFileMode(mode[:len(mode)-1])
- if err != nil && err != io.EOF {
+ mode, err := filemode.New(str)
+ if err != nil {
return err
}
@@ -229,7 +222,7 @@ func (t *Tree) Decode(o plumbing.EncodedObject) (err error) {
baseName := name[:len(name)-1]
t.Entries = append(t.Entries, TreeEntry{
Hash: hash,
- Mode: fm,
+ Mode: mode,
Name: baseName,
})
}
@@ -237,27 +230,6 @@ func (t *Tree) Decode(o plumbing.EncodedObject) (err error) {
return nil
}
-func (t *Tree) decodeFileMode(mode string) (os.FileMode, error) {
- fm, err := strconv.ParseInt(mode, 8, 32)
- if err != nil && err != io.EOF {
- return 0, err
- }
-
- m := os.FileMode(fm)
- switch os.FileMode(fm) {
- case FileMode:
- m = 0644
- case ExecutableMode:
- m = 0755
- case TreeMode:
- m = m | os.ModeDir
- case SymlinkMode:
- m = m | os.ModeSymlink
- }
-
- return m, nil
-}
-
// Encode transforms a Tree into a plumbing.EncodedObject.
func (t *Tree) Encode(o plumbing.EncodedObject) error {
o.SetType(plumbing.TreeObject)
@@ -381,7 +353,7 @@ func (w *TreeWalker) Next() (name string, entry TreeEntry, err error) {
return
}
- if entry.Mode.IsDir() {
+ if entry.Mode == filemode.Dir {
obj, err = GetTree(w.s, entry.Hash)
}
diff --git a/plumbing/object/tree_test.go b/plumbing/object/tree_test.go
index 81fbdec..69c0463 100644
--- a/plumbing/object/tree_test.go
+++ b/plumbing/object/tree_test.go
@@ -2,15 +2,14 @@ package object
import (
"io"
- "os"
-
- fixtures "github.com/src-d/go-git-fixtures"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
+ "srcd.works/go-git.v4/plumbing/storer"
"srcd.works/go-git.v4/storage/filesystem"
+ fixtures "github.com/src-d/go-git-fixtures"
. "gopkg.in/check.v1"
- "srcd.works/go-git.v4/plumbing/storer"
)
type TreeSuite struct {
@@ -31,10 +30,10 @@ func (s *TreeSuite) TestDecode(c *C) {
c.Assert(s.Tree.Entries, HasLen, 8)
c.Assert(s.Tree.Entries[0].Name, Equals, ".gitignore")
c.Assert(s.Tree.Entries[0].Hash.String(), Equals, "32858aad3c383ed1ff0a0f9bdf231d54a00c9e88")
- c.Assert(s.Tree.Entries[0].Mode, Equals, os.FileMode(0644))
+ c.Assert(s.Tree.Entries[0].Mode, Equals, filemode.Regular)
c.Assert(s.Tree.Entries[4].Name, Equals, "go")
c.Assert(s.Tree.Entries[4].Hash.String(), Equals, "a39771a7651f97faf5c72e08224d857fc35133db")
- c.Assert(s.Tree.Entries[4].Mode.String(), Equals, "d---------")
+ c.Assert(s.Tree.Entries[4].Mode, Equals, filemode.Dir)
}
func (s *TreeSuite) TestDecodeNonTree(c *C) {
@@ -164,9 +163,9 @@ func (s *TreeSuite) TestTreeDecodeEncodeIdempotent(c *C) {
trees := []*Tree{
{
Entries: []TreeEntry{
- {"foo", os.FileMode(0), plumbing.NewHash("b029517f6300c2da0f4b651b8642506cd6aaf45d")},
- {"bar", os.FileMode(0), plumbing.NewHash("c029517f6300c2da0f4b651b8642506cd6aaf45d")},
- {"baz", os.FileMode(0), plumbing.NewHash("d029517f6300c2da0f4b651b8642506cd6aaf45d")},
+ {"foo", filemode.Empty, plumbing.NewHash("b029517f6300c2da0f4b651b8642506cd6aaf45d")},
+ {"bar", filemode.Empty, plumbing.NewHash("c029517f6300c2da0f4b651b8642506cd6aaf45d")},
+ {"baz", filemode.Empty, plumbing.NewHash("d029517f6300c2da0f4b651b8642506cd6aaf45d")},
},
},
}
@@ -233,7 +232,7 @@ func (s *TreeSuite) TestTreeWalkerNext(c *C) {
c.Assert(err, IsNil)
c.Assert(name, Equals, e.Path)
c.Assert(entry.Name, Equals, e.Name)
- c.Assert(entry.Mode.String(), Equals, e.Mode)
+ c.Assert(entry.Mode, Equals, e.Mode)
c.Assert(entry.Hash.String(), Equals, e.Hash)
c.Assert(walker.Tree().ID().String(), Equals, e.Tree)
@@ -305,45 +304,47 @@ func (s *TreeSuite) TestTreeWalkerNextSubmodule(c *C) {
}
var treeWalkerExpects = []struct {
- Path, Mode, Name, Hash, Tree string
+ Path string
+ Mode filemode.FileMode
+ Name, Hash, Tree string
}{{
- Path: ".gitignore", Mode: "-rw-r--r--", Name: ".gitignore",
+ Path: ".gitignore", Mode: filemode.Regular, Name: ".gitignore",
Hash: "32858aad3c383ed1ff0a0f9bdf231d54a00c9e88", Tree: "a8d315b2b1c615d43042c3a62402b8a54288cf5c",
}, {
- Path: "CHANGELOG", Mode: "-rw-r--r--", Name: "CHANGELOG",
+ Path: "CHANGELOG", Mode: filemode.Regular, Name: "CHANGELOG",
Hash: "d3ff53e0564a9f87d8e84b6e28e5060e517008aa", Tree: "a8d315b2b1c615d43042c3a62402b8a54288cf5c",
}, {
- Path: "LICENSE", Mode: "-rw-r--r--", Name: "LICENSE",
+ Path: "LICENSE", Mode: filemode.Regular, Name: "LICENSE",
Hash: "c192bd6a24ea1ab01d78686e417c8bdc7c3d197f", Tree: "a8d315b2b1c615d43042c3a62402b8a54288cf5c",
}, {
- Path: "binary.jpg", Mode: "-rw-r--r--", Name: "binary.jpg",
+ Path: "binary.jpg", Mode: filemode.Regular, Name: "binary.jpg",
Hash: "d5c0f4ab811897cadf03aec358ae60d21f91c50d", Tree: "a8d315b2b1c615d43042c3a62402b8a54288cf5c",
}, {
- Path: "go", Mode: "d---------", Name: "go",
+ Path: "go", Mode: filemode.Dir, Name: "go",
Hash: "a39771a7651f97faf5c72e08224d857fc35133db", Tree: "a8d315b2b1c615d43042c3a62402b8a54288cf5c",
}, {
- Path: "go/example.go", Mode: "-rw-r--r--", Name: "example.go",
+ Path: "go/example.go", Mode: filemode.Regular, Name: "example.go",
Hash: "880cd14280f4b9b6ed3986d6671f907d7cc2a198", Tree: "a39771a7651f97faf5c72e08224d857fc35133db",
}, {
- Path: "json", Mode: "d---------", Name: "json",
+ Path: "json", Mode: filemode.Dir, Name: "json",
Hash: "5a877e6a906a2743ad6e45d99c1793642aaf8eda", Tree: "a8d315b2b1c615d43042c3a62402b8a54288cf5c",
}, {
- Path: "json/long.json", Mode: "-rw-r--r--", Name: "long.json",
+ Path: "json/long.json", Mode: filemode.Regular, Name: "long.json",
Hash: "49c6bb89b17060d7b4deacb7b338fcc6ea2352a9", Tree: "5a877e6a906a2743ad6e45d99c1793642aaf8eda",
}, {
- Path: "json/short.json", Mode: "-rw-r--r--", Name: "short.json",
+ Path: "json/short.json", Mode: filemode.Regular, Name: "short.json",
Hash: "c8f1d8c61f9da76f4cb49fd86322b6e685dba956", Tree: "5a877e6a906a2743ad6e45d99c1793642aaf8eda",
}, {
- Path: "php", Mode: "d---------", Name: "php",
+ Path: "php", Mode: filemode.Dir, Name: "php",
Hash: "586af567d0bb5e771e49bdd9434f5e0fb76d25fa", Tree: "a8d315b2b1c615d43042c3a62402b8a54288cf5c",
}, {
- Path: "php/crappy.php", Mode: "-rw-r--r--", Name: "crappy.php",
+ Path: "php/crappy.php", Mode: filemode.Regular, Name: "crappy.php",
Hash: "9a48f23120e880dfbe41f7c9b7b708e9ee62a492", Tree: "586af567d0bb5e771e49bdd9434f5e0fb76d25fa",
}, {
- Path: "vendor", Mode: "d---------", Name: "vendor",
+ Path: "vendor", Mode: filemode.Dir, Name: "vendor",
Hash: "cf4aa3b38974fb7d81f367c0830f7d78d65ab86b", Tree: "a8d315b2b1c615d43042c3a62402b8a54288cf5c",
}, {
- Path: "vendor/foo.go", Mode: "-rw-r--r--", Name: "foo.go",
+ Path: "vendor/foo.go", Mode: filemode.Regular, Name: "foo.go",
Hash: "9dea2395f5403188298c1dabe8bdafe562c491e3", Tree: "cf4aa3b38974fb7d81f367c0830f7d78d65ab86b",
}}
@@ -925,567 +926,567 @@ func (s *TreeSuite) TestTreeDecodeReadBug(c *C) {
expected := &Tree{
Entries: []TreeEntry{
{
- Name: "alter.c", Mode: 0644,
+ Name: "alter.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xa4, 0x9d, 0x33, 0x49, 0xd7, 0xe2, 0x3f, 0xb5, 0x81, 0x19, 0x4f, 0x4c, 0xb5, 0x9a, 0xc0, 0xd5, 0x1b, 0x2, 0x1f, 0x78},
},
{
- Name: "analyze.c", Mode: 0644,
+ Name: "analyze.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x9a, 0x3e, 0x95, 0x97, 0xdb, 0xb, 0x3, 0x20, 0x77, 0xc9, 0x1d, 0x96, 0x9d, 0x22, 0xc6, 0x27, 0x3f, 0x70, 0x2a, 0xc},
},
{
- Name: "attach.c", Mode: 0644,
+ Name: "attach.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xb8, 0xe1, 0x21, 0x99, 0xb5, 0x7d, 0xe8, 0x11, 0xea, 0xe0, 0xd0, 0x61, 0x42, 0xd5, 0xac, 0x4f, 0xd4, 0x30, 0xb1, 0xd8},
},
{
- Name: "auth.c", Mode: 0644,
+ Name: "auth.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xd3, 0x8b, 0xb8, 0x36, 0xa7, 0x84, 0xfb, 0xfa, 0xb6, 0xab, 0x7b, 0x3, 0xd4, 0xe6, 0xdd, 0x43, 0xed, 0xc4, 0x1f, 0xa7},
},
{
- Name: "backup.c", Mode: 0644,
+ Name: "backup.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x25, 0x2f, 0x61, 0xcf, 0xca, 0xa8, 0xfc, 0xf3, 0x13, 0x7e, 0x8, 0xed, 0x68, 0x47, 0xdc, 0xfe, 0x1d, 0xc1, 0xde, 0x54},
},
{
- Name: "bitvec.c", Mode: 0644,
+ Name: "bitvec.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x52, 0x18, 0x4a, 0xa9, 0x64, 0xce, 0x18, 0x98, 0xf3, 0x5d, 0x1b, 0x3d, 0x87, 0x87, 0x1c, 0x2d, 0xe, 0xf4, 0xc5, 0x3d},
},
{
- Name: "btmutex.c", Mode: 0644,
+ Name: "btmutex.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xd8, 0x7d, 0x4d, 0x5f, 0xee, 0xb6, 0x30, 0x7a, 0xec, 0xdc, 0x9a, 0x83, 0x11, 0x14, 0x89, 0xab, 0x30, 0xc6, 0x78, 0xc3},
},
{
- Name: "btree.c", Mode: 0644,
+ Name: "btree.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x3c, 0xa6, 0x5, 0x83, 0xe3, 0xc8, 0xe3, 0x12, 0x0, 0xf9, 0x73, 0xe0, 0xe9, 0xc4, 0x53, 0x62, 0x58, 0xb2, 0x64, 0x39},
},
{
- Name: "btree.h", Mode: 0644,
+ Name: "btree.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0xac, 0xe0, 0xf8, 0xcd, 0x21, 0x77, 0x70, 0xa2, 0xf6, 0x6b, 0x2e, 0xb8, 0x71, 0xbb, 0xc5, 0xfd, 0xc6, 0xfc, 0x2b, 0x68},
},
{
- Name: "btreeInt.h", Mode: 0644,
+ Name: "btreeInt.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0xce, 0x3c, 0x54, 0x93, 0xf8, 0xca, 0xd0, 0xbc, 0x54, 0x8a, 0xe8, 0xe4, 0x4e, 0x51, 0x28, 0x31, 0xd8, 0xfa, 0xc4, 0x31},
},
{
- Name: "build.c", Mode: 0644,
+ Name: "build.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x3c, 0x91, 0xcd, 0xcf, 0xdb, 0x7b, 0x1, 0x7c, 0xbc, 0x2d, 0x5c, 0x29, 0x57, 0x1a, 0x98, 0x27, 0xd, 0xe0, 0x71, 0xe6},
},
{
- Name: "callback.c", Mode: 0644,
+ Name: "callback.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xd4, 0xc, 0x65, 0xcb, 0x92, 0x45, 0x80, 0x29, 0x6a, 0xd0, 0x69, 0xa0, 0x4b, 0xf9, 0xc9, 0xe9, 0x53, 0x4e, 0xca, 0xa7},
},
{
- Name: "complete.c", Mode: 0644,
+ Name: "complete.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x9e, 0x91, 0x40, 0x8, 0x5c, 0x0, 0x46, 0xed, 0x3b, 0xf6, 0xf4, 0x48, 0x52, 0x20, 0x69, 0x2d, 0xca, 0x17, 0x43, 0xc5},
},
{
- Name: "crypto.c", Mode: 0644,
+ Name: "crypto.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x25, 0x51, 0xe6, 0xba, 0x2, 0x39, 0xf8, 0x5a, 0x35, 0x77, 0x96, 0xa8, 0xdd, 0xa8, 0xca, 0x3e, 0x29, 0x70, 0x93, 0xf8},
},
{
- Name: "crypto.h", Mode: 0644,
+ Name: "crypto.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0xf7, 0x1f, 0x53, 0x2c, 0xdc, 0x44, 0x8f, 0xa, 0x1d, 0xd5, 0xc6, 0xef, 0xf5, 0xfb, 0xd3, 0x3a, 0x91, 0x55, 0xaa, 0x97},
},
{
- Name: "crypto_cc.c", Mode: 0644,
+ Name: "crypto_cc.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x53, 0x7d, 0xf7, 0xe3, 0xb3, 0x6a, 0xb5, 0xcf, 0xdd, 0x6f, 0xca, 0x40, 0x28, 0xeb, 0xca, 0xe1, 0x86, 0x87, 0xd6, 0x4d},
},
{
- Name: "crypto_impl.c", Mode: 0644,
+ Name: "crypto_impl.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xa5, 0x89, 0x27, 0xc7, 0x6e, 0xf6, 0x20, 0x56, 0x77, 0xbe, 0x5c, 0x1a, 0x8e, 0x80, 0xc9, 0x83, 0x56, 0xb3, 0xa9, 0xd3},
},
{
- Name: "crypto_libtomcrypt.c", Mode: 0644,
+ Name: "crypto_libtomcrypt.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x1a, 0x33, 0x83, 0xe0, 0x1, 0xa7, 0x21, 0x11, 0xc3, 0xf6, 0x61, 0x92, 0x22, 0xb0, 0x65, 0xf4, 0xbd, 0x1, 0xb, 0xe1},
},
{
- Name: "crypto_openssl.c", Mode: 0644,
+ Name: "crypto_openssl.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xd0, 0x19, 0x81, 0x3b, 0x47, 0x6c, 0x52, 0xd0, 0x20, 0xe2, 0xc0, 0xac, 0xd5, 0x24, 0xe9, 0xea, 0x3d, 0xf, 0xb9, 0xfe},
},
{
- Name: "ctime.c", Mode: 0644,
+ Name: "ctime.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x60, 0x59, 0x5f, 0xf8, 0x8d, 0x92, 0xf7, 0x8, 0x26, 0x4, 0xfb, 0xd9, 0xdf, 0x9a, 0xfe, 0xa1, 0x6a, 0xe8, 0x6f, 0xf},
},
{
- Name: "date.c", Mode: 0644,
+ Name: "date.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x75, 0x8d, 0xd7, 0xc8, 0x9b, 0xca, 0x39, 0x37, 0xa9, 0xd, 0x70, 0x6e, 0xa9, 0x82, 0xce, 0x3a, 0xcf, 0x11, 0xd1, 0x83},
},
{
- Name: "delete.c", Mode: 0644,
+ Name: "delete.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x63, 0x4e, 0x11, 0x55, 0x63, 0xae, 0x12, 0xba, 0x65, 0x58, 0xcc, 0xc5, 0x12, 0xae, 0xd6, 0x31, 0xc0, 0x66, 0xba, 0xd8},
},
{
- Name: "expr.c", Mode: 0644,
+ Name: "expr.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x66, 0x3, 0x97, 0xe0, 0x78, 0xae, 0x48, 0xb2, 0xe7, 0x17, 0x5e, 0x33, 0x85, 0x67, 0x78, 0x19, 0x72, 0x2d, 0xdd, 0x6c},
},
{
- Name: "fault.c", Mode: 0644,
+ Name: "fault.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xc3, 0x2, 0x8c, 0x4f, 0x93, 0x6e, 0xdf, 0x96, 0x71, 0x2d, 0xbe, 0x73, 0xa0, 0x76, 0x62, 0xf0, 0xa2, 0x6b, 0x1d, 0xa},
},
{
- Name: "fkey.c", Mode: 0644,
+ Name: "fkey.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xac, 0x35, 0xbc, 0x19, 0x4c, 0xde, 0xb1, 0x27, 0x98, 0x9b, 0x9, 0x40, 0x35, 0xce, 0xe0, 0x6f, 0x57, 0x37, 0x6f, 0x5e},
},
{
- Name: "func.c", Mode: 0644,
+ Name: "func.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xc0, 0x2f, 0x9, 0x6a, 0xda, 0xd5, 0xbc, 0xe9, 0xac, 0x83, 0xd3, 0x5f, 0xf, 0x46, 0x9, 0xd6, 0xf6, 0xd4, 0x3b, 0xe5},
},
{
- Name: "global.c", Mode: 0644,
+ Name: "global.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x7b, 0x2, 0xcf, 0x21, 0x30, 0xe0, 0xd1, 0xa7, 0xb8, 0x89, 0xd8, 0x44, 0xc, 0xcc, 0x82, 0x8, 0xf7, 0xb6, 0x7b, 0xf9},
},
{
- Name: "hash.c", Mode: 0644,
+ Name: "hash.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xe8, 0x1d, 0xcf, 0x95, 0xe4, 0x38, 0x48, 0xfa, 0x70, 0x86, 0xb7, 0xf7, 0x81, 0xc0, 0x90, 0xad, 0xc7, 0xe6, 0xca, 0x8e},
},
{
- Name: "hash.h", Mode: 0644,
+ Name: "hash.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x82, 0xb7, 0xc5, 0x8c, 0x71, 0x9, 0xb, 0x54, 0x7e, 0x10, 0x17, 0x42, 0xaa, 0x9, 0x51, 0x73, 0x9f, 0xf2, 0xee, 0xe7},
},
{
- Name: "hwtime.h", Mode: 0644,
+ Name: "hwtime.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0xb8, 0xbc, 0x5a, 0x29, 0x5b, 0xe3, 0xfa, 0xc8, 0x35, 0x1f, 0xa9, 0xf0, 0x8a, 0x77, 0x57, 0x9d, 0x59, 0xc9, 0xa8, 0xe4},
},
{
- Name: "insert.c", Mode: 0644,
+ Name: "insert.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x9a, 0x56, 0x61, 0xf5, 0x9a, 0x72, 0x95, 0x2b, 0xe6, 0xc1, 0x67, 0xa0, 0xc2, 0xdb, 0x15, 0x9b, 0x91, 0xb7, 0x1f, 0xae},
},
{
- Name: "journal.c", Mode: 0644,
+ Name: "journal.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xfe, 0xd2, 0x7b, 0xe3, 0xe3, 0x80, 0x55, 0xd2, 0x20, 0x43, 0x95, 0xcd, 0xe6, 0xff, 0xc9, 0x45, 0x89, 0xfb, 0xf5, 0xe8},
},
{
- Name: "legacy.c", Mode: 0644,
+ Name: "legacy.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x94, 0x64, 0x9a, 0xe7, 0x5, 0xab, 0x93, 0x85, 0x10, 0x8d, 0xd, 0x88, 0x7a, 0xf0, 0x75, 0x92, 0x89, 0xfb, 0x23, 0xcb},
},
{
- Name: "lempar.c", Mode: 0644,
+ Name: "lempar.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x2a, 0xfa, 0xa6, 0xce, 0xa6, 0xd8, 0x29, 0x60, 0x2c, 0x27, 0x86, 0xc1, 0xf8, 0xa3, 0x7f, 0x56, 0x7c, 0xf6, 0xfd, 0x53},
},
{
- Name: "loadext.c", Mode: 0644,
+ Name: "loadext.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xcd, 0xcf, 0x6a, 0x93, 0xb8, 0xc4, 0xf, 0x91, 0x4b, 0x94, 0x24, 0xe, 0xf1, 0x4c, 0xb4, 0xa3, 0xa, 0x37, 0xec, 0xa1},
},
{
- Name: "main.c", Mode: 0644,
+ Name: "main.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x39, 0xf6, 0x4, 0x21, 0xe6, 0x81, 0x27, 0x7c, 0xc3, 0xdb, 0xa0, 0x9a, 0xbe, 0x7c, 0xf7, 0x90, 0xd5, 0x28, 0xf5, 0xc3},
},
{
- Name: "malloc.c", Mode: 0644,
+ Name: "malloc.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x35, 0xa4, 0x4e, 0x5f, 0x61, 0xc2, 0xe4, 0x4c, 0x48, 0x1c, 0x62, 0x51, 0xbd, 0xa, 0xae, 0x7a, 0xcd, 0xa4, 0xde, 0xb},
},
{
- Name: "mem0.c", Mode: 0644,
+ Name: "mem0.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xd, 0xb, 0x66, 0x67, 0xd6, 0xa, 0x95, 0x5a, 0x6, 0x96, 0xdf, 0x62, 0x89, 0xb4, 0x91, 0x78, 0x96, 0x93, 0x43, 0xaa},
},
{
- Name: "mem1.c", Mode: 0644,
+ Name: "mem1.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x35, 0x78, 0x49, 0x6f, 0x33, 0x3, 0x7, 0xb2, 0x31, 0xdf, 0xb5, 0x3c, 0xc, 0x2e, 0x1c, 0x6b, 0x32, 0x3d, 0x79, 0x1e},
},
{
- Name: "mem2.c", Mode: 0644,
+ Name: "mem2.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x26, 0x44, 0x8e, 0xa8, 0xaa, 0xe0, 0x36, 0x6a, 0xf0, 0x54, 0x1a, 0xfe, 0xa4, 0x79, 0xb, 0x42, 0xf4, 0xa6, 0x9b, 0x5a},
},
{
- Name: "mem3.c", Mode: 0644,
+ Name: "mem3.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x1a, 0x1b, 0x79, 0x1f, 0x28, 0xf8, 0xcf, 0x3c, 0xe4, 0xf9, 0xa3, 0x5c, 0xda, 0xd7, 0xb7, 0x10, 0x75, 0x68, 0xc7, 0x15},
},
{
- Name: "mem5.c", Mode: 0644,
+ Name: "mem5.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x78, 0x3c, 0xef, 0x61, 0x76, 0xc5, 0x9c, 0xbf, 0x30, 0x91, 0x46, 0x31, 0x9, 0x5a, 0x1a, 0x54, 0xf4, 0xe4, 0x2e, 0x8},
},
{
- Name: "memjournal.c", Mode: 0644,
+ Name: "memjournal.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x5, 0x72, 0x59, 0x48, 0xf6, 0x5d, 0x42, 0x7b, 0x7, 0xf7, 0xf9, 0x29, 0xac, 0xa3, 0xff, 0x22, 0x4b, 0x17, 0x53, 0xdf},
},
{
- Name: "mutex.c", Mode: 0644,
+ Name: "mutex.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xb5, 0x67, 0xe7, 0xc2, 0x7e, 0xf2, 0x4, 0x10, 0x86, 0xaf, 0xe0, 0xf6, 0x96, 0x66, 0xe2, 0x7b, 0xf5, 0x9, 0x8a, 0x59},
},
{
- Name: "mutex.h", Mode: 0644,
+ Name: "mutex.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x9, 0x78, 0x81, 0x22, 0x52, 0x77, 0x89, 0xa, 0x9c, 0x36, 0xc2, 0x4d, 0x41, 0xf6, 0x11, 0x4d, 0x64, 0xc0, 0x6d, 0xb3},
},
{
- Name: "mutex_noop.c", Mode: 0644,
+ Name: "mutex_noop.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x45, 0x6e, 0x82, 0xa2, 0x5e, 0x27, 0x1b, 0x6, 0x14, 0xe7, 0xf4, 0xf8, 0x3c, 0x22, 0x85, 0x53, 0xb7, 0xfa, 0x1, 0x58},
},
{
- Name: "mutex_unix.c", Mode: 0644,
+ Name: "mutex_unix.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xec, 0xa7, 0x29, 0x58, 0x31, 0xc2, 0xf0, 0xee, 0x48, 0xba, 0x54, 0xd0, 0x62, 0x91, 0x4d, 0x6, 0xa1, 0xdd, 0x8e, 0xbe},
},
{
- Name: "mutex_w32.c", Mode: 0644,
+ Name: "mutex_w32.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x27, 0xd1, 0xa, 0xf5, 0xbd, 0x33, 0x1b, 0xdb, 0x97, 0x3f, 0x61, 0x45, 0xb7, 0x4f, 0x72, 0xb6, 0x7, 0xcf, 0xc4, 0x6e},
},
{
- Name: "notify.c", Mode: 0644,
+ Name: "notify.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xfc, 0xab, 0x5b, 0xfa, 0xf0, 0x19, 0x8, 0xd3, 0xde, 0x93, 0xfa, 0x88, 0xb5, 0xea, 0xe9, 0xe9, 0x6c, 0xa3, 0xc8, 0xe8},
},
{
- Name: "os.c", Mode: 0644,
+ Name: "os.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xbe, 0x2e, 0xa4, 0xcf, 0xc0, 0x19, 0x59, 0x93, 0xa3, 0x40, 0xc9, 0x2, 0xae, 0xdd, 0xf1, 0xbe, 0x4b, 0x8e, 0xd7, 0x3a},
},
{
- Name: "os.h", Mode: 0644,
+ Name: "os.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x7, 0xa, 0x2d, 0xdd, 0x17, 0xf7, 0x71, 0xf9, 0x8f, 0xf8, 0xcc, 0xd6, 0xf0, 0x33, 0xbd, 0xac, 0xc5, 0xe9, 0xf6, 0xc},
},
{
- Name: "os_common.h", Mode: 0644,
+ Name: "os_common.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0xf6, 0xc3, 0xe7, 0xff, 0x89, 0x46, 0x30, 0x86, 0x40, 0x18, 0x22, 0xf4, 0x81, 0xe7, 0xe3, 0xb8, 0x7b, 0x2c, 0x78, 0xc7},
},
{
- Name: "os_unix.c", Mode: 0644,
+ Name: "os_unix.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xab, 0xc2, 0x3a, 0x45, 0x2e, 0x72, 0xf7, 0x1c, 0x76, 0xaf, 0xa9, 0x98, 0x3c, 0x3a, 0xd9, 0xd4, 0x25, 0x61, 0x6c, 0x6d},
},
{
- Name: "os_win.c", Mode: 0644,
+ Name: "os_win.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xae, 0xb0, 0x88, 0x14, 0xb3, 0xda, 0xbe, 0x81, 0xb8, 0x4c, 0xda, 0x91, 0x85, 0x82, 0xb0, 0xf, 0xfd, 0x86, 0xe4, 0x87},
},
{
- Name: "pager.c", Mode: 0644,
+ Name: "pager.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x61, 0x72, 0x7f, 0xaa, 0x9c, 0xf, 0x3d, 0x56, 0x62, 0x65, 0xbe, 0x7e, 0xec, 0x5b, 0x2a, 0x35, 0xf6, 0xa4, 0xbc, 0x9f},
},
{
- Name: "pager.h", Mode: 0644,
+ Name: "pager.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x6f, 0x65, 0x91, 0x36, 0xe2, 0x76, 0x7, 0x9d, 0xa4, 0x3a, 0x2e, 0x39, 0xe1, 0xb6, 0x86, 0x37, 0xec, 0xad, 0xcf, 0x68},
},
{
- Name: "parse.y", Mode: 0644,
+ Name: "parse.y", Mode: filemode.Regular,
Hash: plumbing.Hash{0x83, 0x10, 0xb2, 0x69, 0x89, 0xb0, 0x5b, 0xed, 0x1e, 0x1b, 0x3, 0xda, 0x80, 0xf5, 0xc0, 0xa5, 0x2e, 0x9a, 0xd1, 0xd2},
},
{
- Name: "pcache.c", Mode: 0644,
+ Name: "pcache.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x48, 0x2a, 0x18, 0x8b, 0xee, 0x19, 0x91, 0xbc, 0x8a, 0xda, 0xc9, 0x6a, 0x19, 0x3a, 0x53, 0xe5, 0x46, 0x2a, 0x8c, 0x10},
},
{
- Name: "pcache.h", Mode: 0644,
+ Name: "pcache.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0xf4, 0xd4, 0xad, 0x71, 0xc1, 0xd, 0x78, 0xc6, 0xda, 0xbd, 0xe2, 0x52, 0x15, 0xcd, 0x41, 0x5a, 0x76, 0x1, 0x48, 0xca},
},
{
- Name: "pcache1.c", Mode: 0644,
+ Name: "pcache1.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x41, 0x47, 0xd2, 0xef, 0xf5, 0x5b, 0xdd, 0x9f, 0xf7, 0xc6, 0x86, 0xc, 0x60, 0x18, 0x10, 0x20, 0x16, 0x6c, 0x5f, 0x50},
},
{
- Name: "pragma.c", Mode: 0644,
+ Name: "pragma.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x22, 0x97, 0x71, 0x69, 0x61, 0x7d, 0x49, 0x22, 0xb3, 0x99, 0x3f, 0x76, 0x9d, 0x90, 0xfa, 0x7b, 0xc4, 0x41, 0xea, 0x50},
},
{
- Name: "prepare.c", Mode: 0644,
+ Name: "prepare.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xd7, 0x8d, 0x83, 0xcb, 0xd8, 0x78, 0x97, 0xf5, 0x73, 0x30, 0x3f, 0x9f, 0x57, 0xab, 0x8d, 0xe0, 0x24, 0xa6, 0xe3, 0xf8},
},
{
- Name: "printf.c", Mode: 0644,
+ Name: "printf.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x9f, 0x68, 0xd2, 0x4, 0xff, 0xdc, 0x9f, 0x3d, 0x42, 0x7f, 0x80, 0xa8, 0x23, 0x9a, 0x7f, 0xa3, 0xa9, 0x8a, 0xec, 0xbd},
},
{
- Name: "random.c", Mode: 0644,
+ Name: "random.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x23, 0x4e, 0xbd, 0xf6, 0x58, 0xf4, 0x36, 0xcc, 0x7c, 0x68, 0xf0, 0x27, 0xc4, 0x8b, 0xe, 0x1b, 0x9b, 0xa3, 0x4e, 0x98},
},
{
- Name: "resolve.c", Mode: 0644,
+ Name: "resolve.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x91, 0xef, 0xca, 0xa1, 0xa1, 0x6b, 0xfc, 0x98, 0xfb, 0x35, 0xd8, 0x5c, 0xad, 0x15, 0x6b, 0x93, 0x53, 0x3e, 0x4e, 0x6},
},
{
- Name: "rowset.c", Mode: 0644,
+ Name: "rowset.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x57, 0x61, 0xf9, 0x85, 0x50, 0xb1, 0x76, 0xcc, 0xe1, 0x1d, 0xcb, 0xce, 0xc9, 0x38, 0x99, 0xa0, 0x75, 0xbb, 0x64, 0xfd},
},
{
- Name: "select.c", Mode: 0644,
+ Name: "select.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xf3, 0xf1, 0x49, 0x9, 0x63, 0x95, 0x5b, 0x8e, 0xd0, 0xc9, 0xfe, 0x6e, 0x1e, 0xec, 0x83, 0x6c, 0x1a, 0x52, 0x94, 0xb4},
},
{
- Name: "shell.c", Mode: 0644,
+ Name: "shell.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x1b, 0xe2, 0x87, 0x1f, 0xed, 0x9a, 0x1f, 0xdf, 0x1d, 0xf7, 0x19, 0x8e, 0x11, 0x25, 0x36, 0x0, 0xec, 0xba, 0x76, 0xcc},
},
{
- Name: "sqlcipher.h", Mode: 0644,
+ Name: "sqlcipher.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x82, 0x75, 0x30, 0x95, 0xcd, 0x17, 0x23, 0xc5, 0xff, 0x4f, 0x11, 0x15, 0xe4, 0x97, 0x55, 0x91, 0xee, 0x34, 0xf5, 0xce},
},
{
- Name: "sqlite.h.in", Mode: 0644,
+ Name: "sqlite.h.in", Mode: filemode.Regular,
Hash: plumbing.Hash{0x66, 0x8, 0x82, 0x31, 0x75, 0xde, 0x5b, 0x6a, 0xd, 0x37, 0x8f, 0xdb, 0xc, 0x38, 0x18, 0xb6, 0xab, 0x4f, 0xbf, 0x8e},
},
{
- Name: "sqlite3.rc", Mode: 0644,
+ Name: "sqlite3.rc", Mode: filemode.Regular,
Hash: plumbing.Hash{0x96, 0x98, 0x76, 0xda, 0x1e, 0x57, 0x14, 0x3d, 0xe0, 0xb4, 0xd1, 0xc7, 0x62, 0x9f, 0xd3, 0x35, 0x6f, 0x2e, 0x1c, 0x96},
},
{
- Name: "sqlite3ext.h", Mode: 0644,
+ Name: "sqlite3ext.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x92, 0x8b, 0xb3, 0xba, 0xd9, 0xdd, 0x64, 0x3c, 0x30, 0x1d, 0xd2, 0xb0, 0xac, 0x22, 0x28, 0x7a, 0x81, 0x28, 0x48, 0x84},
},
{
- Name: "sqliteInt.h", Mode: 0644,
+ Name: "sqliteInt.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x59, 0x50, 0xf2, 0x37, 0xd9, 0xf9, 0xf2, 0xd3, 0xef, 0x6b, 0xd8, 0xbe, 0x34, 0x2d, 0xcf, 0x64, 0x89, 0x22, 0x51, 0x42},
},
{
- Name: "sqliteLimit.h", Mode: 0644,
+ Name: "sqliteLimit.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0xc7, 0xae, 0xe5, 0x3c, 0xeb, 0xca, 0x94, 0xda, 0x51, 0xe7, 0x1a, 0x82, 0x2e, 0xa5, 0xa6, 0xde, 0xb9, 0x3, 0x85, 0xdf},
},
{
- Name: "status.c", Mode: 0644,
+ Name: "status.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x28, 0x34, 0x9e, 0x6d, 0x3d, 0x20, 0x88, 0xe0, 0x0, 0x3b, 0x76, 0xf8, 0xa, 0x89, 0x54, 0xfa, 0xec, 0x59, 0x30, 0xba},
},
{
- Name: "table.c", Mode: 0644,
+ Name: "table.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x26, 0xbb, 0xfb, 0x4f, 0x45, 0x6c, 0x42, 0x98, 0x25, 0x29, 0xea, 0x1a, 0x63, 0xa0, 0x17, 0x51, 0xdd, 0x3e, 0xe9, 0x5a},
},
{
- Name: "tclsqlite.c", Mode: 0644,
+ Name: "tclsqlite.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xf1, 0xbb, 0x29, 0x21, 0xda, 0xc, 0x68, 0xa4, 0xf1, 0xc8, 0xe1, 0x5c, 0xf5, 0x66, 0xb2, 0x33, 0xe9, 0x2a, 0x51, 0x9f},
},
{
- Name: "test1.c", Mode: 0644,
+ Name: "test1.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xa6, 0x38, 0xe4, 0x80, 0xad, 0xdf, 0x14, 0x43, 0x9c, 0xdf, 0xa4, 0xee, 0x16, 0x4d, 0xc3, 0x1b, 0x79, 0xf8, 0xbc, 0xac},
},
{
- Name: "test2.c", Mode: 0644,
+ Name: "test2.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xd1, 0x30, 0xe9, 0xd0, 0x1b, 0x70, 0x24, 0xa5, 0xec, 0x6d, 0x73, 0x5, 0x92, 0xee, 0x4d, 0x1f, 0xb0, 0x2c, 0xfd, 0xb4},
},
{
- Name: "test3.c", Mode: 0644,
+ Name: "test3.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xe3, 0xed, 0x31, 0xc, 0x81, 0x4, 0xfe, 0x36, 0x21, 0xce, 0xbb, 0xf, 0x51, 0xd1, 0x1, 0x45, 0x1, 0x8d, 0x4f, 0xac},
},
{
- Name: "test4.c", Mode: 0644,
+ Name: "test4.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xa6, 0x37, 0x5c, 0x7c, 0xc4, 0x3, 0xf6, 0xc, 0xaa, 0xb7, 0xe9, 0x59, 0x53, 0x3e, 0x3d, 0xb1, 0xff, 0x75, 0xa, 0xe4},
},
{
- Name: "test5.c", Mode: 0644,
+ Name: "test5.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x30, 0x3d, 0x12, 0x5, 0xb2, 0x26, 0x28, 0x42, 0x3d, 0x98, 0x6f, 0x71, 0xe2, 0x7c, 0x7c, 0xf7, 0x14, 0xa7, 0x45, 0xa6},
},
{
- Name: "test6.c", Mode: 0644,
+ Name: "test6.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xc1, 0x51, 0xea, 0x42, 0x98, 0x9b, 0xb, 0xe2, 0x4e, 0xe4, 0xb9, 0xa4, 0xbe, 0x37, 0x8b, 0x4f, 0x63, 0x6d, 0xb6, 0x41},
},
{
- Name: "test7.c", Mode: 0644,
+ Name: "test7.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x3c, 0xd4, 0xa2, 0x24, 0xd7, 0xe8, 0xe1, 0x6b, 0xd7, 0xcb, 0xe4, 0x9e, 0x2d, 0x3e, 0x94, 0xce, 0x9b, 0x17, 0xbd, 0x76},
},
{
- Name: "test8.c", Mode: 0644,
+ Name: "test8.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xc5, 0x73, 0x93, 0x32, 0xd4, 0x6e, 0x57, 0x12, 0x1d, 0xa2, 0x7c, 0x3e, 0x88, 0xfd, 0xe7, 0x5a, 0xeb, 0x87, 0x10, 0xf7},
},
{
- Name: "test9.c", Mode: 0644,
+ Name: "test9.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xe5, 0x99, 0x3e, 0x8f, 0xf7, 0x8f, 0x61, 0xc2, 0x43, 0x5b, 0x6f, 0x97, 0xa3, 0xb4, 0x63, 0xe2, 0x27, 0xc7, 0x67, 0xac},
},
{
- Name: "test_async.c", Mode: 0644,
+ Name: "test_async.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xb0, 0xb9, 0x43, 0x18, 0x5b, 0xfc, 0x23, 0xc1, 0x7f, 0xd0, 0x8f, 0x55, 0x76, 0x8c, 0xac, 0x12, 0xa9, 0xf5, 0x69, 0x51},
},
{
- Name: "test_autoext.c", Mode: 0644,
+ Name: "test_autoext.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xb5, 0x1, 0x3f, 0x31, 0x73, 0xa2, 0x17, 0x6e, 0x2d, 0x9f, 0xc, 0xaa, 0x99, 0x19, 0x30, 0x36, 0xbf, 0xc3, 0x7e, 0x91},
},
{
- Name: "test_backup.c", Mode: 0644,
+ Name: "test_backup.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xe9, 0x67, 0x42, 0x4a, 0x29, 0xf, 0x73, 0x8a, 0xec, 0xfd, 0xac, 0x57, 0x8e, 0x9b, 0x87, 0xa4, 0xc4, 0xae, 0x8d, 0x7f},
},
{
- Name: "test_btree.c", Mode: 0644,
+ Name: "test_btree.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xdb, 0x72, 0x88, 0x9b, 0x2a, 0xfb, 0x62, 0x72, 0x82, 0x8d, 0xda, 0x86, 0x6d, 0xcc, 0xf1, 0x22, 0xa4, 0x9a, 0x72, 0x99},
},
{
- Name: "test_config.c", Mode: 0644,
+ Name: "test_config.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x53, 0x47, 0x27, 0xa0, 0x80, 0x42, 0xb6, 0xca, 0xd6, 0x7e, 0x26, 0x7e, 0x87, 0xb4, 0x3, 0xa4, 0x1a, 0x73, 0xb2, 0x99},
},
{
- Name: "test_demovfs.c", Mode: 0644,
+ Name: "test_demovfs.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x63, 0x76, 0x27, 0x7, 0x1d, 0x9e, 0x28, 0xf4, 0xb3, 0x45, 0x1b, 0xbb, 0xdd, 0xf8, 0x8, 0xd1, 0xa9, 0x12, 0x0, 0xf8},
},
{
- Name: "test_devsym.c", Mode: 0644,
+ Name: "test_devsym.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x21, 0xf0, 0xf6, 0x84, 0xd8, 0x61, 0x11, 0x67, 0x70, 0xde, 0xfc, 0xde, 0xcd, 0x53, 0x2b, 0xa3, 0xee, 0xab, 0xa9, 0x75},
},
{
- Name: "test_fs.c", Mode: 0644,
+ Name: "test_fs.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x47, 0x8c, 0xad, 0x80, 0xb1, 0x6a, 0x90, 0x9b, 0x23, 0xbd, 0x3, 0xc2, 0xda, 0xd8, 0xb4, 0x49, 0xa7, 0x45, 0x87, 0xa1},
},
{
- Name: "test_func.c", Mode: 0644,
+ Name: "test_func.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x6f, 0x9b, 0xb0, 0x3d, 0xc8, 0x8a, 0x21, 0xd6, 0x58, 0xbf, 0x99, 0x99, 0xba, 0xf6, 0x6d, 0xc1, 0xd5, 0x2e, 0xbc, 0x54},
},
{
- Name: "test_hexio.c", Mode: 0644,
+ Name: "test_hexio.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xb2, 0xb, 0x5c, 0xe7, 0x30, 0xab, 0x7f, 0xa8, 0x0, 0xd2, 0xd0, 0xcc, 0x38, 0xc7, 0x72, 0x75, 0x59, 0x3e, 0xbd, 0xbb},
},
{
- Name: "test_init.c", Mode: 0644,
+ Name: "test_init.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xe3, 0x72, 0x4d, 0x8b, 0xe3, 0x14, 0xdb, 0x9, 0xee, 0xa8, 0x4, 0xb, 0x9d, 0xdf, 0xc8, 0xa8, 0xbe, 0xee, 0x22, 0x91},
},
{
- Name: "test_intarray.c", Mode: 0644,
+ Name: "test_intarray.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xf5, 0xc3, 0xd9, 0xe4, 0x5, 0x9a, 0x16, 0x56, 0x7, 0x34, 0x7, 0xe4, 0x3a, 0x92, 0x11, 0x79, 0x99, 0x69, 0x7b, 0x93},
},
{
- Name: "test_intarray.h", Mode: 0644,
+ Name: "test_intarray.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x69, 0x13, 0x37, 0xd1, 0xae, 0xd6, 0x37, 0x15, 0xd6, 0x2e, 0x76, 0x26, 0x6f, 0xf, 0x3b, 0x50, 0x8b, 0x1, 0xa, 0x34},
},
{
- Name: "test_journal.c", Mode: 0644,
+ Name: "test_journal.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xe8, 0x70, 0x1a, 0x4e, 0xea, 0xdb, 0x8e, 0xad, 0x16, 0x9d, 0x60, 0x6, 0x40, 0x7d, 0x54, 0xa8, 0x98, 0x59, 0x2d, 0x70},
},
{
- Name: "test_loadext.c", Mode: 0644,
+ Name: "test_loadext.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x11, 0x37, 0xe3, 0xa9, 0xaa, 0xe9, 0x29, 0x6, 0xb8, 0x28, 0x9f, 0x6c, 0x3d, 0xaa, 0x61, 0xf0, 0xd0, 0x70, 0xf5, 0x5a},
},
{
- Name: "test_malloc.c", Mode: 0644,
+ Name: "test_malloc.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xcf, 0x98, 0xa8, 0xfb, 0x21, 0x82, 0xc0, 0xba, 0xf5, 0xa, 0xd5, 0x79, 0x79, 0xb6, 0x75, 0xbb, 0x70, 0x7a, 0x93, 0xb0},
},
{
- Name: "test_multiplex.c", Mode: 0644,
+ Name: "test_multiplex.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x62, 0x45, 0x41, 0xb3, 0x2a, 0x10, 0xd2, 0x1a, 0x2f, 0xd1, 0xa, 0x35, 0xee, 0x66, 0x32, 0xbd, 0xac, 0x55, 0x2d, 0x41},
},
{
- Name: "test_multiplex.h", Mode: 0644,
+ Name: "test_multiplex.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0xb7, 0xe1, 0xaf, 0xea, 0x5f, 0xd7, 0x8b, 0x87, 0x58, 0x2, 0x65, 0xf8, 0x4c, 0x81, 0x61, 0x2c, 0xbd, 0x2, 0x5b, 0xaf},
},
{
- Name: "test_mutex.c", Mode: 0644,
+ Name: "test_mutex.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xc9, 0xb4, 0xa2, 0x9a, 0xb7, 0x5c, 0x77, 0xea, 0x5f, 0x36, 0xb5, 0x19, 0x32, 0x56, 0xd7, 0xf, 0xe6, 0x58, 0xe, 0x95},
},
{
- Name: "test_onefile.c", Mode: 0644,
+ Name: "test_onefile.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x69, 0x86, 0x74, 0x41, 0xb8, 0xcc, 0x9a, 0x62, 0x1a, 0xf3, 0x24, 0x13, 0xfc, 0x63, 0xda, 0x80, 0x99, 0x37, 0x64, 0xf4},
},
{
- Name: "test_osinst.c", Mode: 0644,
+ Name: "test_osinst.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x53, 0x14, 0x33, 0x31, 0x3e, 0xe3, 0x6c, 0x7, 0xeb, 0x21, 0xc0, 0x2f, 0x31, 0x15, 0xcb, 0x7a, 0x37, 0x48, 0x6c, 0x79},
},
{
- Name: "test_pcache.c", Mode: 0644,
+ Name: "test_pcache.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x8f, 0xcf, 0xe7, 0xe2, 0x6e, 0x3f, 0xf1, 0x74, 0x96, 0xb8, 0x40, 0xf5, 0xd6, 0x3c, 0x75, 0x78, 0x3a, 0xff, 0x81, 0x62},
},
- {Name: "test_quota.c", Mode: 0644, Hash: plumbing.Hash{
- 0xe5, 0x90, 0x99, 0x6c, 0xa4, 0xb8, 0x57, 0x4a, 0xb1, 0xe4, 0x18, 0x5d, 0x57, 0x77, 0x56, 0x66, 0x4a, 0xd2, 0x49, 0x5f}}, {Name: "test_quota.h", Mode: 0644,
+ {Name: "test_quota.c", Mode: filemode.Regular, Hash: plumbing.Hash{
+ 0xe5, 0x90, 0x99, 0x6c, 0xa4, 0xb8, 0x57, 0x4a, 0xb1, 0xe4, 0x18, 0x5d, 0x57, 0x77, 0x56, 0x66, 0x4a, 0xd2, 0x49, 0x5f}}, {Name: "test_quota.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x2d, 0x7, 0x67, 0xa1, 0x9a, 0xb7, 0xc3, 0xa4, 0x21, 0xcd, 0xba, 0x6a, 0x3, 0x49, 0x20, 0x43, 0x67, 0xc2, 0x2c, 0x81},
},
{
- Name: "test_rtree.c", Mode: 0644,
+ Name: "test_rtree.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xf5, 0x4a, 0xe9, 0xb0, 0x63, 0xbb, 0x73, 0x71, 0x2f, 0xcf, 0xc1, 0xc6, 0x83, 0x2e, 0x2a, 0x50, 0xf6, 0x2a, 0x97, 0xe7},
},
{
- Name: "test_schema.c", Mode: 0644,
+ Name: "test_schema.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x12, 0x64, 0x44, 0x67, 0x64, 0x7d, 0x51, 0x39, 0x4a, 0x1, 0xf9, 0xfa, 0x60, 0x37, 0x62, 0x98, 0x18, 0x54, 0x66, 0xfd},
},
{
- Name: "test_server.c", Mode: 0644,
+ Name: "test_server.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xed, 0x8, 0x18, 0xe6, 0xf6, 0x5f, 0x27, 0x28, 0x2d, 0xc7, 0xb1, 0xc1, 0x90, 0xec, 0x18, 0x8c, 0x89, 0x33, 0x0, 0x2b},
},
{
- Name: "test_sqllog.c", Mode: 0644,
+ Name: "test_sqllog.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x4a, 0xa6, 0x8b, 0x7c, 0x42, 0x93, 0x23, 0xb8, 0xee, 0xbe, 0x6c, 0x9c, 0x2d, 0x7, 0xfc, 0x66, 0xd, 0x8d, 0x47, 0xc9},
},
{
- Name: "test_stat.c", Mode: 0644,
+ Name: "test_stat.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xd4, 0xc9, 0x2, 0xb5, 0xea, 0x11, 0x1a, 0xd5, 0x8a, 0x73, 0x71, 0x12, 0xc2, 0x8f, 0x0, 0x38, 0x43, 0x4c, 0x85, 0xc0},
},
{
- Name: "test_superlock.c", Mode: 0644,
+ Name: "test_superlock.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x93, 0x6f, 0xca, 0xd0, 0xc5, 0x6f, 0x6b, 0xc8, 0x58, 0x9, 0x74, 0x2f, 0x6a, 0xe1, 0xc1, 0xee, 0xb8, 0xb7, 0xd2, 0xf1},
},
{
- Name: "test_syscall.c", Mode: 0644,
+ Name: "test_syscall.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x7c, 0x8, 0x73, 0xc1, 0x6d, 0x84, 0x32, 0x2, 0xf3, 0xe, 0x2d, 0xb9, 0x45, 0x9f, 0xa2, 0x99, 0x75, 0xea, 0x5e, 0x68},
},
{
- Name: "test_tclvar.c", Mode: 0644,
+ Name: "test_tclvar.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x12, 0x19, 0x19, 0xc, 0x3, 0x0, 0xfd, 0x5e, 0xc7, 0xa3, 0xc5, 0x84, 0x8, 0xf3, 0x38, 0x43, 0xd2, 0xe, 0xee, 0x15},
},
{
- Name: "test_thread.c", Mode: 0644,
+ Name: "test_thread.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x2f, 0x93, 0x63, 0xb7, 0x50, 0x1e, 0x51, 0x19, 0x81, 0xfe, 0x32, 0x83, 0x1f, 0xf2, 0xe8, 0xfd, 0x2f, 0x30, 0xc4, 0x93},
},
{
- Name: "test_vfs.c", Mode: 0644,
+ Name: "test_vfs.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xfc, 0xd5, 0x77, 0x43, 0x9c, 0xfd, 0x6c, 0x72, 0xdd, 0xe4, 0x83, 0x58, 0x92, 0x14, 0x20, 0xcf, 0x6e, 0xf1, 0xf8, 0x6d},
},
{
- Name: "test_vfstrace.c", Mode: 0644,
+ Name: "test_vfstrace.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xa, 0xac, 0xc0, 0x1f, 0xe4, 0x2e, 0x77, 0xfe, 0xb8, 0x58, 0xe4, 0xbe, 0xd0, 0xcb, 0x7e, 0x4, 0xa4, 0x35, 0xb2, 0x10},
},
{
- Name: "test_wsd.c", Mode: 0644,
+ Name: "test_wsd.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x99, 0xe4, 0xa0, 0x56, 0x58, 0x1f, 0x58, 0xf4, 0x53, 0x6f, 0xdb, 0x5a, 0x5d, 0xf7, 0x5c, 0x74, 0x69, 0x8a, 0x81, 0x62},
},
{
- Name: "tokenize.c", Mode: 0644,
+ Name: "tokenize.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xfa, 0xea, 0x5f, 0x26, 0xc7, 0x9c, 0x5e, 0x18, 0x8f, 0xa8, 0x7f, 0x2f, 0xdf, 0x6f, 0xf7, 0x6a, 0x7a, 0x60, 0x6, 0xc5},
},
{
- Name: "trigger.c", Mode: 0644,
+ Name: "trigger.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xf1, 0xff, 0x76, 0x6e, 0x20, 0x2a, 0x45, 0x18, 0xec, 0x10, 0xe5, 0x27, 0x12, 0xc, 0xd3, 0xe, 0x83, 0xfb, 0xd0, 0x34},
},
{
- Name: "update.c", Mode: 0644,
+ Name: "update.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x3a, 0xb1, 0xab, 0x2a, 0x4b, 0x65, 0xda, 0x3f, 0x19, 0x8c, 0x15, 0x84, 0xd5, 0x4d, 0x36, 0xf1, 0x8c, 0xa1, 0x21, 0x4a},
},
{
- Name: "utf.c", Mode: 0644,
+ Name: "utf.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x6d, 0x5b, 0x1b, 0xfe, 0x40, 0xc, 0x37, 0x48, 0xaa, 0x70, 0xa3, 0xb2, 0xfd, 0x5e, 0xe, 0xac, 0x5f, 0xc0, 0x4d, 0xe2},
},
{
- Name: "util.c", Mode: 0644,
+ Name: "util.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xd8, 0x3a, 0x63, 0x1, 0x5f, 0xd8, 0x7d, 0xcc, 0x4f, 0xb4, 0x41, 0x66, 0xfa, 0xbf, 0x2e, 0x9b, 0xc9, 0x67, 0x1e, 0xb8},
},
{
- Name: "vacuum.c", Mode: 0644,
+ Name: "vacuum.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x4a, 0xfb, 0x2c, 0xca, 0x64, 0xdd, 0x60, 0x76, 0x11, 0x22, 0x2c, 0x7, 0x93, 0x2d, 0x12, 0xea, 0xcf, 0xa, 0x2c, 0x22},
},
{
- Name: "vdbe.c", Mode: 0644,
+ Name: "vdbe.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xf3, 0x43, 0xe1, 0x3d, 0x4e, 0x91, 0x78, 0x4b, 0x15, 0x88, 0x10, 0xc5, 0xb7, 0xd4, 0x46, 0x84, 0xdf, 0xbf, 0xa2, 0xa5},
},
{
- Name: "vdbe.h", Mode: 0644,
+ Name: "vdbe.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0xfa, 0x7b, 0x31, 0xb7, 0x27, 0xa, 0x90, 0xd4, 0xf6, 0x37, 0x36, 0x5a, 0xfc, 0xc9, 0xbd, 0xa1, 0xd1, 0xb1, 0xe1, 0xd6},
},
{
- Name: "vdbeInt.h", Mode: 0644,
+ Name: "vdbeInt.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x3a, 0x5b, 0x40, 0x28, 0xbb, 0xd6, 0xc9, 0x56, 0x10, 0xd7, 0xc, 0xce, 0x3, 0x69, 0xdf, 0xcd, 0x60, 0x7a, 0xa9, 0x0},
},
{
- Name: "vdbeapi.c", Mode: 0644,
+ Name: "vdbeapi.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x7c, 0x86, 0x1e, 0x2d, 0x47, 0x21, 0x8c, 0x91, 0x63, 0x31, 0x77, 0x77, 0xc3, 0x7, 0x21, 0x99, 0xe9, 0xb4, 0x2, 0x80},
},
{
- Name: "vdbeaux.c", Mode: 0644,
+ Name: "vdbeaux.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x2c, 0x42, 0x69, 0xa5, 0x9e, 0x6d, 0xbc, 0xe8, 0x67, 0x1c, 0x47, 0x4f, 0x34, 0x61, 0x90, 0xbe, 0x2a, 0xe, 0x18, 0x51},
},
{
- Name: "vdbeblob.c", Mode: 0644,
+ Name: "vdbeblob.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x2e, 0x8f, 0xd8, 0xee, 0x74, 0x47, 0xe6, 0x46, 0x46, 0xe3, 0x49, 0x4b, 0x4c, 0x4, 0x1d, 0x3a, 0x4a, 0xbb, 0x8, 0x85},
},
{
- Name: "vdbemem.c", Mode: 0644,
+ Name: "vdbemem.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x8f, 0xc2, 0x22, 0xe2, 0xde, 0x20, 0x50, 0x14, 0x50, 0xec, 0xea, 0x9d, 0x4e, 0xbf, 0xaa, 0xc9, 0x81, 0x4a, 0xae, 0x59},
},
{
- Name: "vdbesort.c", Mode: 0644,
+ Name: "vdbesort.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xfd, 0xfc, 0x4a, 0x79, 0xdd, 0xc9, 0x6e, 0x59, 0x9b, 0x1b, 0xe, 0xeb, 0xac, 0xbd, 0xb8, 0x45, 0xc6, 0x38, 0x13, 0xb2},
},
{
- Name: "vdbetrace.c", Mode: 0644,
+ Name: "vdbetrace.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x35, 0x62, 0x77, 0xe8, 0xd2, 0x3b, 0xca, 0xdb, 0x67, 0x6b, 0x59, 0xd1, 0xa4, 0xdc, 0xf8, 0x42, 0xfd, 0xc4, 0xc9, 0x72},
},
{
- Name: "vtab.c", Mode: 0644,
+ Name: "vtab.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0x95, 0x82, 0x2, 0xc3, 0x1e, 0x24, 0x15, 0xb, 0x60, 0xf1, 0xa, 0x8a, 0xf, 0x74, 0x41, 0xaf, 0xac, 0x3f, 0xbb, 0x1c},
},
{
- Name: "wal.c", Mode: 0644,
+ Name: "wal.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xe6, 0x42, 0xea, 0x21, 0x5, 0xb5, 0xc5, 0x4a, 0xf3, 0x5, 0x88, 0x9, 0x62, 0x69, 0xab, 0x75, 0xcb, 0xef, 0x8f, 0xf2},
},
{
- Name: "wal.h", Mode: 0644,
+ Name: "wal.h", Mode: filemode.Regular,
Hash: plumbing.Hash{0x9, 0x25, 0x46, 0x35, 0x4b, 0x34, 0xc0, 0xab, 0x3d, 0x20, 0x5, 0x6a, 0x7f, 0x8a, 0x8a, 0x52, 0xe4, 0xd0, 0xb5, 0xf5},
},
{
- Name: "walker.c", Mode: 0644,
+ Name: "walker.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xe7, 0x1e, 0xd2, 0xac, 0x48, 0x4c, 0x91, 0x6c, 0x1c, 0xc1, 0x0, 0x7e, 0x5e, 0x5, 0xda, 0x47, 0x1c, 0xb4, 0x95, 0x99},
},
{
- Name: "where.c", Mode: 0644,
+ Name: "where.c", Mode: filemode.Regular,
Hash: plumbing.Hash{0xe6, 0x14, 0xf4, 0xa6, 0xd8, 0x64, 0xe7, 0xe, 0xc4, 0x32, 0x8d, 0xb, 0xdb, 0x25, 0x4e, 0x3a, 0xc9, 0xf0, 0xd2, 0x87},
},
},
diff --git a/plumbing/object/treenoder.go b/plumbing/object/treenoder.go
index 73d96e2..89fcdb1 100644
--- a/plumbing/object/treenoder.go
+++ b/plumbing/object/treenoder.go
@@ -9,18 +9,17 @@ package object
// to the file contents by the merkletrie difftree algorithm. This is
// consistent with how the "git diff-tree" command works.
import (
- "encoding/binary"
"io"
- "os"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/utils/merkletrie/noder"
)
type treeNoder struct {
parent *Tree // the root node is its own parent
name string // empty string for the root node
- mode os.FileMode
+ mode filemode.FileMode
hash plumbing.Hash
children []noder.Noder // memoized
}
@@ -33,7 +32,7 @@ func newTreeNoder(t *Tree) *treeNoder {
return &treeNoder{
parent: t,
name: "",
- mode: os.ModeDir,
+ mode: filemode.Dir,
hash: t.Hash,
}
}
@@ -47,14 +46,7 @@ func (t *treeNoder) String() string {
}
func (t *treeNoder) Hash() []byte {
- return append(t.hash[:], modeToBytes(t.mode)...)
-}
-
-// mode in little endian (endianess is an arbitrary decission).
-func modeToBytes(m os.FileMode) []byte {
- ret := make([]byte, 4)
- binary.LittleEndian.PutUint32(ret, uint32(m))
- return ret
+ return append(t.hash[:], t.mode.Bytes()...)
}
func (t *treeNoder) Name() string {
@@ -62,13 +54,13 @@ func (t *treeNoder) Name() string {
}
func (t *treeNoder) IsDir() bool {
- return t.mode.IsDir()
+ return t.mode == filemode.Dir
}
// Children will return the children of a treenoder as treenoders,
// building them from the children of the wrapped git tree.
func (t *treeNoder) Children() ([]noder.Noder, error) {
- if !t.mode.IsDir() {
+ if t.mode != filemode.Dir {
return noder.NoChildren, nil
}
diff --git a/utils/binary/read.go b/utils/binary/read.go
index 608583b..7cd6184 100644
--- a/utils/binary/read.go
+++ b/utils/binary/read.go
@@ -27,7 +27,7 @@ func ReadUntil(r io.Reader, delim byte) ([]byte, error) {
var buf [1]byte
value := make([]byte, 0, 16)
for {
- if _, err := r.Read(buf[:]); err != nil {
+ if _, err := io.ReadFull(r, buf[:]); err != nil {
if err == io.EOF {
return nil, err
}
diff --git a/worktree.go b/worktree.go
index 2a4e5d8..36b17b6 100644
--- a/worktree.go
+++ b/worktree.go
@@ -9,6 +9,7 @@ import (
"srcd.works/go-git.v4/config"
"srcd.works/go-git.v4/plumbing"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/plumbing/format/index"
"srcd.works/go-git.v4/plumbing/object"
@@ -65,11 +66,11 @@ func (w *Worktree) Checkout(commit plumbing.Hash) error {
}
func (w *Worktree) checkoutEntry(name string, e *object.TreeEntry, idx *index.Index) error {
- if e.Mode == object.SubmoduleMode {
+ if e.Mode == filemode.Submodule {
return w.addIndexFromTreeEntry(name, e, idx)
}
- if e.Mode.IsDir() {
+ if e.Mode == filemode.Dir {
return nil
}
@@ -86,18 +87,23 @@ func (w *Worktree) checkoutFile(name string, e *object.TreeEntry, idx *index.Ind
if err != nil {
return err
}
-
defer from.Close()
- to, err := w.fs.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, e.Mode.Perm())
+
+ mode, err := e.Mode.ToOSFileMode()
+ if err != nil {
+ return err
+ }
+
+ to, err := w.fs.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, mode.Perm())
if err != nil {
return err
}
+ defer to.Close()
if _, err := io.Copy(to, from); err != nil {
return err
}
- defer to.Close()
return w.addIndexFromFile(name, e, idx)
}
@@ -107,7 +113,7 @@ func (w *Worktree) addIndexFromTreeEntry(name string, f *object.TreeEntry, idx *
idx.Entries = append(idx.Entries, index.Entry{
Hash: f.Hash,
Name: name,
- Mode: object.SubmoduleMode,
+ Mode: filemode.Submodule,
})
return nil
@@ -119,10 +125,15 @@ func (w *Worktree) addIndexFromFile(name string, f *object.TreeEntry, idx *index
return err
}
+ mode, err := filemode.NewFromOSFileMode(fi.Mode())
+ if err != nil {
+ return err
+ }
+
e := index.Entry{
Hash: f.Hash,
Name: name,
- Mode: w.getMode(fi),
+ Mode: mode,
ModifiedAt: fi.ModTime(),
Size: uint32(fi.Size()),
}
@@ -178,7 +189,12 @@ func (w *Worktree) compareFileWithEntry(fi billy.FileInfo, e *index.Entry) (Stat
return Modified, nil
}
- if w.getMode(fi) != e.Mode {
+ mode, err := filemode.NewFromOSFileMode(fi.Mode())
+ if err != nil {
+ return Modified, err
+ }
+
+ if mode != e.Mode {
return Modified, nil
}
@@ -191,23 +207,6 @@ func (w *Worktree) compareFileWithEntry(fi billy.FileInfo, e *index.Entry) (Stat
return Unmodified, nil
}
-func (w *Worktree) getMode(fi billy.FileInfo) os.FileMode {
- if fi.Mode().IsDir() {
- return object.TreeMode
- }
-
- if fi.Mode()&os.ModeSymlink != 0 {
- return object.SymlinkMode
- }
-
- const modeExec = 0111
- if fi.Mode()&modeExec != 0 {
- return object.ExecutableMode
- }
-
- return object.FileMode
-}
-
const gitmodulesFile = ".gitmodules"
// Submodule returns the submodule with the given name
diff --git a/worktree_test.go b/worktree_test.go
index 81d35b1..afc592e 100644
--- a/worktree_test.go
+++ b/worktree_test.go
@@ -4,8 +4,8 @@ import (
"io/ioutil"
"os"
+ "srcd.works/go-git.v4/plumbing/filemode"
"srcd.works/go-git.v4/plumbing/format/index"
- "srcd.works/go-git.v4/plumbing/object"
"github.com/src-d/go-git-fixtures"
. "gopkg.in/check.v1"
@@ -72,7 +72,7 @@ func (s *WorktreeSuite) TestCheckoutIndexmemfs(c *C) {
c.Assert(idx.Entries, HasLen, 9)
c.Assert(idx.Entries[0].Hash.String(), Equals, "32858aad3c383ed1ff0a0f9bdf231d54a00c9e88")
c.Assert(idx.Entries[0].Name, Equals, ".gitignore")
- c.Assert(idx.Entries[0].Mode, Equals, object.FileMode)
+ c.Assert(idx.Entries[0].Mode, Equals, filemode.Regular)
c.Assert(idx.Entries[0].ModifiedAt.IsZero(), Equals, false)
c.Assert(idx.Entries[0].Size, Equals, uint32(189))
@@ -105,7 +105,7 @@ func (s *WorktreeSuite) TestCheckoutIndexOS(c *C) {
c.Assert(idx.Entries, HasLen, 9)
c.Assert(idx.Entries[0].Hash.String(), Equals, "32858aad3c383ed1ff0a0f9bdf231d54a00c9e88")
c.Assert(idx.Entries[0].Name, Equals, ".gitignore")
- c.Assert(idx.Entries[0].Mode, Equals, object.FileMode)
+ c.Assert(idx.Entries[0].Mode, Equals, filemode.Regular)
c.Assert(idx.Entries[0].ModifiedAt.IsZero(), Equals, false)
c.Assert(idx.Entries[0].Size, Equals, uint32(189))