diff --git a/CHANGELOG.md b/CHANGELOG.md index 2926ac9..1d74e66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Fixed +- The sync button on an archived repository says **Sync** like every other row instead of **Manual Sync**, so the wider label no longer pushes the row's status badge out of line. Hovering it explains that automatic syncs are off for archived mirrors - The Activity Log summary no longer shows a repository as syncing after a quick sync finished (#454). Events are stored to the second, and a sync that starts and finishes in the same second could come back in the wrong order, so the start event was counted as the current state. Activities now come back newest first within the same second too, and the summary counts a finish over a start from the same second - Issue and pull request passes over large repositories finish across rate limit resets (#449 follow-up) - A pass stopped by the rate limit keeps the numbers it finished, and the next run repeats the same pass and skips them unless they changed since it started; before, every run started over from the first item, so a repository too large for one hour of budget never completed a pass diff --git a/README.md b/README.md index 4b8f2de..c4a5dc6 100644 --- a/README.md +++ b/README.md @@ -309,7 +309,7 @@ CLEANUP_DRY_RUN=false # Set to true to test without changes - Regular repositories: Made read-only using Gitea/Forgejo's archive feature - Mirror repositories: Renamed with `archived-` prefix (Gitea/Forgejo API limitation prevents archiving mirrors) - Failed operations: Repository remains fully accessible even if marking as archived fails -- **Manual Sync on Demand**: Archived mirrors stay in Gitea/Forgejo with automatic syncs disabled; trigger `Manual Sync` from the Repositories page whenever you need fresh data. +- **Sync on Demand**: Archived mirrors stay in Gitea/Forgejo with automatic syncs disabled; use `Sync` on the Repositories page whenever you need fresh data. - **The Whole Point of Backups**: Your Gitea/Forgejo mirrors are preserved even when GitHub sources disappear - that's why you have backups! - **Strongly Recommended**: Always use `CLEANUP_ORPHANED_REPO_ACTION=archive` (default) instead of `delete` diff --git a/docs/ENVIRONMENT_VARIABLES.md b/docs/ENVIRONMENT_VARIABLES.md index ff53cdf..8f075ab 100644 --- a/docs/ENVIRONMENT_VARIABLES.md +++ b/docs/ENVIRONMENT_VARIABLES.md @@ -333,7 +333,7 @@ Configure automatic cleanup of old events and data. - Description updated with preservation notice and timestamp - Mirror interval set to 8760h (1 year) to minimize sync attempts - Repository remains fully accessible and cloneable -- **Manual Sync Option**: Archived mirrors are still available on the Repositories page with automatic syncs disabled—use the `Manual Sync` action to refresh them on demand. +- **Sync on Demand**: Archived mirrors are still available on the Repositories page with automatic syncs disabled; use the `Sync` action to refresh them on demand. ### Execution Settings diff --git a/src/components/config/AutomationSettings.tsx b/src/components/config/AutomationSettings.tsx index 6ea56f3..464409f 100644 --- a/src/components/config/AutomationSettings.tsx +++ b/src/components/config/AutomationSettings.tsx @@ -117,7 +117,7 @@ const orphanActions = [ label: "Archive", description: "Kept read-only with an archived prefix", icon: Archive, - info: "Renames the mirror with an archived- prefix and disables automatic syncs. Nothing is lost; use Manual Sync to refresh.", + info: "Renames the mirror with an archived- prefix and disables automatic syncs. Nothing is lost; use Sync on the Repositories page to refresh.", }, { value: "delete" as const, diff --git a/src/components/repositories/RepositoryTable.tsx b/src/components/repositories/RepositoryTable.tsx index 7d1de52..b529fe7 100644 --- a/src/components/repositories/RepositoryTable.tsx +++ b/src/components/repositories/RepositoryTable.tsx @@ -1301,6 +1301,7 @@ function RepoActionButton({ let primaryIcon = <>; let primaryOnClick = () => {}; let primaryDisabled = isLoading; + let primaryTooltip: string | undefined; let showPrimaryAction = true; if (repo.status === "failed") { @@ -1308,10 +1309,16 @@ function RepoActionButton({ primaryIcon = ; primaryOnClick = onRetry; } else if (["mirrored", "synced", "syncing", "archived"].includes(repo.status)) { - primaryLabel = repo.status === "archived" ? "Manual Sync" : "Sync"; + primaryLabel = "Sync"; primaryIcon = ; primaryOnClick = onSync; primaryDisabled ||= repo.status === "syncing"; + // Archived mirrors are left out of automatic syncs, so this button is the + // way to refresh one. The Archived badge already marks the row; the label + // stays "Sync" so the column lines up with the other rows. + if (repo.status === "archived") { + primaryTooltip = "Automatic syncs are off for archived mirrors. This syncs it now."; + } } else if (["imported", "mirroring"].includes(repo.status)) { primaryLabel = "Mirror"; primaryIcon = ; @@ -1336,28 +1343,41 @@ function RepoActionButton({ ); } + const primaryButton = ( + + ); + // Show primary action with dropdown for additional actions return (
- + {primaryTooltip ? ( + + + {primaryButton} + {primaryTooltip} + + + ) : ( + primaryButton + )}