github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/filesystem/util/copyMtimes.go (about)

     1  package util
     2  
     3  import (
     4  	"github.com/Cloud-Foundations/Dominator/lib/filesystem"
     5  )
     6  
     7  func copyMtimes(sourceFs, destFs *filesystem.FileSystem) {
     8  	sourceFilenameToInodeTable := sourceFs.FilenameToInodeTable()
     9  	destInodeToFilenamesTable := destFs.InodeToFilenamesTable()
    10  	for inum, destInode := range destFs.InodeTable {
    11  		filenames := destInodeToFilenamesTable[inum]
    12  		var sourceInode filesystem.GenericInode
    13  		for _, filename := range filenames { // Search for source inode.
    14  			if sourceInum, ok := sourceFilenameToInodeTable[filename]; ok {
    15  				sourceInode = sourceFs.InodeTable[sourceInum]
    16  				break
    17  			}
    18  		}
    19  		if sourceInode == nil {
    20  			continue
    21  		}
    22  		if destInode, ok := destInode.(*filesystem.RegularInode); ok {
    23  			if sourceInode, ok := sourceInode.(*filesystem.RegularInode); ok {
    24  				newIno := *destInode
    25  				newIno.MtimeNanoSeconds = sourceInode.MtimeNanoSeconds
    26  				newIno.MtimeSeconds = sourceInode.MtimeSeconds
    27  				if filesystem.CompareRegularInodes(&newIno, sourceInode, nil) {
    28  					destFs.InodeTable[inum] = &newIno
    29  				}
    30  			}
    31  		}
    32  		if destInode, ok := destInode.(*filesystem.SpecialInode); ok {
    33  			if sourceInode, ok := sourceInode.(*filesystem.SpecialInode); ok {
    34  				newIno := *destInode
    35  				newIno.MtimeNanoSeconds = sourceInode.MtimeNanoSeconds
    36  				newIno.MtimeSeconds = sourceInode.MtimeSeconds
    37  				if filesystem.CompareSpecialInodes(&newIno, sourceInode, nil) {
    38  					destFs.InodeTable[inum] = &newIno
    39  				}
    40  			}
    41  		}
    42  	}
    43  }