Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

types: add backwards compat layer to filemode handling

older knots return a full modestring for each file. use some primitive
parsing to extract a filemode in these scenarios.

Signed-off-by: oppiliappan <me@oppi.li>

authored by

oppiliappan and committed by
Tangled
a17d65a1 fb667186

+61 -1
+61 -1
types/tree.go
··· 1 1 package types 2 2 3 3 import ( 4 + "fmt" 5 + "os" 4 6 "time" 5 7 6 8 "github.com/go-git/go-git/v5/plumbing" ··· 20 18 } 21 19 22 20 func (t *NiceTree) FileMode() (filemode.FileMode, error) { 23 - return filemode.New(t.Mode) 21 + if numericMode, err := filemode.New(t.Mode); err == nil { 22 + return numericMode, nil 23 + } 24 + 25 + // TODO: this is here for backwards compat, can be removed in future versions 26 + osMode, err := parseModeString(t.Mode) 27 + if err != nil { 28 + return filemode.Empty, nil 29 + } 30 + 31 + conv, err := filemode.NewFromOSFileMode(osMode) 32 + if err != nil { 33 + return filemode.Empty, nil 34 + } 35 + 36 + return conv, nil 37 + } 38 + 39 + // ParseFileModeString parses a file mode string like "-rw-r--r--" 40 + // and returns an os.FileMode 41 + func parseModeString(modeStr string) (os.FileMode, error) { 42 + if len(modeStr) != 10 { 43 + return 0, fmt.Errorf("invalid mode string length: expected 10, got %d", len(modeStr)) 44 + } 45 + 46 + var mode os.FileMode 47 + 48 + // Parse file type (first character) 49 + switch modeStr[0] { 50 + case 'd': 51 + mode |= os.ModeDir 52 + case 'l': 53 + mode |= os.ModeSymlink 54 + case '-': 55 + // regular file 56 + default: 57 + return 0, fmt.Errorf("unknown file type: %c", modeStr[0]) 58 + } 59 + 60 + // parse permissions for owner, group, and other 61 + perms := modeStr[1:] 62 + shifts := []int{6, 3, 0} // bit shifts for owner, group, other 63 + 64 + for i := range 3 { 65 + offset := i * 3 66 + shift := shifts[i] 67 + 68 + if perms[offset] == 'r' { 69 + mode |= os.FileMode(4 << shift) 70 + } 71 + if perms[offset+1] == 'w' { 72 + mode |= os.FileMode(2 << shift) 73 + } 74 + if perms[offset+2] == 'x' { 75 + mode |= os.FileMode(1 << shift) 76 + } 77 + } 78 + 79 + return mode, nil 24 80 } 25 81 26 82 func (t *NiceTree) IsFile() bool {