feature/versioned-dependencies #141

Merged
xpamych merged 4 commits from feature/versioned-dependencies into master 2026-02-12 15:30:38 +00:00
3 changed files with 55 additions and 4 deletions
Showing only changes of commit 108038ef47 - Show all commits

View File

@@ -35,6 +35,7 @@ import (
"mvdan.cc/sh/v3/interp" "mvdan.cc/sh/v3/interp"
"mvdan.cc/sh/v3/syntax" "mvdan.cc/sh/v3/syntax"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cpu"
finddeps "gitea.plemya-x.ru/Plemya-x/ALR/internal/build/find_deps" finddeps "gitea.plemya-x.ru/Plemya-x/ALR/internal/build/find_deps"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/decoder" "gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/decoder"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/handlers" "gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/handlers"
@@ -242,17 +243,28 @@ func buildPkgMetadata(
pkgInfo.Homepage = vars.Homepage.Resolved() pkgInfo.Homepage = vars.Homepage.Resolved()
pkgInfo.License = strings.Join(vars.Licenses, ", ") pkgInfo.License = strings.Join(vars.Licenses, ", ")
pkgInfo.Maintainer = vars.Maintainer.Resolved() pkgInfo.Maintainer = vars.Maintainer.Resolved()
pkgFormat := input.PkgFormat()
info := input.OSRelease()
// Для RPM на multilib-системах квалифицируем автоконфликт архитектурой (ISA),
// чтобы не удалять пакеты другой архитектуры. Например, установка
// libdrm+alr.x86_64 не должна конфликтовать с libdrm.i686.
autoConflictName := vars.Name
if pkgFormat == "rpm" {
if isa := goArchToRPMISA(cpu.Arch()); isa != "" {
autoConflictName = fmt.Sprintf("%s(%s)", vars.Name, isa)
}
}
pkgInfo.Overridables = nfpm.Overridables{ pkgInfo.Overridables = nfpm.Overridables{
Conflicts: append(vars.Conflicts, vars.Name), Conflicts: append(vars.Conflicts, autoConflictName),
Replaces: vars.Replaces, Replaces: vars.Replaces,
Provides: append(vars.Provides, vars.Name), Provides: append(vars.Provides, vars.Name),
Depends: deps, Depends: deps,
} }
pkgInfo.Section = vars.Group.Resolved() pkgInfo.Section = vars.Group.Resolved()
pkgFormat := input.PkgFormat()
info := input.OSRelease()
if pkgFormat == "apk" { if pkgFormat == "apk" {
// Alpine отказывается устанавливать пакеты, которые предоставляют сами себя, поэтому удаляем такие элементы // Alpine отказывается устанавливать пакеты, которые предоставляют сами себя, поэтому удаляем такие элементы
pkgInfo.Overridables.Provides = slices.DeleteFunc(pkgInfo.Overridables.Provides, func(s string) bool { pkgInfo.Overridables.Provides = slices.DeleteFunc(pkgInfo.Overridables.Provides, func(s string) bool {

View File

@@ -180,6 +180,22 @@ func normalizeContents(contents []*files.Content) {
var RegexpALRPackageName = regexp.MustCompile(`^(?P<package>[^+]+)\+(?P<repo>.+)$`) var RegexpALRPackageName = regexp.MustCompile(`^(?P<package>[^+]+)\+(?P<repo>.+)$`)
// goArchToRPMISA конвертирует Go-архитектуру в RPM ISA (Instruction Set Architecture)
// квалификатор, используемый в спецификациях зависимостей (например, "x86-64" для amd64).
// Возвращает пустую строку, если ISA квалификатор неизвестен для данной архитектуры.
func goArchToRPMISA(goarch string) string {
switch goarch {
case "amd64":
return "x86-64"
case "386":
return "x86-32"
case "arm64":
return "aarch-64"
default:
return ""
}
}
func getBasePkgInfo(vars *alrsh.Package, input interface { func getBasePkgInfo(vars *alrsh.Package, input interface {
RepositoryProvider RepositoryProvider
OsInfoProvider OsInfoProvider

View File

@@ -157,6 +157,29 @@ func TestRegexpALRPackageName(t *testing.T) {
} }
} }
func TestGoArchToRPMISA(t *testing.T) {
tests := []struct {
goarch string
expected string
}{
{"amd64", "x86-64"},
{"386", "x86-32"},
{"arm64", "aarch-64"},
{"arm", ""},
{"mips", ""},
{"unknown", ""},
}
for _, tt := range tests {
t.Run(tt.goarch, func(t *testing.T) {
result := goArchToRPMISA(tt.goarch)
if result != tt.expected {
t.Errorf("goArchToRPMISA(%q) = %q, ожидается %q", tt.goarch, result, tt.expected)
}
})
}
}
func TestExtractRepoNameFromPath(t *testing.T) { func TestExtractRepoNameFromPath(t *testing.T) {
tests := []struct { tests := []struct {
name string name string