feature/versioned-dependencies #141
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user