shithub: furgit

ref: ab174c473618dd3743881cf44e02c2db4d1ecd5f
dir: /object/fetch/treefs_info.go/

View raw version
package fetch

import (
	"io/fs"
	"time"

	"codeberg.org/lindenii/furgit/object/tree"
)

type treeFSInfo struct {
	name  string
	mode  fs.FileMode
	size  int64
	sys   any
	isDir bool
}

var (
	_ fs.FileInfo = (*treeFSInfo)(nil)
	_ fs.DirEntry = (*treeFSInfo)(nil)
)

func (info *treeFSInfo) Name() string       { return info.name }
func (info *treeFSInfo) Size() int64        { return info.size }
func (info *treeFSInfo) Mode() fs.FileMode  { return info.mode }
func (info *treeFSInfo) Type() fs.FileMode  { return info.mode.Type() }
func (info *treeFSInfo) IsDir() bool        { return info.isDir }
func (info *treeFSInfo) ModTime() time.Time { return time.Time{} }
func (info *treeFSInfo) Sys() any           { return info.sys }
func (info *treeFSInfo) Info() (fs.FileInfo, error) {
	return info, nil
}

func treeFSEntryMode(mode tree.FileMode) fs.FileMode {
	switch mode {
	case tree.FileModeDir:
		return fs.ModeDir | 0o555
	case tree.FileModeRegular:
		return 0o444
	case tree.FileModeExecutable:
		return 0o555
	case tree.FileModeSymlink:
		return fs.ModeSymlink | 0o444
	case tree.FileModeGitlink:
		return fs.ModeIrregular
	default:
		return fs.ModeIrregular
	}
}

func (treeFS *TreeFS) statEntry(entry treeEntryValue) (*treeFSInfo, error) {
	size := int64(0)

	if entry.mode == tree.FileModeRegular || entry.mode == tree.FileModeExecutable || entry.mode == tree.FileModeSymlink {
		var err error

		size, err = entry.blobSize(treeFS.fetcher)
		if err != nil {
			return nil, err
		}
	}

	var sys any
	if entry.treeEntry != nil {
		sys = *entry.treeEntry
	}

	return &treeFSInfo{
		name:  entry.name,
		mode:  treeFSEntryMode(entry.mode),
		size:  size,
		sys:   sys,
		isDir: entry.isDir(),
	}, nil
}