this repo has no description
0
fork

Configure Feed

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

feat(controller): add activity to detect changed files

+88 -9
+65 -1
controller/activities/git.go
··· 21 21 _, err = git.PlainClone(path, false, &git.CloneOptions{ 22 22 URL: url, 23 23 ReferenceName: plumbing.ReferenceName(revision), 24 - Depth: 1, 25 24 }) 26 25 if err != nil { 27 26 return "", err ··· 29 28 30 29 return path, nil 31 30 } 31 + 32 + func ChangedFiles(ctx context.Context, path string, oldRevision string) ([]string, error) { 33 + logger := activity.GetLogger(ctx) 34 + logger.Info("Getting changed files", "path", path, "oldRevision", oldRevision) 35 + 36 + repo, err := git.PlainOpen(path) 37 + if err != nil { 38 + return nil, err 39 + } 40 + 41 + // Resolve old revision 42 + oldHash, err := repo.ResolveRevision(plumbing.Revision(oldRevision)) 43 + if err != nil { 44 + return nil, err 45 + } 46 + oldCommit, err := repo.CommitObject(*oldHash) 47 + if err != nil { 48 + return nil, err 49 + } 50 + 51 + // Resolve HEAD 52 + headRef, err := repo.Head() 53 + if err != nil { 54 + return nil, err 55 + } 56 + newCommit, err := repo.CommitObject(headRef.Hash()) 57 + if err != nil { 58 + return nil, err 59 + } 60 + 61 + // Get trees and diff 62 + oldTree, err := oldCommit.Tree() 63 + if err != nil { 64 + return nil, err 65 + } 66 + newTree, err := newCommit.Tree() 67 + if err != nil { 68 + return nil, err 69 + } 70 + 71 + changes, err := oldTree.Diff(newTree) 72 + if err != nil { 73 + return nil, err 74 + } 75 + 76 + // Like `git diff --name-only` 77 + seen := map[string]struct{}{} 78 + var files []string 79 + for _, change := range changes { 80 + if change.From.Name != "" { 81 + if _, ok := seen[change.From.Name]; !ok { 82 + files = append(files, change.From.Name) 83 + seen[change.From.Name] = struct{}{} 84 + } 85 + } 86 + if change.To.Name != "" { 87 + if _, ok := seen[change.To.Name]; !ok { 88 + files = append(files, change.To.Name) 89 + seen[change.To.Name] = struct{}{} 90 + } 91 + } 92 + } 93 + 94 + return files, nil 95 + }
+2 -1
controller/worker/main.go
··· 24 24 25 25 w.RegisterWorkflow(workflows.Infra) 26 26 w.RegisterActivity(activities.Clone) 27 + w.RegisterActivity(activities.ChangedFiles) 27 28 w.RegisterActivity(activities.TerragruntGraph) 28 - w.RegisterActivity(activities.TerragruntTreeShaking) 29 + w.RegisterActivity(activities.TerragruntGraphShaking) 29 30 30 31 err = w.Run(worker.InterruptCh()) 31 32 if err != nil {
+21 -7
controller/workflows/infra.go
··· 8 8 ) 9 9 10 10 type InfraInputs struct { 11 - Url string 12 - Revision string 13 - Stack string 11 + Url string 12 + Revision string 13 + OldRevision string 14 + Stack string 14 15 } 15 16 16 17 // TODO create trigger ··· 34 35 return "", err 35 36 } 36 37 37 - var dotGraph string 38 - err = workflow.ExecuteActivity(ctx, activities.TerragruntGraph, path+"/infra/"+input.Stack).Get(ctx, &dotGraph) 38 + var ( 39 + dotGraph string 40 + changedFiles []string 41 + ) 42 + 43 + graphFuture := workflow.ExecuteActivity(ctx, activities.TerragruntGraph, path+"/infra/"+input.Stack) 44 + changedFilesFuture := workflow.ExecuteActivity(ctx, activities.ChangedFiles, path, input.OldRevision) 45 + 46 + err = graphFuture.Get(ctx, &dotGraph) 39 47 if err != nil { 40 - logger.Error("Activity failed.", "Error", err) 48 + logger.Error("TerragruntGraph failed", "Error", err) 49 + return "", err 50 + } 51 + 52 + err = changedFilesFuture.Get(ctx, &changedFiles) 53 + if err != nil { 54 + logger.Error("ChangedFiles failed", "Error", err) 41 55 return "", err 42 56 } 43 57 44 58 var result string 45 - err = workflow.ExecuteActivity(ctx, activities.TerragruntTreeShaking, dotGraph, []string{"cluster"}).Get(ctx, &result) 59 + err = workflow.ExecuteActivity(ctx, activities.TerragruntGraphShaking, dotGraph, changedFiles).Get(ctx, &result) 46 60 if err != nil { 47 61 logger.Error("Activity failed.", "Error", err) 48 62 return "", err