forked from Cloud-Foundations/Dominator
/
copyMtimes.go
43 lines (41 loc) · 1.41 KB
/
copyMtimes.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
package util
import (
"github.com/Cloud-Foundations/Dominator/lib/filesystem"
)
func copyMtimes(sourceFs, destFs *filesystem.FileSystem) {
sourceFilenameToInodeTable := sourceFs.FilenameToInodeTable()
destInodeToFilenamesTable := destFs.InodeToFilenamesTable()
for inum, destInode := range destFs.InodeTable {
filenames := destInodeToFilenamesTable[inum]
var sourceInode filesystem.GenericInode
for _, filename := range filenames { // Search for source inode.
if sourceInum, ok := sourceFilenameToInodeTable[filename]; ok {
sourceInode = sourceFs.InodeTable[sourceInum]
break
}
}
if sourceInode == nil {
continue
}
if destInode, ok := destInode.(*filesystem.RegularInode); ok {
if sourceInode, ok := sourceInode.(*filesystem.RegularInode); ok {
newIno := *destInode
newIno.MtimeNanoSeconds = sourceInode.MtimeNanoSeconds
newIno.MtimeSeconds = sourceInode.MtimeSeconds
if filesystem.CompareRegularInodes(&newIno, sourceInode, nil) {
destFs.InodeTable[inum] = &newIno
}
}
}
if destInode, ok := destInode.(*filesystem.SpecialInode); ok {
if sourceInode, ok := sourceInode.(*filesystem.SpecialInode); ok {
newIno := *destInode
newIno.MtimeNanoSeconds = sourceInode.MtimeNanoSeconds
newIno.MtimeSeconds = sourceInode.MtimeSeconds
if filesystem.CompareSpecialInodes(&newIno, sourceInode, nil) {
destFs.InodeTable[inum] = &newIno
}
}
}
}
}