github.com/Cloud-Foundations/Dominator@v0.3.4/lib/filesystem/util/copyMtimes.go (about)

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