diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2023-04-27 17:15:51 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2023-04-28 14:53:23 +0200 |
| commit | 99a64946f423cdca21ebb353acfb69f4df9b134c (patch) | |
| tree | 70949cda77bb2f79687841fd16be80c16cff2d59 | |
| parent | 41f95395462c3a77e6631264b29cbed08d59c2d3 (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.go | 10 | ||||
| -rw-r--r-- | dashboard/app/tree_test.go | 61 |
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) + } +} |
