From 905aa9434def08d792506dc78d779d1262050d06 Mon Sep 17 00:00:00 2001 From: Aung Htet Nay <57069407+aunghtetnay@users.noreply.github.com> Date: Wed, 15 Oct 2025 21:55:39 +0630 Subject: [PATCH 1/5] Change FFmpeg source to GitHub mirror in Dockerfile (#36424) --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index ad8150552a..e457ae3623 100644 --- a/Dockerfile +++ b/Dockerfile @@ -208,12 +208,12 @@ FROM build AS ffmpeg # renovate: datasource=repology depName=ffmpeg packageName=openpkg_current/ffmpeg ARG FFMPEG_VERSION=8.0 # ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"] -ARG FFMPEG_URL=https://ffmpeg.org/releases +ARG FFMPEG_URL=https://github.com/FFmpeg/FFmpeg/archive/refs/tags WORKDIR /usr/local/ffmpeg/src # Download and extract ffmpeg source code -ADD ${FFMPEG_URL}/ffmpeg-${FFMPEG_VERSION}.tar.xz /usr/local/ffmpeg/src/ -RUN tar xf ffmpeg-${FFMPEG_VERSION}.tar.xz; +ADD ${FFMPEG_URL}/n${FFMPEG_VERSION}.tar.gz /usr/local/ffmpeg/src/ +RUN tar xf n${FFMPEG_VERSION}.tar.gz && mv FFmpeg-n${FFMPEG_VERSION} ffmpeg-${FFMPEG_VERSION}; WORKDIR /usr/local/ffmpeg/src/ffmpeg-${FFMPEG_VERSION} From 28a42bb62c71f7a2b25002a41ebc586445a93b69 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 15 Oct 2025 17:38:36 +0200 Subject: [PATCH 2/5] Fix low-contrast hover colour of alert actions (light theme only) (#36484) --- app/javascript/styles/mastodon/components.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 65ed88dca9..78c711c552 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -10439,7 +10439,7 @@ noscript { &:hover, &:focus, &:active { - background: color.change($ui-base-color, $alpha: 0.85); + background: color.change($white, $alpha: 0.15); } } From 869eeecfee61d6e2a18ca3f7761809c0493e1fcc Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 15 Oct 2025 19:30:47 +0200 Subject: [PATCH 3/5] Show new replies early if the fetch-all-replies task takes long to finish (#36481) --- .../status/components/refresh_controller.tsx | 51 +++++++++++++------ app/javascript/mastodon/locales/en.json | 2 +- app/javascript/mastodon/reducers/contexts.ts | 7 ++- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/app/javascript/mastodon/features/status/components/refresh_controller.tsx b/app/javascript/mastodon/features/status/components/refresh_controller.tsx index 8297922cbb..253cce4691 100644 --- a/app/javascript/mastodon/features/status/components/refresh_controller.tsx +++ b/app/javascript/mastodon/features/status/components/refresh_controller.tsx @@ -38,7 +38,7 @@ const messages = defineMessages({ }, success: { id: 'status.context.loading_success', - defaultMessage: 'All replies loaded', + defaultMessage: 'New replies loaded', }, error: { id: 'status.context.loading_error', @@ -81,22 +81,38 @@ export const RefreshController: React.FC<{ useEffect(() => { let timeoutId: ReturnType; - const scheduleRefresh = (refresh: AsyncRefreshHeader) => { + const scheduleRefresh = ( + refresh: AsyncRefreshHeader, + iteration: number, + ) => { timeoutId = setTimeout(() => { void apiGetAsyncRefresh(refresh.id).then((result) => { - // If the refresh status is not finished, - // schedule another refresh and exit - if (result.async_refresh.status !== 'finished') { - scheduleRefresh(refresh); + // At three scheduled refreshes, we consider the job + // long-running and attempt to fetch any new replies so far + const isLongRunning = iteration === 3; + + const { status, result_count } = result.async_refresh; + + // If the refresh status is not finished and not long-running, + // we just schedule another refresh and exit + if (status === 'running' && !isLongRunning) { + scheduleRefresh(refresh, iteration + 1); return; } - // Refresh status is finished. The action below will clear `refreshHeader` - dispatch(completeContextRefresh({ statusId })); + // If refresh status is finished, clear `refreshHeader` + // (we don't want to do this if it's just a long-running job) + if (status === 'finished') { + dispatch(completeContextRefresh({ statusId })); + } // Exit if there's nothing to fetch - if (result.async_refresh.result_count === 0) { - setLoadingState('idle'); + if (result_count === 0) { + if (status === 'finished') { + setLoadingState('idle'); + } else { + scheduleRefresh(refresh, iteration + 1); + } return; } @@ -106,10 +122,15 @@ export const RefreshController: React.FC<{ // If so, they will populate `contexts.pendingReplies[statusId]` void dispatch(fetchContext({ statusId, prefetchOnly: true })) .then(() => { - // Reset loading state to `idle` – but if the fetch - // has resulted in new pending replies, the `hasPendingReplies` + // Reset loading state to `idle`. If the fetch has + // resulted in new pending replies, the `hasPendingReplies` // flag will switch the loading state to 'more-available' - setLoadingState('idle'); + if (status === 'finished') { + setLoadingState('idle'); + } else { + // Keep background fetch going if `isLongRunning` is true + scheduleRefresh(refresh, iteration + 1); + } }) .catch(() => { // Show an error if the fetch failed @@ -121,7 +142,7 @@ export const RefreshController: React.FC<{ // Initialise a refresh if (refreshHeader && !wasDismissed) { - scheduleRefresh(refreshHeader); + scheduleRefresh(refreshHeader, 1); setLoadingState('loading'); } @@ -135,7 +156,7 @@ export const RefreshController: React.FC<{ if (loadingState === 'success') { const timeoutId = setTimeout(() => { setLoadingState('idle'); - }, 3000); + }, 2500); return () => { clearTimeout(timeoutId); diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 5ecf32ff6d..6917bfef36 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -876,7 +876,7 @@ "status.contains_quote": "Contains quote", "status.context.loading": "Loading more replies", "status.context.loading_error": "Couldn't load new replies", - "status.context.loading_success": "All replies loaded", + "status.context.loading_success": "New replies loaded", "status.context.more_replies_found": "More replies found", "status.context.retry": "Retry", "status.context.show": "Show", diff --git a/app/javascript/mastodon/reducers/contexts.ts b/app/javascript/mastodon/reducers/contexts.ts index 0a31c49828..0331c8083a 100644 --- a/app/javascript/mastodon/reducers/contexts.ts +++ b/app/javascript/mastodon/reducers/contexts.ts @@ -166,7 +166,10 @@ const updateContext = (state: Draft, status: ApiStatusJSON): void => { export const contextsReducer = createReducer(initialState, (builder) => { builder .addCase(fetchContext.fulfilled, (state, action) => { - if (action.payload.prefetchOnly) { + const currentReplies = state.replies[action.meta.arg.statusId] ?? []; + const hasReplies = currentReplies.length > 0; + // Ignore prefetchOnly if there are no replies - then we can load them immediately + if (action.payload.prefetchOnly && hasReplies) { storePrefetchedReplies( state, action.meta.arg.statusId, @@ -179,7 +182,7 @@ export const contextsReducer = createReducer(initialState, (builder) => { action.payload.context, ); - if (action.payload.refresh) { + if (action.payload.refresh && !action.payload.prefetchOnly) { state.refreshing[action.meta.arg.statusId] = action.payload.refresh; } } From ef53dcfd8c593655ac907e0c7f3c3018e3a91b72 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 16 Oct 2025 11:10:53 +0200 Subject: [PATCH 4/5] Fix pinned hashtag columns fully refreshing unprompted (#36497) --- app/javascript/mastodon/features/hashtag_timeline/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.jsx b/app/javascript/mastodon/features/hashtag_timeline/index.jsx index 1a7ffa6c23..791f494d3d 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/index.jsx +++ b/app/javascript/mastodon/features/hashtag_timeline/index.jsx @@ -142,7 +142,7 @@ class HashtagTimeline extends PureComponent { const { params, local } = this.props; const { id, tags } = prevProps.params; - if (id !== params.id || !isEqual(tags, params.tags) || !isEqual(local, params.local)) { + if (id !== params.id || !isEqual(tags, params.tags) || !isEqual(local, prevProps.local)) { this._unload(); this._load(); } From 241ad1c5878161f5f4a19c16ed6c042f1c2cb6c2 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 16 Oct 2025 11:24:22 +0200 Subject: [PATCH 5/5] Update docker-compose.yml sidekiq health check to work for both 4.4 and 4.5 (#36498) --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index a2264b65d3..3cc3b7f488 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -115,7 +115,7 @@ services: volumes: - ./public/system:/mastodon/public/system healthcheck: - test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 7' || false"] + test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ [78]' || false"] ## Uncomment to enable federation with tor instances along with adding the following ENV variables ## http_hidden_proxy=http://privoxy:8118