Monorepo for Tangled tangled.org
4

Configure Feed

Select the types of activity you want to include in your feed.

knotserver/git: compute changed files between commits and wire into workflow compiler

Signed-off-by: Anirudh Oppiliappan <anirudh@tangled.org>

author
Anirudh Oppiliappan
committer
Tangled
date (Jun 11, 2026, 12:01 PM +0300) commit 4127eece parent 8d334a4c change-id rosvqvxs
+54
+48
knotserver/git/diff.go
··· 158 158 return raw, &formatPatch[0], nil 159 159 } 160 160 161 + // ChangedFilesBetween returns the list of files changed between oldSha and newSha. 162 + // If oldSha is the zero hash (initial push), all files in newSha are returned. 163 + func (g *GitRepo) ChangedFilesBetween(oldSha, newSha string) ([]string, error) { 164 + newCommit, err := g.ResolveRevision(newSha) 165 + if err != nil { 166 + return nil, err 167 + } 168 + 169 + if plumbing.NewHash(oldSha) == plumbing.ZeroHash { 170 + tree, err := newCommit.Tree() 171 + if err != nil { 172 + return nil, err 173 + } 174 + var files []string 175 + tree.Files().ForEach(func(f *object.File) error { 176 + files = append(files, f.Name) 177 + return nil 178 + }) 179 + return files, nil 180 + } 181 + 182 + oldCommit, err := g.ResolveRevision(oldSha) 183 + if err != nil { 184 + return nil, err 185 + } 186 + 187 + dt, err := g.DiffTree(oldCommit, newCommit) 188 + if err != nil { 189 + return nil, err 190 + } 191 + 192 + seen := make(map[string]struct{}) 193 + for _, f := range dt.Diff { 194 + if f.OldName != "" { 195 + seen[f.OldName] = struct{}{} 196 + } 197 + if f.NewName != "" { 198 + seen[f.NewName] = struct{}{} 199 + } 200 + } 201 + 202 + files := make([]string, 0, len(seen)) 203 + for name := range seen { 204 + files = append(files, name) 205 + } 206 + return files, nil 207 + } 208 + 161 209 func (g *GitRepo) ResolveRevision(revStr string) (*object.Commit, error) { 162 210 rev, err := g.r.ResolveRevision(plumbing.Revision(revStr)) 163 211 if err != nil {
+6
knotserver/internal.go
··· 385 385 DefaultBranch: defaultBranch, 386 386 } 387 387 388 + changedFiles, err := gr.ChangedFilesBetween(line.OldSha.String(), line.NewSha.String()) 389 + if err != nil { 390 + return fmt.Errorf("getting changed files: %w", err) 391 + } 392 + 388 393 compiler := workflow.Compiler{ 389 394 Trigger: tangled.Pipeline_TriggerMetadata{ 390 395 Kind: string(workflow.TriggerKindPush), 391 396 Push: &trigger, 392 397 Repo: triggerRepo, 393 398 }, 399 + ChangedFiles: changedFiles, 394 400 } 395 401 396 402 cp := compiler.Compile(compiler.Parse(pipeline))