- err = os.Chmod(tmp.Name(), os.FileMode(0666&^umask))
- if err != nil {
- return err
- }
- return os.Rename(tmp.Name(), dbPath)
-}
-
-func (file *File) listBeauty(indent string, n int, isLast, veryFirst bool) {
- if veryFirst {
- fmt.Printf("[%s]\n", humanize.IBytes(file.Size))
- } else {
- var box string
- if isLast {
- box = "â"
- } else {
- box = "â"
- }
- name := file.Name
- fmt.Printf("%s%s %s\tâ%d [%s] %s\n",
- indent, box, name, n, humanize.IBytes(file.Size),
- time.Unix(file.Mtime, 0).Format("2006-01-02"),
- )
- if isLast {
- indent += " "
- } else {
- indent += "â "
- }
- }
- for n, f := range file.Files {
- n++
- f.listBeauty(indent, n, n == len(file.Files), false)
- }
-}
-
-func (file *File) listSimple(root string, veryFirst bool) {
- name := file.Name
- fmt.Println(
- strconv.FormatUint(file.Size, 10),
- time.Unix(file.Mtime, 0).Format("2006-01-02T15:04:05"),
- root+name,
- )
- if veryFirst {
- name = ""
- }
- for _, f := range file.Files {
- f.listSimple(root+name, false)
- }
-}
-
-func (file *File) listFiles(root string, veryFirst bool) {
- name := file.Name
- if veryFirst {
- root = ""
- } else {
- fmt.Println(root + name)
- root += name
- }
- for _, f := range file.Files {
- f.listFiles(root, false)
- }
-}
-
-func (db *File) find(p string) (file *File, parents []*File, idx int, err error) {
- file = db
- var f File
-Entities:
- for _, ent := range strings.Split(p, "/") {
- for idx, f = range file.Files {
- if (ent == f.Name) || (ent+"/" == f.Name) {
- parents = append(parents, file)
- file = &f
- continue Entities
- }
- }
- err = fmt.Errorf("no entity found: %s", ent)
- return
- }
- return
-}
-
-func (db *File) remove(p string) error {
- file, parents, idx, err := db.find(p)
- if err != nil {
- return err
- }
- lastParent := parents[len(parents)-1]
- lastParent.Files = append(
- lastParent.Files[:idx],
- lastParent.Files[idx+1:]...,
- )
- for _, parent := range parents {
- parent.Size -= file.Size
- }
- return nil
-}
-
-func (db *File) add(p string) error {
- cols := strings.Split(p, "/")
- cols, name := cols[:len(cols)-1], cols[len(cols)-1]
- var parent *File
- var err error
- if len(cols) != 0 {
- parent, _, _, err = db.find(path.Join(cols...))
- if err != nil {
- return err
- }
- } else {
- parent = db
- }
- info, err := os.Stat(p)
- if err != nil {
- return err
- }
- if info.IsDir() {
- name += "/"
- }
- file := File{
- Name: name,
- Size: uint64(info.Size()),
- Mtime: info.ModTime().Unix(),