From 861260198a994ecc5da3f8a21bffa9c35fd19436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Roth?= Date: Mon, 7 Oct 2024 14:19:22 +0200 Subject: [PATCH] publish: persist multidist flag --- api/publish.go | 14 +- cmd/publish_snapshot.go | 4 +- cmd/publish_switch.go | 7 +- cmd/publish_update.go | 7 +- deb/publish.go | 11 +- deb/publish_bench_test.go | 2 +- deb/publish_test.go | 80 +++++----- system/t06_publish/PublishList5Test_gold | 4 + system/t06_publish/PublishShow3Test_gold | 1 + system/t06_publish/PublishShow4Test_gold | 1 + system/t06_publish/PublishSwitch16Test_gold | 8 + system/t06_publish/PublishUpdate14Test_gold | 8 + system/t06_publish/switch.py | 29 ++++ system/t06_publish/update.py | 25 +++ system/t12_api/publish.py | 164 ++++++++++++++++++++ 15 files changed, 310 insertions(+), 55 deletions(-) create mode 100644 system/t06_publish/PublishSwitch16Test_gold create mode 100644 system/t06_publish/PublishUpdate14Test_gold diff --git a/api/publish.go b/api/publish.go index a520878a..a434d90c 100644 --- a/api/publish.go +++ b/api/publish.go @@ -130,7 +130,7 @@ func apiPublishRepoOrSnapshot(c *gin.Context) { var resources []string collectionFactory := context.NewCollectionFactory() - if b.SourceKind == "snapshot" { + if b.SourceKind == deb.SourceSnapshot { var snapshot *deb.Snapshot snapshotCollection := collectionFactory.SnapshotCollection() @@ -182,7 +182,7 @@ func apiPublishRepoOrSnapshot(c *gin.Context) { return } - published, err := deb.NewPublishedRepo(storage, prefix, b.Distribution, b.Architectures, components, sources, collectionFactory) + published, err := deb.NewPublishedRepo(storage, prefix, b.Distribution, b.Architectures, components, sources, collectionFactory, b.MultiDist) if err != nil { AbortWithJSONError(c, 500, fmt.Errorf("unable to publish: %s", err)) return @@ -232,7 +232,7 @@ func apiPublishRepoOrSnapshot(c *gin.Context) { return &task.ProcessReturnValue{Code: http.StatusBadRequest, Value: nil}, fmt.Errorf("prefix/distribution already used by another published repo: %s", duplicate) } - err := published.Publish(context.PackagePool(), context, collectionFactory, signer, publishOutput, b.ForceOverwrite, b.MultiDist) + err := published.Publish(context.PackagePool(), context, collectionFactory, signer, publishOutput, b.ForceOverwrite) if err != nil { return &task.ProcessReturnValue{Code: http.StatusInternalServerError, Value: nil}, fmt.Errorf("unable to publish: %s", err) } @@ -263,7 +263,7 @@ func apiPublishUpdateSwitch(c *gin.Context) { Name string `binding:"required"` } AcquireByHash *bool - MultiDist bool + MultiDist *bool } if c.Bind(&b) != nil { @@ -339,10 +339,14 @@ func apiPublishUpdateSwitch(c *gin.Context) { published.AcquireByHash = *b.AcquireByHash } + if b.MultiDist != nil { + published.MultiDist = *b.MultiDist + } + resources = append(resources, string(published.Key())) taskName := fmt.Sprintf("Update published %s (%s): %s", published.SourceKind, strings.Join(updatedComponents, " "), strings.Join(updatedSnapshots, ", ")) maybeRunTaskInBackground(c, taskName, resources, func(out aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) { - err := published.Publish(context.PackagePool(), context, collectionFactory, signer, out, b.ForceOverwrite, b.MultiDist) + err := published.Publish(context.PackagePool(), context, collectionFactory, signer, out, b.ForceOverwrite) if err != nil { return &task.ProcessReturnValue{Code: http.StatusInternalServerError, Value: nil}, fmt.Errorf("unable to update: %s", err) } diff --git a/cmd/publish_snapshot.go b/cmd/publish_snapshot.go index 1e79fac2..3d2e43e6 100644 --- a/cmd/publish_snapshot.go +++ b/cmd/publish_snapshot.go @@ -118,7 +118,7 @@ func aptlyPublishSnapshotOrRepo(cmd *commander.Command, args []string) error { butAutomaticUpgrades := context.Flags().Lookup("butautomaticupgrades").Value.String() multiDist := context.Flags().Lookup("multi-dist").Value.Get().(bool) - published, err := deb.NewPublishedRepo(storage, prefix, distribution, context.ArchitecturesList(), components, sources, collectionFactory) + published, err := deb.NewPublishedRepo(storage, prefix, distribution, context.ArchitecturesList(), components, sources, collectionFactory, multiDist) if err != nil { return fmt.Errorf("unable to publish: %s", err) } @@ -166,7 +166,7 @@ func aptlyPublishSnapshotOrRepo(cmd *commander.Command, args []string) error { context.Progress().ColoredPrintf("@rWARNING@|: force overwrite mode enabled, aptly might corrupt other published repositories sharing the same package pool.\n") } - err = published.Publish(context.PackagePool(), context, collectionFactory, signer, context.Progress(), forceOverwrite, multiDist) + err = published.Publish(context.PackagePool(), context, collectionFactory, signer, context.Progress(), forceOverwrite) if err != nil { return fmt.Errorf("unable to publish: %s", err) } diff --git a/cmd/publish_switch.go b/cmd/publish_switch.go index a5534747..0f1a620b 100644 --- a/cmd/publish_switch.go +++ b/cmd/publish_switch.go @@ -13,7 +13,6 @@ func aptlyPublishSwitch(cmd *commander.Command, args []string) error { var err error components := strings.Split(context.Flags().Lookup("component").Value.String(), ",") - multiDist := context.Flags().Lookup("multi-dist").Value.Get().(bool) if len(args) < len(components)+1 || len(args) > len(components)+2 { cmd.Usage() @@ -96,7 +95,11 @@ func aptlyPublishSwitch(cmd *commander.Command, args []string) error { published.SkipBz2 = context.Flags().Lookup("skip-bz2").Value.Get().(bool) } - err = published.Publish(context.PackagePool(), context, collectionFactory, signer, context.Progress(), forceOverwrite, multiDist) + if context.Flags().IsSet("multi-dist") { + published.MultiDist = context.Flags().Lookup("multi-dist").Value.Get().(bool) + } + + err = published.Publish(context.PackagePool(), context, collectionFactory, signer, context.Progress(), forceOverwrite) if err != nil { return fmt.Errorf("unable to publish: %s", err) } diff --git a/cmd/publish_update.go b/cmd/publish_update.go index 9bceda50..28de8c67 100644 --- a/cmd/publish_update.go +++ b/cmd/publish_update.go @@ -17,7 +17,6 @@ func aptlyPublishUpdate(cmd *commander.Command, args []string) error { distribution := args[0] param := "." - multiDist := context.Flags().Lookup("multi-dist").Value.Get().(bool) if len(args) == 2 { param = args[1] @@ -65,7 +64,11 @@ func aptlyPublishUpdate(cmd *commander.Command, args []string) error { published.SkipBz2 = context.Flags().Lookup("skip-bz2").Value.Get().(bool) } - err = published.Publish(context.PackagePool(), context, collectionFactory, signer, context.Progress(), forceOverwrite, multiDist) + if context.Flags().IsSet("multi-dist") { + published.MultiDist = context.Flags().Lookup("multi-dist").Value.Get().(bool) + } + + err = published.Publish(context.PackagePool(), context, collectionFactory, signer, context.Progress(), forceOverwrite) if err != nil { return fmt.Errorf("unable to publish: %s", err) } diff --git a/deb/publish.go b/deb/publish.go index 2bdd608d..79c47cb8 100644 --- a/deb/publish.go +++ b/deb/publish.go @@ -70,6 +70,9 @@ type PublishedRepo struct { // Provide index files per hash also AcquireByHash bool + + // Support multiple distributions + MultiDist bool } // ParsePrefix splits [storage:]prefix into components @@ -153,13 +156,14 @@ func walkUpTree(source interface{}, collectionFactory *CollectionFactory) (rootD // distribution and architectures are user-defined properties // components & sources are lists of component to source mapping (*Snapshot or *LocalRepo) func NewPublishedRepo(storage, prefix, distribution string, architectures []string, - components []string, sources []interface{}, collectionFactory *CollectionFactory) (*PublishedRepo, error) { + components []string, sources []interface{}, collectionFactory *CollectionFactory, multiDist bool) (*PublishedRepo, error) { result := &PublishedRepo{ UUID: uuid.New(), Storage: storage, Architectures: architectures, Sources: make(map[string]string), sourceItems: make(map[string]repoSourceItem), + MultiDist: multiDist, } if len(sources) == 0 { @@ -315,6 +319,7 @@ func (p *PublishedRepo) MarshalJSON() ([]byte, error) { "Storage": p.Storage, "SkipContents": p.SkipContents, "AcquireByHash": p.AcquireByHash, + "MultiDist": p.MultiDist, }) } @@ -547,7 +552,7 @@ func (p *PublishedRepo) GetCodename() string { // Publish publishes snapshot (repository) contents, links package files, generates Packages & Release files, signs them func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorageProvider aptly.PublishedStorageProvider, - collectionFactory *CollectionFactory, signer pgp.Signer, progress aptly.Progress, forceOverwrite, multiDist bool) error { + collectionFactory *CollectionFactory, signer pgp.Signer, progress aptly.Progress, forceOverwrite bool) error { publishedStorage := publishedStorageProvider.GetPublishedStorage(p.Storage) err := publishedStorage.MkDir(filepath.Join(p.Prefix, "pool")) @@ -659,7 +664,7 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorageP if err2 != nil { return err2 } - if multiDist { + if p.MultiDist { relPath = filepath.Join("pool", p.Distribution, component, poolDir) } else { relPath = filepath.Join("pool", component, poolDir) diff --git a/deb/publish_bench_test.go b/deb/publish_bench_test.go index b135a8b8..86f18c30 100644 --- a/deb/publish_bench_test.go +++ b/deb/publish_bench_test.go @@ -94,7 +94,7 @@ func BenchmarkListReferencedFiles(b *testing.B) { repo.UpdateRefList(refs.Merge(sharedRefs, false, true)) repoCollection.Add(repo) - publish, err := NewPublishedRepo("", "test", "", nil, []string{defaultComponent}, []interface{}{repo}, factory) + publish, err := NewPublishedRepo("", "test", "", nil, []string{defaultComponent}, []interface{}{repo}, factory, false) if err != nil { b.Fatal(err) } diff --git a/deb/publish_test.go b/deb/publish_test.go index 6fdad759..5243a41a 100644 --- a/deb/publish_test.go +++ b/deb/publish_test.go @@ -134,19 +134,19 @@ func (s *PublishedRepoSuite) SetUpTest(c *C) { s.packageCollection.Update(s.p2) s.packageCollection.Update(s.p3) - s.repo, _ = NewPublishedRepo("", "ppa", "squeeze", nil, []string{"main"}, []interface{}{s.snapshot}, s.factory) + s.repo, _ = NewPublishedRepo("", "ppa", "squeeze", nil, []string{"main"}, []interface{}{s.snapshot}, s.factory, false) s.repo.SkipContents = true - s.repo2, _ = NewPublishedRepo("", "ppa", "maverick", nil, []string{"main"}, []interface{}{s.localRepo}, s.factory) + s.repo2, _ = NewPublishedRepo("", "ppa", "maverick", nil, []string{"main"}, []interface{}{s.localRepo}, s.factory, false) s.repo2.SkipContents = true - s.repo3, _ = NewPublishedRepo("", "linux", "natty", nil, []string{"main", "contrib"}, []interface{}{s.snapshot, s.snapshot2}, s.factory) + s.repo3, _ = NewPublishedRepo("", "linux", "natty", nil, []string{"main", "contrib"}, []interface{}{s.snapshot, s.snapshot2}, s.factory, false) s.repo3.SkipContents = true - s.repo4, _ = NewPublishedRepo("", "ppa", "maverick", []string{"source"}, []string{"main"}, []interface{}{s.localRepo}, s.factory) + s.repo4, _ = NewPublishedRepo("", "ppa", "maverick", []string{"source"}, []string{"main"}, []interface{}{s.localRepo}, s.factory, false) s.repo4.SkipContents = true - s.repo5, _ = NewPublishedRepo("files:other", "ppa", "maverick", []string{"source"}, []string{"main"}, []interface{}{s.localRepo}, s.factory) + s.repo5, _ = NewPublishedRepo("files:other", "ppa", "maverick", []string{"source"}, []string{"main"}, []interface{}{s.localRepo}, s.factory, false) s.repo5.SkipContents = true } @@ -178,25 +178,25 @@ func (s *PublishedRepoSuite) TestNewPublishedRepo(c *C) { c.Check(s.repo3.RefList("main").Len(), Equals, 3) c.Check(s.repo3.RefList("contrib").Len(), Equals, 3) - c.Check(func() { NewPublishedRepo("", ".", "a", nil, nil, nil, s.factory) }, PanicMatches, "publish with empty sources") + c.Check(func() { NewPublishedRepo("", ".", "a", nil, nil, nil, s.factory, false) }, PanicMatches, "publish with empty sources") c.Check(func() { - NewPublishedRepo("", ".", "a", nil, []string{"main"}, []interface{}{s.snapshot, s.snapshot2}, s.factory) + NewPublishedRepo("", ".", "a", nil, []string{"main"}, []interface{}{s.snapshot, s.snapshot2}, s.factory, false) }, PanicMatches, "sources and components should be equal in size") c.Check(func() { - NewPublishedRepo("", ".", "a", nil, []string{"main", "contrib"}, []interface{}{s.localRepo, s.snapshot2}, s.factory) + NewPublishedRepo("", ".", "a", nil, []string{"main", "contrib"}, []interface{}{s.localRepo, s.snapshot2}, s.factory, false) }, PanicMatches, "interface conversion:.*") - _, err := NewPublishedRepo("", ".", "a", nil, []string{"main", "main"}, []interface{}{s.snapshot, s.snapshot2}, s.factory) + _, err := NewPublishedRepo("", ".", "a", nil, []string{"main", "main"}, []interface{}{s.snapshot, s.snapshot2}, s.factory, false) c.Check(err, ErrorMatches, "duplicate component name: main") - _, err = NewPublishedRepo("", ".", "wheezy/updates", nil, []string{"main"}, []interface{}{s.snapshot}, s.factory) + _, err = NewPublishedRepo("", ".", "wheezy/updates", nil, []string{"main"}, []interface{}{s.snapshot}, s.factory, false) c.Check(err, IsNil) } func (s *PublishedRepoSuite) TestMultiDistPool(c *C) { - repo, err := NewPublishedRepo("", "ppa", "squeeze", nil, []string{"main"}, []interface{}{s.snapshot}, s.factory) + repo, err := NewPublishedRepo("", "ppa", "squeeze", nil, []string{"main"}, []interface{}{s.snapshot}, s.factory, true) c.Assert(err, IsNil) - err = repo.Publish(s.packagePool, s.provider, s.factory, &NullSigner{}, nil, false, true) + err = repo.Publish(s.packagePool, s.provider, s.factory, &NullSigner{}, nil, false) c.Assert(err, IsNil) publishedStorage := files.NewPublishedStorage(s.root, "", "") @@ -301,7 +301,7 @@ func (s *PublishedRepoSuite) TestPrefixNormalization(c *C) { errorExpected: "invalid prefix .*", }, } { - repo, err := NewPublishedRepo("", t.prefix, "squeeze", nil, []string{"main"}, []interface{}{s.snapshot}, s.factory) + repo, err := NewPublishedRepo("", t.prefix, "squeeze", nil, []string{"main"}, []interface{}{s.snapshot}, s.factory, false) if t.errorExpected != "" { c.Check(err, ErrorMatches, t.errorExpected) } else { @@ -311,56 +311,56 @@ func (s *PublishedRepoSuite) TestPrefixNormalization(c *C) { } func (s *PublishedRepoSuite) TestDistributionComponentGuessing(c *C) { - repo, err := NewPublishedRepo("", "ppa", "", nil, []string{""}, []interface{}{s.snapshot}, s.factory) + repo, err := NewPublishedRepo("", "ppa", "", nil, []string{""}, []interface{}{s.snapshot}, s.factory, false) c.Check(err, IsNil) c.Check(repo.Distribution, Equals, "squeeze") c.Check(repo.Components(), DeepEquals, []string{"main"}) - repo, err = NewPublishedRepo("", "ppa", "wheezy", nil, []string{""}, []interface{}{s.snapshot}, s.factory) + repo, err = NewPublishedRepo("", "ppa", "wheezy", nil, []string{""}, []interface{}{s.snapshot}, s.factory, false) c.Check(err, IsNil) c.Check(repo.Distribution, Equals, "wheezy") c.Check(repo.Components(), DeepEquals, []string{"main"}) - repo, err = NewPublishedRepo("", "ppa", "", nil, []string{"non-free"}, []interface{}{s.snapshot}, s.factory) + repo, err = NewPublishedRepo("", "ppa", "", nil, []string{"non-free"}, []interface{}{s.snapshot}, s.factory, false) c.Check(err, IsNil) c.Check(repo.Distribution, Equals, "squeeze") c.Check(repo.Components(), DeepEquals, []string{"non-free"}) - repo, err = NewPublishedRepo("", "ppa", "squeeze", nil, []string{""}, []interface{}{s.localRepo}, s.factory) + repo, err = NewPublishedRepo("", "ppa", "squeeze", nil, []string{""}, []interface{}{s.localRepo}, s.factory, false) c.Check(err, IsNil) c.Check(repo.Distribution, Equals, "squeeze") c.Check(repo.Components(), DeepEquals, []string{"main"}) - _, err = NewPublishedRepo("", "ppa", "", nil, []string{"main"}, []interface{}{s.localRepo}, s.factory) + _, err = NewPublishedRepo("", "ppa", "", nil, []string{"main"}, []interface{}{s.localRepo}, s.factory, false) c.Check(err, ErrorMatches, "unable to guess distribution name, please specify explicitly") s.localRepo.DefaultDistribution = "precise" s.localRepo.DefaultComponent = "contrib" s.factory.LocalRepoCollection().Update(s.localRepo) - repo, err = NewPublishedRepo("", "ppa", "", nil, []string{""}, []interface{}{s.localRepo}, s.factory) + repo, err = NewPublishedRepo("", "ppa", "", nil, []string{""}, []interface{}{s.localRepo}, s.factory, false) c.Check(err, IsNil) c.Check(repo.Distribution, Equals, "precise") c.Check(repo.Components(), DeepEquals, []string{"contrib"}) s.localRepo.DefaultDistribution = "precise/updates" - repo, err = NewPublishedRepo("", "ppa", "", nil, []string{""}, []interface{}{s.localRepo}, s.factory) + repo, err = NewPublishedRepo("", "ppa", "", nil, []string{""}, []interface{}{s.localRepo}, s.factory, false) c.Check(err, IsNil) c.Check(repo.Distribution, Equals, "precise/updates") c.Check(repo.Components(), DeepEquals, []string{"contrib"}) - repo, err = NewPublishedRepo("", "ppa", "", nil, []string{"", "contrib"}, []interface{}{s.snapshot, s.snapshot2}, s.factory) + repo, err = NewPublishedRepo("", "ppa", "", nil, []string{"", "contrib"}, []interface{}{s.snapshot, s.snapshot2}, s.factory, false) c.Check(err, IsNil) c.Check(repo.Distribution, Equals, "squeeze") c.Check(repo.Components(), DeepEquals, []string{"contrib", "main"}) - _, err = NewPublishedRepo("", "ppa", "", nil, []string{"", ""}, []interface{}{s.snapshot, s.snapshot2}, s.factory) + _, err = NewPublishedRepo("", "ppa", "", nil, []string{"", ""}, []interface{}{s.snapshot, s.snapshot2}, s.factory, false) c.Check(err, ErrorMatches, "duplicate component name: main") } func (s *PublishedRepoSuite) TestPublish(c *C) { - err := s.repo.Publish(s.packagePool, s.provider, s.factory, &NullSigner{}, nil, false, false) + err := s.repo.Publish(s.packagePool, s.provider, s.factory, &NullSigner{}, nil, false) c.Assert(err, IsNil) c.Check(s.repo.Architectures, DeepEquals, []string{"i386"}) @@ -407,7 +407,7 @@ func (s *PublishedRepoSuite) TestPublish(c *C) { } func (s *PublishedRepoSuite) TestPublishNoSigner(c *C) { - err := s.repo.Publish(s.packagePool, s.provider, s.factory, nil, nil, false, false) + err := s.repo.Publish(s.packagePool, s.provider, s.factory, nil, nil, false) c.Assert(err, IsNil) c.Check(filepath.Join(s.publishedStorage.PublicPath(), "ppa/dists/squeeze/Release"), PathExists) @@ -415,7 +415,7 @@ func (s *PublishedRepoSuite) TestPublishNoSigner(c *C) { } func (s *PublishedRepoSuite) TestPublishLocalRepo(c *C) { - err := s.repo2.Publish(s.packagePool, s.provider, s.factory, nil, nil, false, false) + err := s.repo2.Publish(s.packagePool, s.provider, s.factory, nil, nil, false) c.Assert(err, IsNil) c.Check(filepath.Join(s.publishedStorage.PublicPath(), "ppa/dists/maverick/Release"), PathExists) @@ -423,7 +423,7 @@ func (s *PublishedRepoSuite) TestPublishLocalRepo(c *C) { } func (s *PublishedRepoSuite) TestPublishLocalSourceRepo(c *C) { - err := s.repo4.Publish(s.packagePool, s.provider, s.factory, nil, nil, false, false) + err := s.repo4.Publish(s.packagePool, s.provider, s.factory, nil, nil, false) c.Assert(err, IsNil) c.Check(filepath.Join(s.publishedStorage.PublicPath(), "ppa/dists/maverick/Release"), PathExists) @@ -431,7 +431,7 @@ func (s *PublishedRepoSuite) TestPublishLocalSourceRepo(c *C) { } func (s *PublishedRepoSuite) TestPublishOtherStorage(c *C) { - err := s.repo5.Publish(s.packagePool, s.provider, s.factory, nil, nil, false, false) + err := s.repo5.Publish(s.packagePool, s.provider, s.factory, nil, nil, false) c.Assert(err, IsNil) c.Check(filepath.Join(s.publishedStorage2.PublicPath(), "ppa/dists/maverick/Release"), PathExists) @@ -443,10 +443,10 @@ func (s *PublishedRepoSuite) TestString(c *C) { "ppa/squeeze [] publishes {main: [snap]: Snapshot from mirror [yandex]: http://mirror.yandex.ru/debian/ squeeze}") c.Check(s.repo2.String(), Equals, "ppa/maverick [] publishes {main: [local1]: comment1}") - repo, _ := NewPublishedRepo("", "", "squeeze", []string{"s390"}, []string{"main"}, []interface{}{s.snapshot}, s.factory) + repo, _ := NewPublishedRepo("", "", "squeeze", []string{"s390"}, []string{"main"}, []interface{}{s.snapshot}, s.factory, false) c.Check(repo.String(), Equals, "./squeeze [s390] publishes {main: [snap]: Snapshot from mirror [yandex]: http://mirror.yandex.ru/debian/ squeeze}") - repo, _ = NewPublishedRepo("", "", "squeeze", []string{"i386", "amd64"}, []string{"main"}, []interface{}{s.snapshot}, s.factory) + repo, _ = NewPublishedRepo("", "", "squeeze", []string{"i386", "amd64"}, []string{"main"}, []interface{}{s.snapshot}, s.factory, false) c.Check(repo.String(), Equals, "./squeeze [i386, amd64] publishes {main: [snap]: Snapshot from mirror [yandex]: http://mirror.yandex.ru/debian/ squeeze}") repo.Origin = "myorigin" @@ -526,11 +526,11 @@ func (s *PublishedRepoCollectionSuite) SetUpTest(c *C) { s.localRepo = NewLocalRepo("local1", "comment1") s.factory.LocalRepoCollection().Add(s.localRepo) - s.repo1, _ = NewPublishedRepo("", "ppa", "anaconda", []string{}, []string{"main"}, []interface{}{s.snap1}, s.factory) - s.repo2, _ = NewPublishedRepo("", "", "anaconda", []string{}, []string{"main", "contrib"}, []interface{}{s.snap2, s.snap1}, s.factory) - s.repo3, _ = NewPublishedRepo("", "ppa", "anaconda", []string{}, []string{"main"}, []interface{}{s.snap2}, s.factory) - s.repo4, _ = NewPublishedRepo("", "ppa", "precise", []string{}, []string{"main"}, []interface{}{s.localRepo}, s.factory) - s.repo5, _ = NewPublishedRepo("files:other", "ppa", "precise", []string{}, []string{"main"}, []interface{}{s.localRepo}, s.factory) + s.repo1, _ = NewPublishedRepo("", "ppa", "anaconda", []string{}, []string{"main"}, []interface{}{s.snap1}, s.factory, false) + s.repo2, _ = NewPublishedRepo("", "", "anaconda", []string{}, []string{"main", "contrib"}, []interface{}{s.snap2, s.snap1}, s.factory, false) + s.repo3, _ = NewPublishedRepo("", "ppa", "anaconda", []string{}, []string{"main"}, []interface{}{s.snap2}, s.factory, false) + s.repo4, _ = NewPublishedRepo("", "ppa", "precise", []string{}, []string{"main"}, []interface{}{s.localRepo}, s.factory, false) + s.repo5, _ = NewPublishedRepo("files:other", "ppa", "precise", []string{}, []string{"main"}, []interface{}{s.localRepo}, s.factory, false) s.collection = s.factory.PublishedRepoCollection() } @@ -714,7 +714,7 @@ func (s *PublishedRepoCollectionSuite) TestListReferencedFiles(c *C) { s.snapshotCollection.Add(snap3) // Ensure that adding a second publish point with matching files doesn't give duplicate results. - repo3, err := NewPublishedRepo("", "", "anaconda-2", []string{}, []string{"main"}, []interface{}{snap3}, s.factory) + repo3, err := NewPublishedRepo("", "", "anaconda-2", []string{}, []string{"main"}, []interface{}{snap3}, s.factory, false) c.Check(err, IsNil) c.Check(s.collection.Add(repo3), IsNil) @@ -757,11 +757,11 @@ func (s *PublishedRepoRemoveSuite) SetUpTest(c *C) { s.snapshotCollection.Add(s.snap1) - s.repo1, _ = NewPublishedRepo("", "ppa", "anaconda", []string{}, []string{"main"}, []interface{}{s.snap1}, s.factory) - s.repo2, _ = NewPublishedRepo("", "", "anaconda", []string{}, []string{"main"}, []interface{}{s.snap1}, s.factory) - s.repo3, _ = NewPublishedRepo("", "ppa", "meduza", []string{}, []string{"main"}, []interface{}{s.snap1}, s.factory) - s.repo4, _ = NewPublishedRepo("", "ppa", "osminog", []string{}, []string{"contrib"}, []interface{}{s.snap1}, s.factory) - s.repo5, _ = NewPublishedRepo("files:other", "ppa", "osminog", []string{}, []string{"contrib"}, []interface{}{s.snap1}, s.factory) + s.repo1, _ = NewPublishedRepo("", "ppa", "anaconda", []string{}, []string{"main"}, []interface{}{s.snap1}, s.factory, false) + s.repo2, _ = NewPublishedRepo("", "", "anaconda", []string{}, []string{"main"}, []interface{}{s.snap1}, s.factory, false) + s.repo3, _ = NewPublishedRepo("", "ppa", "meduza", []string{}, []string{"main"}, []interface{}{s.snap1}, s.factory, false) + s.repo4, _ = NewPublishedRepo("", "ppa", "osminog", []string{}, []string{"contrib"}, []interface{}{s.snap1}, s.factory, false) + s.repo5, _ = NewPublishedRepo("files:other", "ppa", "osminog", []string{}, []string{"contrib"}, []interface{}{s.snap1}, s.factory, false) s.collection = s.factory.PublishedRepoCollection() s.collection.Add(s.repo1) diff --git a/system/t06_publish/PublishList5Test_gold b/system/t06_publish/PublishList5Test_gold index 7a5ea773..58b5dc05 100644 --- a/system/t06_publish/PublishList5Test_gold +++ b/system/t06_publish/PublishList5Test_gold @@ -9,6 +9,7 @@ "Codename": "", "Distribution": "maverick", "Label": "", + "MultiDist": false, "NotAutomatic": "", "Origin": "LP-PPA-gladky-anton-gnuplot", "Path": "./maverick", @@ -33,6 +34,7 @@ "Codename": "", "Distribution": "wheezy", "Label": "", + "MultiDist": false, "NotAutomatic": "", "Origin": "", "Path": "ppa/smira/wheezy", @@ -58,6 +60,7 @@ "Codename": "", "Distribution": "maverick", "Label": "", + "MultiDist": false, "NotAutomatic": "", "Origin": "origin1", "Path": "ppa/tr1/maverick", @@ -83,6 +86,7 @@ "Codename": "", "Distribution": "maverick", "Label": "label1", + "MultiDist": false, "NotAutomatic": "", "Origin": "", "Path": "ppa/tr2/maverick", diff --git a/system/t06_publish/PublishShow3Test_gold b/system/t06_publish/PublishShow3Test_gold index 43458ac0..aefbff7c 100644 --- a/system/t06_publish/PublishShow3Test_gold +++ b/system/t06_publish/PublishShow3Test_gold @@ -8,6 +8,7 @@ "Codename": "", "Distribution": "maverick", "Label": "", + "MultiDist": false, "NotAutomatic": "", "Origin": "LP-PPA-gladky-anton-gnuplot", "Path": "./maverick", diff --git a/system/t06_publish/PublishShow4Test_gold b/system/t06_publish/PublishShow4Test_gold index 158d77f8..cf95faee 100644 --- a/system/t06_publish/PublishShow4Test_gold +++ b/system/t06_publish/PublishShow4Test_gold @@ -8,6 +8,7 @@ "Codename": "", "Distribution": "maverick", "Label": "", + "MultiDist": false, "NotAutomatic": "", "Origin": "LP-PPA-gladky-anton-gnuplot", "Path": "ppa/smira/maverick", diff --git a/system/t06_publish/PublishSwitch16Test_gold b/system/t06_publish/PublishSwitch16Test_gold new file mode 100644 index 00000000..122b2882 --- /dev/null +++ b/system/t06_publish/PublishSwitch16Test_gold @@ -0,0 +1,8 @@ +Loading packages... +Generating metadata files and linking package files... +Finalizing metadata files... +Signing file 'Release' with gpg, please enter your passphrase when prompted: +Clearsigning file 'Release' with gpg, please enter your passphrase when prompted: +Cleaning up prefix "." components main... + +Publish for snapshot ./bookworm (origin: LP-PPA-gladky-anton-gnuplot) [amd64, i386] publishes {main: [snap3]: Pulled into 'snap2' with 'snap1' as source, pull request was: 'gnuplot-x11'} has been successfully switched to new snapshot. diff --git a/system/t06_publish/PublishUpdate14Test_gold b/system/t06_publish/PublishUpdate14Test_gold new file mode 100644 index 00000000..6bd929ca --- /dev/null +++ b/system/t06_publish/PublishUpdate14Test_gold @@ -0,0 +1,8 @@ +Loading packages... +Generating metadata files and linking package files... +Finalizing metadata files... +Signing file 'Release' with gpg, please enter your passphrase when prompted: +Clearsigning file 'Release' with gpg, please enter your passphrase when prompted: +Cleaning up prefix "." components main... + +Publish for local repo ./bookworm [i386, source] publishes {main: [local-repo]} has been successfully updated. diff --git a/system/t06_publish/switch.py b/system/t06_publish/switch.py index 933e08c1..dc777b91 100644 --- a/system/t06_publish/switch.py +++ b/system/t06_publish/switch.py @@ -581,3 +581,32 @@ class PublishSwitch15Test(BaseTest): self.check_exists('public/dists/maverick/main/binary-amd64/Packages') self.check_exists('public/dists/maverick/main/binary-amd64/Packages.gz') self.check_not_exists('public/dists/maverick/main/binary-amd64/Packages.bz2') + + +class PublishSwitch16Test(BaseTest): + """ + publish switch: -multi-dist + """ + fixtureDB = True + fixturePool = True + fixtureCmds = [ + "aptly snapshot create snap1 from mirror gnuplot-maverick", + "aptly snapshot create snap2 empty", + "aptly snapshot pull -no-deps -architectures=i386,amd64 snap2 snap1 snap3 gnuplot-x11", + "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=bookworm snap1", + ] + runCmd = "aptly publish switch -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -multi-dist bookworm snap3" + gold_processor = BaseTest.expand_environ + + def check(self): + super(PublishSwitch16Test, self).check() + + self.check_exists('public/dists/bookworm/Release') + + self.check_exists('public/dists/bookworm/main/binary-i386/Packages') + self.check_exists('public/dists/bookworm/main/binary-i386/Packages.gz') + + self.check_exists('public/dists/bookworm/main/binary-amd64/Packages') + self.check_exists('public/dists/bookworm/main/binary-amd64/Packages.gz') + + self.check_exists('public/pool/bookworm/main/g/gnuplot/gnuplot-x11_4.6.1-1~maverick2_amd64.deb') diff --git a/system/t06_publish/update.py b/system/t06_publish/update.py index d3cb443f..7757715a 100644 --- a/system/t06_publish/update.py +++ b/system/t06_publish/update.py @@ -462,3 +462,28 @@ class PublishUpdate13Test(BaseTest): self.check_exists('public/dists/maverick/main/binary-i386/Packages') self.check_exists('public/dists/maverick/main/binary-i386/Packages.gz') self.check_not_exists('public/dists/maverick/main/binary-i386/Packages.bz2') + + +class PublishUpdate14Test(BaseTest): + """ + publish update: -multi-dist + """ + fixtureCmds = [ + "aptly repo create local-repo", + "aptly repo add local-repo ${files}/", + "aptly publish repo -keyring=${files}/aptly.pub -distribution=bookworm local-repo", + ] + runCmd = "aptly publish update -keyring=${files}/aptly.pub -multi-dist bookworm" + gold_processor = BaseTest.expand_environ + + def check(self): + super(PublishUpdate14Test, self).check() + + self.check_exists('public/dists/bookworm/InRelease') + self.check_exists('public/dists/bookworm/Release') + self.check_exists('public/dists/bookworm/Release.gpg') + + self.check_exists('public/dists/bookworm/main/binary-i386/Packages') + self.check_exists('public/dists/bookworm/main/binary-i386/Packages.gz') + + self.check_exists('public/pool/bookworm/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb') diff --git a/system/t12_api/publish.py b/system/t12_api/publish.py index 42866421..325802d2 100644 --- a/system/t12_api/publish.py +++ b/system/t12_api/publish.py @@ -52,6 +52,7 @@ class PublishAPITestRepo(APITest): 'Path': prefix + '/' + 'wheezy', 'Prefix': prefix, 'SkipContents': False, + 'MultiDist': False, 'SourceKind': 'local', 'Sources': [{'Component': 'main', 'Name': repo_name}], 'Storage': '', @@ -96,6 +97,7 @@ class PublishAPITestRepo(APITest): 'Path': './' + distribution, 'Prefix': ".", 'SkipContents': False, + 'MultiDist': False, 'SourceKind': 'local', 'Sources': [{'Component': 'main', 'Name': repo_name}], 'Storage': '', @@ -122,6 +124,71 @@ class PublishAPITestRepo(APITest): self.check_in(repo2_expected, all_repos.json()) +class PublishAPITestRepoMultiDist(APITest): + """ + Test MultiDist publishing to subdirectory + """ + fixtureGpg = True + + def check(self): + repo_name = self.random_name() + self.check_equal(self.post( + "/api/repos", json={"Name": repo_name, "DefaultDistribution": "bookworm"}).status_code, 201) + + d = self.random_name() + self.check_equal(self.upload("/api/files/" + d, + "libboost-program-options-dev_1.49.0.1_i386.deb", "pyspi_0.6.1-1.3.dsc", + "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz", + "pyspi-0.6.1-1.3.stripped.dsc").status_code, 200) + + task = self.post_task("/api/repos/" + repo_name + "/file/" + d) + self.check_task(task) + + # publishing under prefix, default distribution + prefix = self.random_name() + task = self.post_task( + "/api/publish/" + prefix, + json={ + "SourceKind": "local", + "MultiDist": True, + "Sources": [{"Name": repo_name}], + "Signing": DefaultSigningOptions, + } + ) + self.check_task(task) + repo_expected = { + 'AcquireByHash': False, + 'Architectures': ['i386', 'source'], + 'Codename': '', + 'Distribution': 'bookworm', + 'Label': '', + 'Origin': '', + 'NotAutomatic': '', + 'ButAutomaticUpgrades': '', + 'Path': prefix + '/' + 'bookworm', + 'Prefix': prefix, + 'SkipContents': False, + 'MultiDist': True, + 'SourceKind': 'local', + 'Sources': [{'Component': 'main', 'Name': repo_name}], + 'Storage': '', + 'Suite': ''} + + all_repos = self.get("/api/publish") + self.check_equal(all_repos.status_code, 200) + self.check_in(repo_expected, all_repos.json()) + + self.check_exists("public/" + prefix + "/dists/bookworm/Release") + self.check_exists("public/" + prefix + + "/dists/bookworm/main/binary-i386/Packages") + self.check_exists("public/" + prefix + + "/dists/bookworm/main/Contents-i386.gz") + self.check_exists("public/" + prefix + + "/dists/bookworm/main/source/Sources") + self.check_exists( + "public/" + prefix + "/pool/bookworm/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb") + + class PublishSnapshotAPITest(APITest): """ POST /publish/:prefix (snapshots), GET /publish @@ -172,6 +239,7 @@ class PublishSnapshotAPITest(APITest): 'Distribution': 'squeeze', 'Label': 'fun', 'Origin': 'earth', + 'MultiDist': False, 'NotAutomatic': 'yes', 'ButAutomaticUpgrades': 'yes', 'Path': prefix + '/' + 'squeeze', @@ -265,6 +333,7 @@ class PublishUpdateAPITestRepo(APITest): 'Path': prefix + '/' + 'wheezy', 'Prefix': prefix, 'SkipContents': False, + 'MultiDist': False, 'SourceKind': 'local', 'Sources': [{'Component': 'main', 'Name': repo_name}], 'Storage': '', @@ -287,6 +356,94 @@ class PublishUpdateAPITestRepo(APITest): self.check_not_exists("public/" + prefix + "dists/") +class PublishUpdateAPIMultiDist(APITest): + """ + Test MultiDist publishing to subdirectory + """ + fixtureGpg = True + + def check(self): + repo_name = self.random_name() + self.check_equal(self.post( + "/api/repos", json={"Name": repo_name, "DefaultDistribution": "bookworm"}).status_code, 201) + + d = self.random_name() + self.check_equal( + self.upload("/api/files/" + d, + "pyspi_0.6.1-1.3.dsc", + "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz", + "pyspi-0.6.1-1.3.stripped.dsc").status_code, 200) + task = self.post_task("/api/repos/" + repo_name + "/file/" + d) + self.check_task(task) + + prefix = self.random_name() + task = self.post_task( + "/api/publish/" + prefix, + json={ + "Architectures": ["i386", "source"], + "SourceKind": "local", + "Sources": [{"Name": repo_name}], + "Signing": DefaultSigningOptions, + } + ) + self.check_task(task) + + self.check_not_exists( + "public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb") + self.check_exists("public/" + prefix + + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc") + + d = self.random_name() + self.check_equal(self.upload("/api/files/" + d, + "libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200) + task = self.post_task("/api/repos/" + repo_name + "/file/" + d) + self.check_task(task) + + task = self.delete_task("/api/repos/" + repo_name + "/packages/", + json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}) + self.check_task(task) + + # Update and switch MultiDist on. + task = self.put_task( + "/api/publish/" + prefix + "/bookworm", + json={ + "MultiDist": True, + "Signing": DefaultSigningOptions, + } + ) + self.check_task(task) + repo_expected = { + 'AcquireByHash': False, + 'Architectures': ['i386', 'source'], + 'Codename': '', + 'Distribution': 'bookworm', + 'Label': '', + 'Origin': '', + 'NotAutomatic': '', + 'ButAutomaticUpgrades': '', + 'Path': prefix + '/' + 'bookworm', + 'Prefix': prefix, + 'SkipContents': False, + 'MultiDist': True, + 'SourceKind': 'local', + 'Sources': [{'Component': 'main', 'Name': repo_name}], + 'Storage': '', + 'Suite': ''} + + all_repos = self.get("/api/publish") + self.check_equal(all_repos.status_code, 200) + self.check_in(repo_expected, all_repos.json()) + + self.check_exists( + "public/" + prefix + "/pool/bookworm/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb") + self.check_not_exists( + "public/" + prefix + "/pool/bookworm/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc") + + task = self.delete_task("/api/publish/" + prefix + "/bookworm") + self.check_task(task) + self.check_not_exists("public/" + prefix + "dists/") + + class PublishConcurrentUpdateAPITestRepo(APITest): """ PUT /publish/:prefix/:distribution (local repos), DELETE /publish/:prefix/:distribution @@ -368,6 +525,7 @@ class PublishConcurrentUpdateAPITestRepo(APITest): 'Path': prefix + '/' + 'wheezy', 'Prefix': prefix, 'SkipContents': False, + 'MultiDist': False, 'SourceKind': 'local', 'Sources': [{'Component': 'main', 'Name': repo_name}], 'Storage': '', @@ -465,6 +623,7 @@ class PublishUpdateSkipCleanupAPITestRepo(APITest): 'Path': prefix + '/' + 'wheezy', 'Prefix': prefix, 'SkipContents': False, + 'MultiDist': False, 'SourceKind': 'local', 'Sources': [{'Component': 'main', 'Name': repo_name}], 'Storage': '', @@ -532,6 +691,7 @@ class PublishSwitchAPITestRepo(APITest): 'Path': prefix + '/' + 'wheezy', 'Prefix': prefix, 'SkipContents': False, + 'MultiDist': False, 'SourceKind': 'snapshot', 'Sources': [{'Component': 'main', 'Name': snapshot1_name}], 'Storage': '', @@ -579,6 +739,7 @@ class PublishSwitchAPITestRepo(APITest): 'Path': prefix + '/' + 'wheezy', 'Prefix': prefix, 'SkipContents': True, + 'MultiDist': False, 'SourceKind': 'snapshot', 'Sources': [{'Component': 'main', 'Name': snapshot2_name}], 'Storage': '', @@ -644,6 +805,7 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest): 'Path': prefix + '/' + 'wheezy', 'Prefix': prefix, 'SkipContents': False, + 'MultiDist': False, 'SourceKind': 'snapshot', 'Sources': [{'Component': 'main', 'Name': snapshot1_name}], 'Storage': '', @@ -681,6 +843,7 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest): 'Path': prefix + '/' + 'otherdist', 'Prefix': prefix, 'SkipContents': False, + 'MultiDist': False, 'SourceKind': 'snapshot', 'Sources': [{'Component': 'main', 'Name': snapshot1_name}], 'Storage': '', @@ -723,6 +886,7 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest): 'Path': prefix + '/' + 'wheezy', 'Prefix': prefix, 'SkipContents': True, + 'MultiDist': False, 'SourceKind': 'snapshot', 'Sources': [{'Component': 'main', 'Name': snapshot2_name}], 'Storage': '',