From 4127eeceb204b6b4d44b8fb9b3e8198aa6a23ea9 Mon Sep 17 00:00:00 2001 From: Anirudh Oppiliappan Date: Wed, 18 Mar 2026 15:02:30 +0200 Subject: [PATCH] knotserver/git: compute changed files between commits and wire into workflow compiler Signed-off-by: Anirudh Oppiliappan --- knotserver/git/diff.go | 48 ++++++++++++++++++++++++++++++++++++++++++ knotserver/internal.go | 6 ++++++ 2 files changed, 54 insertions(+) diff --git a/knotserver/git/diff.go b/knotserver/git/diff.go index 38c761ab..46f4c0cd 100644 --- a/knotserver/git/diff.go +++ b/knotserver/git/diff.go @@ -158,6 +158,54 @@ func (g *GitRepo) formatSinglePatch(commit plumbing.Hash, extraArgs ...string) ( return raw, &formatPatch[0], nil } +// ChangedFilesBetween returns the list of files changed between oldSha and newSha. +// If oldSha is the zero hash (initial push), all files in newSha are returned. +func (g *GitRepo) ChangedFilesBetween(oldSha, newSha string) ([]string, error) { + newCommit, err := g.ResolveRevision(newSha) + if err != nil { + return nil, err + } + + if plumbing.NewHash(oldSha) == plumbing.ZeroHash { + tree, err := newCommit.Tree() + if err != nil { + return nil, err + } + var files []string + tree.Files().ForEach(func(f *object.File) error { + files = append(files, f.Name) + return nil + }) + return files, nil + } + + oldCommit, err := g.ResolveRevision(oldSha) + if err != nil { + return nil, err + } + + dt, err := g.DiffTree(oldCommit, newCommit) + if err != nil { + return nil, err + } + + seen := make(map[string]struct{}) + for _, f := range dt.Diff { + if f.OldName != "" { + seen[f.OldName] = struct{}{} + } + if f.NewName != "" { + seen[f.NewName] = struct{}{} + } + } + + files := make([]string, 0, len(seen)) + for name := range seen { + files = append(files, name) + } + return files, nil +} + func (g *GitRepo) ResolveRevision(revStr string) (*object.Commit, error) { rev, err := g.r.ResolveRevision(plumbing.Revision(revStr)) if err != nil { diff --git a/knotserver/internal.go b/knotserver/internal.go index 76f63260..625a72e8 100644 --- a/knotserver/internal.go +++ b/knotserver/internal.go @@ -385,12 +385,18 @@ func (h *InternalHandle) triggerPipeline( DefaultBranch: defaultBranch, } + changedFiles, err := gr.ChangedFilesBetween(line.OldSha.String(), line.NewSha.String()) + if err != nil { + return fmt.Errorf("getting changed files: %w", err) + } + compiler := workflow.Compiler{ Trigger: tangled.Pipeline_TriggerMetadata{ Kind: string(workflow.TriggerKindPush), Push: &trigger, Repo: triggerRepo, }, + ChangedFiles: changedFiles, } cp := compiler.Compile(compiler.Parse(pipeline)) -- 2.51.2