v1.11.0
ADDED: * fsutils: better/additional fsattrs functionality * paths: highly filterable filesystem searching
This commit is contained in:
96
fsutils/funcs_fsattrs.go
Normal file
96
fsutils/funcs_fsattrs.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package fsutils
|
||||
|
||||
import (
|
||||
`reflect`
|
||||
`strings`
|
||||
)
|
||||
|
||||
/*
|
||||
String returns a string representation (comparable to lsattr(1)) of an FsAttrs.
|
||||
|
||||
Not all flags are represented, as this aims for compatibility with e2fsprogs/lsattr output.
|
||||
*/
|
||||
func (f *FsAttrs) String() (s string) {
|
||||
|
||||
// Flags have their short name printed if set, otherwise a '-' placeholder is used.
|
||||
// https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git/tree/lib/e2p/pf.c
|
||||
|
||||
var refType reflect.Type
|
||||
var refVal reflect.Value
|
||||
var refField reflect.StructField
|
||||
var fieldVal reflect.Value
|
||||
var tagVal string
|
||||
var sb strings.Builder
|
||||
|
||||
if f == nil {
|
||||
s = strings.Repeat("-", len(linuxFsAttrsListOrder))
|
||||
return
|
||||
}
|
||||
|
||||
refVal = reflect.ValueOf(*f)
|
||||
refType = refVal.Type()
|
||||
for _, fn := range linuxFsAttrsListOrder {
|
||||
refField, _ = refType.FieldByName(fn)
|
||||
tagVal = refField.Tag.Get("fsAttrShort")
|
||||
if tagVal == "" || tagVal == "-" {
|
||||
continue
|
||||
}
|
||||
fieldVal = refVal.FieldByName(fn)
|
||||
if fieldVal.Bool() {
|
||||
sb.WriteString(tagVal)
|
||||
} else {
|
||||
sb.WriteString("-")
|
||||
}
|
||||
}
|
||||
|
||||
s = sb.String()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
/*
|
||||
StringLong returns a more extensive/"human-friendly" representation (comparable to lsattr(1) wiih -l) of an Fsattrs.
|
||||
|
||||
Not all flags are represented, as this aims for compatibility with e2fsprogs/lsattr output.
|
||||
*/
|
||||
func (f *FsAttrs) StringLong() (s string) {
|
||||
|
||||
// The long names are separated via a commma then a space.
|
||||
// If no attrs are set, the string "---" is used.
|
||||
// https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git/tree/lib/e2p/pf.c
|
||||
|
||||
var refType reflect.Type
|
||||
var refVal reflect.Value
|
||||
var refField reflect.StructField
|
||||
var fieldVal reflect.Value
|
||||
var tagVal string
|
||||
var out []string
|
||||
|
||||
if f == nil {
|
||||
s = strings.Repeat("-", 3)
|
||||
return
|
||||
}
|
||||
|
||||
refVal = reflect.ValueOf(*f)
|
||||
refType = refVal.Type()
|
||||
for _, fn := range linuxFsAttrsListOrder {
|
||||
refField, _ = refType.FieldByName(fn)
|
||||
tagVal = refField.Tag.Get("fsAttrLong")
|
||||
if tagVal == "" || tagVal == "-" {
|
||||
continue
|
||||
}
|
||||
fieldVal = refVal.FieldByName(fn)
|
||||
if fieldVal.Bool() {
|
||||
out = append(out, tagVal)
|
||||
}
|
||||
}
|
||||
|
||||
if out == nil || len(out) == 0 {
|
||||
s = strings.Repeat("-", 3)
|
||||
return
|
||||
}
|
||||
|
||||
s = strings.Join(out, ", ")
|
||||
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user