Skip to content

Commit 58cf979

Browse files
heschigopherbot
authored andcommitted
internal/task: continue x repo tagging
Next step: expand the workflow with tagging tasks, currently all no-ops. For golang/go#48523. Change-Id: I48cb8804dc1db6c17b748b54a194e9ef64ef6bce Reviewed-on: https://go-review.googlesource.com/c/build/+/425089 Reviewed-by: Dmitri Shuralyov <[email protected]> Run-TryBot: Heschi Kreinick <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Auto-Submit: Heschi Kreinick <[email protected]>
1 parent e7573ff commit 58cf979

File tree

1 file changed

+62
-3
lines changed

1 file changed

+62
-3
lines changed

internal/task/tagx.go

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,34 @@ type TagXReposTasks struct {
1515
Gerrit GerritClient
1616
}
1717

18+
func (x *TagXReposTasks) NewDefinition() *wf.Definition {
19+
wd := wf.New()
20+
repos := wf.Task0(wd, "Select repositories", x.SelectRepos)
21+
wf.Expand1(wd, "Create plan", x.BuildPlan, repos)
22+
return wd
23+
}
24+
1825
type TagRepo struct {
1926
Name string
2027
Next string
2128
Deps []string
2229
}
2330

24-
func (x *TagXReposTasks) SelectRepos(ctx *wf.TaskContext) ([]*TagRepo, error) {
31+
func (x *TagXReposTasks) SelectRepos(ctx *wf.TaskContext) ([]TagRepo, error) {
2532
projects, err := x.Gerrit.ListProjects(ctx)
2633
if err != nil {
2734
return nil, err
2835
}
2936

3037
ctx.Printf("Examining repositories %v", projects)
31-
var repos []*TagRepo
38+
var repos []TagRepo
3239
for _, p := range projects {
3340
repo, err := x.readRepo(ctx, p)
3441
if err != nil {
3542
return nil, err
3643
}
3744
if repo != nil {
38-
repos = append(repos, repo)
45+
repos = append(repos, *repo)
3946
}
4047
}
4148
return repos, nil
@@ -99,3 +106,55 @@ func (x *TagXReposTasks) readRepo(ctx *wf.TaskContext, project string) (*TagRepo
99106
}
100107
return result, nil
101108
}
109+
110+
func (x *TagXReposTasks) BuildPlan(wd *wf.Definition, repos []TagRepo) error {
111+
updated := map[string]wf.Dependency{}
112+
113+
// Find all repositories whose dependencies are satisfied and update
114+
// them, proceeding until all are updated or no progress can be made.
115+
for len(updated) != len(repos) {
116+
progress := false
117+
for _, repo := range repos {
118+
dep, ok := x.planRepo(wd, repo, updated)
119+
if !ok {
120+
continue
121+
}
122+
updated[repo.Name] = dep
123+
progress = true
124+
}
125+
126+
if !progress {
127+
return fmt.Errorf("cycle detected, sorry")
128+
}
129+
}
130+
return nil
131+
}
132+
133+
func (x *TagXReposTasks) planRepo(wd *wf.Definition, repo TagRepo, updated map[string]wf.Dependency) (wf.Dependency, bool) {
134+
var deps []wf.Dependency
135+
for _, repoDeps := range repo.Deps {
136+
if dep, ok := updated[repoDeps]; ok {
137+
deps = append(deps, dep)
138+
} else {
139+
return nil, false
140+
}
141+
}
142+
wd = wd.Sub(repo.Name)
143+
commit := wf.Task1(wd, "update go.mod", x.UpdateGoMod, wf.Const(repo), wf.After(deps...))
144+
green := wf.Action2(wd, "wait for green post-submit", x.AwaitGreen, wf.Const(repo), commit)
145+
tagged := wf.Task2(wd, "tag", x.TagRepo, wf.Const(repo), commit, wf.After(green))
146+
wf.Output(wd, "tagged version", tagged)
147+
return tagged, true
148+
}
149+
150+
func (x *TagXReposTasks) UpdateGoMod(ctx *wf.TaskContext, repo TagRepo) (string, error) {
151+
return "", nil
152+
}
153+
154+
func (x *TagXReposTasks) AwaitGreen(ctx *wf.TaskContext, repo TagRepo, commit string) error {
155+
return nil
156+
}
157+
158+
func (x *TagXReposTasks) TagRepo(ctx *wf.TaskContext, repo TagRepo, commit string) (string, error) {
159+
return repo.Next, nil
160+
}

0 commit comments

Comments
 (0)