|
|
- package Filesystem
-
- import (
- "PackageManager/Client/Database"
- "crypto/md5"
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
- "time"
- )
-
- func HashFile(path string) (string, error) {
- var (
- Md5Hash string
- hashBytes [16]byte
- file *os.File
- e error
- )
-
- file, e = os.Open(path)
- if e != nil {
- panic(e)
- }
-
- defer file.Close()
-
- body, e := ioutil.ReadAll(file)
- if e != nil {
- panic(e)
- }
-
- //Get the 16 bytes hash
- hashBytes = md5.Sum(body)
-
- //Convert the bytes to a string
- Md5Hash = fmt.Sprintf("%x", hashBytes)
-
- return Md5Hash, nil
- }
-
- func UpdateFilesystemHash() error {
- var (
- fileHash string
- rows []Database.FilesystemHashRow
- e error
- )
-
- e = filepath.Walk(".", func(path string, info os.FileInfo, e error) error {
- if e != nil {
- return e
- }
-
- // Ignore hidden files
- if strings.HasPrefix(info.Name(), ".") || strings.HasPrefix(path, ".") {
- return nil
- }
-
- // Ignore directories
- if info.IsDir() {
- return nil
- }
-
- fileHash, e = HashFile(path)
-
- if e != nil {
- return e
- }
-
- rows = append(rows, Database.FilesystemHashRow{
- Path: path,
- Hash: fileHash,
- UpdatedAt: info.ModTime(),
- })
-
- // TODO: If len(rows) > x, update the db and clear out rows, and continue
-
- return nil
- })
-
- if e != nil {
- panic(e)
- }
-
- return Database.FindOrCreateFileHash(rows)
- }
-
- func GetFilesystemDiff() (map[int]string, map[int]string, error) {
- var (
- fileHash string
- hashes []string = []string{}
- lastUpdatedAt time.Time
- dirtyFiles map[int]string
- newFiles map[int]string = make(map[int]string)
- newFilesTmp map[string]string = make(map[string]string)
- counter int
- ok bool
- e error
- )
-
- lastUpdatedAt, e = Database.GetMostRecentTimestamp()
- if e != nil {
- return dirtyFiles, newFiles, e
- }
-
- e = filepath.Walk(".", func(path string, info os.FileInfo, e error) error {
- if e != nil {
- return e
- }
-
- // Ignore hidden files
- if strings.HasPrefix(info.Name(), ".") || strings.HasPrefix(path, ".") {
- return nil
- }
-
- // Ignore directories
- if info.IsDir() {
- return nil
- }
-
- fileHash, e = HashFile(path)
-
- if e != nil {
- return e
- }
-
- hashes = append(hashes, fileHash)
-
- if info.ModTime().After(lastUpdatedAt) {
- newFilesTmp[path] = path
- }
-
- // TODO: If len(rows) > x, update the db and clear out rows, and continue
-
- return nil
- })
- if e != nil {
- return dirtyFiles, newFiles, e
- }
-
- dirtyFiles, e = Database.FindModifiedFiles(hashes)
- if e != nil {
- return dirtyFiles, newFiles, e
- }
-
- for _, file := range dirtyFiles {
- _, ok = newFilesTmp[file]
- if ok {
- delete(newFilesTmp, file)
- }
- }
-
- counter = len(dirtyFiles)
-
- for _, file := range newFilesTmp {
- newFiles[counter] = file
- counter++
- }
-
- return dirtyFiles, newFiles, e
- }
|