From 771cadc8fcf869418b371064e09f6d375a01d2f8 Mon Sep 17 00:00:00 2001 From: Raphael Borg Ellul Vincenti Date: Mon, 4 Aug 2025 08:12:37 +0200 Subject: [PATCH 1/4] fix: handle larger amount of repositories by iterating 100 pages --- .../GiteaCloneDialogRepositoryListLoaderImpl.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt index 4cbcb95..f7346ec 100644 --- a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt +++ b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt @@ -22,6 +22,7 @@ import com.intellij.openapi.progress.ProgressManager import com.intellij.ui.SingleSelectionModel import com.intellij.util.EventDispatcher import kotlinx.coroutines.runBlocking +import org.gitnex.tea4j.v2.models.Repository import javax.swing.ListSelectionModel internal class GiteaCloneDialogRepositoryListLoaderImpl : GiteaCloneDialogRepositoryListLoader, Disposable { @@ -48,7 +49,17 @@ internal class GiteaCloneDialogRepositoryListLoaderImpl : GiteaCloneDialogReposi val userApi = service().getGiteaApi(account.server.toString(), token).getUserApi() val user = userApi.userGetCurrent().execute().body() ?: return@submitIOTask - val mutableList = userApi.userCurrentListRepos(1, 9999).execute().body() ?: return@submitIOTask + + val allRepos = mutableListOf() + for (page in 1..99) { + indicator.checkCanceled() + val pageResult = userApi.userCurrentListRepos(page, 100).execute().body() ?: break + if (pageResult.isEmpty()) break + allRepos.addAll(pageResult) + } + + if (allRepos.isEmpty()) return@submitIOTask + val mutableList = allRepos runInEdt { indicator.checkCanceled() preservingSelection(listModel, listSelectionModel) { From 8840a99464f6495534818b1926b0e120843ecd2d Mon Sep 17 00:00:00 2001 From: Raphael Borg Ellul Vincenti Date: Mon, 4 Aug 2025 08:48:26 +0200 Subject: [PATCH 2/4] feat: iterate dynamically based on the amount of results returned --- .../clone/GiteaCloneDialogRepositoryListLoaderImpl.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt index f7346ec..28bda8e 100644 --- a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt +++ b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt @@ -51,13 +51,17 @@ internal class GiteaCloneDialogRepositoryListLoaderImpl : GiteaCloneDialogReposi val user = userApi.userGetCurrent().execute().body() ?: return@submitIOTask val allRepos = mutableListOf() - for (page in 1..99) { + var page = 1 + val perPage = 50 + while (true) { indicator.checkCanceled() - val pageResult = userApi.userCurrentListRepos(page, 100).execute().body() ?: break + val pageResult = userApi.userCurrentListRepos(page, perPage).execute().body() ?: break if (pageResult.isEmpty()) break allRepos.addAll(pageResult) + if (pageResult.size < perPage) break + page += 1 } - + if (allRepos.isEmpty()) return@submitIOTask val mutableList = allRepos runInEdt { From 92e30d819ba6dd6f0f776f4c69c5a626dd8fa9e9 Mon Sep 17 00:00:00 2001 From: Raphael Borg Ellul Vincenti Date: Mon, 4 Aug 2025 09:11:32 +0200 Subject: [PATCH 3/4] feat: sort repositories by org and name for easier search --- .../ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt index 28bda8e..6659aaf 100644 --- a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt +++ b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt @@ -63,7 +63,11 @@ internal class GiteaCloneDialogRepositoryListLoaderImpl : GiteaCloneDialogReposi } if (allRepos.isEmpty()) return@submitIOTask - val mutableList = allRepos + val mutableList = allRepos.sortedWith(compareBy({ repo -> + val owner = repo.owner?.login?.lowercase() ?: "" + val userLogin = user.login?.lowercase() ?: "" + if (owner == userLogin) 0 else 1 + }, { repo -> repo.owner?.login?.lowercase() ?: "" }, { repo -> repo.name?.lowercase() ?: "" })).toMutableList() runInEdt { indicator.checkCanceled() preservingSelection(listModel, listSelectionModel) { From c27842b49975fffc7d85a5562952d18e9b410c75 Mon Sep 17 00:00:00 2001 From: Raphael Borg Ellul Vincenti Date: Mon, 4 Aug 2025 09:21:30 +0200 Subject: [PATCH 4/4] feat: add configuration for pagesize when fetching repositories --- .../github/leondevlifelog/gitea/services/GiteaSettings.kt | 3 +++ .../leondevlifelog/gitea/ui/GiteaSettingsConfigurable.kt | 5 +++++ .../ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt | 2 +- src/main/resources/messages/GiteaBundle.properties | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/github/leondevlifelog/gitea/services/GiteaSettings.kt b/src/main/kotlin/com/github/leondevlifelog/gitea/services/GiteaSettings.kt index ba9da95..c213d52 100644 --- a/src/main/kotlin/com/github/leondevlifelog/gitea/services/GiteaSettings.kt +++ b/src/main/kotlin/com/github/leondevlifelog/gitea/services/GiteaSettings.kt @@ -21,7 +21,10 @@ class GiteaSettings : PersistentStateComponent { return GiteaApi(baseUrl, token) } + fun getReposPerPage(): Int = myState.REPOS_PER_PAGE + fun setReposPerPage(value: Int) { myState.REPOS_PER_PAGE = value.coerceAtMost(50).coerceAtLeast(1) } class State { + var REPOS_PER_PAGE = 50 var OPEN_IN_BROWSER_GIST = true var COPY_URL_GIST = false diff --git a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/GiteaSettingsConfigurable.kt b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/GiteaSettingsConfigurable.kt index 8b30e01..362a57e 100644 --- a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/GiteaSettingsConfigurable.kt +++ b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/GiteaSettingsConfigurable.kt @@ -55,6 +55,11 @@ class GiteaSettingsConfigurable internal constructor(private val project: Projec settings::isCloneGitUsingSsh, settings::setCloneGitUsingSsh ) } + row(GiteaBundle.message("settings.repos.per.page")) { + intTextField(range = 1..50).columns(2).bindIntText({ settings.getReposPerPage() }, { + settings.setReposPerPage(it) + }).gap(RightGap.SMALL) + } row(GiteaBundle.message("settings.timeout")) { intTextField(range = 0..60).columns(2).bindIntText({ settings.getConnectionTimeout() / 1000 }, { settings.setConnectionTimeout(it * 1000) diff --git a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt index 6659aaf..c4fe71d 100644 --- a/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt +++ b/src/main/kotlin/com/github/leondevlifelog/gitea/ui/clone/GiteaCloneDialogRepositoryListLoaderImpl.kt @@ -52,7 +52,7 @@ internal class GiteaCloneDialogRepositoryListLoaderImpl : GiteaCloneDialogReposi val allRepos = mutableListOf() var page = 1 - val perPage = 50 + val perPage = service().getReposPerPage() while (true) { indicator.checkCanceled() val pageResult = userApi.userCurrentListRepos(page, perPage).execute().body() ?: break diff --git a/src/main/resources/messages/GiteaBundle.properties b/src/main/resources/messages/GiteaBundle.properties index d6329de..d6ea832 100644 --- a/src/main/resources/messages/GiteaBundle.properties +++ b/src/main/resources/messages/GiteaBundle.properties @@ -36,6 +36,7 @@ settings.timeout.seconds=seconds settings.timeout=Timeout settings.clone.ssh=Using ssh to clone settings.ssh.port=SSH Clone Port +settings.repos.per.page=List Repositories page size accounts.default.missing=missing default account clone.error.load.repositories=error when load repos accounts.relogin=Re-login