aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2023-04-27 17:15:51 +0200
committerAleksandr Nogikh <wp32pw@gmail.com>2023-04-28 14:53:23 +0200
commit99a64946f423cdca21ebb353acfb69f4df9b134c (patch)
tree70949cda77bb2f79687841fd16be80c16cff2d59
parent41f95395462c3a77e6631264b29cbed08d59c2d3 (diff)
dashboard: prioritize Merge=true KernelRepo links
It might be the case that the same repo is mentioned both as Merge=false and via some chain of Merge=true links. Adjust the code to properly handle such scenarios and add a test.
-rw-r--r--dashboard/app/tree.go10
-rw-r--r--dashboard/app/tree_test.go61
2 files changed, 66 insertions, 5 deletions
diff --git a/dashboard/app/tree.go b/dashboard/app/tree.go
index caaa06bde..263c4651b 100644
--- a/dashboard/app/tree.go
+++ b/dashboard/app/tree.go
@@ -694,10 +694,17 @@ func (g *repoGraph) nodeByAlias(alias string) *repoNode {
// reachable returns a map *repoNode -> bool (whether commits are merged).
func (n *repoNode) reachable(in bool) map[*repoNode]bool {
ret := map[*repoNode]bool{}
+ // First collect nodes only reachable via merge=true links.
+ n.reachableMerged(in, true, ret)
+ n.reachableMerged(in, false, ret)
+ return ret
+}
+
+func (n *repoNode) reachableMerged(in, onlyMerge bool, ret map[*repoNode]bool) {
var dfs func(*repoNode, bool)
dfs = func(node *repoNode, merge bool) {
for _, edge := range node.edges {
- if edge.in != in {
+ if edge.in != in || onlyMerge && !edge.merge {
continue
}
if _, ok := ret[edge.other]; ok {
@@ -708,7 +715,6 @@ func (n *repoNode) reachable(in bool) map[*repoNode]bool {
}
}
dfs(n, true)
- return ret
}
func (n *repoNode) allReachable() map[*repoNode]bool {
diff --git a/dashboard/app/tree_test.go b/dashboard/app/tree_test.go
index 555b543d9..5c4af14ec 100644
--- a/dashboard/app/tree_test.go
+++ b/dashboard/app/tree_test.go
@@ -126,11 +126,11 @@ var downstreamUpstreamRepos = []KernelRepo{
LabelIntroduced: `downstream`,
CommitInflow: []KernelRepoLink{
{
- Alias: `lts`,
- Merge: true,
+ Alias: `upstream`,
},
{
- Alias: `upstream`,
+ Alias: `lts`,
+ Merge: true,
},
},
},
@@ -794,3 +794,58 @@ func TestRepoGraph(t *testing.T) {
t.Fatal(diff)
}
}
+
+func TestRepoGraphMergeFirst(t *testing.T) {
+ // Test whether we prioritize merge links.
+ g, err := makeRepoGraph([]KernelRepo{
+ {
+ URL: `https://downstream.repo/repo`,
+ Branch: `master`,
+ Alias: `downstream`,
+ CommitInflow: []KernelRepoLink{
+ {
+ Alias: `upstream`,
+ Merge: false,
+ },
+ {
+ Alias: `lts`,
+ Merge: true,
+ },
+ },
+ },
+ {
+ URL: `https://lts.repo/repo`,
+ Branch: `lts-master`,
+ Alias: `lts`,
+ CommitInflow: []KernelRepoLink{
+ {
+ Alias: `upstream`,
+ Merge: true,
+ },
+ },
+ },
+ {
+ URL: `https://upstream.repo/repo`,
+ Branch: `upstream-master`,
+ Alias: `upstream`,
+ },
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ downstream := g.nodeByAlias(`downstream`)
+ lts := g.nodeByAlias(`lts`)
+ upstream := g.nodeByAlias(`upstream`)
+
+ // Test the downstream node.
+ if diff := cmp.Diff(map[*repoNode]bool{
+ lts: true,
+ upstream: true,
+ }, downstream.reachable(true)); diff != "" {
+ t.Fatal(diff)
+ }
+ if diff := cmp.Diff(map[*repoNode]bool{}, downstream.reachable(false)); diff != "" {
+ t.Fatal(diff)
+ }
+}