Re-publishing for local repositories. #8

Cleanup part is missing.
This commit is contained in:
Andrey Smirnov
2014-04-22 10:49:40 +04:00
parent c70c196420
commit 7eb2fdf425
+57 -14
View File
@@ -40,8 +40,8 @@ type PublishedRepo struct {
localRepo *LocalRepo localRepo *LocalRepo
// Package references is SourceKind == "local" // Package references is SourceKind == "local"
packageRefs *PackageRefList packageRefs *PackageRefList
// Old (currently created) package references // True if repo is being re-published
oldRefs *PackageRefList rePublishing bool
} }
// NewPublishedRepo creates new published repository // NewPublishedRepo creates new published repository
@@ -214,6 +214,15 @@ func (p *PublishedRepo) RefList() *PackageRefList {
panic("unknown source") panic("unknown source")
} }
func (p *PublishedRepo) UpdateLocalRepo() {
if p.SourceKind != "local" {
panic("not local repo publish")
}
p.packageRefs = p.localRepo.RefList()
p.rePublishing = true
}
// Encode does msgpack encoding of PublishedRepo // Encode does msgpack encoding of PublishedRepo
func (p *PublishedRepo) Encode() []byte { func (p *PublishedRepo) Encode() []byte {
var buf bytes.Buffer var buf bytes.Buffer
@@ -267,17 +276,25 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorage
return fmt.Errorf("source is empty") return fmt.Errorf("source is empty")
} }
if len(p.Architectures) == 0 { if !p.rePublishing {
p.Architectures = list.Architectures(true) if len(p.Architectures) == 0 {
p.Architectures = list.Architectures(true)
}
if len(p.Architectures) == 0 {
return fmt.Errorf("unable to figure out list of architectures, please supply explicit list")
}
sort.Strings(p.Architectures)
} }
if len(p.Architectures) == 0 { var suffix string
return fmt.Errorf("unable to figure out list of architectures, please supply explicit list") if p.rePublishing {
suffix = ".tmp"
} }
sort.Strings(p.Architectures)
generatedFiles := map[string]utils.ChecksumInfo{} generatedFiles := map[string]utils.ChecksumInfo{}
renameMap := map[string]string{}
if progress != nil { if progress != nil {
progress.Printf("Generating metadata files and linking package files...\n") progress.Printf("Generating metadata files and linking package files...\n")
@@ -301,11 +318,15 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorage
} }
var packagesFile *os.File var packagesFile *os.File
packagesFile, err = publishedStorage.CreateFile(filepath.Join(basePath, relativePath)) packagesFile, err = publishedStorage.CreateFile(filepath.Join(basePath, relativePath+suffix))
if err != nil { if err != nil {
return fmt.Errorf("unable to creates Packages file: %s", err) return fmt.Errorf("unable to creates Packages file: %s", err)
} }
if suffix != "" {
renameMap[filepath.Join(basePath, relativePath+suffix)] = filepath.Join(basePath, relativePath)
}
bufWriter := bufio.NewWriter(packagesFile) bufWriter := bufio.NewWriter(packagesFile)
err = list.ForEach(func(pkg *Package) error { err = list.ForEach(func(pkg *Package) error {
@@ -350,22 +371,27 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorage
return fmt.Errorf("unable to compress Packages files: %s", err) return fmt.Errorf("unable to compress Packages files: %s", err)
} }
if suffix != "" {
renameMap[filepath.Join(basePath, relativePath+suffix+".gz")] = filepath.Join(basePath, relativePath+".gz")
renameMap[filepath.Join(basePath, relativePath+suffix+".bz2")] = filepath.Join(basePath, relativePath+".bz2")
}
packagesFile.Close() packagesFile.Close()
var checksumInfo utils.ChecksumInfo var checksumInfo utils.ChecksumInfo
checksumInfo, err = publishedStorage.ChecksumsForFile(filepath.Join(basePath, relativePath)) checksumInfo, err = publishedStorage.ChecksumsForFile(filepath.Join(basePath, relativePath+suffix))
if err != nil { if err != nil {
return fmt.Errorf("unable to collect checksums: %s", err) return fmt.Errorf("unable to collect checksums: %s", err)
} }
generatedFiles[relativePath] = checksumInfo generatedFiles[relativePath] = checksumInfo
checksumInfo, err = publishedStorage.ChecksumsForFile(filepath.Join(basePath, relativePath+".gz")) checksumInfo, err = publishedStorage.ChecksumsForFile(filepath.Join(basePath, relativePath+suffix+".gz"))
if err != nil { if err != nil {
return fmt.Errorf("unable to collect checksums: %s", err) return fmt.Errorf("unable to collect checksums: %s", err)
} }
generatedFiles[relativePath+".gz"] = checksumInfo generatedFiles[relativePath+".gz"] = checksumInfo
checksumInfo, err = publishedStorage.ChecksumsForFile(filepath.Join(basePath, relativePath+".bz2")) checksumInfo, err = publishedStorage.ChecksumsForFile(filepath.Join(basePath, relativePath+suffix+".bz2"))
if err != nil { if err != nil {
return fmt.Errorf("unable to collect checksums: %s", err) return fmt.Errorf("unable to collect checksums: %s", err)
} }
@@ -402,11 +428,15 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorage
release["SHA256"] += fmt.Sprintf(" %s %8d %s\n", info.SHA256, info.Size, path) release["SHA256"] += fmt.Sprintf(" %s %8d %s\n", info.SHA256, info.Size, path)
} }
releaseFile, err := publishedStorage.CreateFile(filepath.Join(basePath, "Release")) releaseFile, err := publishedStorage.CreateFile(filepath.Join(basePath, "Release"+suffix))
if err != nil { if err != nil {
return fmt.Errorf("unable to create Release file: %s", err) return fmt.Errorf("unable to create Release file: %s", err)
} }
if suffix != "" {
renameMap[filepath.Join(basePath, "Release"+suffix)] = filepath.Join(basePath, "Release")
}
bufWriter := bufio.NewWriter(releaseFile) bufWriter := bufio.NewWriter(releaseFile)
err = release.WriteTo(bufWriter) err = release.WriteTo(bufWriter)
@@ -433,10 +463,23 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorage
return fmt.Errorf("unable to sign Release file: %s", err) return fmt.Errorf("unable to sign Release file: %s", err)
} }
err = signer.ClearSign(releaseFilename, filepath.Join(filepath.Dir(releaseFilename), "InRelease")) err = signer.ClearSign(releaseFilename, filepath.Join(filepath.Dir(releaseFilename), "InRelease"+suffix))
if err != nil { if err != nil {
return fmt.Errorf("unable to sign Release file: %s", err) return fmt.Errorf("unable to sign Release file: %s", err)
} }
if suffix != "" {
renameMap[filepath.Join(basePath, "Release"+suffix+".gpg")] = filepath.Join(basePath, "Release.gpg")
renameMap[filepath.Join(basePath, "InRelease"+suffix)] = filepath.Join(basePath, "InRelease")
}
}
for oldName, newName := range renameMap {
err = publishedStorage.RenameFile(oldName, newName)
if err != nil {
return fmt.Errorf("unable to rename: %s", err)
}
} }
return nil return nil