Skip to content

Commit 2fd8a86

Browse files
authored
fix(server): default to the shared URL of two builds (#281)
1 parent a2244c7 commit 2fd8a86

File tree

3 files changed

+31
-12
lines changed

3 files changed

+31
-12
lines changed

packages/server/src/ui/routes/build-view/build-view.jsx

+20-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {useState, useMemo, useCallback} from 'preact/hooks';
99
import {Link, route} from 'preact-router';
1010
import clsx from 'clsx';
1111
import './build-view.css';
12+
import * as _ from '@lhci/utils/src/lodash.js';
1213

1314
import {AsyncLoader, combineLoadingStates, combineAsyncData} from '../../components/async-loader';
1415
import {
@@ -28,14 +29,32 @@ import {LoadingSpinner} from '../../components/loading-spinner';
2829
import {LhrComparison} from './lhr-comparison.jsx';
2930
import {Dropdown} from '../../components/dropdown';
3031

32+
/**
33+
* @param {{compareUrl?: string, runs: Array<LHCI.ServerCommand.Run>}} props
34+
* @param {Array<LHCI.ServerCommand.Run>} compareRuns
35+
* @return {string} */
36+
function computeSelectedUrl(props, compareRuns) {
37+
if (props.compareUrl) return props.compareUrl;
38+
if (!compareRuns.length) return '';
39+
40+
// Choose the shortest URL that exists in both of the builds fallingback to whatever was available in the compare.
41+
const fallbackUrl = compareRuns[0].url;
42+
const groupedUrls = _.groupBy(props.runs, run => run.url);
43+
const urlsInBothRuns = groupedUrls
44+
.filter(group => new Set(group.map(entry => entry.buildId)).size > 1)
45+
.map(group => group[0].url)
46+
.sort((a, b) => a.length - b.length);
47+
return urlsInBothRuns[0] || fallbackUrl;
48+
}
49+
3150
/** @param {{project: LHCI.ServerCommand.Project, build: LHCI.ServerCommand.Build, ancestorBuild: LHCI.ServerCommand.Build | null, runs: Array<LHCI.ServerCommand.Run>, compareUrl?: string, hasBaseOverride: boolean}} props */
3251
const BuildView_ = props => {
3352
const [openBuildHash, setOpenBuild] = useState(/** @type {null|'base'|'compare'} */ (null));
3453
const [isOpenLhrLinkHovered, setLhrLinkHover] = useState(false);
35-
const selectedUrl = props.compareUrl || (props.runs[0] && props.runs[0].url);
3654
const buildHashSelectorCloseFn = useCallback(() => setOpenBuild(null), [setOpenBuild]);
3755

3856
const compareRuns = props.runs.filter(run => run.buildId === props.build.id);
57+
const selectedUrl = computeSelectedUrl(props, compareRuns);
3958
const availableUrls = [...new Set(compareRuns.map(run => run.url))];
4059
const run = compareRuns.find(run => run.url === selectedUrl);
4160

0 commit comments

Comments
 (0)