From 5b61bdc3a81d5704ca283271b4ea25874fce778f Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 25 Mar 2023 19:37:50 +0100 Subject: [PATCH 1/6] add size field to Category data class (#519) Makes it possible to display the size of a category to the user --- .../suwayomi/tachidesk/manga/impl/Category.kt | 17 +++++++++++++---- .../manga/model/dataclass/CategoryDataClass.kt | 1 + .../manga/model/table/CategoryTable.kt | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Category.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Category.kt index ad684c04e..92e7ede9f 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Category.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Category.kt @@ -18,7 +18,6 @@ import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.update import suwayomi.tachidesk.manga.impl.CategoryManga.removeMangaFromCategory -import suwayomi.tachidesk.manga.impl.util.lang.isNotEmpty import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass import suwayomi.tachidesk.manga.model.table.CategoryMangaTable import suwayomi.tachidesk.manga.model.table.CategoryMetaTable @@ -98,12 +97,14 @@ object Category { const val DEFAULT_CATEGORY_ID = 0 const val DEFAULT_CATEGORY_NAME = "Default" - private fun addDefaultIfNecessary(categories: List): List = - if (MangaTable.select { (MangaTable.inLibrary eq true) and (MangaTable.defaultCategory eq true) }.isNotEmpty()) { - listOf(CategoryDataClass(DEFAULT_CATEGORY_ID, 0, DEFAULT_CATEGORY_NAME, true)) + categories + private fun addDefaultIfNecessary(categories: List): List { + val defaultCategorySize = MangaTable.select { (MangaTable.inLibrary eq true) and (MangaTable.defaultCategory eq true) }.count().toInt() + return if (defaultCategorySize > 0) { + listOf(CategoryDataClass(DEFAULT_CATEGORY_ID, 0, DEFAULT_CATEGORY_NAME, true, defaultCategorySize)) + categories } else { categories } + } fun getCategoryList(): List { return transaction { @@ -123,6 +124,14 @@ object Category { } } + fun getCategorySize(categoryId: Int): Int { + return transaction { + CategoryMangaTable.select { + CategoryMangaTable.category eq categoryId + }.count().toInt() + } + } + fun getCategoryMetaMap(categoryId: Int): Map { return transaction { CategoryMetaTable.select { CategoryMetaTable.ref eq categoryId } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/CategoryDataClass.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/CategoryDataClass.kt index 3e7fd1fb6..70389d48f 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/CategoryDataClass.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/CategoryDataClass.kt @@ -12,5 +12,6 @@ data class CategoryDataClass( val order: Int, val name: String, val default: Boolean, + val size: Int, val meta: Map = emptyMap() ) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/table/CategoryTable.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/table/CategoryTable.kt index 8d8a08ab5..32bef6b6c 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/table/CategoryTable.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/table/CategoryTable.kt @@ -23,5 +23,6 @@ fun CategoryTable.toDataClass(categoryEntry: ResultRow) = CategoryDataClass( categoryEntry[order], categoryEntry[name], categoryEntry[isDefault], + Category.getCategorySize(categoryEntry[id].value), Category.getCategoryMetaMap(categoryEntry[id].value) ) From dcde4947e83f4850a037184aff9c158233d23a5c Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 25 Mar 2023 19:38:42 +0100 Subject: [PATCH 2/6] Emit update to clients after adding all mangas to the queue (#521) Emitting updates before all the mangas were added to the queue could lead to e.g. wrong progress calculation. --- .../manga/controller/UpdateController.kt | 15 +++++++-------- .../tachidesk/manga/impl/update/IUpdater.kt | 2 +- .../tachidesk/manga/impl/update/Updater.kt | 10 +++++++--- .../tachidesk/manga/impl/update/TestUpdater.kt | 4 ++-- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt index a86da540c..85b78a8ab 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt @@ -93,14 +93,13 @@ object UpdateController { if (clear) { updater.reset() } - categories - .flatMap { CategoryManga.getCategoryMangaList(it.id) } - .distinctBy { it.id } - .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, MangaDataClass::title)) - .filter { it.updateStrategy == UpdateStrategy.ALWAYS_UPDATE } - .forEach { manga -> - updater.addMangaToQueue(manga) - } + updater.addMangasToQueue( + categories + .flatMap { CategoryManga.getCategoryMangaList(it.id) } + .distinctBy { it.id } + .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, MangaDataClass::title)) + .filter { it.updateStrategy == UpdateStrategy.ALWAYS_UPDATE } + ) } fun categoryUpdateWS(ws: WsConfig) { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/IUpdater.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/IUpdater.kt index 33c20bf8d..a69225727 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/IUpdater.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/IUpdater.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.flow.StateFlow import suwayomi.tachidesk.manga.model.dataclass.MangaDataClass interface IUpdater { - fun addMangaToQueue(manga: MangaDataClass) + fun addMangasToQueue(mangas: List) val status: StateFlow fun reset() } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt index 7316038a4..5cef31ab7 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt @@ -74,13 +74,17 @@ class Updater : IUpdater { return tracker.values.toList() } - override fun addMangaToQueue(manga: MangaDataClass) { + override fun addMangasToQueue(mangas: List) { + mangas.forEach { tracker[it.id] = UpdateJob(it) } + _status.update { UpdateStatus(tracker.values.toList(), true) } + mangas.forEach { addMangaToQueue(it) } + } + + private fun addMangaToQueue(manga: MangaDataClass) { val updateChannel = getOrCreateUpdateChannelFor(manga.sourceId) scope.launch { updateChannel.send(UpdateJob(manga)) } - tracker[manga.id] = UpdateJob(manga) - _status.update { UpdateStatus(tracker.values.toList(), true) } } override fun reset() { diff --git a/server/src/test/kotlin/suwayomi/tachidesk/manga/impl/update/TestUpdater.kt b/server/src/test/kotlin/suwayomi/tachidesk/manga/impl/update/TestUpdater.kt index b4c7f8a17..cd1a66dba 100644 --- a/server/src/test/kotlin/suwayomi/tachidesk/manga/impl/update/TestUpdater.kt +++ b/server/src/test/kotlin/suwayomi/tachidesk/manga/impl/update/TestUpdater.kt @@ -13,8 +13,8 @@ class TestUpdater : IUpdater { private val _status = MutableStateFlow(UpdateStatus()) override val status: StateFlow = _status.asStateFlow() - override fun addMangaToQueue(manga: MangaDataClass) { - updateQueue.add(UpdateJob(manga)) + override fun addMangasToQueue(mangas: List) { + mangas.forEach { updateQueue.add(UpdateJob(it)) } isRunning = true updateStatus() } From 9a50f2e4089c6766388adefc397f8fd59bcc063c Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Mon, 27 Mar 2023 15:41:19 +0200 Subject: [PATCH 3/6] Notify clients even if no manga gets updated (#531) In case no manga gets updated and no update job was running before, the client would never receive an info about its update request --- .../tachidesk/manga/controller/UpdateController.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt index 85b78a8ab..172c7d96c 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt @@ -93,13 +93,20 @@ object UpdateController { if (clear) { updater.reset() } - updater.addMangasToQueue( - categories + + val mangasToUpdate = categories .flatMap { CategoryManga.getCategoryMangaList(it.id) } .distinctBy { it.id } .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, MangaDataClass::title)) .filter { it.updateStrategy == UpdateStrategy.ALWAYS_UPDATE } - ) + + // In case no manga gets updated and no update job was running before, the client would never receive an info about its update request + if (mangasToUpdate.isEmpty()) { + UpdaterSocket.notifyAllClients(UpdateStatus()) + return + } + + updater.addMangasToQueue(mangasToUpdate) } fun categoryUpdateWS(ws: WsConfig) { From d3aa32147a017113c1a4fecf437518133a116e12 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Mon, 27 Mar 2023 18:45:46 +0200 Subject: [PATCH 4/6] Add logic to only update specific categories (#520) Makes it possible to only update specific categories. In case a manga is in an excluded category it will be excluded even if it is also in an included category. --- .../manga/controller/CategoryController.kt | 5 ++-- .../manga/controller/UpdateController.kt | 30 ++++++++++++------- .../suwayomi/tachidesk/manga/impl/Category.kt | 6 ++-- .../tachidesk/manga/impl/CategoryManga.kt | 16 ++++++++++ .../tachidesk/manga/impl/update/Updater.kt | 2 +- .../model/dataclass/CategoryDataClass.kt | 11 +++++++ .../manga/model/table/CategoryTable.kt | 3 ++ .../M0026_CategoryIncludeInUpdate.kt | 19 ++++++++++++ 8 files changed, 77 insertions(+), 15 deletions(-) create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/server/database/migration/M0026_CategoryIncludeInUpdate.kt diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/CategoryController.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/CategoryController.kt index 96b56b5ac..c4ec3ef3f 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/CategoryController.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/CategoryController.kt @@ -61,14 +61,15 @@ object CategoryController { pathParam("categoryId"), formParam("name"), formParam("default"), + formParam("includeInUpdate"), documentWith = { withOperation { summary("Category modify") description("Modify a category") } }, - behaviorOf = { ctx, categoryId, name, isDefault -> - Category.updateCategory(categoryId, name, isDefault) + behaviorOf = { ctx, categoryId, name, isDefault, includeInUpdate -> + Category.updateCategory(categoryId, name, isDefault, includeInUpdate) ctx.status(200) }, withResults = { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt index 172c7d96c..06f055a68 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt @@ -13,10 +13,7 @@ import suwayomi.tachidesk.manga.impl.Chapter import suwayomi.tachidesk.manga.impl.update.IUpdater import suwayomi.tachidesk.manga.impl.update.UpdateStatus import suwayomi.tachidesk.manga.impl.update.UpdaterSocket -import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass -import suwayomi.tachidesk.manga.model.dataclass.MangaChapterDataClass -import suwayomi.tachidesk.manga.model.dataclass.MangaDataClass -import suwayomi.tachidesk.manga.model.dataclass.PaginatedList +import suwayomi.tachidesk.manga.model.dataclass.* import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.util.formParam import suwayomi.tachidesk.server.util.handler @@ -94,11 +91,21 @@ object UpdateController { updater.reset() } - val mangasToUpdate = categories - .flatMap { CategoryManga.getCategoryMangaList(it.id) } - .distinctBy { it.id } - .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, MangaDataClass::title)) - .filter { it.updateStrategy == UpdateStrategy.ALWAYS_UPDATE } + val includeInUpdateStatusToCategoryMap = categories.groupBy { it.includeInUpdate } + val excludedCategories = includeInUpdateStatusToCategoryMap[IncludeInUpdate.EXCLUDE].orEmpty() + val includedCategories = includeInUpdateStatusToCategoryMap[IncludeInUpdate.INCLUDE].orEmpty() + val unsetCategories = includeInUpdateStatusToCategoryMap[IncludeInUpdate.UNSET].orEmpty() + val categoriesToUpdate = includedCategories.ifEmpty { unsetCategories } + + logger.debug { "Updating categories: '${categoriesToUpdate.joinToString("', '") { it.name }}'" } + + val categoriesToUpdateMangas = categoriesToUpdate + .flatMap { CategoryManga.getCategoryMangaList(it.id) } + .distinctBy { it.id } + val mangasToCategoriesMap = CategoryManga.getMangasCategories(categoriesToUpdateMangas.map { it.id }) + val mangasToUpdate = categoriesToUpdateMangas + .filter { it.updateStrategy == UpdateStrategy.ALWAYS_UPDATE } + .filter { !excludedCategories.any { category -> mangasToCategoriesMap[it.id]?.contains(category) == true } } // In case no manga gets updated and no update job was running before, the client would never receive an info about its update request if (mangasToUpdate.isEmpty()) { @@ -106,7 +113,10 @@ object UpdateController { return } - updater.addMangasToQueue(mangasToUpdate) + updater.addMangasToQueue( + mangasToUpdate + .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, MangaDataClass::title)), + ) } fun categoryUpdateWS(ws: WsConfig) { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Category.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Category.kt index 92e7ede9f..6e6ac6491 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Category.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Category.kt @@ -19,6 +19,7 @@ import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.update import suwayomi.tachidesk.manga.impl.CategoryManga.removeMangaFromCategory import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass +import suwayomi.tachidesk.manga.model.dataclass.IncludeInUpdate import suwayomi.tachidesk.manga.model.table.CategoryMangaTable import suwayomi.tachidesk.manga.model.table.CategoryMetaTable import suwayomi.tachidesk.manga.model.table.CategoryTable @@ -49,11 +50,12 @@ object Category { } } - fun updateCategory(categoryId: Int, name: String?, isDefault: Boolean?) { + fun updateCategory(categoryId: Int, name: String?, isDefault: Boolean?, includeInUpdate: Int?) { transaction { CategoryTable.update({ CategoryTable.id eq categoryId }) { if (name != null && !name.equals(DEFAULT_CATEGORY_NAME, ignoreCase = true)) it[CategoryTable.name] = name if (isDefault != null) it[CategoryTable.isDefault] = isDefault + if (includeInUpdate != null) it[CategoryTable.includeInUpdate] = includeInUpdate } } } @@ -100,7 +102,7 @@ object Category { private fun addDefaultIfNecessary(categories: List): List { val defaultCategorySize = MangaTable.select { (MangaTable.inLibrary eq true) and (MangaTable.defaultCategory eq true) }.count().toInt() return if (defaultCategorySize > 0) { - listOf(CategoryDataClass(DEFAULT_CATEGORY_ID, 0, DEFAULT_CATEGORY_NAME, true, defaultCategorySize)) + categories + listOf(CategoryDataClass(DEFAULT_CATEGORY_ID, 0, DEFAULT_CATEGORY_NAME, true, defaultCategorySize, IncludeInUpdate.UNSET)) + categories } else { categories } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/CategoryManga.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/CategoryManga.kt index 8316dcc75..b571c53d1 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/CategoryManga.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/CategoryManga.kt @@ -116,4 +116,20 @@ object CategoryManga { } } } + + fun getMangasCategories(mangaIDs: List): Map> { + return buildMap { + transaction { + CategoryMangaTable.innerJoin(CategoryTable) + .select { CategoryMangaTable.manga inList mangaIDs } + .groupBy { it[CategoryMangaTable.manga] } + .forEach { + val mangaId = it.key.value + val categories = it.value + + set(mangaId, categories.map { category -> CategoryTable.toDataClass(category) }) + } + } + } + } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt index 5cef31ab7..446011d73 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt @@ -76,7 +76,7 @@ class Updater : IUpdater { override fun addMangasToQueue(mangas: List) { mangas.forEach { tracker[it.id] = UpdateJob(it) } - _status.update { UpdateStatus(tracker.values.toList(), true) } + _status.update { UpdateStatus(tracker.values.toList(), mangas.isNotEmpty()) } mangas.forEach { addMangaToQueue(it) } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/CategoryDataClass.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/CategoryDataClass.kt index 70389d48f..641aeea19 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/CategoryDataClass.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/dataclass/CategoryDataClass.kt @@ -1,5 +1,7 @@ package suwayomi.tachidesk.manga.model.dataclass +import com.fasterxml.jackson.annotation.JsonValue + /* * Copyright (C) Contributors to the Suwayomi project * @@ -7,11 +9,20 @@ package suwayomi.tachidesk.manga.model.dataclass * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +enum class IncludeInUpdate(@JsonValue val value: Int) { + EXCLUDE(0), INCLUDE(1), UNSET(-1); + + companion object { + fun fromValue(value: Int) = IncludeInUpdate.values().find { it.value == value } ?: UNSET + } +} + data class CategoryDataClass( val id: Int, val order: Int, val name: String, val default: Boolean, val size: Int, + val includeInUpdate: IncludeInUpdate, val meta: Map = emptyMap() ) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/table/CategoryTable.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/table/CategoryTable.kt index 32bef6b6c..47e86a39a 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/model/table/CategoryTable.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/model/table/CategoryTable.kt @@ -11,11 +11,13 @@ import org.jetbrains.exposed.dao.id.IntIdTable import org.jetbrains.exposed.sql.ResultRow import suwayomi.tachidesk.manga.impl.Category import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass +import suwayomi.tachidesk.manga.model.dataclass.IncludeInUpdate object CategoryTable : IntIdTable() { val name = varchar("name", 64) val order = integer("order").default(0) val isDefault = bool("is_default").default(false) + val includeInUpdate = integer("include_in_update").default(IncludeInUpdate.UNSET.value) } fun CategoryTable.toDataClass(categoryEntry: ResultRow) = CategoryDataClass( @@ -24,5 +26,6 @@ fun CategoryTable.toDataClass(categoryEntry: ResultRow) = CategoryDataClass( categoryEntry[name], categoryEntry[isDefault], Category.getCategorySize(categoryEntry[id].value), + IncludeInUpdate.fromValue(categoryEntry[includeInUpdate]), Category.getCategoryMetaMap(categoryEntry[id].value) ) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/database/migration/M0026_CategoryIncludeInUpdate.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/database/migration/M0026_CategoryIncludeInUpdate.kt new file mode 100644 index 000000000..15f92ef21 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/database/migration/M0026_CategoryIncludeInUpdate.kt @@ -0,0 +1,19 @@ +package suwayomi.tachidesk.server.database.migration + +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +import de.neonew.exposed.migrations.helpers.AddColumnMigration +import suwayomi.tachidesk.manga.model.dataclass.IncludeInUpdate + +@Suppress("ClassName", "unused") +class M0026_CategoryIncludeInUpdate : AddColumnMigration( + "Category", + "include_in_update", + "INT", + IncludeInUpdate.UNSET.value.toString() +) From 871c28b1ea51c2e03bf5754a949e467df555b90d Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Mon, 27 Mar 2023 21:26:37 +0330 Subject: [PATCH 5/6] cleanup notes --- CONTRIBUTING.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d1354beff..7eb85fbaa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,9 +2,10 @@ ## Where should I start? Checkout [This Kanban Board](https://github.com/Suwayomi/Tachidesk/projects/1) to see the rough development roadmap. -**Note 1:** Notify the developers on [Suwayomi discord](https://discord.gg/DDZdqZWaHA) (#tachidesk-server and #tachidesk-webui channels) or open a WIP pull request before starting if you decide to take on working on anything from/not from the roadmap in order to avoid parallel efforts on the same issue/feature. - -**Note 2:** Your pull request will be squashed into a single commit. +### Important notes +- Notify the developers on [Suwayomi discord](https://discord.gg/DDZdqZWaHA) (#tachidesk-server and #tachidesk-webui channels) or open a WIP pull request before starting if you decide to take on working on anything from/not from the roadmap in order to avoid parallel efforts on the same issue/feature. +- Your pull request will be squashed into a single commit. +- We hate big pull requests, make them as small as possible, change one meaningfull thing. Spam pull requests, we don't mind. ### Project goals and vision - Porting Tachiyomi and covering it's features From f2a650ba02e1ffd25313e354a98bb72ead322fd9 Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Mon, 27 Mar 2023 21:27:10 +0330 Subject: [PATCH 6/6] fix typo --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7eb85fbaa..28923d57f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ Checkout [This Kanban Board](https://github.com/Suwayomi/Tachidesk/projects/1) t ### Important notes - Notify the developers on [Suwayomi discord](https://discord.gg/DDZdqZWaHA) (#tachidesk-server and #tachidesk-webui channels) or open a WIP pull request before starting if you decide to take on working on anything from/not from the roadmap in order to avoid parallel efforts on the same issue/feature. - Your pull request will be squashed into a single commit. -- We hate big pull requests, make them as small as possible, change one meaningfull thing. Spam pull requests, we don't mind. +- We hate big pull requests, make them as small as possible, change one meaningful thing. Spam pull requests, we don't mind. ### Project goals and vision - Porting Tachiyomi and covering it's features