mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-05-30 04:20:53 +00:00
Refactoring: move package files importing code to common deb from command. #116
This commit is contained in:
+6
-105
@@ -8,8 +8,6 @@ import (
|
|||||||
"github.com/smira/commander"
|
"github.com/smira/commander"
|
||||||
"github.com/smira/flag"
|
"github.com/smira/flag"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func aptlyRepoAdd(cmd *commander.Command, args []string) error {
|
func aptlyRepoAdd(cmd *commander.Command, args []string) error {
|
||||||
@@ -49,110 +47,13 @@ func aptlyRepoAdd(cmd *commander.Command, args []string) error {
|
|||||||
return fmt.Errorf("unable to collect package files: %s", err)
|
return fmt.Errorf("unable to collect package files: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
processedFiles := []string{}
|
var processedFiles, failedFiles2 []string
|
||||||
|
|
||||||
if forceReplace {
|
processedFiles, failedFiles2, err = deb.ImportPackageFiles(list, packageFiles, forceReplace, verifier, context.PackagePool(),
|
||||||
list.PrepareIndex()
|
context.CollectionFactory().PackageCollection(), &aptly.ConsoleResultReporter{context.Progress()})
|
||||||
}
|
failedFiles = append(failedFiles, failedFiles2...)
|
||||||
|
if err != nil {
|
||||||
for _, file := range packageFiles {
|
return fmt.Errorf("unable to import package files: %s", err)
|
||||||
var (
|
|
||||||
stanza deb.Stanza
|
|
||||||
p *deb.Package
|
|
||||||
)
|
|
||||||
|
|
||||||
candidateProcessedFiles := []string{}
|
|
||||||
isSourcePackage := strings.HasSuffix(file, ".dsc")
|
|
||||||
isUdebPackage := strings.HasSuffix(file, ".udeb")
|
|
||||||
|
|
||||||
if isSourcePackage {
|
|
||||||
stanza, err = deb.GetControlFileFromDsc(file, verifier)
|
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
stanza["Package"] = stanza["Source"]
|
|
||||||
delete(stanza, "Source")
|
|
||||||
|
|
||||||
p, err = deb.NewSourcePackageFromControlFile(stanza)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
stanza, err = deb.GetControlFileFromDeb(file)
|
|
||||||
if isUdebPackage {
|
|
||||||
p = deb.NewUdebPackageFromControlFile(stanza)
|
|
||||||
} else {
|
|
||||||
p = deb.NewPackageFromControlFile(stanza)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
context.Progress().ColoredPrintf("@y[!]@| @!Unable to read file %s: %s@|", file, err)
|
|
||||||
failedFiles = append(failedFiles, file)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var checksums utils.ChecksumInfo
|
|
||||||
checksums, err = utils.ChecksumsForFile(file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if isSourcePackage {
|
|
||||||
p.UpdateFiles(append(p.Files(), deb.PackageFile{Filename: filepath.Base(file), Checksums: checksums}))
|
|
||||||
} else {
|
|
||||||
p.UpdateFiles([]deb.PackageFile{deb.PackageFile{Filename: filepath.Base(file), Checksums: checksums}})
|
|
||||||
}
|
|
||||||
|
|
||||||
err = context.PackagePool().Import(file, checksums.MD5)
|
|
||||||
if err != nil {
|
|
||||||
context.Progress().ColoredPrintf("@y[!]@| @!Unable to import file %s into pool: %s@|", file, err)
|
|
||||||
failedFiles = append(failedFiles, file)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
candidateProcessedFiles = append(candidateProcessedFiles, file)
|
|
||||||
|
|
||||||
// go over all files, except for the last one (.dsc/.deb itself)
|
|
||||||
for _, f := range p.Files() {
|
|
||||||
if filepath.Base(f.Filename) == filepath.Base(file) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
sourceFile := filepath.Join(filepath.Dir(file), filepath.Base(f.Filename))
|
|
||||||
err = context.PackagePool().Import(sourceFile, f.Checksums.MD5)
|
|
||||||
if err != nil {
|
|
||||||
context.Progress().ColoredPrintf("@y[!]@| @!Unable to import file %s into pool: %s@|", sourceFile, err)
|
|
||||||
failedFiles = append(failedFiles, file)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
candidateProcessedFiles = append(candidateProcessedFiles, sourceFile)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
// some files haven't been imported
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
err = context.CollectionFactory().PackageCollection().Update(p)
|
|
||||||
if err != nil {
|
|
||||||
context.Progress().ColoredPrintf("@y[!]@| @!Unable to save package %s: %s@|", p, err)
|
|
||||||
failedFiles = append(failedFiles, file)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if forceReplace {
|
|
||||||
conflictingPackages := list.Search(deb.Dependency{Pkg: p.Name, Version: p.Version, Architecture: p.Architecture}, true)
|
|
||||||
for _, cp := range conflictingPackages {
|
|
||||||
context.Progress().ColoredPrintf("@r[-]@| %s removed due to conflict with package being added", cp)
|
|
||||||
list.Remove(cp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = list.Add(p)
|
|
||||||
if err != nil {
|
|
||||||
context.Progress().ColoredPrintf("@y[!]@| @!Unable to add package to repo %s: %s@|", p, err)
|
|
||||||
failedFiles = append(failedFiles, file)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
context.Progress().ColoredPrintf("@g[+]@| %s added@|", p)
|
|
||||||
processedFiles = append(processedFiles, candidateProcessedFiles...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
repo.UpdateRefList(deb.NewPackageRefListFromPackageList(list))
|
repo.UpdateRefList(deb.NewPackageRefListFromPackageList(list))
|
||||||
|
|||||||
+112
@@ -2,6 +2,7 @@ package deb
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/smira/aptly/aptly"
|
"github.com/smira/aptly/aptly"
|
||||||
|
"github.com/smira/aptly/utils"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
@@ -49,3 +50,114 @@ func CollectPackageFiles(locations []string, reporter aptly.ResultReporter) (pac
|
|||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ImportPackageFiles imports files into local repository
|
||||||
|
func ImportPackageFiles(list *PackageList, packageFiles []string, forceReplace bool, verifier utils.Verifier,
|
||||||
|
pool aptly.PackagePool, collection *PackageCollection, reporter aptly.ResultReporter) (processedFiles []string, failedFiles []string, err error) {
|
||||||
|
if forceReplace {
|
||||||
|
list.PrepareIndex()
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range packageFiles {
|
||||||
|
var (
|
||||||
|
stanza Stanza
|
||||||
|
p *Package
|
||||||
|
)
|
||||||
|
|
||||||
|
candidateProcessedFiles := []string{}
|
||||||
|
isSourcePackage := strings.HasSuffix(file, ".dsc")
|
||||||
|
isUdebPackage := strings.HasSuffix(file, ".udeb")
|
||||||
|
|
||||||
|
if isSourcePackage {
|
||||||
|
stanza, err = GetControlFileFromDsc(file, verifier)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
stanza["Package"] = stanza["Source"]
|
||||||
|
delete(stanza, "Source")
|
||||||
|
|
||||||
|
p, err = NewSourcePackageFromControlFile(stanza)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
stanza, err = GetControlFileFromDeb(file)
|
||||||
|
if isUdebPackage {
|
||||||
|
p = NewUdebPackageFromControlFile(stanza)
|
||||||
|
} else {
|
||||||
|
p = NewPackageFromControlFile(stanza)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
reporter.Warning("Unable to read file %s: %s", file, err)
|
||||||
|
failedFiles = append(failedFiles, file)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var checksums utils.ChecksumInfo
|
||||||
|
checksums, err = utils.ChecksumsForFile(file)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if isSourcePackage {
|
||||||
|
p.UpdateFiles(append(p.Files(), PackageFile{Filename: filepath.Base(file), Checksums: checksums}))
|
||||||
|
} else {
|
||||||
|
p.UpdateFiles([]PackageFile{PackageFile{Filename: filepath.Base(file), Checksums: checksums}})
|
||||||
|
}
|
||||||
|
|
||||||
|
err = pool.Import(file, checksums.MD5)
|
||||||
|
if err != nil {
|
||||||
|
reporter.Warning("Unable to import file %s into pool: %s", file, err)
|
||||||
|
failedFiles = append(failedFiles, file)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
candidateProcessedFiles = append(candidateProcessedFiles, file)
|
||||||
|
|
||||||
|
// go over all files, except for the last one (.dsc/.deb itself)
|
||||||
|
for _, f := range p.Files() {
|
||||||
|
if filepath.Base(f.Filename) == filepath.Base(file) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
sourceFile := filepath.Join(filepath.Dir(file), filepath.Base(f.Filename))
|
||||||
|
err = pool.Import(sourceFile, f.Checksums.MD5)
|
||||||
|
if err != nil {
|
||||||
|
reporter.Warning("Unable to import file %s into pool: %s", sourceFile, err)
|
||||||
|
failedFiles = append(failedFiles, file)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
candidateProcessedFiles = append(candidateProcessedFiles, sourceFile)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
// some files haven't been imported
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
err = collection.Update(p)
|
||||||
|
if err != nil {
|
||||||
|
reporter.Warning("Unable to save package %s: %s", p, err)
|
||||||
|
failedFiles = append(failedFiles, file)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if forceReplace {
|
||||||
|
conflictingPackages := list.Search(Dependency{Pkg: p.Name, Version: p.Version, Architecture: p.Architecture}, true)
|
||||||
|
for _, cp := range conflictingPackages {
|
||||||
|
reporter.Removed("%s removed due to conflict with package being added", cp)
|
||||||
|
list.Remove(cp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = list.Add(p)
|
||||||
|
if err != nil {
|
||||||
|
reporter.Warning("Unable to add package to repo %s: %s", p, err)
|
||||||
|
failedFiles = append(failedFiles, file)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
reporter.Added("%s added", p)
|
||||||
|
processedFiles = append(processedFiles, candidateProcessedFiles...)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user