forked from xplshn/dbin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfindURL.go
116 lines (95 loc) · 3.1 KB
/
findURL.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package main
import (
"fmt"
"net/url"
"path/filepath"
"strings"
)
func findMatchingBins(bEntry binaryEntry, uRepoIndex []binaryEntry) ([]binaryEntry, uint16) {
var matchingBins []binaryEntry
var highestRank uint16
for _, bin := range uRepoIndex {
if bin.Name == bEntry.Name && (bEntry.PkgId == "" || bin.PkgId == bEntry.PkgId) && (bEntry.Version == "" || bin.Version == bEntry.Version) {
matchingBins = append(matchingBins, bin)
if bin.Rank > highestRank {
highestRank = bin.Rank
}
}
}
return matchingBins, highestRank
}
func selectHighestRankedBin(matchingBins []binaryEntry, highestRank uint16) binaryEntry {
if len(matchingBins) == 1 {
return matchingBins[0]
}
var nonGlibcBins []binaryEntry
for _, bin := range matchingBins {
if !strings.Contains(bin.PkgId, "glibc") {
nonGlibcBins = append(nonGlibcBins, bin)
}
}
if len(nonGlibcBins) > 0 {
var selectedBin binaryEntry
var highestNonGlibcRank uint16
for _, bin := range nonGlibcBins {
if bin.Rank > highestNonGlibcRank {
highestNonGlibcRank = bin.Rank
selectedBin = bin
}
}
return selectedBin
}
for _, bin := range matchingBins {
if bin.Rank == highestRank {
return bin
}
}
if highestRank == 0 {
return matchingBins[0]
}
return binaryEntry{}
}
func findURL(config *Config, bEntries []binaryEntry, verbosityLevel Verbosity, uRepoIndex []binaryEntry) ([]string, []string, error) {
var foundURLs []string
var foundB3sum []string
var allErrors []error
allFailed := true
for _, bEntry := range bEntries {
parsedURL, err := url.ParseRequestURI(bEntry.Name)
if err == nil && parsedURL.Scheme != "" && parsedURL.Host != "" {
if verbosityLevel >= extraVerbose {
fmt.Printf("\033[2K\rFound \"%s\" is already a valid URL", bEntry.Name)
}
foundURLs = append(foundURLs, bEntry.Name)
foundB3sum = append(foundB3sum, "!no_check")
allFailed = false
continue
}
if instBEntry := bEntryOfinstalledBinary(filepath.Join(config.InstallDir, bEntry.Name)); instBEntry.Name != "" {
bEntry = instBEntry
}
matchingBins, highestRank := findMatchingBins(bEntry, uRepoIndex)
if len(matchingBins) == 0 {
foundURLs = append(foundURLs, "!not_found")
foundB3sum = append(foundB3sum, "!no_check")
allErrors = append(allErrors, fmt.Errorf("didn't find download URL for [%s]", parseBinaryEntry(bEntry, false)))
continue
}
allFailed = false
selectedBin := selectHighestRankedBin(matchingBins, highestRank)
url := ternary(selectedBin.GhcrPkg != "", selectedBin.GhcrPkg, selectedBin.DownloadURL)
foundURLs = append(foundURLs, url)
foundB3sum = append(foundB3sum, selectedBin.Bsum)
if verbosityLevel >= extraVerbose {
fmt.Printf("\033[2K\rFound \"%s\" with id=%s version=%s", bEntry.Name, selectedBin.PkgId, selectedBin.Version)
}
}
if allFailed {
var errorMessages []string
for _, e := range allErrors {
errorMessages = append(errorMessages, e.Error())
}
return nil, nil, fmt.Errorf(ternary(len(bEntries) != 1, "error: no valid download URLs found for any of the requested binaries.\n%s\n", "%s\n"), strings.Join(errorMessages, "\n"))
}
return foundURLs, foundB3sum, nil
}