From 5137f2cf25a71cfaf6d7794d86ea2ed52bb001d3 Mon Sep 17 00:00:00 2001 From: Bernhard Guillon Date: Mon, 6 Jul 2026 21:47:30 +0200 Subject: Docker test fixes: directory pattern matching, mtime-based sync, Go version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixed directory pattern matching: go-gitignore doesn't match 'build/' against bare 'build', now checks with trailing slash appended - Added ModTime to FileMeta for reliable change detection (same-size file modifications now sync correctly) - Updated Dockerfile to golang:1.24-alpine (was 1.22) - Downgraded go.mod to Go 1.24 (system has custom 1.26.4 build) Docker tested with podman: - Initial sync correctly excludes ignored dirs/files - Nested .gitignore works (sub/ ignores *.tmp) - Watcher syncs new/modified/deleted files - Case-sensitive rename (Foo→foo) handled correctly - Same-size file modifications sync correctly --- Dockerfile | 2 +- gitignore.go | 4 ++-- go.mod | 2 +- sync.go | 3 +++ watcher.go | 8 +++++--- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index eb516c2..1258531 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22-alpine AS builder +FROM golang:1.24-alpine AS builder WORKDIR /src COPY go.mod go.sum ./ RUN go mod download diff --git a/gitignore.go b/gitignore.go index 569e191..2c9fc4b 100644 --- a/gitignore.go +++ b/gitignore.go @@ -50,8 +50,8 @@ func (s *GitignoreStack) IsIgnored(relPath string) bool { continue } - posMatch := layer.posRules != nil && layer.posRules.MatchesPath(childRel) - negMatch := layer.negRules != nil && layer.negRules.MatchesPath(childRel) + posMatch := layer.posRules != nil && (layer.posRules.MatchesPath(childRel) || layer.posRules.MatchesPath(childRel+"/")) + negMatch := layer.negRules != nil && (layer.negRules.MatchesPath(childRel) || layer.negRules.MatchesPath(childRel+"/")) if negMatch { result = false diff --git a/go.mod b/go.mod index 0c8474f..78e7d9a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module sourcewatch -go 1.26.4 +go 1.24 require ( github.com/fsnotify/fsnotify v1.10.1 diff --git a/sync.go b/sync.go index 526e143..6bdd651 100644 --- a/sync.go +++ b/sync.go @@ -5,11 +5,13 @@ import ( "log" "os" "path/filepath" + "time" ) type FileMeta struct { Size int64 Mode os.FileMode + ModTime time.Time Symlink string } @@ -65,6 +67,7 @@ func initialSync(hostDir, dataDir string, stack *GitignoreStack, dryRun bool) (* meta := FileMeta{ Size: info.Size(), Mode: info.Mode(), + ModTime: info.ModTime(), Symlink: linkTarget, } manifest.Files[relPath] = meta diff --git a/watcher.go b/watcher.go index 2067887..192b61b 100644 --- a/watcher.go +++ b/watcher.go @@ -127,6 +127,7 @@ func syncCreate(srcPath, destPath, relPath string, manifest *Manifest, stack *Gi meta := FileMeta{ Size: info.Size(), Mode: info.Mode(), + ModTime: info.ModTime(), Symlink: linkTarget, } manifest.Files[relPath] = meta @@ -161,13 +162,14 @@ func syncWrite(srcPath, destPath, relPath string, manifest *Manifest, dryRun, ve } meta, exists := manifest.Files[relPath] - if exists && meta.Size == info.Size() && meta.Mode == info.Mode() { + if exists && meta.Size == info.Size() && meta.Mode == info.Mode() && meta.ModTime.Equal(info.ModTime()) { return } manifest.Files[relPath] = FileMeta{ - Size: info.Size(), - Mode: info.Mode(), + Size: info.Size(), + Mode: info.Mode(), + ModTime: info.ModTime(), } if dryRun { -- cgit v1.2.3