Monorepo for Tangled
0

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>

Anirudh Oppiliappan (May 4, 2026, 11:33 PM +0300) 260ce507 e6b76e40

+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
··· 374 374 RepoDid: &repoDid, 375 375 } 376 376 377 + changedFiles, err := gr.ChangedFilesBetween(line.OldSha.String(), line.NewSha.String()) 378 + if err != nil { 379 + return fmt.Errorf("getting changed files: %w", err) 380 + } 381 + 377 382 compiler := workflow.Compiler{ 378 383 Trigger: tangled.Pipeline_TriggerMetadata{ 379 384 Kind: string(workflow.TriggerKindPush), 380 385 Push: &trigger, 381 386 Repo: triggerRepo, 382 387 }, 388 + ChangedFiles: changedFiles, 383 389 } 384 390 385 391 cp := compiler.Compile(compiler.Parse(pipeline))