-
Notifications
You must be signed in to change notification settings - Fork 127
/
file.go
128 lines (111 loc) · 3.16 KB
/
file.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package fs
import (
"io"
"time"
)
// Item is a FS item (file or dir)
type Item interface {
GetPath() string
GetName() string
GetFlag() rune
IsDir() bool
GetSize() int64
GetType() string
GetUsage() int64
GetMtime() time.Time
GetItemCount() int
GetParent() Item
SetParent(Item)
GetMultiLinkedInode() uint64
EncodeJSON(writer io.Writer, topLevel bool) error
GetItemStats(linkedItems HardLinkedItems) (int, int64, int64)
UpdateStats(linkedItems HardLinkedItems)
AddFile(Item)
GetFiles() Files
SetFiles(Files)
}
// Files - slice of pointers to File
type Files []Item
// HardLinkedItems maps inode number to array of all hard linked items
type HardLinkedItems map[uint64]Files
// IndexOf searches File in Files and returns its index
func (f Files) IndexOf(file Item) (int, bool) {
for i, item := range f {
if item == file {
return i, true
}
}
return 0, false
}
// FindByName searches name in Files and returns its index
func (f Files) FindByName(name string) (int, bool) {
for i, item := range f {
if item.GetName() == name {
return i, true
}
}
return 0, false
}
// Remove removes File from Files
func (f Files) Remove(file Item) Files {
index, ok := f.IndexOf(file)
if !ok {
return f
}
return append(f[:index], f[index+1:]...)
}
// RemoveByName removes File from Files
func (f Files) RemoveByName(name string) Files {
index, ok := f.FindByName(name)
if !ok {
return f
}
return append(f[:index], f[index+1:]...)
}
func (f Files) Len() int { return len(f) }
func (f Files) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
func (f Files) Less(i, j int) bool {
if f[i].GetUsage() != f[j].GetUsage() {
return f[i].GetUsage() > f[j].GetUsage()
}
// if usage is the same, sort by name
return f[i].GetName() > f[j].GetName()
}
// ByApparentSize sorts files by apparent size
type ByApparentSize Files
func (f ByApparentSize) Len() int { return len(f) }
func (f ByApparentSize) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
func (f ByApparentSize) Less(i, j int) bool {
if f[i].GetSize() != f[j].GetSize() {
return f[i].GetSize() > f[j].GetSize()
}
// if size is the same, sort by name
return f[i].GetName() > f[j].GetName()
}
// ByItemCount sorts files by item count
type ByItemCount Files
func (f ByItemCount) Len() int { return len(f) }
func (f ByItemCount) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
func (f ByItemCount) Less(i, j int) bool {
if f[i].GetItemCount() != f[j].GetItemCount() {
return f[i].GetItemCount() > f[j].GetItemCount()
}
// if item count is the same, sort by name
return f[i].GetName() > f[j].GetName()
}
// ByName sorts files by name
type ByName Files
func (f ByName) Len() int { return len(f) }
func (f ByName) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
func (f ByName) Less(i, j int) bool { return f[i].GetName() > f[j].GetName() }
// ByMtime sorts files by name
type ByMtime Files
func (f ByMtime) Len() int { return len(f) }
func (f ByMtime) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
func (f ByMtime) Less(i, j int) bool {
if !f[i].GetMtime().Equal(f[j].GetMtime()) {
return f[i].GetMtime().After(f[j].GetMtime())
}
// if item count is the same, sort by name
return f[i].GetName() > f[j].GetName()
}