Implement package resolve logic fixes
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
## 1. Fix Resolve Function Logic
|
## 1. Fix Resolve Function Logic
|
||||||
|
|
||||||
- [ ] 1.1 Change initialization: start packages with Exists: false instead of true
|
- [x] 1.1 Change initialization: start packages with Exists: false instead of true
|
||||||
- [ ] 1.2 Reorder to check sync DBs BEFORE local DB
|
- [x] 1.2 Reorder to check sync DBs BEFORE local DB
|
||||||
- [ ] 1.3 Separate availability check (sync DBs) from installation check (local DB)
|
- [x] 1.3 Separate availability check (sync DBs) from installation check (local DB)
|
||||||
- [ ] 1.4 Add AUR fallback for packages not in sync DBs
|
- [x] 1.4 Add AUR fallback for packages not in sync DBs
|
||||||
- [ ] 1.5 Validate all packages have either Exists or InAUR before returning
|
- [x] 1.5 Validate all packages have either Exists or InAUR before returning
|
||||||
|
|||||||
+41
-42
@@ -189,7 +189,19 @@ func (f *Fetcher) Resolve(packages []string) (map[string]*PackageInfo, error) {
|
|||||||
|
|
||||||
result := make(map[string]*PackageInfo)
|
result := make(map[string]*PackageInfo)
|
||||||
for _, pkg := range packages {
|
for _, pkg := range packages {
|
||||||
result[pkg] = &PackageInfo{Name: pkg, Exists: true}
|
result[pkg] = &PackageInfo{Name: pkg, Exists: false}
|
||||||
|
}
|
||||||
|
|
||||||
|
syncPkgs, err := f.checkSyncDBs(packages)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
fmt.Fprintf(os.Stderr, "[debug] Resolve: sync db check done (%.2fs)\n", time.Since(start).Seconds())
|
||||||
|
|
||||||
|
for pkg, syncPkg := range syncPkgs {
|
||||||
|
result[pkg].Exists = true
|
||||||
|
result[pkg].InAUR = false
|
||||||
|
result[pkg].syncPkg = syncPkg
|
||||||
}
|
}
|
||||||
|
|
||||||
localPkgs, err := f.buildLocalPkgMap()
|
localPkgs, err := f.buildLocalPkgMap()
|
||||||
@@ -198,53 +210,30 @@ func (f *Fetcher) Resolve(packages []string) (map[string]*PackageInfo, error) {
|
|||||||
}
|
}
|
||||||
fmt.Fprintf(os.Stderr, "[debug] Resolve: local pkgs built (%.2fs)\n", time.Since(start).Seconds())
|
fmt.Fprintf(os.Stderr, "[debug] Resolve: local pkgs built (%.2fs)\n", time.Since(start).Seconds())
|
||||||
|
|
||||||
var notInLocal []string
|
for pkg := range localPkgs {
|
||||||
for _, pkg := range packages {
|
if info, ok := result[pkg]; ok {
|
||||||
if localPkg, ok := localPkgs[pkg]; ok {
|
info.Installed = true
|
||||||
result[pkg] = &PackageInfo{
|
|
||||||
Name: pkg,
|
|
||||||
Exists: true,
|
|
||||||
InAUR: false,
|
|
||||||
Installed: true,
|
|
||||||
syncPkg: localPkg,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
notInLocal = append(notInLocal, pkg)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(notInLocal) > 0 {
|
var notInSync []string
|
||||||
syncPkgs, err := f.checkSyncDBs(notInLocal)
|
for _, pkg := range packages {
|
||||||
if err != nil {
|
if !result[pkg].Exists {
|
||||||
return nil, err
|
notInSync = append(notInSync, pkg)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
f.ensureAURCache(packages)
|
if len(notInSync) > 0 {
|
||||||
|
f.ensureAURCache(notInSync)
|
||||||
|
|
||||||
for _, pkg := range packages {
|
for _, pkg := range packages {
|
||||||
info := result[pkg]
|
info := result[pkg]
|
||||||
if info == nil {
|
if info.Exists {
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if info.Installed {
|
|
||||||
if aurInfo, ok := f.aurCache[pkg]; ok {
|
|
||||||
info.InAUR = true
|
|
||||||
info.AURInfo = &aurInfo
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if syncPkg, ok := syncPkgs[pkg]; ok {
|
|
||||||
info.InAUR = false
|
|
||||||
info.Installed = false
|
|
||||||
info.syncPkg = syncPkg
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if aurInfo, ok := f.aurCache[pkg]; ok {
|
if aurInfo, ok := f.aurCache[pkg]; ok {
|
||||||
info.InAUR = true
|
info.InAUR = true
|
||||||
info.Installed = false
|
|
||||||
info.AURInfo = &aurInfo
|
info.AURInfo = &aurInfo
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -253,6 +242,13 @@ func (f *Fetcher) Resolve(packages []string) (map[string]*PackageInfo, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, pkg := range packages {
|
||||||
|
info := result[pkg]
|
||||||
|
if !info.Exists && !info.InAUR {
|
||||||
|
return nil, fmt.Errorf("package not validated: %s", pkg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Fprintf(os.Stderr, "[debug] Resolve: done (%.2fs)\n", time.Since(start).Seconds())
|
fmt.Fprintf(os.Stderr, "[debug] Resolve: done (%.2fs)\n", time.Since(start).Seconds())
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
@@ -277,18 +273,21 @@ func (f *Fetcher) ensureAURCache(packages []string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
f.fetchAURInfo(uncached)
|
_, err := f.fetchAURInfo(uncached)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "[debug] ensureAURCache: fetch error: %v\n", err)
|
||||||
|
}
|
||||||
fmt.Fprintf(os.Stderr, "[debug] ensureAURCache: done (%.2fs)\n", time.Since(start).Seconds())
|
fmt.Fprintf(os.Stderr, "[debug] ensureAURCache: done (%.2fs)\n", time.Since(start).Seconds())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Fetcher) fetchAURInfo(packages []string) map[string]AURPackage {
|
func (f *Fetcher) fetchAURInfo(packages []string) (map[string]AURPackage, error) {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
fmt.Fprintf(os.Stderr, "[debug] fetchAURInfo: starting...\n")
|
fmt.Fprintf(os.Stderr, "[debug] fetchAURInfo: starting...\n")
|
||||||
|
|
||||||
result := make(map[string]AURPackage)
|
result := make(map[string]AURPackage)
|
||||||
|
|
||||||
if len(packages) == 0 {
|
if len(packages) == 0 {
|
||||||
return result
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
v := url.Values{}
|
v := url.Values{}
|
||||||
@@ -298,18 +297,18 @@ func (f *Fetcher) fetchAURInfo(packages []string) map[string]AURPackage {
|
|||||||
|
|
||||||
resp, err := http.Get(AURInfoURL + "&" + v.Encode())
|
resp, err := http.Get(AURInfoURL + "&" + v.Encode())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return result
|
return result, err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return result
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var aurResp AURResponse
|
var aurResp AURResponse
|
||||||
if err := json.Unmarshal(body, &aurResp); err != nil {
|
if err := json.Unmarshal(body, &aurResp); err != nil {
|
||||||
return result
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, r := range aurResp.Results {
|
for _, r := range aurResp.Results {
|
||||||
@@ -318,7 +317,7 @@ func (f *Fetcher) fetchAURInfo(packages []string) map[string]AURPackage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintf(os.Stderr, "[debug] fetchAURInfo: done (%.2fs)\n", time.Since(start).Seconds())
|
fmt.Fprintf(os.Stderr, "[debug] fetchAURInfo: done (%.2fs)\n", time.Since(start).Seconds())
|
||||||
return result
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Fetcher) ListOrphans() ([]string, error) {
|
func (f *Fetcher) ListOrphans() ([]string, error) {
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ func categorizePackages(f *fetch.Fetcher, packages []string) (pacmanPkgs, aurPkg
|
|||||||
|
|
||||||
for _, pkg := range packages {
|
for _, pkg := range packages {
|
||||||
info := resolved[pkg]
|
info := resolved[pkg]
|
||||||
if info == nil || !info.Exists {
|
if info == nil || (!info.Exists && !info.InAUR) {
|
||||||
fmt.Fprintf(os.Stderr, "error: package not found: %s\n", pkg)
|
fmt.Fprintf(os.Stderr, "error: package not found: %s\n", pkg)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -335,7 +335,7 @@ func DryRun(packages []string) (*output.Result, error) {
|
|||||||
var aurPkgs []string
|
var aurPkgs []string
|
||||||
for _, pkg := range packages {
|
for _, pkg := range packages {
|
||||||
info := resolved[pkg]
|
info := resolved[pkg]
|
||||||
if info == nil || !info.Exists {
|
if info == nil || (!info.Exists && !info.InAUR) {
|
||||||
return nil, fmt.Errorf("package not found: %s", pkg)
|
return nil, fmt.Errorf("package not found: %s", pkg)
|
||||||
}
|
}
|
||||||
if info.InAUR {
|
if info.InAUR {
|
||||||
|
|||||||
Reference in New Issue
Block a user