Skip to content

Commit 8a2d878

Browse files
committed
disable set target for lower versions
1 parent 135eb45 commit 8a2d878

File tree

3 files changed

+34
-22
lines changed

3 files changed

+34
-22
lines changed

app/pages/system/UpdatePage.tsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import { differenceInMinutes } from 'date-fns'
1010
import { useMemo } from 'react'
1111
import * as R from 'remeda'
12+
import { lt as semverLt } from 'semver'
1213

1314
import {
1415
Images24Icon,
@@ -198,7 +199,17 @@ export default function UpdatePage() {
198199
<CardBlock.Body>
199200
<ul className="space-y-3">
200201
{repos.items.map((repo) => {
201-
const isTarget = repo.systemVersion === status.targetRelease?.version
202+
const targetVersion = status.targetRelease?.version
203+
const isTarget = repo.systemVersion === targetVersion
204+
// semverLt looks at prerelease meta but not build meta. In prod
205+
// it doesn't matter either way because there will be neither. On
206+
// dogfood it shouldn't matter because the versions will usually
207+
// be the same and with the same prelease meta and only differing
208+
// build meta, so semverLt will return false and we don't disable
209+
// any. Very important this is
210+
const olderThanTarget = targetVersion
211+
? semverLt(repo.systemVersion, targetVersion)
212+
: false
202213
return (
203214
<li
204215
key={repo.hash}
@@ -249,10 +260,13 @@ export default function UpdatePage() {
249260
errorTitle: `Error setting target release to ${repo.systemVersion}`,
250261
})
251262
}}
252-
// TODO: follow API logic, disabling for older releases.
253-
// Or maybe just have the API tell us by adding a field to
254-
// the TufRepo response type.
255-
disabled={isTarget && 'Already set as target'}
263+
disabled={
264+
isTarget
265+
? 'Already set as target'
266+
: olderThanTarget
267+
? 'Cannot set older release as target'
268+
: false
269+
}
256270
/>
257271
</MoreActionsMenu>
258272
</div>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
"react-stately": "^3.32.2",
7171
"recharts": "^2.15.1",
7272
"remeda": "^2.30.0",
73+
"semver": "^7.7.3",
7374
"simplebar-react": "^3.2.6",
7475
"ts-pattern": "^5.8.0",
7576
"tslib": "^2.7.0",
@@ -129,7 +130,6 @@
129130
"prettier": "^3.4.2",
130131
"prettier-plugin-tailwindcss": "^0.6.14",
131132
"resize-observer-polyfill": "^1.5.1",
132-
"semver": "^7.7.3",
133133
"tailwindcss": "^4.1.14",
134134
"tsx": "^4.19.2",
135135
"type-fest": "^4.33.0",

test/e2e/system-update.e2e.ts

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ test('Set target release', async ({ page }) => {
5353
await page.getByRole('button', { name: '17.0.0 actions' }).click()
5454
const disabledItem = page.getByRole('menuitem', { name: 'Set as target release' })
5555
await expect(disabledItem).toBeDisabled()
56+
await disabledItem.hover()
57+
await expect(page.getByText('Already set as target')).toBeVisible()
5658
await page.keyboard.press('Escape')
5759

5860
// Upgrade to 18.0.0
@@ -77,6 +79,13 @@ test('Set target release', async ({ page }) => {
7779

7880
const release18 = page.getByRole('listitem').filter({ hasText: '18.0.0' })
7981
await expect(release18.getByText('Target')).toBeVisible()
82+
83+
// Set target on 17 should still be disabled, but now for a different reason
84+
await page.getByRole('button', { name: '17.0.0 actions' }).click()
85+
const setTargetItem = page.getByRole('menuitem', { name: 'Set as target release' })
86+
await expect(setTargetItem).toBeDisabled()
87+
await setTargetItem.hover()
88+
await expect(page.getByText('Cannot set older release as target')).toBeVisible()
8089
})
8190

8291
test('Cannot downgrade to older release', async ({ page }) => {
@@ -88,23 +97,12 @@ test('Cannot downgrade to older release', async ({ page }) => {
8897
const release17 = page.getByRole('listitem').filter({ hasText: '17.0.0' })
8998
await expect(release17.getByText('Target')).toBeVisible()
9099

91-
// Try to downgrade to 16.0.0
100+
// Try to downgrade to 16.0.0 - button should be disabled
92101
await page.getByRole('button', { name: '16.0.0 actions' }).click()
93-
await page.getByRole('menuitem', { name: 'Set as target release' }).click()
94-
95-
const modal = page.getByRole('dialog', { name: 'Confirm set target release' })
96-
await expect(modal).toBeVisible()
97-
await expect(
98-
modal.getByText('Are you sure you want to set 16.0.0 as the target release?')
99-
).toBeVisible()
100-
101-
await page.getByRole('button', { name: 'Confirm' }).click()
102-
103-
// Verify error toast appears
104-
await expectToast(
105-
page,
106-
'Requested target release (16.0.0) must not be older than current target release (17.0.0).'
107-
)
102+
const setTargetItem = page.getByRole('menuitem', { name: 'Set as target release' })
103+
await expect(setTargetItem).toBeDisabled()
104+
await setTargetItem.hover()
105+
await expect(page.getByText('Cannot set older release as target')).toBeVisible()
108106

109107
// Verify the target release has NOT changed - still 17.0.0
110108
await expect(page.getByLabel('Properties table')).toContainText('17.0.0')

0 commit comments

Comments
 (0)