2024-08-13 00:01:00 +00:00
|
|
|
package lib
|
|
|
|
|
|
|
|
import (
|
2024-08-13 19:12:27 +00:00
|
|
|
"archive/tar"
|
|
|
|
"bufio"
|
2024-08-25 23:33:38 +00:00
|
|
|
"bytes"
|
2024-08-13 19:12:27 +00:00
|
|
|
"compress/gzip"
|
2024-08-13 00:01:00 +00:00
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"net/url"
|
2024-08-13 19:12:27 +00:00
|
|
|
"os"
|
|
|
|
"path"
|
2024-08-13 00:01:00 +00:00
|
|
|
|
2024-08-13 19:12:27 +00:00
|
|
|
"git.matterlinux.xyz/matter/tracker/log"
|
2024-08-13 00:01:00 +00:00
|
|
|
"github.com/bigkevmcd/go-configparser"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Package struct {
|
|
|
|
Name string `json:"name"`
|
|
|
|
Pool *Pool `json:"-"`
|
|
|
|
Version string `json:"version"`
|
|
|
|
Depends []string `json:"depends"`
|
|
|
|
Size string `json:"size"`
|
|
|
|
Desc string `json:"desc"`
|
2024-08-13 19:12:27 +00:00
|
|
|
Archive string `json:"archive"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Package) Files() []string {
|
|
|
|
var (
|
|
|
|
gzip_reader io.Reader
|
|
|
|
header *tar.Header
|
|
|
|
result []string
|
|
|
|
file *os.File
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
if file, err = os.Open(p.Archive); err != nil {
|
|
|
|
log.Error("Failed to open %s", p.Archive)
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
|
|
|
|
if gzip_reader, err = gzip.NewReader(bufio.NewReader(file)); err != nil {
|
|
|
|
log.Error("Failed to create reader for %s", p.Archive)
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
reader := tar.NewReader(gzip_reader)
|
|
|
|
|
|
|
|
for header, err = reader.Next(); err == nil; header, err = reader.Next() {
|
|
|
|
if header.Typeflag != tar.TypeReg {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if path.Base(header.Name) != "files.tar.gz" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if result, err = GetFiles(reader); err == nil {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Error("Failed to get file list for %s: %s", p.Archive, err.Error())
|
|
|
|
return []string{}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result
|
2024-08-13 00:01:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Package) URL() string {
|
|
|
|
if nil == p.Pool {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
url, _ := url.JoinPath(p.Pool.Source, "src/branch/"+p.Pool.Branch+"/src", p.Name)
|
|
|
|
return url
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Package) DependsToStr() string {
|
|
|
|
var depends string = ""
|
|
|
|
for _, d := range p.Depends {
|
|
|
|
depends += fmt.Sprintf("%s ", d)
|
|
|
|
}
|
|
|
|
return depends
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Package) Load(r io.Reader) error {
|
|
|
|
var (
|
|
|
|
err error
|
|
|
|
size int64
|
|
|
|
section string = "DEFAULT"
|
2024-08-25 23:33:38 +00:00
|
|
|
buffer []byte
|
2024-08-13 00:01:00 +00:00
|
|
|
)
|
|
|
|
|
2024-08-25 23:33:38 +00:00
|
|
|
if buffer, err = io.ReadAll(r); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if p.Depends, err = GetMultiple("depends", bytes.NewReader(buffer)); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2024-08-13 00:01:00 +00:00
|
|
|
parser := configparser.New()
|
2024-08-25 23:33:38 +00:00
|
|
|
if err = parser.ParseReader(bytes.NewReader(buffer)); err != nil {
|
2024-08-13 00:01:00 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, s := range parser.Sections() {
|
|
|
|
if s == "DEFAULT" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
section = s
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
if section == "DEFAULT" {
|
|
|
|
return fmt.Errorf("DATA does not contain any sections")
|
|
|
|
}
|
|
|
|
|
|
|
|
p.Name = section
|
|
|
|
|
|
|
|
if p.Version, err = parser.Get(section, "version"); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if size, err = parser.GetInt64(section, "size"); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
p.Size = SizeFromBytes(size)
|
|
|
|
|
|
|
|
if p.Desc, err = parser.Get(section, "desc"); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|