Merge branch '2788-migrate-repo-order' into 'master'

Maintain legacy repo priority ordering when migrating

Closes #2788

See merge request fdroid/fdroidclient!1387
This commit is contained in:
Hans-Christoph Steiner
2024-05-03 08:39:53 +00:00
4 changed files with 26 additions and 25 deletions

View File

@@ -134,8 +134,8 @@ public class DBHelper {
}
/**
* Load Additional Repos first, then Default Repos. This way, Default
* Repos will be shown after the OEM-added ones on the Manage Repos
* Load Default Repos first, then Additional Repos. This way, the OEM-added repos
* will be shown after the default ones (i.e. lower priority) on the Manage Repos
* screen. This throws a hard {@code Exception} on parse errors since
* Default Repos are built into the APK. So it should fail as hard and fast
* as possible so the developer catches the problem.
@@ -164,9 +164,10 @@ public class DBHelper {
") != 0, FYI the priority item was removed in v1.16");
}
// add default repos first, so they are at the top of the list with higher priority
List<String> repos = new ArrayList<>(additionalRepos.size() + defaultRepos.size());
repos.addAll(additionalRepos);
repos.addAll(defaultRepos);
repos.addAll(additionalRepos);
final int descriptionIndex = 2;
for (int i = descriptionIndex; i < repos.size(); i += REPO_XML_ITEM_COUNT) {

View File

@@ -316,9 +316,9 @@ public class DBHelperTest {
String[] defaultRepos = context.getResources().getStringArray(R.array.default_repos);
List<String> shouldBeRepos = new LinkedList<>();
shouldBeRepos.addAll(Arrays.asList(defaultRepos));
shouldBeRepos.addAll(oem0);
shouldBeRepos.addAll(oem1);
shouldBeRepos.addAll(Arrays.asList(defaultRepos));
// Normalize whitespace in descriptions, just like DBHelper does.
final int descriptionIndex = 2;

View File

@@ -106,13 +106,13 @@ internal class MultiRepoMigrationTest {
db.getRepositoryDao().getRepositories().sortedByDescending { it.weight }.also { repos ->
assertEquals(reposToMigrate.size, repos.size)
assertEquals(reposToMigrate.size, repos.map { it.weight }.toSet().size)
assertEquals(fdroidRepo.address, repos[0].address)
assertEquals(guardianRepo.address, repos[0].address)
assertEquals(1_000_000_000, repos[0].weight)
assertEquals(fdroidArchiveRepo.address, repos[1].address)
assertEquals(guardianArchiveRepo.address, repos[1].address)
assertEquals(999_999_999, repos[1].weight)
assertEquals(guardianRepo.address, repos[2].address)
assertEquals(fdroidRepo.address, repos[2].address)
assertEquals(999_999_998, repos[2].weight)
assertEquals(guardianArchiveRepo.address, repos[3].address)
assertEquals(fdroidArchiveRepo.address, repos[3].address)
assertEquals(999_999_997, repos[3].weight)
}
}
@@ -148,18 +148,18 @@ internal class MultiRepoMigrationTest {
db.getRepositoryDao().getRepositories().sortedByDescending { it.weight }.also { repos ->
assertEquals(reposToMigrate.size, repos.size)
assertEquals(reposToMigrate.size, repos.map { it.weight }.toSet().size)
assertEquals(fdroidRepo.address, repos[0].address)
assertEquals("https://example.com/fdroid/repo", repos[0].address)
assertEquals(1_000_000_000, repos[0].weight)
assertEquals(fdroidArchiveRepo.address, repos[1].address)
assertEquals(999_999_999, repos[1].weight)
assertEquals("https://example.org/fdroid/repo", repos[1].address)
assertEquals(999_999_998, repos[1].weight) // space for archive above
assertEquals(guardianRepo.address, repos[2].address)
assertEquals(999_999_998, repos[2].weight)
assertEquals(999_999_996, repos[2].weight)
assertEquals(guardianArchiveRepo.address, repos[3].address)
assertEquals(999_999_997, repos[3].weight)
assertEquals("https://example.org/fdroid/repo", repos[4].address)
assertEquals(999_999_996, repos[4].weight)
assertEquals("https://example.com/fdroid/repo", repos[5].address)
assertEquals(999_999_994, repos[5].weight) // space for archive above
assertEquals(999_999_995, repos[3].weight)
assertEquals(fdroidRepo.address, repos[4].address)
assertEquals(999_999_994, repos[4].weight)
assertEquals(fdroidArchiveRepo.address, repos[5].address)
assertEquals(999_999_993, repos[5].weight)
}
}
}
@@ -183,12 +183,12 @@ internal class MultiRepoMigrationTest {
db.getRepositoryDao().getRepositories().sortedByDescending { it.weight }.also { repos ->
assertEquals(reposToMigrate.size, repos.size)
assertEquals(reposToMigrate.size, repos.map { it.weight }.toSet().size)
assertEquals("https://example.org/fdroid/repo", repos[0].address)
assertEquals(1_000_000_000, repos[0].weight)
assertEquals(guardianRepo.address, repos[1].address)
assertEquals(999_999_998, repos[1].weight) // space for archive above
assertEquals(fdroidArchiveRepo.address, repos[2].address)
assertEquals(999_999_996, repos[2].weight) // space for archive above
assertEquals(guardianRepo.address, repos[0].address)
assertEquals(1_000_000_000, repos[0].weight) // space for archive below
assertEquals("https://example.org/fdroid/repo", repos[1].address)
assertEquals(999_999_998, repos[1].weight)
assertEquals(fdroidArchiveRepo.address, repos[2].address) // archive at the end
assertEquals(999_999_996, repos[2].weight)
}
}
}

View File

@@ -33,7 +33,7 @@ internal class MultiRepoMigration : AutoMigrationSpec {
"""
SELECT repoId, address, certificate, weight FROM ${CoreRepository.TABLE}
JOIN ${RepositoryPreferences.TABLE} USING (repoId)
ORDER BY weight ASC"""
ORDER BY weight DESC"""
).use { cursor ->
while (cursor.moveToNext()) {
val repo = getRepo(cursor)
@@ -54,7 +54,7 @@ internal class MultiRepoMigration : AutoMigrationSpec {
}
// now go through all repos and adapt their weight,
// so that repos with a low weight get a high weight with space for archive repos
// so that repos get a higher weight with space for archive repos
var nextWeight = REPO_WEIGHT
repos.forEach { repo ->
val archiveRepo = archiveMap[repo.certificate]