Monorepo for Tangled tangled.org

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

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

anirudh.fi c19d1efc 9c5aa919

verified
+54
+48
knotserver/git/diff.go
··· 146 146 return stdout.String(), &formatPatch[0], nil 147 147 } 148 148 149 + // ChangedFilesBetween returns the list of files changed between oldSha and newSha. 150 + // If oldSha is the zero hash (initial push), all files in newSha are returned. 151 + func (g *GitRepo) ChangedFilesBetween(oldSha, newSha string) ([]string, error) { 152 + newCommit, err := g.ResolveRevision(newSha) 153 + if err != nil { 154 + return nil, err 155 + } 156 + 157 + if plumbing.NewHash(oldSha) == plumbing.ZeroHash { 158 + tree, err := newCommit.Tree() 159 + if err != nil { 160 + return nil, err 161 + } 162 + var files []string 163 + tree.Files().ForEach(func(f *object.File) error { 164 + files = append(files, f.Name) 165 + return nil 166 + }) 167 + return files, nil 168 + } 169 + 170 + oldCommit, err := g.ResolveRevision(oldSha) 171 + if err != nil { 172 + return nil, err 173 + } 174 + 175 + dt, err := g.DiffTree(oldCommit, newCommit) 176 + if err != nil { 177 + return nil, err 178 + } 179 + 180 + seen := make(map[string]struct{}) 181 + for _, f := range dt.Diff { 182 + if f.OldName != "" { 183 + seen[f.OldName] = struct{}{} 184 + } 185 + if f.NewName != "" { 186 + seen[f.NewName] = struct{}{} 187 + } 188 + } 189 + 190 + files := make([]string, 0, len(seen)) 191 + for name := range seen { 192 + files = append(files, name) 193 + } 194 + return files, nil 195 + } 196 + 149 197 func (g *GitRepo) ResolveRevision(revStr string) (*object.Commit, error) { 150 198 rev, err := g.r.ResolveRevision(plumbing.Revision(revStr)) 151 199 if err != nil {
+6
knotserver/internal.go
··· 299 299 NewSha: line.NewSha.String(), 300 300 } 301 301 302 + changedFiles, err := gr.ChangedFilesBetween(line.OldSha.String(), line.NewSha.String()) 303 + if err != nil { 304 + return fmt.Errorf("getting changed files: %w", err) 305 + } 306 + 302 307 compiler := workflow.Compiler{ 303 308 Trigger: tangled.Pipeline_TriggerMetadata{ 304 309 Kind: string(workflow.TriggerKindPush), ··· 309 314 Repo: repoName, 310 315 }, 311 316 }, 317 + ChangedFiles: changedFiles, 312 318 } 313 319 314 320 cp := compiler.Compile(compiler.Parse(pipeline))