forked from Plemya-x/ALR
		
	Merge pull request 'fix: remove duplicates correctly' (#46) from Maks1mS/ALR:fix/remove-duplicates-correctly into master
Reviewed-on: Plemya-x/ALR#46
This commit is contained in:
		| @@ -11,7 +11,7 @@ | |||||||
|     <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> |     <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> | ||||||
|         <text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text> |         <text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text> | ||||||
|         <text x="33.5" y="14">coverage</text> |         <text x="33.5" y="14">coverage</text> | ||||||
|         <text x="86" y="15" fill="#010101" fill-opacity=".3">19.5%</text> |         <text x="86" y="15" fill="#010101" fill-opacity=".3">19.8%</text> | ||||||
|         <text x="86" y="14">19.5%</text> |         <text x="86" y="14">19.8%</text> | ||||||
|     </g> |     </g> | ||||||
| </svg> | </svg> | ||||||
|   | |||||||
| Before Width: | Height: | Size: 926 B After Width: | Height: | Size: 926 B | 
| @@ -365,69 +365,69 @@ msgstr "" | |||||||
| msgid "Building package" | msgid "Building package" | ||||||
| msgstr "" | 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" | msgid "Downloading sources" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:253 | #: pkg/build/build.go:257 | ||||||
| msgid "Building package metadata" | msgid "Building package metadata" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:275 | #: pkg/build/build.go:279 | ||||||
| msgid "Compressing package" | msgid "Compressing package" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:434 | #: pkg/build/build.go:438 | ||||||
| msgid "" | msgid "" | ||||||
| "Your system's CPU architecture doesn't match this package. Do you want to " | "Your system's CPU architecture doesn't match this package. Do you want to " | ||||||
| "build anyway?" | "build anyway?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:448 | #: pkg/build/build.go:452 | ||||||
| msgid "This package is already installed" | msgid "This package is already installed" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:472 | #: pkg/build/build.go:476 | ||||||
| msgid "Installing build dependencies" | msgid "Installing build dependencies" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:513 | #: pkg/build/build.go:517 | ||||||
| msgid "Installing dependencies" | msgid "Installing dependencies" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:548 | #: pkg/build/build.go:598 | ||||||
| msgid "The checksums array must be the same length as sources" |  | ||||||
| msgstr "" |  | ||||||
|  |  | ||||||
| #: pkg/build/build.go:599 |  | ||||||
| msgid "Would you like to remove the build dependencies?" | msgid "Would you like to remove the build dependencies?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:662 | #: pkg/build/build.go:661 | ||||||
| msgid "Executing prepare()" | msgid "Executing prepare()" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:672 | #: pkg/build/build.go:671 | ||||||
| msgid "Executing build()" | msgid "Executing build()" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:702 pkg/build/build.go:722 | #: pkg/build/build.go:701 pkg/build/build.go:721 | ||||||
| msgid "Executing %s()" | msgid "Executing %s()" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:781 | #: pkg/build/build.go:780 | ||||||
| msgid "Error installing native packages" | msgid "Error installing native packages" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:805 | #: pkg/build/build.go:804 | ||||||
| msgid "Error installing package" | msgid "Error installing package" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:864 | #: pkg/build/build.go:863 | ||||||
| msgid "AutoProv is not implemented for this package format, so it's skipped" | msgid "AutoProv is not implemented for this package format, so it's skipped" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:875 | #: pkg/build/build.go:874 | ||||||
| msgid "AutoReq is not implemented for this package format, so it's skipped" | msgid "AutoReq is not implemented for this package format, so it's skipped" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,8 +12,8 @@ msgstr "" | |||||||
| "MIME-Version: 1.0\n" | "MIME-Version: 1.0\n" | ||||||
| "Content-Type: text/plain; charset=UTF-8\n" | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" | ||||||
| "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" | ||||||
| "X-Generator: Gtranslator 47.1\n" | "X-Generator: Gtranslator 47.1\n" | ||||||
|  |  | ||||||
| #: build.go:44 | #: build.go:44 | ||||||
| @@ -379,19 +379,23 @@ msgstr "Не удалось предложить пользователю про | |||||||
| msgid "Building package" | msgid "Building package" | ||||||
| msgstr "Сборка пакета" | 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" | msgid "Downloading sources" | ||||||
| msgstr "Скачивание источников" | msgstr "Скачивание источников" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:253 | #: pkg/build/build.go:257 | ||||||
| msgid "Building package metadata" | msgid "Building package metadata" | ||||||
| msgstr "Сборка метаданных пакета" | msgstr "Сборка метаданных пакета" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:275 | #: pkg/build/build.go:279 | ||||||
| msgid "Compressing package" | msgid "Compressing package" | ||||||
| msgstr "Сжатие пакета" | msgstr "Сжатие пакета" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:434 | #: pkg/build/build.go:438 | ||||||
| msgid "" | msgid "" | ||||||
| "Your system's CPU architecture doesn't match this package. Do you want to " | "Your system's CPU architecture doesn't match this package. Do you want to " | ||||||
| "build anyway?" | "build anyway?" | ||||||
| @@ -399,52 +403,48 @@ msgstr "" | |||||||
| "Архитектура процессора вашей системы не соответствует этому пакету. Вы все " | "Архитектура процессора вашей системы не соответствует этому пакету. Вы все " | ||||||
| "равно хотите выполнить сборку?" | "равно хотите выполнить сборку?" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:448 | #: pkg/build/build.go:452 | ||||||
| msgid "This package is already installed" | msgid "This package is already installed" | ||||||
| msgstr "Этот пакет уже установлен" | msgstr "Этот пакет уже установлен" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:472 | #: pkg/build/build.go:476 | ||||||
| msgid "Installing build dependencies" | msgid "Installing build dependencies" | ||||||
| msgstr "Установка зависимостей сборки" | msgstr "Установка зависимостей сборки" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:513 | #: pkg/build/build.go:517 | ||||||
| msgid "Installing dependencies" | msgid "Installing dependencies" | ||||||
| msgstr "Установка зависимостей" | msgstr "Установка зависимостей" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:548 | #: pkg/build/build.go:598 | ||||||
| msgid "The checksums array must be the same length as sources" |  | ||||||
| msgstr "Массив контрольных сумм должен быть той же длины, что и источники" |  | ||||||
|  |  | ||||||
| #: pkg/build/build.go:599 |  | ||||||
| msgid "Would you like to remove the build dependencies?" | msgid "Would you like to remove the build dependencies?" | ||||||
| msgstr "Хотели бы вы удалить зависимости сборки?" | msgstr "Хотели бы вы удалить зависимости сборки?" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:662 | #: pkg/build/build.go:661 | ||||||
| msgid "Executing prepare()" | msgid "Executing prepare()" | ||||||
| msgstr "Исполнение prepare()" | msgstr "Исполнение prepare()" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:672 | #: pkg/build/build.go:671 | ||||||
| msgid "Executing build()" | msgid "Executing build()" | ||||||
| msgstr "Исполнение 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()" | msgid "Executing %s()" | ||||||
| msgstr "Исполнение %s()" | msgstr "Исполнение %s()" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:781 | #: pkg/build/build.go:780 | ||||||
| msgid "Error installing native packages" | msgid "Error installing native packages" | ||||||
| msgstr "Ошибка при установке нативных пакетов" | msgstr "Ошибка при установке нативных пакетов" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:805 | #: pkg/build/build.go:804 | ||||||
| msgid "Error installing package" | msgid "Error installing package" | ||||||
| msgstr "Ошибка при установке пакета" | msgstr "Ошибка при установке пакета" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:864 | #: pkg/build/build.go:863 | ||||||
| msgid "AutoProv is not implemented for this package format, so it's skipped" | msgid "AutoProv is not implemented for this package format, so it's skipped" | ||||||
| msgstr "" | msgstr "" | ||||||
| "AutoProv не реализовано для этого формата пакета, поэтому будет пропущено" | "AutoProv не реализовано для этого формата пакета, поэтому будет пропущено" | ||||||
|  |  | ||||||
| #: pkg/build/build.go:875 | #: pkg/build/build.go:874 | ||||||
| msgid "AutoReq is not implemented for this package format, so it's skipped" | msgid "AutoReq is not implemented for this package format, so it's skipped" | ||||||
| msgstr "" | msgstr "" | ||||||
| "AutoReq не реализовано для этого формата пакета, поэтому будет пропущено" | "AutoReq не реализовано для этого формата пакета, поэтому будет пропущено" | ||||||
|   | |||||||
| @@ -203,8 +203,12 @@ func (b *Builder) BuildPackage(ctx context.Context) ([]string, []string, error) | |||||||
| 	buildDepends = removeDuplicates(buildDepends) | 	buildDepends = removeDuplicates(buildDepends) | ||||||
| 	optDepends = removeDuplicates(optDepends) | 	optDepends = removeDuplicates(optDepends) | ||||||
| 	depends = removeDuplicates(depends) | 	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{ | 	mergedVars := types.BuildVars{ | ||||||
| 		Sources:   sources, | 		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 { | 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 { | 	for i, src := range bv.Sources { | ||||||
| 		opts := dl.Options{ | 		opts := dl.Options{ | ||||||
| 			Name:        fmt.Sprintf("%s[%d]", bv.Name, i), | 			Name:        fmt.Sprintf("%s[%d]", bv.Name, i), | ||||||
|   | |||||||
| @@ -313,3 +313,24 @@ func removeDuplicates(slice []string) []string { | |||||||
|  |  | ||||||
| 	return result | 	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 | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								pkg/build/utils_internal_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								pkg/build/utils_internal_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <http://www.gnu.org/licenses/>. | ||||||
|  |  | ||||||
|  | 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) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user