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 4cbcb95..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 @@ -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,25 @@ 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() + var page = 1 + val perPage = service().getReposPerPage() + while (true) { + indicator.checkCanceled() + 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.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) { 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