Skip to content

Commit 6ec4392

Browse files
committed
Initial resolver working
Signed-off-by: Gavin Zhao <git@gzgz.dev>
1 parent f07a55c commit 6ec4392

File tree

8 files changed

+266
-19
lines changed

8 files changed

+266
-19
lines changed

builder/build.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,9 @@ func (p *Package) CopyAssets(h *PackageHistory, o *Overlay) error {
229229
return h.WriteXML(histPath)
230230
}
231231

232-
func (p *Package) calcDeps(profile *Profile) (deps []string) {
232+
func (p *Package) calcDeps(resolver *Resolver) ([]Dep, error) {
233233
// hash = LayersFakeHash
234-
deps = append(deps, "rust")
235-
deps = append(deps, "cargo")
236-
deps = append(deps, "llvm")
237-
return
234+
return resolver.Query(p.Deps, true, true)
238235
}
239236

240237
// PrepYpkg will do the initial leg work of preparing us for a ypkg build.
@@ -491,7 +488,7 @@ func (p *Package) CollectAssets(overlay *Overlay, usr *UserInfo, manifestTarget
491488
}
492489

493490
// Build will attempt to build the package in the overlayfs system.
494-
func (p *Package) Build(notif PidNotifier, history *PackageHistory, profile *Profile, pman *EopkgManager, overlay *Overlay, manifestTarget string) error {
491+
func (p *Package) Build(notif PidNotifier, history *PackageHistory, profile *Profile, pman *EopkgManager, overlay *Overlay, resolver *Resolver, manifestTarget string) error {
495492
slog.Debug("Building package", "name", p.Name, "version", p.Version, "release", p.Release, "type", p.Type,
496493
"profile", overlay.Back.Name)
497494

@@ -508,7 +505,11 @@ func (p *Package) Build(notif PidNotifier, history *PackageHistory, profile *Pro
508505

509506
// Set up layers caching, only for YPKG
510507
if p.Type == PackageTypeYpkg {
511-
deps := p.calcDeps(profile)
508+
deps, err := p.calcDeps(resolver)
509+
if err != nil {
510+
return fmt.Errorf("Failed to calculate dependencies: %w", err)
511+
}
512+
512513
layer := Layer{
513514
deps: deps,
514515
profile: profile,
@@ -520,6 +521,7 @@ func (p *Package) Build(notif PidNotifier, history *PackageHistory, profile *Pro
520521
return err
521522
}
522523
overlay.LayerDir = contentPath
524+
slog.Info("Using layer", "hash", layer.Hash())
523525
} else {
524526
return errors.New("Under testing of layers feature, XML build is not enabled yet.")
525527
}

builder/layer.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,26 @@ import (
55
"encoding/json"
66
"fmt"
77
"log/slog"
8+
"os"
89
"path/filepath"
910
"strings"
1011

1112
"github.com/zeebo/blake3"
1213
)
1314

1415
type Layer struct {
15-
deps []string
16+
deps []Dep
1617
profile *Profile
1718
back *BackingImage
19+
created bool
20+
hash string
1821
}
1922

2023
func (l Layer) MarshalJSON() ([]byte, error) {
2124
var imageHash string
2225
var err error
2326
if PathExists(l.back.ImagePath) {
24-
if imageHash, err = hashFile(l.back.ImagePath); err != nil {
27+
if imageHash, err = xxh3128HashFile(l.back.ImagePath); err != nil {
2528
return nil, err
2629
}
2730
// } else if PathExists(l.back.ImagePath) {
@@ -33,19 +36,23 @@ func (l Layer) MarshalJSON() ([]byte, error) {
3336
}
3437

3538
return json.Marshal(struct {
36-
Deps []string
39+
Deps []Dep `json:"deps"`
3740
ImageHash string
3841
}{Deps: l.deps, ImageHash: imageHash})
3942
}
4043

4144
func (l *Layer) Hash() string {
42-
jsonBytes, err := json.Marshal(l)
43-
if err != nil {
44-
return LayersFakeHash
45-
} else {
46-
hashBytes := blake3.Sum256(jsonBytes)
47-
return base64.StdEncoding.EncodeToString(hashBytes[:])
45+
if l.hash == "" {
46+
jsonBytes, err := json.Marshal(l)
47+
if err != nil {
48+
l.hash = LayersFakeHash
49+
} else {
50+
hashBytes := blake3.Sum256(jsonBytes)
51+
l.hash = base64.StdEncoding.EncodeToString(hashBytes[:])
52+
}
4853
}
54+
return l.hash
55+
4956
}
5057

5158
func (l *Layer) BasePath() string {
@@ -61,7 +68,15 @@ func (l *Layer) RequestOverlay(notif PidNotifier) (contentPath string, err error
6168
}
6269
}
6370

71+
func (l *Layer) RemoveIfNotCreated() {
72+
slog.Debug("Layer not fully created, removing...", "path", l.BasePath())
73+
if !l.created {
74+
os.RemoveAll(l.BasePath())
75+
}
76+
}
77+
6478
func (l *Layer) Create(notif PidNotifier) (contentPath string, err error) {
79+
slog.Info("Creating layer", "hash", l.Hash())
6580
basePath := l.BasePath()
6681
contentPath = filepath.Join(basePath, "content")
6782

@@ -136,7 +151,12 @@ func (l *Layer) Create(notif PidNotifier) (contentPath string, err error) {
136151
}
137152

138153
// Install our dependencies
139-
cmd := fmt.Sprintf("eopkg it -y %s", strings.Join(l.deps, " "))
154+
pkgs := make([]string, len(l.deps))
155+
for idx, dep := range l.deps {
156+
pkgs[idx] = dep.Name
157+
}
158+
slog.Debug("Installing dependencies", "size", len(pkgs), "pkgs", pkgs)
159+
cmd := fmt.Sprintf("eopkg it -y %s", strings.Join(pkgs, " "))
140160
if DisableColors {
141161
cmd += " -n"
142162
}

builder/manager.go

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,25 @@
1717
package builder
1818

1919
import (
20+
"encoding/xml"
2021
"errors"
2122
"fmt"
23+
"io"
2224
"log/slog"
25+
"net/http"
2326
"os"
2427
"os/signal"
28+
"path"
2529
"path/filepath"
2630
"strings"
2731
"sync"
2832
"syscall"
2933
"time"
3034

35+
"github.com/getsolus/libeopkg/index"
3136
"github.com/getsolus/libosdev/disk"
3237
"github.com/go-git/go-git/v5"
38+
"github.com/ulikunitz/xz"
3339

3440
"github.com/getsolus/solbuild/cli/log"
3541
)
@@ -72,6 +78,7 @@ type Manager struct {
7278
pkgManager *EopkgManager // Package manager, if any
7379
lock *sync.Mutex // Lock on all operations to prevent.. damage.
7480
profile *Profile // The profile we've been requested to use
81+
resolver *Resolver
7582

7683
lockfile *LockFile // We track the global lock for each operation
7784
didStart bool // Whether we got anything done.
@@ -374,7 +381,10 @@ func (m *Manager) Build() error {
374381
return err
375382
}
376383

377-
return m.pkg.Build(m, m.history, m.GetProfile(), m.pkgManager, m.overlay, m.manifestTarget)
384+
m.InitResolver()
385+
slog.Debug("Successfully initialized resolver")
386+
387+
return m.pkg.Build(m, m.history, m.GetProfile(), m.pkgManager, m.overlay, m.resolver, m.manifestTarget)
378388
}
379389

380390
// Chroot will enter the build environment to allow users to introspect it.
@@ -478,3 +488,92 @@ func (m *Manager) SetTmpfs(enable bool, size string) {
478488
m.Config.TmpfsSize = strings.TrimSpace(size)
479489
}
480490
}
491+
492+
func (m *Manager) InitResolver() error {
493+
m.resolver = NewResolver()
494+
495+
if m.profile == nil {
496+
return errors.New("Profile not initialized!")
497+
}
498+
499+
profile := m.profile
500+
/// nameToUrl := make(map[string]string)
501+
repos := []string{}
502+
503+
if strings.Contains(profile.Image, "unstable") {
504+
// nameToUrl["Solus"] = "https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz"
505+
repos = append(repos, "https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz")
506+
// repos = append(repos, "https://packages.getsol.us/unstable/eopkg-index.xml.xz")
507+
} else if strings.Contains(profile.Image, "stable") {
508+
// nameToUrl["Solus"] = "https://cdn.getsol.us/repo/shannon/eopkg-index.xml.xz"
509+
repos = append(repos, "https://cdn.getsol.us/repo/shannon/eopkg-index.xml.xz")
510+
} else {
511+
slog.Warn("Unrecognized image name, not adding default repo", "image", profile.Image)
512+
}
513+
514+
// Realistically, remove can only be * or Solus
515+
// for _, remove := range profile.RemoveRepos {
516+
// if remove == "*" {
517+
// repos = []string{}
518+
// continue
519+
// }
520+
521+
// if idx := slices.Index(repos, remove); idx != -1 {
522+
// repos = slices.Delete(repos, idx, idx+1)
523+
// } else {
524+
// slog.Warn("Cannot remove noexistent repo", "name", remove)
525+
// }
526+
// }
527+
if len(profile.RemoveRepos) != 0 {
528+
repos = []string{}
529+
if len(profile.RemoveRepos) > 1 {
530+
slog.Warn("Unexpectedly requested removing of more than 1 repo", "removes", profile.RemoveRepos)
531+
}
532+
}
533+
534+
for _, add := range profile.AddRepos {
535+
if repo := profile.Repos[add]; repo != nil {
536+
repos = append(repos, repo.URI)
537+
} else {
538+
slog.Warn("Cannot add nonexistent repo", "name", add)
539+
}
540+
}
541+
542+
for _, repo := range repos {
543+
slog.Debug("Fetching repo", "url", repo)
544+
545+
var r io.Reader
546+
ext := path.Ext(repo)
547+
resp, err := http.Get(repo)
548+
if err != nil {
549+
// slog.Error("Failed to fetch", "url", repo, "error", err)
550+
return fmt.Errorf("Failed to fetch %s: %w", repo, err)
551+
}
552+
slog.Debug("Fetched")
553+
554+
if ext == ".xz" {
555+
// slog.Debug("Decoding .xz")
556+
if r, err = xz.NewReader(resp.Body); err != nil {
557+
// slog.Error("Failed to init xz reader", "error", err)
558+
return fmt.Errorf("Failed to init xz reader for %s: %w", repo, err)
559+
}
560+
} else if ext == ".xml" {
561+
r = resp.Body
562+
} else {
563+
// slog.Error("Unrecognized repo url extension", "url", repo, "ext", ext)
564+
return fmt.Errorf("Unrecognized repo url extension %s for %s", ext, repo)
565+
}
566+
567+
dec := xml.NewDecoder(r)
568+
var i index.Index
569+
if err := dec.Decode(&i); err != nil {
570+
// slog.Error("Failed to decode index", "error", err)
571+
return fmt.Errorf("Failed to decode index for %s: %w", repo, err)
572+
}
573+
574+
m.resolver.AddIndex(&i)
575+
slog.Info("Parsed and added repo to resolver", "url", repo)
576+
}
577+
578+
return nil
579+
}

builder/pkg.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ type Package struct {
6262
Path string // Path to the build spec
6363
Sources []source.Source // Each package has 0 or more sources that we fetch
6464
CanNetwork bool // Only applicable to ypkg builds
65+
Deps []string
6566
}
6667

6768
// YmlPackage is a parsed ypkg build file.
@@ -71,6 +72,8 @@ type YmlPackage struct {
7172
Release int `yaml:"release"`
7273
Networking bool `yaml:"networking"` // If set to false (default) we disable networking in the build
7374
Source []map[string]string `yaml:"source"`
75+
BuildDeps []string `yaml:"builddeps"`
76+
CheckDeps []string `yaml:"checkdeps"`
7477
}
7578

7679
// XMLUpdate represents an update in the package history.
@@ -220,6 +223,7 @@ func NewYmlPackageFromBytes(by []byte) (*Package, error) {
220223
Release: ypkg.Release,
221224
Type: PackageTypeYpkg,
222225
CanNetwork: ypkg.Networking,
226+
Deps: append(ypkg.BuildDeps, ypkg.CheckDeps...),
223227
}
224228

225229
for _, row := range ypkg.Source {

0 commit comments

Comments
 (0)