forked from Plemya-x/ALR
		
	Merge branch 'Maks1mS-master'
# Conflicts: # pkg/build/build.go
This commit is contained in:
		@@ -1,6 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ALR - Any Linux Repository
 | 
			
		||||
 * Любая Linux репозитория
 | 
			
		||||
 * Copyright (C) 2024 Евгений Храмов
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
@@ -47,6 +46,9 @@ import (
 | 
			
		||||
	_ "github.com/goreleaser/nfpm/v2/arch"
 | 
			
		||||
	_ "github.com/goreleaser/nfpm/v2/deb"
 | 
			
		||||
	_ "github.com/goreleaser/nfpm/v2/rpm"
 | 
			
		||||
	"mvdan.cc/sh/v3/expand"
 | 
			
		||||
	"mvdan.cc/sh/v3/interp"
 | 
			
		||||
	"mvdan.cc/sh/v3/syntax"
 | 
			
		||||
 | 
			
		||||
	"github.com/goreleaser/nfpm/v2"
 | 
			
		||||
	"github.com/goreleaser/nfpm/v2/files"
 | 
			
		||||
@@ -63,9 +65,6 @@ import (
 | 
			
		||||
	"plemya-x.ru/alr/pkg/loggerctx"
 | 
			
		||||
	"plemya-x.ru/alr/pkg/manager"
 | 
			
		||||
	"plemya-x.ru/alr/pkg/repos"
 | 
			
		||||
	"mvdan.cc/sh/v3/expand"
 | 
			
		||||
	"mvdan.cc/sh/v3/interp"
 | 
			
		||||
	"mvdan.cc/sh/v3/syntax"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Функция BuildPackage выполняет сборку скрипта по указанному пути. Возвращает два среза.
 | 
			
		||||
@@ -171,7 +170,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
 | 
			
		||||
 | 
			
		||||
	pkgFormat := getPkgFormat(opts.Manager) // Получаем формат пакета
 | 
			
		||||
 | 
			
		||||
	pkgInfo, err := buildPkgMetadata(vars, dirs, pkgFormat, append(repoDeps, builtNames...)) // Собираем метаданные пакета
 | 
			
		||||
	pkgInfo, err := buildPkgMetadata(vars, dirs, pkgFormat, info, append(repoDeps, builtNames...)) // Собираем метаданные пакета
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -503,23 +502,18 @@ func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Dire
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Функция buildPkgMetadata создает метаданные для пакета, который будет собран.
 | 
			
		||||
func buildPkgMetadata(vars *types.BuildVars, dirs types.Directories, pkgFormat string, deps []string) (*nfpm.Info, error) {
 | 
			
		||||
	pkgInfo := &nfpm.Info{
 | 
			
		||||
		Name:        vars.Name,
 | 
			
		||||
		Description: vars.Description,
 | 
			
		||||
		Arch:        cpu.Arch(),
 | 
			
		||||
		Platform:    "linux",
 | 
			
		||||
		Version:     vars.Version,
 | 
			
		||||
		Release:     strconv.Itoa(vars.Release),
 | 
			
		||||
		Homepage:    vars.Homepage,
 | 
			
		||||
		License:     strings.Join(vars.Licenses, ", "),
 | 
			
		||||
		Maintainer:  vars.Maintainer,
 | 
			
		||||
		Overridables: nfpm.Overridables{
 | 
			
		||||
			Conflicts: vars.Conflicts,
 | 
			
		||||
			Replaces:  vars.Replaces,
 | 
			
		||||
			Provides:  vars.Provides,
 | 
			
		||||
			Depends:   deps,
 | 
			
		||||
		},
 | 
			
		||||
func buildPkgMetadata(vars *types.BuildVars, dirs types.Directories, pkgFormat string, info *distro.OSRelease, deps []string) (*nfpm.Info, error) {
 | 
			
		||||
	pkgInfo := getBasePkgInfo(vars)
 | 
			
		||||
	pkgInfo.Description = vars.Description
 | 
			
		||||
	pkgInfo.Platform = "linux"
 | 
			
		||||
	pkgInfo.Homepage = vars.Homepage
 | 
			
		||||
	pkgInfo.License = strings.Join(vars.Licenses, ", ")
 | 
			
		||||
	pkgInfo.Maintainer = vars.Maintainer
 | 
			
		||||
	pkgInfo.Overridables = nfpm.Overridables{
 | 
			
		||||
		Conflicts: vars.Conflicts,
 | 
			
		||||
		Replaces:  vars.Replaces,
 | 
			
		||||
		Provides:  vars.Provides,
 | 
			
		||||
		Depends:   deps,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if pkgFormat == "apk" {
 | 
			
		||||
@@ -529,6 +523,10 @@ func buildPkgMetadata(vars *types.BuildVars, dirs types.Directories, pkgFormat s
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if pkgFormat == "rpm" && info.ID == "altlinux" {
 | 
			
		||||
		pkgInfo.Release = "alt" + pkgInfo.Release
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if vars.Epoch != 0 {
 | 
			
		||||
		pkgInfo.Epoch = strconv.FormatUint(uint64(vars.Epoch), 10)
 | 
			
		||||
	}
 | 
			
		||||
@@ -665,16 +663,20 @@ func checkForBuiltPackage(mgr manager.Manager, vars *types.BuildVars, pkgFormat,
 | 
			
		||||
	return pkgPath, true, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Функция pkgFileName возвращает имя файла пакета, если оно было бы создано.
 | 
			
		||||
// Это используется для проверки, был ли пакет уже собран.
 | 
			
		||||
func pkgFileName(vars *types.BuildVars, pkgFormat string) (string, error) {
 | 
			
		||||
	pkgInfo := &nfpm.Info{
 | 
			
		||||
func getBasePkgInfo(vars *types.BuildVars) *nfpm.Info {
 | 
			
		||||
	return &nfpm.Info{
 | 
			
		||||
		Name:    vars.Name,
 | 
			
		||||
		Arch:    cpu.Arch(),
 | 
			
		||||
		Version: vars.Version,
 | 
			
		||||
		Release: strconv.Itoa(vars.Release),
 | 
			
		||||
		Epoch:   strconv.FormatUint(uint64(vars.Epoch), 10),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pkgFileName returns the filename of the package if it were to be built.
 | 
			
		||||
// This is used to check if the package has already been built.
 | 
			
		||||
func pkgFileName(vars *types.BuildVars, pkgFormat string) (string, error) {
 | 
			
		||||
	pkgInfo := getBasePkgInfo(vars)
 | 
			
		||||
 | 
			
		||||
	packager, err := nfpm.Get(pkgFormat)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										157
									
								
								pkg/manager/apt_rpm.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								pkg/manager/apt_rpm.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,157 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ALR - Any Linux Repository
 | 
			
		||||
 * Copyright (C) 2024 Евгений Храмов
 | 
			
		||||
 *
 | 
			
		||||
 * 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 manager
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// APTRpm represents the APT-RPM package manager
 | 
			
		||||
type APTRpm struct {
 | 
			
		||||
	rootCmd string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*APTRpm) Exists() bool {
 | 
			
		||||
	cmd := exec.Command("apt-config", "dump")
 | 
			
		||||
	output, err := cmd.Output()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return strings.Contains(string(output), "RPM")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*APTRpm) Name() string {
 | 
			
		||||
	return "apt-rpm"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*APTRpm) Format() string {
 | 
			
		||||
	return "rpm"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *APTRpm) SetRootCmd(s string) {
 | 
			
		||||
	a.rootCmd = s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *APTRpm) Sync(opts *Opts) error {
 | 
			
		||||
	opts = ensureOpts(opts)
 | 
			
		||||
	cmd := a.getCmd(opts, "apt-get", "update")
 | 
			
		||||
	setCmdEnv(cmd)
 | 
			
		||||
	err := cmd.Run()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("apt-get: sync: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *APTRpm) Install(opts *Opts, pkgs ...string) error {
 | 
			
		||||
	opts = ensureOpts(opts)
 | 
			
		||||
	cmd := a.getCmd(opts, "apt-get", "install")
 | 
			
		||||
	cmd.Args = append(cmd.Args, pkgs...)
 | 
			
		||||
	setCmdEnv(cmd)
 | 
			
		||||
	err := cmd.Run()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("apt-get: install: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *APTRpm) InstallLocal(opts *Opts, pkgs ...string) error {
 | 
			
		||||
	opts = ensureOpts(opts)
 | 
			
		||||
	return a.Install(opts, pkgs...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *APTRpm) Remove(opts *Opts, pkgs ...string) error {
 | 
			
		||||
	opts = ensureOpts(opts)
 | 
			
		||||
	cmd := a.getCmd(opts, "apt-get", "remove")
 | 
			
		||||
	cmd.Args = append(cmd.Args, pkgs...)
 | 
			
		||||
	setCmdEnv(cmd)
 | 
			
		||||
	err := cmd.Run()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("apt-get: remove: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *APTRpm) Upgrade(opts *Opts, pkgs ...string) error {
 | 
			
		||||
	opts = ensureOpts(opts)
 | 
			
		||||
	return a.Install(opts, pkgs...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *APTRpm) UpgradeAll(opts *Opts) error {
 | 
			
		||||
	opts = ensureOpts(opts)
 | 
			
		||||
	cmd := a.getCmd(opts, "apt-get", "dist-upgrade")
 | 
			
		||||
	setCmdEnv(cmd)
 | 
			
		||||
	err := cmd.Run()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("apt-get: upgradeall: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (y *APTRpm) ListInstalled(opts *Opts) (map[string]string, error) {
 | 
			
		||||
	out := map[string]string{}
 | 
			
		||||
	cmd := exec.Command("rpm", "-qa", "--queryformat", "%{NAME}\u200b%|EPOCH?{%{EPOCH}:}:{}|%{VERSION}-%{RELEASE}\\n")
 | 
			
		||||
 | 
			
		||||
	stdout, err := cmd.StdoutPipe()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = cmd.Start()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	scanner := bufio.NewScanner(stdout)
 | 
			
		||||
	for scanner.Scan() {
 | 
			
		||||
		name, version, ok := strings.Cut(scanner.Text(), "\u200b")
 | 
			
		||||
		if !ok {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		version = strings.TrimPrefix(version, "0:")
 | 
			
		||||
		out[name] = version
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = scanner.Err()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *APTRpm) getCmd(opts *Opts, mgrCmd string, args ...string) *exec.Cmd {
 | 
			
		||||
	var cmd *exec.Cmd
 | 
			
		||||
	if opts.AsRoot {
 | 
			
		||||
		cmd = exec.Command(getRootCmd(a.rootCmd), mgrCmd)
 | 
			
		||||
		cmd.Args = append(cmd.Args, opts.Args...)
 | 
			
		||||
		cmd.Args = append(cmd.Args, args...)
 | 
			
		||||
	} else {
 | 
			
		||||
		cmd = exec.Command(mgrCmd, args...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if opts.NoConfirm {
 | 
			
		||||
		cmd.Args = append(cmd.Args, "-y")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return cmd
 | 
			
		||||
}
 | 
			
		||||
@@ -46,6 +46,7 @@ var managers = []Manager{
 | 
			
		||||
	&YUM{},
 | 
			
		||||
	&APK{},
 | 
			
		||||
	&Zypper{},
 | 
			
		||||
	&APTRpm{},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Register registers a new package manager
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user