diff --git a/assets/coverage-badge.svg b/assets/coverage-badge.svg index 718bd0e..4257307 100644 --- a/assets/coverage-badge.svg +++ b/assets/coverage-badge.svg @@ -11,7 +11,7 @@ coverage coverage - 19.5% - 19.5% + 19.8% + 19.8% diff --git a/internal/translations/default.pot b/internal/translations/default.pot index d5caa4e..5ea6ec7 100644 --- a/internal/translations/default.pot +++ b/internal/translations/default.pot @@ -365,69 +365,69 @@ msgstr "" msgid "Building package" msgstr "" -#: pkg/build/build.go:231 +#: pkg/build/build.go:208 +msgid "The checksums array must be the same length as sources" +msgstr "" + +#: pkg/build/build.go:235 msgid "Downloading sources" msgstr "" -#: pkg/build/build.go:253 +#: pkg/build/build.go:257 msgid "Building package metadata" msgstr "" -#: pkg/build/build.go:275 +#: pkg/build/build.go:279 msgid "Compressing package" msgstr "" -#: pkg/build/build.go:434 +#: pkg/build/build.go:438 msgid "" "Your system's CPU architecture doesn't match this package. Do you want to " "build anyway?" msgstr "" -#: pkg/build/build.go:448 +#: pkg/build/build.go:452 msgid "This package is already installed" msgstr "" -#: pkg/build/build.go:472 +#: pkg/build/build.go:476 msgid "Installing build dependencies" msgstr "" -#: pkg/build/build.go:513 +#: pkg/build/build.go:517 msgid "Installing dependencies" msgstr "" -#: pkg/build/build.go:548 -msgid "The checksums array must be the same length as sources" -msgstr "" - -#: pkg/build/build.go:599 +#: pkg/build/build.go:598 msgid "Would you like to remove the build dependencies?" msgstr "" -#: pkg/build/build.go:662 +#: pkg/build/build.go:661 msgid "Executing prepare()" msgstr "" -#: pkg/build/build.go:672 +#: pkg/build/build.go:671 msgid "Executing build()" msgstr "" -#: pkg/build/build.go:702 pkg/build/build.go:722 +#: pkg/build/build.go:701 pkg/build/build.go:721 msgid "Executing %s()" msgstr "" -#: pkg/build/build.go:781 +#: pkg/build/build.go:780 msgid "Error installing native packages" msgstr "" -#: pkg/build/build.go:805 +#: pkg/build/build.go:804 msgid "Error installing package" msgstr "" -#: pkg/build/build.go:864 +#: pkg/build/build.go:863 msgid "AutoProv is not implemented for this package format, so it's skipped" msgstr "" -#: pkg/build/build.go:875 +#: pkg/build/build.go:874 msgid "AutoReq is not implemented for this package format, so it's skipped" msgstr "" diff --git a/internal/translations/po/ru/default.po b/internal/translations/po/ru/default.po index 42a41eb..cd7932d 100644 --- a/internal/translations/po/ru/default.po +++ b/internal/translations/po/ru/default.po @@ -12,8 +12,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Gtranslator 47.1\n" #: build.go:44 @@ -379,19 +379,23 @@ msgstr "Не удалось предложить пользователю про msgid "Building package" msgstr "Сборка пакета" -#: pkg/build/build.go:231 +#: pkg/build/build.go:208 +msgid "The checksums array must be the same length as sources" +msgstr "Массив контрольных сумм должен быть той же длины, что и источники" + +#: pkg/build/build.go:235 msgid "Downloading sources" msgstr "Скачивание источников" -#: pkg/build/build.go:253 +#: pkg/build/build.go:257 msgid "Building package metadata" msgstr "Сборка метаданных пакета" -#: pkg/build/build.go:275 +#: pkg/build/build.go:279 msgid "Compressing package" msgstr "Сжатие пакета" -#: pkg/build/build.go:434 +#: pkg/build/build.go:438 msgid "" "Your system's CPU architecture doesn't match this package. Do you want to " "build anyway?" @@ -399,52 +403,48 @@ msgstr "" "Архитектура процессора вашей системы не соответствует этому пакету. Вы все " "равно хотите выполнить сборку?" -#: pkg/build/build.go:448 +#: pkg/build/build.go:452 msgid "This package is already installed" msgstr "Этот пакет уже установлен" -#: pkg/build/build.go:472 +#: pkg/build/build.go:476 msgid "Installing build dependencies" msgstr "Установка зависимостей сборки" -#: pkg/build/build.go:513 +#: pkg/build/build.go:517 msgid "Installing dependencies" msgstr "Установка зависимостей" -#: pkg/build/build.go:548 -msgid "The checksums array must be the same length as sources" -msgstr "Массив контрольных сумм должен быть той же длины, что и источники" - -#: pkg/build/build.go:599 +#: pkg/build/build.go:598 msgid "Would you like to remove the build dependencies?" msgstr "Хотели бы вы удалить зависимости сборки?" -#: pkg/build/build.go:662 +#: pkg/build/build.go:661 msgid "Executing prepare()" msgstr "Исполнение prepare()" -#: pkg/build/build.go:672 +#: pkg/build/build.go:671 msgid "Executing build()" msgstr "Исполнение build()" -#: pkg/build/build.go:702 pkg/build/build.go:722 +#: pkg/build/build.go:701 pkg/build/build.go:721 msgid "Executing %s()" msgstr "Исполнение %s()" -#: pkg/build/build.go:781 +#: pkg/build/build.go:780 msgid "Error installing native packages" msgstr "Ошибка при установке нативных пакетов" -#: pkg/build/build.go:805 +#: pkg/build/build.go:804 msgid "Error installing package" msgstr "Ошибка при установке пакета" -#: pkg/build/build.go:864 +#: pkg/build/build.go:863 msgid "AutoProv is not implemented for this package format, so it's skipped" msgstr "" "AutoProv не реализовано для этого формата пакета, поэтому будет пропущено" -#: pkg/build/build.go:875 +#: pkg/build/build.go:874 msgid "AutoReq is not implemented for this package format, so it's skipped" msgstr "" "AutoReq не реализовано для этого формата пакета, поэтому будет пропущено" diff --git a/pkg/build/build.go b/pkg/build/build.go index f7af40f..f47e287 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -203,8 +203,12 @@ func (b *Builder) BuildPackage(ctx context.Context) ([]string, []string, error) buildDepends = removeDuplicates(buildDepends) optDepends = removeDuplicates(optDepends) depends = removeDuplicates(depends) - sources = removeDuplicates(sources) - checksums = removeDuplicates(checksums) + + if len(sources) != len(checksums) { + slog.Error(gotext.Get("The checksums array must be the same length as sources")) + os.Exit(1) + } + sources, checksums = removeDuplicatesSources(sources, checksums) mergedVars := types.BuildVars{ Sources: sources, @@ -544,11 +548,6 @@ func (b *Builder) buildALRDeps(ctx context.Context, depends []string) (builtPath } func (b *Builder) getSources(ctx context.Context, dirs types.Directories, bv *types.BuildVars) error { - if len(bv.Sources) != len(bv.Checksums) { - slog.Error(gotext.Get("The checksums array must be the same length as sources")) - os.Exit(1) - } - for i, src := range bv.Sources { opts := dl.Options{ Name: fmt.Sprintf("%s[%d]", bv.Name, i), diff --git a/pkg/build/utils.go b/pkg/build/utils.go index 7354ca6..33656c6 100644 --- a/pkg/build/utils.go +++ b/pkg/build/utils.go @@ -313,3 +313,24 @@ func removeDuplicates(slice []string) []string { return result } + +func removeDuplicatesSources(sources, checksums []string) ([]string, []string) { + seen := map[string]string{} + keys := make([]string, 0) + for i, s := range sources { + if val, ok := seen[s]; !ok || strings.EqualFold(val, "SKIP") { + if !ok { + keys = append(keys, s) + } + seen[s] = checksums[i] + } + } + + newSources := make([]string, len(keys)) + newChecksums := make([]string, len(keys)) + for i, k := range keys { + newSources[i] = k + newChecksums[i] = seen[k] + } + return newSources, newChecksums +} diff --git a/pkg/build/utils_internal_test.go b/pkg/build/utils_internal_test.go new file mode 100644 index 0000000..a12ca64 --- /dev/null +++ b/pkg/build/utils_internal_test.go @@ -0,0 +1,47 @@ +// ALR - Any Linux Repository +// Copyright (C) 2025 Евгений Храмов +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package build + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRemoveDuplicatesSources(t *testing.T) { + type testCase struct { + Name string + Sources []string + Checksums []string + NewSources []string + NewChecksums []string + } + + for _, tc := range []testCase{{ + Name: "prefer non-skip values", + Sources: []string{"a", "b", "c", "a"}, + Checksums: []string{"skip", "skip", "skip", "1"}, + NewSources: []string{"a", "b", "c"}, + NewChecksums: []string{"1", "skip", "skip"}, + }} { + t.Run(tc.Name, func(t *testing.T) { + s, c := removeDuplicatesSources(tc.Sources, tc.Checksums) + assert.Equal(t, s, tc.NewSources) + assert.Equal(t, c, tc.NewChecksums) + }) + } +}