refactor: move pkg/ to internal/ and update imports
	
		
			
	
		
	
	
				
					
				
			Restructure project by relocating package contents from pkg/ to internal/ to better reflect internal-only usage. This commit is initial step to prepare project for public api
This commit is contained in:
		
							
								
								
									
										169
									
								
								internal/manager/apk.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								internal/manager/apk.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | ||||
| // This file was originally part of the project "LURE - Linux User REpository", created by Elara Musayelyan. | ||||
| // It has been modified as part of "ALR - Any Linux Repository" by the ALR Authors. | ||||
| // | ||||
| // ALR - Any Linux Repository | ||||
| // Copyright (C) 2025 The ALR Authors | ||||
| // | ||||
| // 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" | ||||
| ) | ||||
|  | ||||
| // APK represents the APK package manager | ||||
| type APK struct { | ||||
| 	CommonPackageManager | ||||
| } | ||||
|  | ||||
| func NewAPK() *APK { | ||||
| 	return &APK{ | ||||
| 		CommonPackageManager: CommonPackageManager{ | ||||
| 			noConfirmArg: "-i", | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (*APK) Exists() bool { | ||||
| 	_, err := exec.LookPath("apk") | ||||
| 	return err == nil | ||||
| } | ||||
|  | ||||
| func (*APK) Name() string { | ||||
| 	return "apk" | ||||
| } | ||||
|  | ||||
| func (*APK) Format() string { | ||||
| 	return "apk" | ||||
| } | ||||
|  | ||||
| func (a *APK) Sync(opts *Opts) error { | ||||
| 	opts = ensureOpts(opts) | ||||
| 	cmd := a.getCmd(opts, "apk", "update") | ||||
| 	setCmdEnv(cmd) | ||||
| 	err := cmd.Run() | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("apk: sync: %w", err) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (a *APK) Install(opts *Opts, pkgs ...string) error { | ||||
| 	opts = ensureOpts(opts) | ||||
| 	cmd := a.getCmd(opts, "apk", "add") | ||||
| 	cmd.Args = append(cmd.Args, pkgs...) | ||||
| 	setCmdEnv(cmd) | ||||
| 	err := cmd.Run() | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("apk: install: %w", err) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (a *APK) InstallLocal(opts *Opts, pkgs ...string) error { | ||||
| 	opts = ensureOpts(opts) | ||||
| 	cmd := a.getCmd(opts, "apk", "add", "--allow-untrusted") | ||||
| 	cmd.Args = append(cmd.Args, pkgs...) | ||||
| 	setCmdEnv(cmd) | ||||
| 	err := cmd.Run() | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("apk: installlocal: %w", err) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (a *APK) Remove(opts *Opts, pkgs ...string) error { | ||||
| 	opts = ensureOpts(opts) | ||||
| 	cmd := a.getCmd(opts, "apk", "del") | ||||
| 	cmd.Args = append(cmd.Args, pkgs...) | ||||
| 	setCmdEnv(cmd) | ||||
| 	err := cmd.Run() | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("apk: remove: %w", err) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (a *APK) Upgrade(opts *Opts, pkgs ...string) error { | ||||
| 	opts = ensureOpts(opts) | ||||
| 	cmd := a.getCmd(opts, "apk", "upgrade") | ||||
| 	cmd.Args = append(cmd.Args, pkgs...) | ||||
| 	setCmdEnv(cmd) | ||||
| 	err := cmd.Run() | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("apk: upgrade: %w", err) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (a *APK) UpgradeAll(opts *Opts) error { | ||||
| 	opts = ensureOpts(opts) | ||||
| 	return a.Upgrade(opts) | ||||
| } | ||||
|  | ||||
| func (a *APK) ListInstalled(opts *Opts) (map[string]string, error) { | ||||
| 	out := map[string]string{} | ||||
| 	cmd := exec.Command("apk", "list", "-I") | ||||
|  | ||||
| 	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, info, ok := strings.Cut(scanner.Text(), "-") | ||||
| 		if !ok { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		version, _, ok := strings.Cut(info, " ") | ||||
| 		if !ok { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		out[name] = version | ||||
| 	} | ||||
|  | ||||
| 	err = scanner.Err() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (a *APK) IsInstalled(pkg string) (bool, error) { | ||||
| 	cmd := exec.Command("apk", "info", "--installed", pkg) | ||||
| 	output, err := cmd.CombinedOutput() | ||||
| 	if err != nil { | ||||
| 		if exitErr, ok := err.(*exec.ExitError); ok { | ||||
| 			// Exit code 1 means the package is not installed | ||||
| 			if exitErr.ExitCode() == 1 { | ||||
| 				return false, nil | ||||
| 			} | ||||
| 		} | ||||
| 		return false, fmt.Errorf("apk: isinstalled: %w, output: %s", err, output) | ||||
| 	} | ||||
| 	return true, nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user