You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: evaluater.go
    path of file: ./repos/devspace/pkg/devspace/sync
    
    the code of the file until where you have to start completion: package sync

import (
	"github.com/loft-sh/devspace/helper/remote"
	"github.com/loft-sh/devspace/pkg/util/log"
	"os"
)

// s.fileIndex needs to be locked before this function is called
func shouldRemoveRemote(relativePath string, s *Sync) bool {
	// File / Folder was already deleted from map so event was already processed or should not be processed
	if s.fileIndex.fileMap[relativePath] == nil {
		return false
	}

	// Exclude symbolic links
	if s.fileIndex.fileMap[relativePath].IsSymbolicLink {
		return false
	}

	// Exclude changes on the exclude list
	if s.ignoreMatcher != nil {
		if s.ignoreMatcher.Matches(relativePath, s.fileIndex.fileMap[relativePath].IsDirectory) {
			return false
		}
	}

	// Exclude changes on the upload exclude list
	if s.uploadIgnoreMatcher != nil {
		if s.ignoreMatcher.Matches(relativePath, s.fileIndex.fileMap[relativePath].IsDirectory) {
			return false
		}
	}

	return true
}

// s.fileIndex needs to be locked before this function is called
func shouldUpload(s 
    
func shouldUpload(s *Sync, fileInformation *FileInformation, log log.Logger) bool {
	// Exclude if stat is nil
	if fileInformation == nil {
		return false
	}

	// Exclude changes on the upload exclude list
	// is not necessary here anymore because it was already
	// checked

	// stat.Mode()&os.ModeSymlink

	// Exclude local symlinks
	if fileInformation.IsSymbolicLink {
		log.Debugf("Don't upload %s because it is a symbolic link", fileInformation.Name)
		return false
	}

	// Exclude changes on the exclude list
	if s.ignoreMatcher != nil && s.ignoreMatcher.Matches(fileInformation.Name, fileInformation.IsDirectory) {
		log.Debugf("Don't upload %s because it is excluded", fileInformation.Name)
		return false
	}

	// Check if we already tracked the path
	if s.fileIndex.fileMap[fileInformation.Name] != nil {
		// Folder already exists, don't send change
		if fileInformation.IsDirectory {
			log.Debugf("Don't upload %s because directory already exists", fileInformation.Name)
			return false
		}

		// Exclude symlinks
		if s.fileIndex.fileMap[fileInformation.Name].IsSymbolicLink {
			log.Debugf("Don't upload %s because it is a symbolic link", fileInformation.Name)
			return false
		}

		// File did not change or was changed by downstream
		if fileInformation.Mtime == s.fileIndex.fileMap[fileInformation.Name].Mtime && fileInformation.Size == s.fileIndex.fileMap[fileInformation.Name].Size {
			log.Debugf("Don't upload %s because mtime and size have not changed", fileInformation.Name)
			return false
		}
	}

	return true
}