From cfb376441221c09245feb9fc036713b539aa8a58 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Sat, 28 Dec 2024 12:02:20 +0300 Subject: [PATCH] lint: run `make fmt` --- build.go | 1 + fix.go | 1 + gen.go | 1 + helper.go | 5 +- info.go | 3 +- install.go | 1 + internal/cliutils/prompt.go | 1 + internal/config/config.go | 1 + internal/config/lang.go | 3 +- internal/config/paths.go | 1 + internal/db/db.go | 5 +- internal/dl/dl.go | 5 +- internal/dl/file.go | 1 + internal/overrides/overrides.go | 5 +- internal/shutils/decoder/decoder.go | 5 +- internal/shutils/handlers/fakeroot.go | 2 +- internal/shutils/helpers/helpers.go | 3 +- internal/translations/translations.go | 3 +- list.go | 3 +- main.go | 1 + pkg/build/build.go | 1 + pkg/build/findDeps.go | 1 + pkg/build/install.go | 16 +-- pkg/distro/osrelease.go | 3 +- pkg/gen/funcs.go | 20 +-- pkg/gen/pip.go | 121 ++++++++--------- pkg/manager/apt_rpm.go | 1 + pkg/manager/dnf.go | 182 +++++++++++++------------- pkg/repos/pull.go | 7 +- repo.go | 3 +- upgrade.go | 7 +- 31 files changed, 219 insertions(+), 194 deletions(-) diff --git a/build.go b/build.go index 08014f7..d2c05bc 100644 --- a/build.go +++ b/build.go @@ -23,6 +23,7 @@ import ( "path/filepath" "github.com/urfave/cli/v2" + "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/osutils" "plemya-x.ru/alr/internal/types" diff --git a/fix.go b/fix.go index 2c6c3d1..128aec9 100644 --- a/fix.go +++ b/fix.go @@ -22,6 +22,7 @@ import ( "os" "github.com/urfave/cli/v2" + "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/db" "plemya-x.ru/alr/pkg/loggerctx" diff --git a/gen.go b/gen.go index b634d69..a1ec833 100644 --- a/gen.go +++ b/gen.go @@ -4,6 +4,7 @@ import ( "os" "github.com/urfave/cli/v2" + "plemya-x.ru/alr/pkg/gen" ) diff --git a/helper.go b/helper.go index 4dc7dfe..b02348b 100644 --- a/helper.go +++ b/helper.go @@ -6,12 +6,13 @@ import ( "strings" "github.com/urfave/cli/v2" + "mvdan.cc/sh/v3/expand" + "mvdan.cc/sh/v3/interp" + "plemya-x.ru/alr/internal/cpu" "plemya-x.ru/alr/internal/shutils/helpers" "plemya-x.ru/alr/pkg/distro" "plemya-x.ru/alr/pkg/loggerctx" - "mvdan.cc/sh/v3/expand" - "mvdan.cc/sh/v3/interp" ) var helperCmd = &cli.Command{ diff --git a/info.go b/info.go index 78dc9f9..9cb02cd 100644 --- a/info.go +++ b/info.go @@ -23,13 +23,14 @@ import ( "os" "github.com/urfave/cli/v2" + "gopkg.in/yaml.v3" + "plemya-x.ru/alr/internal/cliutils" "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/overrides" "plemya-x.ru/alr/pkg/distro" "plemya-x.ru/alr/pkg/loggerctx" "plemya-x.ru/alr/pkg/repos" - "gopkg.in/yaml.v3" ) var infoCmd = &cli.Command{ diff --git a/install.go b/install.go index 77c08bb..d64761c 100644 --- a/install.go +++ b/install.go @@ -22,6 +22,7 @@ import ( "fmt" "github.com/urfave/cli/v2" + "plemya-x.ru/alr/internal/cliutils" "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/db" diff --git a/internal/cliutils/prompt.go b/internal/cliutils/prompt.go index f46fd1e..2423fc0 100644 --- a/internal/cliutils/prompt.go +++ b/internal/cliutils/prompt.go @@ -24,6 +24,7 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/db" "plemya-x.ru/alr/internal/pager" diff --git a/internal/config/config.go b/internal/config/config.go index db43f89..56e6a55 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -24,6 +24,7 @@ import ( "sync" "github.com/pelletier/go-toml/v2" + "plemya-x.ru/alr/internal/types" "plemya-x.ru/alr/pkg/loggerctx" ) diff --git a/internal/config/lang.go b/internal/config/lang.go index 55d8948..715aec4 100644 --- a/internal/config/lang.go +++ b/internal/config/lang.go @@ -24,8 +24,9 @@ import ( "strings" "sync" - "plemya-x.ru/alr/pkg/loggerctx" "golang.org/x/text/language" + + "plemya-x.ru/alr/pkg/loggerctx" ) var ( diff --git a/internal/config/paths.go b/internal/config/paths.go index 8b10c35..8b3d552 100644 --- a/internal/config/paths.go +++ b/internal/config/paths.go @@ -25,6 +25,7 @@ import ( "sync" "github.com/pelletier/go-toml/v2" + "plemya-x.ru/alr/pkg/loggerctx" ) diff --git a/internal/db/db.go b/internal/db/db.go index 9e421cb..ee555f7 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -28,10 +28,11 @@ import ( "sync" "github.com/jmoiron/sqlx" - "plemya-x.ru/alr/internal/config" - "plemya-x.ru/alr/pkg/loggerctx" "golang.org/x/exp/slices" "modernc.org/sqlite" + + "plemya-x.ru/alr/internal/config" + "plemya-x.ru/alr/pkg/loggerctx" ) // CurrentVersion is the current version of the database. diff --git a/internal/dl/dl.go b/internal/dl/dl.go index a2a6781..ece5165 100644 --- a/internal/dl/dl.go +++ b/internal/dl/dl.go @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -*/ + */ // Пакет dl содержит абстракции для загрузки файлов и каталогов // из различных источников. @@ -39,6 +39,7 @@ import ( "golang.org/x/crypto/blake2b" "golang.org/x/crypto/blake2s" "golang.org/x/exp/slices" + "plemya-x.ru/alr/internal/dlcache" "plemya-x.ru/alr/pkg/loggerctx" ) @@ -299,8 +300,6 @@ func linkDir(src, dest string) error { return nil } - - rel, err := filepath.Rel(src, path) if err != nil { return err diff --git a/internal/dl/file.go b/internal/dl/file.go index a98d07a..7d70727 100644 --- a/internal/dl/file.go +++ b/internal/dl/file.go @@ -33,6 +33,7 @@ import ( "github.com/mholt/archiver/v4" "github.com/schollz/progressbar/v3" + "plemya-x.ru/alr/internal/shutils/handlers" ) diff --git a/internal/overrides/overrides.go b/internal/overrides/overrides.go index 728711a..c4d4e71 100644 --- a/internal/overrides/overrides.go +++ b/internal/overrides/overrides.go @@ -22,11 +22,12 @@ import ( "reflect" "strings" + "golang.org/x/exp/slices" + "golang.org/x/text/language" + "plemya-x.ru/alr/internal/cpu" "plemya-x.ru/alr/internal/db" "plemya-x.ru/alr/pkg/distro" - "golang.org/x/exp/slices" - "golang.org/x/text/language" ) type Opts struct { diff --git a/internal/shutils/decoder/decoder.go b/internal/shutils/decoder/decoder.go index 9f28f2f..f02d3f2 100644 --- a/internal/shutils/decoder/decoder.go +++ b/internal/shutils/decoder/decoder.go @@ -25,12 +25,13 @@ import ( "strings" "github.com/mitchellh/mapstructure" - "plemya-x.ru/alr/internal/overrides" - "plemya-x.ru/alr/pkg/distro" "golang.org/x/exp/slices" "mvdan.cc/sh/v3/expand" "mvdan.cc/sh/v3/interp" "mvdan.cc/sh/v3/syntax" + + "plemya-x.ru/alr/internal/overrides" + "plemya-x.ru/alr/pkg/distro" ) var ErrNotPointerToStruct = errors.New("val must be a pointer to a struct") diff --git a/internal/shutils/handlers/fakeroot.go b/internal/shutils/handlers/fakeroot.go index 254c5d2..6f828e6 100644 --- a/internal/shutils/handlers/fakeroot.go +++ b/internal/shutils/handlers/fakeroot.go @@ -10,9 +10,9 @@ import ( "syscall" "time" - "plemya-x.ru/fakeroot" "mvdan.cc/sh/v3/expand" "mvdan.cc/sh/v3/interp" + "plemya-x.ru/fakeroot" ) // FakerootExecHandler was extracted from github.com/mvdan/sh/interp/handler.go diff --git a/internal/shutils/helpers/helpers.go b/internal/shutils/helpers/helpers.go index 3036a38..6fcfe23 100644 --- a/internal/shutils/helpers/helpers.go +++ b/internal/shutils/helpers/helpers.go @@ -31,8 +31,9 @@ import ( "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/object" "golang.org/x/exp/slices" - "plemya-x.ru/alr/internal/shutils/handlers" "mvdan.cc/sh/v3/interp" + + "plemya-x.ru/alr/internal/shutils/handlers" ) var ( diff --git a/internal/translations/translations.go b/internal/translations/translations.go index 1c545da..54e9a73 100644 --- a/internal/translations/translations.go +++ b/internal/translations/translations.go @@ -24,9 +24,10 @@ import ( "sync" "go.elara.ws/logger" - "plemya-x.ru/alr/pkg/loggerctx" "go.elara.ws/translate" "golang.org/x/text/language" + + "plemya-x.ru/alr/pkg/loggerctx" ) //go:embed files diff --git a/list.go b/list.go index a9ebf29..9c6d951 100644 --- a/list.go +++ b/list.go @@ -22,12 +22,13 @@ import ( "fmt" "github.com/urfave/cli/v2" + "golang.org/x/exp/slices" + "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/db" "plemya-x.ru/alr/pkg/loggerctx" "plemya-x.ru/alr/pkg/manager" "plemya-x.ru/alr/pkg/repos" - "golang.org/x/exp/slices" ) var listCmd = &cli.Command{ diff --git a/main.go b/main.go index 03325a1..1f47326 100644 --- a/main.go +++ b/main.go @@ -28,6 +28,7 @@ import ( "github.com/mattn/go-isatty" "github.com/urfave/cli/v2" "go.elara.ws/logger" + "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/db" "plemya-x.ru/alr/internal/translations" diff --git a/pkg/build/build.go b/pkg/build/build.go index a836515..2e03c8b 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -52,6 +52,7 @@ import ( "github.com/goreleaser/nfpm/v2" "github.com/goreleaser/nfpm/v2/files" + "plemya-x.ru/alr/internal/cliutils" "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/cpu" diff --git a/pkg/build/findDeps.go b/pkg/build/findDeps.go index 115e659..98f66a3 100644 --- a/pkg/build/findDeps.go +++ b/pkg/build/findDeps.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/goreleaser/nfpm/v2" + "plemya-x.ru/alr/internal/types" "plemya-x.ru/alr/pkg/loggerctx" ) diff --git a/pkg/build/install.go b/pkg/build/install.go index 19ee98f..32eea6d 100644 --- a/pkg/build/install.go +++ b/pkg/build/install.go @@ -46,15 +46,15 @@ func InstallPkgs(ctx context.Context, alrPkgs []db.Package, nativePkgs []string, if len(nativePkgs) > 0 { err := opts.Manager.Install(nil, nativePkgs...) - // Если есть нативные пакеты, выполняем их установку + // Если есть нативные пакеты, выполняем их установку if err != nil { log.Fatal("Error installing native packages").Err(err).Send() - // Логируем и завершаем выполнение при ошибке + // Логируем и завершаем выполнение при ошибке } } InstallScripts(ctx, GetScriptPaths(ctx, alrPkgs), opts) - // Устанавливаем скрипты сборки через функцию InstallScripts + // Устанавливаем скрипты сборки через функцию InstallScripts } // GetScriptPaths возвращает срез путей к скриптам, соответствующий @@ -62,7 +62,7 @@ func InstallPkgs(ctx context.Context, alrPkgs []db.Package, nativePkgs []string, func GetScriptPaths(ctx context.Context, pkgs []db.Package) []string { var scripts []string for _, pkg := range pkgs { - // Для каждого пакета создаем путь к скрипту сборки + // Для каждого пакета создаем путь к скрипту сборки scriptPath := filepath.Join(config.GetPaths(ctx).RepoDir, pkg.Repository, pkg.Name, "alr.sh") scripts = append(scripts, scriptPath) } @@ -75,17 +75,17 @@ func InstallScripts(ctx context.Context, scripts []string, opts types.BuildOpts) for _, script := range scripts { opts.Script = script // Устанавливаем текущий скрипт в опции builtPkgs, _, err := BuildPackage(ctx, opts) - // Выполняем сборку пакета + // Выполняем сборку пакета if err != nil { log.Fatal("Error building package").Err(err).Send() - // Логируем и завершаем выполнение при ошибке сборки + // Логируем и завершаем выполнение при ошибке сборки } err = opts.Manager.InstallLocal(nil, builtPkgs...) - // Устанавливаем локально собранные пакеты + // Устанавливаем локально собранные пакеты if err != nil { log.Fatal("Error installing package").Err(err).Send() - // Логируем и завершаем выполнение при ошибке установки + // Логируем и завершаем выполнение при ошибке установки } } } diff --git a/pkg/distro/osrelease.go b/pkg/distro/osrelease.go index f9ba17f..f604f80 100644 --- a/pkg/distro/osrelease.go +++ b/pkg/distro/osrelease.go @@ -23,10 +23,11 @@ import ( "os" "strings" - "plemya-x.ru/alr/internal/shutils/handlers" "mvdan.cc/sh/v3/expand" "mvdan.cc/sh/v3/interp" "mvdan.cc/sh/v3/syntax" + + "plemya-x.ru/alr/internal/shutils/handlers" ) // OSRelease contains information from an os-release file diff --git a/pkg/gen/funcs.go b/pkg/gen/funcs.go index 46022e3..d249c93 100644 --- a/pkg/gen/funcs.go +++ b/pkg/gen/funcs.go @@ -1,20 +1,20 @@ package gen import ( - "strings" - "text/template" + "strings" + "text/template" ) // Определяем переменную funcs типа template.FuncMap, которая будет использоваться для // предоставления пользовательских функций в шаблонах var funcs = template.FuncMap{ - // Функция "tolower" использует strings.ToLower - // для преобразования строки в нижний регистр - "tolower": strings.ToLower, + // Функция "tolower" использует strings.ToLower + // для преобразования строки в нижний регистр + "tolower": strings.ToLower, - // Функция "firstchar" — это лямбда-функция, которая берет строку - // и возвращает её первый символ - "firstchar": func(s string) string { - return s[:1] - }, + // Функция "firstchar" — это лямбда-функция, которая берет строку + // и возвращает её первый символ + "firstchar": func(s string) string { + return s[:1] + }, } diff --git a/pkg/gen/pip.go b/pkg/gen/pip.go index c9a7384..365815b 100644 --- a/pkg/gen/pip.go +++ b/pkg/gen/pip.go @@ -1,98 +1,99 @@ package gen import ( - _ "embed" // Пакет для встраивания содержимого файлов в бинарники Go, использовав откладку //go:embed - "encoding/json" // Пакет для работы с JSON: декодирование и кодирование - "errors" // Пакет для создания и обработки ошибок - "fmt" // Пакет для форматированного ввода и вывода - "io" // Пакет для интерфейсов ввода и вывода - "net/http" // Пакет для HTTP-клиентов и серверов - "text/template" // Пакет для обработки текстовых шаблонов + _ "embed" // Пакет для встраивания содержимого файлов в бинарники Go, использовав откладку //go:embed + "encoding/json" // Пакет для работы с JSON: декодирование и кодирование + "errors" // Пакет для создания и обработки ошибок + "fmt" // Пакет для форматированного ввода и вывода + "io" // Пакет для интерфейсов ввода и вывода + "net/http" // Пакет для HTTP-клиентов и серверов + "text/template" // Пакет для обработки текстовых шаблонов ) // Используем директиву //go:embed для встраивания содержимого файла шаблона в строку pipTmpl // Встраивание файла tmpls/pip.tmpl.sh +// //go:embed tmpls/pip.tmpl.sh var pipTmpl string // PipOptions содержит параметры, которые будут переданы в шаблон type PipOptions struct { - Name string // Имя пакета - Version string // Версия пакета - Description string // Описание пакета + Name string // Имя пакета + Version string // Версия пакета + Description string // Описание пакета } // pypiAPIResponse представляет структуру ответа от API PyPI type pypiAPIResponse struct { - Info pypiInfo `json:"info"` // Информация о пакете - URLs []pypiURL `json:"urls"` // Список URL-адресов для загрузки пакета + Info pypiInfo `json:"info"` // Информация о пакете + URLs []pypiURL `json:"urls"` // Список URL-адресов для загрузки пакета } // Метод SourceURL ищет и возвращает URL исходного distribution для пакета, если он существует func (res pypiAPIResponse) SourceURL() (pypiURL, error) { - for _, url := range res.URLs { - if url.PackageType == "sdist" { - return url, nil - } - } - return pypiURL{}, errors.New("package doesn't have a source distribution") + for _, url := range res.URLs { + if url.PackageType == "sdist" { + return url, nil + } + } + return pypiURL{}, errors.New("package doesn't have a source distribution") } // pypiInfo содержит основную информацию о пакете, такую как имя, версия и пр. type pypiInfo struct { - Name string `json:"name"` - Version string `json:"version"` - Summary string `json:"summary"` - Homepage string `json:"home_page"` - License string `json:"license"` + Name string `json:"name"` + Version string `json:"version"` + Summary string `json:"summary"` + Homepage string `json:"home_page"` + License string `json:"license"` } // pypiURL представляет информацию об одном из доступных для загрузки URL type pypiURL struct { - Digests map[string]string `json:"digests"` // Контрольные суммы для файлов - Filename string `json:"filename"` // Имя файла - PackageType string `json:"packagetype"` // Тип пакета (например sdist) + Digests map[string]string `json:"digests"` // Контрольные суммы для файлов + Filename string `json:"filename"` // Имя файла + PackageType string `json:"packagetype"` // Тип пакета (например sdist) } // Функция Pip загружает информацию о пакете из PyPI и использует шаблон для вывода информации func Pip(w io.Writer, opts PipOptions) error { - // Создаем новый шаблон с добавлением функций из FuncMap - tmpl, err := template.New("pip"). - Funcs(funcs). - Parse(pipTmpl) - if err != nil { - return err - } + // Создаем новый шаблон с добавлением функций из FuncMap + tmpl, err := template.New("pip"). + Funcs(funcs). + Parse(pipTmpl) + if err != nil { + return err + } - // Формируем URL для запроса к PyPI на основании имени и версии пакета - url := fmt.Sprintf( - "https://pypi.org/pypi/%s/%s/json", - opts.Name, - opts.Version, - ) + // Формируем URL для запроса к PyPI на основании имени и версии пакета + url := fmt.Sprintf( + "https://pypi.org/pypi/%s/%s/json", + opts.Name, + opts.Version, + ) - // Выполняем HTTP GET запрос к PyPI - res, err := http.Get(url) - if err != nil { - return err - } - defer res.Body.Close() // Закрываем тело ответа после завершения работы - if res.StatusCode != 200 { - return fmt.Errorf("pypi: %s", res.Status) - } + // Выполняем HTTP GET запрос к PyPI + res, err := http.Get(url) + if err != nil { + return err + } + defer res.Body.Close() // Закрываем тело ответа после завершения работы + if res.StatusCode != 200 { + return fmt.Errorf("pypi: %s", res.Status) + } - // Раскодируем ответ JSON от PyPI в структуру pypiAPIResponse - var resp pypiAPIResponse - err = json.NewDecoder(res.Body).Decode(&resp) - if err != nil { - return err - } + // Раскодируем ответ JSON от PyPI в структуру pypiAPIResponse + var resp pypiAPIResponse + err = json.NewDecoder(res.Body).Decode(&resp) + if err != nil { + return err + } - // Если в opts указано описание, используем его вместо описания из PyPI - if opts.Description != "" { - resp.Info.Summary = opts.Description - } + // Если в opts указано описание, используем его вместо описания из PyPI + if opts.Description != "" { + resp.Info.Summary = opts.Description + } - // Выполняем шаблон с использованием данных из resp и записываем результат в w - return tmpl.Execute(w, resp) + // Выполняем шаблон с использованием данных из resp и записываем результат в w + return tmpl.Execute(w, resp) } diff --git a/pkg/manager/apt_rpm.go b/pkg/manager/apt_rpm.go index a13d292..bd20492 100644 --- a/pkg/manager/apt_rpm.go +++ b/pkg/manager/apt_rpm.go @@ -107,6 +107,7 @@ func (a *APTRpm) UpgradeAll(opts *Opts) error { } 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") diff --git a/pkg/manager/dnf.go b/pkg/manager/dnf.go index c97c573..a3b4dc6 100644 --- a/pkg/manager/dnf.go +++ b/pkg/manager/dnf.go @@ -19,154 +19,154 @@ package manager import ( - "bufio" - "fmt" - "os/exec" - "strings" + "bufio" + "fmt" + "os/exec" + "strings" ) // DNF представляет менеджер пакетов DNF type DNF struct { - rootCmd string // rootCmd хранит команду, используемую для выполнения команд с правами root + rootCmd string // rootCmd хранит команду, используемую для выполнения команд с правами root } // Exists проверяет, доступен ли DNF в системе, возвращает true если да func (*DNF) Exists() bool { - _, err := exec.LookPath("dnf") - return err == nil + _, err := exec.LookPath("dnf") + return err == nil } // Name возвращает имя менеджера пакетов, в данном случае "dnf" func (*DNF) Name() string { - return "dnf" + return "dnf" } // Format возвращает формат пакетов "rpm", используемый DNF func (*DNF) Format() string { - return "rpm" + return "rpm" } // SetRootCmd устанавливает команду, используемую для выполнения операций с правами root func (d *DNF) SetRootCmd(s string) { - d.rootCmd = s + d.rootCmd = s } // Sync выполняет upgrade всех установленных пакетов, обновляя их до более новых версий func (d *DNF) Sync(opts *Opts) error { - opts = ensureOpts(opts) // Гарантирует, что opts не равен nil и содержит допустимые значения - cmd := d.getCmd(opts, "dnf", "upgrade") - setCmdEnv(cmd) // Устанавливает переменные окружения для команды - err := cmd.Run() // Выполняет команду - if err != nil { - return fmt.Errorf("dnf: sync: %w", err) - } - return nil + opts = ensureOpts(opts) // Гарантирует, что opts не равен nil и содержит допустимые значения + cmd := d.getCmd(opts, "dnf", "upgrade") + setCmdEnv(cmd) // Устанавливает переменные окружения для команды + err := cmd.Run() // Выполняет команду + if err != nil { + return fmt.Errorf("dnf: sync: %w", err) + } + return nil } // Install устанавливает указанные пакеты с помощью DNF func (d *DNF) Install(opts *Opts, pkgs ...string) error { - opts = ensureOpts(opts) - cmd := d.getCmd(opts, "dnf", "install", "--allowerasing") - cmd.Args = append(cmd.Args, pkgs...) // Добавляем названия пакетов к команде - setCmdEnv(cmd) - err := cmd.Run() - if err != nil { - return fmt.Errorf("dnf: install: %w", err) - } - return nil + opts = ensureOpts(opts) + cmd := d.getCmd(opts, "dnf", "install", "--allowerasing") + cmd.Args = append(cmd.Args, pkgs...) // Добавляем названия пакетов к команде + setCmdEnv(cmd) + err := cmd.Run() + if err != nil { + return fmt.Errorf("dnf: install: %w", err) + } + return nil } // InstallLocal расширяет метод Install для установки пакетов, расположенных локально func (d *DNF) InstallLocal(opts *Opts, pkgs ...string) error { - opts = ensureOpts(opts) - return d.Install(opts, pkgs...) + opts = ensureOpts(opts) + return d.Install(opts, pkgs...) } // Remove удаляет указанные пакеты с помощью DNF func (d *DNF) Remove(opts *Opts, pkgs ...string) error { - opts = ensureOpts(opts) - cmd := d.getCmd(opts, "dnf", "remove") - cmd.Args = append(cmd.Args, pkgs...) - setCmdEnv(cmd) - err := cmd.Run() - if err != nil { - return fmt.Errorf("dnf: remove: %w", err) - } - return nil + opts = ensureOpts(opts) + cmd := d.getCmd(opts, "dnf", "remove") + cmd.Args = append(cmd.Args, pkgs...) + setCmdEnv(cmd) + err := cmd.Run() + if err != nil { + return fmt.Errorf("dnf: remove: %w", err) + } + return nil } // Upgrade обновляет указанные пакеты до более новых версий func (d *DNF) Upgrade(opts *Opts, pkgs ...string) error { - opts = ensureOpts(opts) - cmd := d.getCmd(opts, "dnf", "upgrade") - cmd.Args = append(cmd.Args, pkgs...) - setCmdEnv(cmd) - err := cmd.Run() - if err != nil { - return fmt.Errorf("dnf: upgrade: %w", err) - } - return nil + opts = ensureOpts(opts) + cmd := d.getCmd(opts, "dnf", "upgrade") + cmd.Args = append(cmd.Args, pkgs...) + setCmdEnv(cmd) + err := cmd.Run() + if err != nil { + return fmt.Errorf("dnf: upgrade: %w", err) + } + return nil } // UpgradeAll обновляет все установленные пакеты func (d *DNF) UpgradeAll(opts *Opts) error { - opts = ensureOpts(opts) - cmd := d.getCmd(opts, "dnf", "upgrade") - setCmdEnv(cmd) - err := cmd.Run() - if err != nil { - return fmt.Errorf("dnf: upgradeall: %w", err) - } - return nil + opts = ensureOpts(opts) + cmd := d.getCmd(opts, "dnf", "upgrade") + setCmdEnv(cmd) + err := cmd.Run() + if err != nil { + return fmt.Errorf("dnf: upgradeall: %w", err) + } + return nil } // ListInstalled возвращает список установленных пакетов и их версий func (d *DNF) ListInstalled(opts *Opts) (map[string]string, error) { - out := map[string]string{} - cmd := exec.Command("rpm", "-qa", "--queryformat", "%{NAME}\u200b%|EPOCH?{%{EPOCH}:}:{}|%{VERSION}-%{RELEASE}\\n") + 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 - } + stdout, err := cmd.StdoutPipe() + if err != nil { + return nil, err + } - err = cmd.Start() - 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 - } + 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 - } + err = scanner.Err() + if err != nil { + return nil, err + } - return out, nil + return out, nil } // getCmd создает и возвращает команду exec.Cmd для менеджера пакетов DNF func (d *DNF) getCmd(opts *Opts, mgrCmd string, args ...string) *exec.Cmd { - var cmd *exec.Cmd - if opts.AsRoot { - cmd = exec.Command(getRootCmd(d.rootCmd), mgrCmd) - cmd.Args = append(cmd.Args, opts.Args...) - cmd.Args = append(cmd.Args, args...) - } else { - cmd = exec.Command(mgrCmd, args...) - } + var cmd *exec.Cmd + if opts.AsRoot { + cmd = exec.Command(getRootCmd(d.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") // Добавляет параметр автоматического подтверждения (-y) - } + if opts.NoConfirm { + cmd.Args = append(cmd.Args, "-y") // Добавляет параметр автоматического подтверждения (-y) + } - return cmd + return cmd } diff --git a/pkg/repos/pull.go b/pkg/repos/pull.go index 516d7d8..1436f53 100644 --- a/pkg/repos/pull.go +++ b/pkg/repos/pull.go @@ -35,6 +35,10 @@ import ( "github.com/go-git/go-git/v5/plumbing/format/diff" "github.com/pelletier/go-toml/v2" "go.elara.ws/vercmp" + "mvdan.cc/sh/v3/expand" + "mvdan.cc/sh/v3/interp" + "mvdan.cc/sh/v3/syntax" + "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/db" "plemya-x.ru/alr/internal/shutils/decoder" @@ -42,9 +46,6 @@ import ( "plemya-x.ru/alr/internal/types" "plemya-x.ru/alr/pkg/distro" "plemya-x.ru/alr/pkg/loggerctx" - "mvdan.cc/sh/v3/expand" - "mvdan.cc/sh/v3/interp" - "mvdan.cc/sh/v3/syntax" ) // Pull pulls the provided repositories. If a repo doesn't exist, it will be cloned diff --git a/repo.go b/repo.go index 9423e20..689990a 100644 --- a/repo.go +++ b/repo.go @@ -24,12 +24,13 @@ import ( "github.com/pelletier/go-toml/v2" "github.com/urfave/cli/v2" + "golang.org/x/exp/slices" + "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/db" "plemya-x.ru/alr/internal/types" "plemya-x.ru/alr/pkg/loggerctx" "plemya-x.ru/alr/pkg/repos" - "golang.org/x/exp/slices" ) var addrepoCmd = &cli.Command{ diff --git a/upgrade.go b/upgrade.go index fb0ea97..20bb40f 100644 --- a/upgrade.go +++ b/upgrade.go @@ -23,6 +23,10 @@ import ( "fmt" "github.com/urfave/cli/v2" + "go.elara.ws/vercmp" + "golang.org/x/exp/maps" + "golang.org/x/exp/slices" + "plemya-x.ru/alr/internal/config" "plemya-x.ru/alr/internal/db" "plemya-x.ru/alr/internal/types" @@ -31,9 +35,6 @@ import ( "plemya-x.ru/alr/pkg/loggerctx" "plemya-x.ru/alr/pkg/manager" "plemya-x.ru/alr/pkg/repos" - "go.elara.ws/vercmp" - "golang.org/x/exp/maps" - "golang.org/x/exp/slices" ) var upgradeCmd = &cli.Command{