diff --git a/cmd/snapshot_pull.go b/cmd/snapshot_pull.go index dcf3338f..7604f0ec 100644 --- a/cmd/snapshot_pull.go +++ b/cmd/snapshot_pull.go @@ -18,6 +18,7 @@ func aptlySnapshotPull(cmd *commander.Command, args []string) error { noDeps := context.flags.Lookup("no-deps").Value.Get().(bool) noRemove := context.flags.Lookup("no-remove").Value.Get().(bool) + allMatches := context.flags.Lookup("all-matches").Value.Get().(bool) // Load snapshot snapshot, err := context.CollectionFactory().SnapshotCollection().ByName(args[0]) @@ -97,51 +98,57 @@ func aptlySnapshotPull(cmd *commander.Command, args []string) error { dep := dependencies[i] // Search for package that can satisfy dependencies - pkg := sourcePackageList.Search(dep) - if pkg == nil { + searchResults := sourcePackageList.Search(dep, allMatches) + if searchResults == nil { context.Progress().ColoredPrintf("@y[!]@| @!Dependency %s can't be satisfied with source %s@|", &dep, source) continue } if !noRemove { // Remove all packages with the same name and architecture - for p := packageList.Search(deb.Dependency{Architecture: pkg.Architecture, Pkg: pkg.Name}); p != nil; { - packageList.Remove(p) - context.Progress().ColoredPrintf("@r[-]@| %s removed", p) - p = packageList.Search(deb.Dependency{Architecture: pkg.Architecture, Pkg: pkg.Name}) + for _, pkg := range searchResults { + pS := packageList.Search(deb.Dependency{Architecture: pkg.Architecture, Pkg: pkg.Name}, true) + for _, p := range pS { + packageList.Remove(p) + context.Progress().ColoredPrintf("@r[-]@| %s removed", p) + } } } // Add new discovered package - packageList.Add(pkg) - context.Progress().ColoredPrintf("@g[+]@| %s added", pkg) + for _, pkg := range searchResults { + packageList.Add(pkg) + context.Progress().ColoredPrintf("@g[+]@| %s added", pkg) + } if noDeps { continue } - // Find missing dependencies for single added package - pL := deb.NewPackageList() - pL.Add(pkg) + // Find missing dependencies, for each added package + for _, pkg := range searchResults { + pL := deb.NewPackageList() + pL.Add(pkg) - var missing []deb.Dependency - missing, err = pL.VerifyDependencies(context.DependencyOptions(), []string{arch}, packageList, nil) - if err != nil { - context.Progress().ColoredPrintf("@y[!]@| @!Error while verifying dependencies for pkg %s: %s@|", pkg, err) - } - - // Append missing dependencies to the list of dependencies to satisfy - for _, misDep := range missing { - found := false - for _, d := range dependencies { - if d == misDep { - found = true - break - } + var missing []deb.Dependency + missing, err = pL.VerifyDependencies(context.DependencyOptions(), []string{arch}, packageList, nil) + if err != nil { + context.Progress().ColoredPrintf("@y[!]@| @!Error while verifying dependencies for pkg %s: %s@|", pkg, err) } - if !found { - dependencies = append(dependencies, misDep) + // Append missing dependencies to the list of dependencies to satisfy + for _, misDep := range missing { + found := false + for _, d := range dependencies { + if d == misDep { + found = true + break + } + } + + if !found { + dependencies = append(dependencies, misDep) + } } } } @@ -186,6 +193,7 @@ Example: cmd.Flag.Bool("dry-run", false, "don't create destination snapshot, just show what would be pulled") cmd.Flag.Bool("no-deps", false, "don't process dependencies, just pull listed packages") cmd.Flag.Bool("no-remove", false, "don't remove other package versions when pulling package") + cmd.Flag.Bool("all-matches", false, "pull all the packages that satisfy the dependency version requirements") return cmd } diff --git a/deb/list.go b/deb/list.go index 4d379cad..1c5058f2 100644 --- a/deb/list.go +++ b/deb/list.go @@ -263,7 +263,7 @@ func (l *PackageList) VerifyDependencies(options int, architectures []string, so continue } - if sources.Search(dep) == nil { + if sources.Search(dep, false) == nil { variantsMissing = append(variantsMissing, dep) missingCount++ } else { @@ -334,7 +334,7 @@ func (l *PackageList) PrepareIndex() { } // Search searches package index for specified package -func (l *PackageList) Search(dep Dependency) *Package { +func (l *PackageList) Search(dep Dependency, allMatches bool) (searchResults []*Package) { if !l.indexed { panic("list not indexed, can't search") } @@ -342,9 +342,16 @@ func (l *PackageList) Search(dep Dependency) *Package { if dep.Relation == VersionDontCare { for _, p := range l.providesIndex[dep.Pkg] { if p.MatchesArchitecture(dep.Architecture) { - return p + searchResults = append(searchResults, p) + + if !allMatches { + break + } } } + if len(searchResults) != 0 { + return + } } i := sort.Search(len(l.packagesIndex), func(j int) bool { return l.packagesIndex[j].Name >= dep.Pkg }) @@ -352,12 +359,17 @@ func (l *PackageList) Search(dep Dependency) *Package { for i < len(l.packagesIndex) && l.packagesIndex[i].Name == dep.Pkg { p := l.packagesIndex[i] if p.MatchesDependency(dep) { - return p + searchResults = append(searchResults, p) + + if !allMatches { + break + } } i++ } - return nil + + return } // Filter filters package index by specified queries (ORed together), possibly pulling dependencies @@ -431,11 +443,13 @@ func (l *PackageList) Filter(queries []string, withDependencies bool, source *Pa // try to satisfy dependencies for _, dep := range missing { - p := l.Search(dep) - if p != nil { - result.Add(p) - dependencySource.Add(p) - added++ + searchResults := l.Search(dep, false) + if searchResults != nil { + for _, p := range searchResults { + result.Add(p) + dependencySource.Add(p) + added++ + } } } } diff --git a/deb/list_test.go b/deb/list_test.go index 5a7db3be..04da48da 100644 --- a/deb/list_test.go +++ b/deb/list_test.go @@ -7,6 +7,43 @@ import ( "strings" ) +type containsChecker struct { + *CheckerInfo +} + +func (c *containsChecker) Check(params []interface{}, names []string) (result bool, error string) { + var ( + pkgSlice1 []*Package + pkgSlice2 []*Package + ok bool + ) + + pkgMap := make (map[*Package]bool) + + + pkgSlice1, ok = params[0].([]*Package) + if !ok { + return false, "The first parameter is not a Package slice" + } + pkgSlice2, ok = params[1].([]*Package) + if !ok { + return false, "The second parameter is not a Package slice" + } + + for _, pkg := range pkgSlice2 { + pkgMap[pkg] = true + } + + for _, pkg := range pkgSlice1 { + if _, ok := pkgMap[pkg]; !ok { + return false, "" + } + } + return true, "" +} + +var Contains Checker = &containsChecker{&CheckerInfo{Name: "Contains", Params: []string{"Container", "Expected to contain"}}} + type PackageListSuite struct { // Simple list with "real" packages from stanzas list *PackageList @@ -14,8 +51,10 @@ type PackageListSuite struct { // Mocked packages in list packages []*Package + packages2 []*Package sourcePackages []*Package il *PackageList + il2 *PackageList } var _ = Suite(&PackageListSuite{}) @@ -60,6 +99,20 @@ func (s *PackageListSuite) SetUpTest(c *C) { } s.il.PrepareIndex() + s.il2 = NewPackageList() + s.packages2 = []*Package{ + &Package{Name: "mailer", Version: "3.5.8", Architecture: "amd64", Source: "postfix (1.3)", Provides: []string{"mail-agent"}, deps: &PackageDependencies{}}, + &Package{Name: "sendmail", Version: "1.0", Architecture: "amd64", Source: "postfix (1.3)", Provides: []string{"mail-agent"}, deps: &PackageDependencies{}}, + &Package{Name: "app", Version: "1.1-bp1", Architecture: "amd64", deps: &PackageDependencies{PreDepends: []string{"dpkg (>= 1.6)"}, Depends: []string{"lib (>> 0.9)", "data (>= 1.0)"}}}, + &Package{Name: "app", Version: "1.1-bp2", Architecture: "amd64", deps: &PackageDependencies{PreDepends: []string{"dpkg (>= 1.6)"}, Depends: []string{"lib (>> 0.9)", "data (>= 1.0)"}}}, + &Package{Name: "app", Version: "1.2", Architecture: "amd64", deps: &PackageDependencies{PreDepends: []string{"dpkg (>= 1.6)"}, Depends: []string{"lib (>> 0.9) | libx (>= 1.5)", "data (>= 1.0) | mail-agent"}}}, + &Package{Name: "app", Version: "3.0", Architecture: "amd64", deps: &PackageDependencies{PreDepends: []string{"dpkg >= 1.6)"}, Depends: []string{"lib (>> 0.9)", "data (>= 1.0)"}}}, + } + for _, p := range s.packages2 { + s.il2.Add(p) + } + s.il2.PrepareIndex() + s.sourcePackages = []*Package{ &Package{Name: "postfix", Version: "1.3", Architecture: "source", SourceArchitecture: "any", IsSource: true, deps: &PackageDependencies{}}, &Package{Name: "app", Version: "1.1~bp1", Architecture: "source", SourceArchitecture: "any", IsSource: true, deps: &PackageDependencies{}}, @@ -196,31 +249,56 @@ func (s *PackageListSuite) TestAppend(c *C) { } func (s *PackageListSuite) TestSearch(c *C) { - c.Check(func() { s.list.Search(Dependency{Architecture: "i386", Pkg: "app"}) }, Panics, "list not indexed, can't search") + //allMatches = False + c.Check(func() { s.list.Search(Dependency{Architecture: "i386", Pkg: "app"}, false) }, Panics, "list not indexed, can't search") - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app"}), Equals, s.packages[3]) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "mail-agent"}), Equals, s.packages[4]) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "puppy"}), IsNil) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app"}, false), DeepEquals, []*Package{s.packages[3]}) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "mail-agent"}, false), DeepEquals, []*Package{s.packages[4]}) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "puppy"}, false), IsNil) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionEqual, Version: "1.1~bp1"}), Equals, s.packages[3]) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionEqual, Version: "1.1~bp2"}), IsNil) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionEqual, Version: "1.1~bp1"}, false), DeepEquals, []*Package{s.packages[3]}) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionEqual, Version: "1.1~bp2"}, false), IsNil) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLess, Version: "1.1"}), Equals, s.packages[3]) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLess, Version: "1.1~~"}), IsNil) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLess, Version: "1.1"}, false), DeepEquals, []*Package{s.packages[3]}) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLess, Version: "1.1~~"}, false), IsNil) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLessOrEqual, Version: "1.1"}), Equals, s.packages[3]) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLessOrEqual, Version: "1.1~bp1"}), Equals, s.packages[3]) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLessOrEqual, Version: "1.1~~"}), IsNil) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLessOrEqual, Version: "1.1"}, false), DeepEquals, []*Package{s.packages[3]}) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLessOrEqual, Version: "1.1~bp1"}, false), DeepEquals, []*Package{s.packages[3]}) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionLessOrEqual, Version: "1.1~~"}, false), IsNil) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreater, Version: "1.0"}), Equals, s.packages[3]) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreater, Version: "1.2"}), IsNil) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreater, Version: "1.0"}, false), DeepEquals, []*Package{s.packages[3]}) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreater, Version: "1.2"}, false), IsNil) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreaterOrEqual, Version: "1.0"}), Equals, s.packages[3]) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreaterOrEqual, Version: "1.1~bp1"}), Equals, s.packages[3]) - c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreaterOrEqual, Version: "1.2"}), IsNil) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreaterOrEqual, Version: "1.0"}, false), DeepEquals, []*Package{s.packages[3]}) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreaterOrEqual, Version: "1.1~bp1"}, false), DeepEquals, []*Package{s.packages[3]}) + c.Check(s.il.Search(Dependency{Architecture: "i386", Pkg: "app", Relation: VersionGreaterOrEqual, Version: "1.2"}, false), IsNil) // search w/o version should return package with latest version - c.Check(s.il.Search(Dependency{Architecture: "source", Pkg: "dpkg"}), Equals, s.packages[13]) + c.Check(s.il.Search(Dependency{Architecture: "source", Pkg: "dpkg"}, false), DeepEquals, []*Package{s.packages[13]}) + + // allMatches = True + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app"}, true), Contains, []*Package{s.packages2[2], s.packages2[3], s.packages2[4], s.packages2[5]}) + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "mail-agent"}, true), Contains, []*Package{s.packages2[0], s.packages2[1]}) + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "puppy"}, true), IsNil) + + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionEqual, Version: "1.1"}, true), Contains, []*Package{s.packages2[2], s.packages2[3]}) + + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionEqual, Version: "1.1"}, true), Contains, []*Package{s.packages2[2], s.packages2[3]}) + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionEqual, Version: "3"}, true), Contains, []*Package{s.packages2[5]}) + + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionLess, Version: "1.2"}, true), Contains, []*Package{s.packages2[2], s.packages2[3]}) + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionLess, Version: "1.1~"}, true), IsNil) + + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionLessOrEqual, Version: "1.2"}, true), Contains, []*Package{s.packages2[2], s.packages2[3], s.packages2[4]}) + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionLessOrEqual, Version: "1.1-bp1"}, true), Contains, []*Package{s.packages2[2]}) + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionLessOrEqual, Version: "1.0"}, true), IsNil) + + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionGreater, Version: "1.1"}, true), Contains, []*Package{s.packages2[2], s.packages2[3], s.packages2[4], s.packages2[5]}) + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionGreater, Version: "5.0"}, true), IsNil) + + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionGreaterOrEqual, Version: "1.2"}, true), Contains, []*Package{s.packages2[4], s.packages2[5]}) + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionGreaterOrEqual, Version: "1.1~bp1"}, true), Contains, []*Package{s.packages2[2], s.packages2[3], s.packages2[4], s.packages2[5]}) + c.Check(s.il2.Search(Dependency{Architecture: "amd64", Pkg: "app", Relation: VersionGreaterOrEqual, Version: "5.0"}, true), IsNil) } func (s *PackageListSuite) TestFilter(c *C) { diff --git a/deb/package.go b/deb/package.go index 8569ad43..01b638dd 100644 --- a/deb/package.go +++ b/deb/package.go @@ -43,7 +43,7 @@ func NewPackageFromControlFile(input Stanza) *Package { Version: input["Version"], Architecture: input["Architecture"], Source: input["Source"], - V06Plus: true, + V06Plus: true, } delete(input, "Package") @@ -92,7 +92,7 @@ func NewSourcePackageFromControlFile(input Stanza) (*Package, error) { Version: input["Version"], Architecture: "source", SourceArchitecture: input["Architecture"], - V06Plus: true, + V06Plus: true, } delete(input, "Package") @@ -212,6 +212,7 @@ func (p *Package) MatchesDependency(dep Dependency) bool { } r := CompareVersions(p.Version, dep.Version) + switch dep.Relation { case VersionEqual: return r == 0 diff --git a/deb/package_test.go b/deb/package_test.go index 815da84d..9f967ec7 100644 --- a/deb/package_test.go +++ b/deb/package_test.go @@ -90,16 +90,16 @@ func (s *PackageSuite) TestKey(c *C) { c.Check(p.Key(""), DeepEquals, []byte("Pi386 alien-arena-common 7.40-2 c8901eedd79ac51b")) c.Check(p.Key("xD"), DeepEquals, []byte("xDPi386 alien-arena-common 7.40-2 c8901eedd79ac51b")) - p.V06Plus = false - c.Check(p.Key(""), DeepEquals, []byte("Pi386 alien-arena-common 7.40-2")) - c.Check(p.Key("xD"), DeepEquals, []byte("xDPi386 alien-arena-common 7.40-2")) + p.V06Plus = false + c.Check(p.Key(""), DeepEquals, []byte("Pi386 alien-arena-common 7.40-2")) + c.Check(p.Key("xD"), DeepEquals, []byte("xDPi386 alien-arena-common 7.40-2")) } func (s *PackageSuite) TestShortKey(c *C) { - p := NewPackageFromControlFile(s.stanza) + p := NewPackageFromControlFile(s.stanza) - c.Check(p.ShortKey(""), DeepEquals, []byte("Pi386 alien-arena-common 7.40-2")) - c.Check(p.ShortKey("xD"), DeepEquals, []byte("xDPi386 alien-arena-common 7.40-2")) + c.Check(p.ShortKey(""), DeepEquals, []byte("Pi386 alien-arena-common 7.40-2")) + c.Check(p.ShortKey("xD"), DeepEquals, []byte("xDPi386 alien-arena-common 7.40-2")) } func (s *PackageSuite) TestStanza(c *C) { @@ -174,6 +174,9 @@ func (s *PackageSuite) TestMatchesDependency(c *C) { // exact match c.Check(p.MatchesDependency(Dependency{Pkg: "alien-arena-common", Architecture: "i386", Relation: VersionEqual, Version: "7.40-2"}), Equals, true) + // exact match, same version, no revision specified + c.Check(p.MatchesDependency(Dependency{Pkg: "alien-arena-common", Architecture: "i386", Relation: VersionEqual, Version: "7.40"}), Equals, false) + // different name c.Check(p.MatchesDependency(Dependency{Pkg: "alien-arena", Architecture: "i386", Relation: VersionEqual, Version: "7.40-2"}), Equals, false) diff --git a/man/aptly.1 b/man/aptly.1 index 6c336482..62398f77 100644 --- a/man/aptly.1 +++ b/man/aptly.1 @@ -603,6 +603,10 @@ $ aptly snapshot pull wheezy\-main wheezy\-backports wheezy\-new\-xorg xorg\-ser Options: . .TP +\-\fBall\-matches\fR=false +pull all the packages that satisfy the dependency version requirements +. +.TP \-\fBdry\-run\fR=false don\(cqt create destination snapshot, just show what would be pulled . diff --git a/system/t05_snapshot/PullSnapshot13Test_gold b/system/t05_snapshot/PullSnapshot13Test_gold new file mode 100644 index 00000000..14ef34fc --- /dev/null +++ b/system/t05_snapshot/PullSnapshot13Test_gold @@ -0,0 +1,164 @@ +Dependencies would be pulled into snapshot: + [empty]: Created as empty +from snapshot: + [sensu]: Snapshot from mirror [sensu]: http://repos.sensuapp.org/apt/ sensu +and result would be saved as new snapshot destination. +Loading packages (154)... +Building indexes... +[+] sensu_0.12.6-5_amd64 added +[+] sensu_0.12.6-4_amd64 added +[+] sensu_0.12.6-3_amd64 added +[+] sensu_0.12.6-2_amd64 added +[+] sensu_0.12.6-1_amd64 added +[+] sensu_0.12.5-1_amd64 added +[+] sensu_0.12.4-1_amd64 added +[+] sensu_0.12.3-1_amd64 added +[+] sensu_0.12.2-1_amd64 added +[+] sensu_0.12.1-1_amd64 added +[+] sensu_0.12.0-1_amd64 added +[+] sensu_0.11.3-1_amd64 added +[+] sensu_0.11.1-1_amd64 added +[+] sensu_0.11.0.beta.4-1_amd64 added +[+] sensu_0.11.0.beta.3-1_amd64 added +[+] sensu_0.11.0.beta.2-1_amd64 added +[+] sensu_0.11.0.beta.1-1_amd64 added +[+] sensu_0.11.0.beta-1_amd64 added +[+] sensu_0.11.0-1_amd64 added +[+] sensu_0.10.2-1_amd64 added +[+] sensu_0.10.1-1_amd64 added +[+] sensu_0.10.0-2_amd64 added +[+] sensu_0.10.0-1_amd64 added +[+] sensu_0.9.13.beta.1-1_amd64 added +[+] sensu_0.9.13.beta-2_amd64 added +[+] sensu_0.9.13.beta-1_amd64 added +[+] sensu_0.9.13-1_amd64 added +[+] sensu_0.9.12.beta.6-2_amd64 added +[+] sensu_0.9.12.beta.6-1_amd64 added +[+] sensu_0.9.12.beta.5-5_amd64 added +[+] sensu_0.9.12.beta.5-4_amd64 added +[+] sensu_0.9.12.beta.5-3_amd64 added +[+] sensu_0.9.12.beta.5-2_amd64 added +[+] sensu_0.9.12.beta.5-1_amd64 added +[+] sensu_0.9.12.beta.4-1_amd64 added +[+] sensu_0.9.12.beta.3-3_amd64 added +[+] sensu_0.9.12.beta.3-2_amd64 added +[+] sensu_0.9.12.beta.3-1_amd64 added +[+] sensu_0.9.12.beta.2-1_amd64 added +[+] sensu_0.9.12.beta.1-1_amd64 added +[+] sensu_0.9.12.beta-1_amd64 added +[+] sensu_0.9.12-3_amd64 added +[+] sensu_0.9.12-2_amd64 added +[+] sensu_0.9.12-1_amd64 added +[+] sensu_0.9.11-1_amd64 added +[+] sensu_0.9.10-1_amd64 added +[+] sensu_0.9.9.beta.4-1_amd64 added +[+] sensu_0.9.9.beta.3-2_amd64 added +[+] sensu_0.9.9.beta.3-1_amd64 added +[+] sensu_0.9.9.beta.2-1_amd64 added +[+] sensu_0.9.9.beta.1-1_amd64 added +[+] sensu_0.9.9.beta-1_amd64 added +[+] sensu_0.9.9-1_amd64 added +[+] sensu_0.9.8.beta.4-1_amd64 added +[+] sensu_0.9.8.beta.3-1_amd64 added +[+] sensu_0.9.8.beta.2-1_amd64 added +[+] sensu_0.9.8.beta.1-1_amd64 added +[+] sensu_0.9.8.beta-1_amd64 added +[+] sensu_0.9.8-1_amd64 added +[+] sensu_0.9.7.beta.4-1_amd64 added +[+] sensu_0.9.7.beta.3-1_amd64 added +[+] sensu_0.9.7.beta.2-1_amd64 added +[+] sensu_0.9.7.beta.1-1_amd64 added +[+] sensu_0.9.7.beta-1_amd64 added +[+] sensu_0.9.7-1_amd64 added +[+] sensu_0.9.6.beta.7-1_amd64 added +[+] sensu_0.9.6.beta.6-1_amd64 added +[+] sensu_0.9.6.beta.3-1_amd64 added +[+] sensu_0.9.6.beta.2-1_amd64 added +[+] sensu_0.9.6-4_amd64 added +[+] sensu_0.9.6-3_amd64 added +[+] sensu_0.9.6-2_amd64 added +[+] sensu_0.9.6-1_amd64 added +[+] sensu_0.9.5-36_amd64 added +[+] sensu_0.9.5-35_amd64 added +[+] sensu_0.9.5-34_amd64 added +[+] sensu_0.9.5-30_amd64 added +[+] sensu_0.12.6-5_i386 added +[+] sensu_0.12.6-4_i386 added +[+] sensu_0.12.6-3_i386 added +[+] sensu_0.12.6-2_i386 added +[+] sensu_0.12.6-1_i386 added +[+] sensu_0.12.5-1_i386 added +[+] sensu_0.12.4-1_i386 added +[+] sensu_0.12.3-1_i386 added +[+] sensu_0.12.2-1_i386 added +[+] sensu_0.12.1-1_i386 added +[+] sensu_0.12.0-1_i386 added +[+] sensu_0.11.3-1_i386 added +[+] sensu_0.11.1-1_i386 added +[+] sensu_0.11.0.beta.4-1_i386 added +[+] sensu_0.11.0.beta.3-1_i386 added +[+] sensu_0.11.0.beta.2-1_i386 added +[+] sensu_0.11.0.beta.1-1_i386 added +[+] sensu_0.11.0.beta-1_i386 added +[+] sensu_0.11.0-1_i386 added +[+] sensu_0.10.2-1_i386 added +[+] sensu_0.10.1-1_i386 added +[+] sensu_0.10.0-2_i386 added +[+] sensu_0.10.0-1_i386 added +[+] sensu_0.9.13.beta.1-1_i386 added +[+] sensu_0.9.13.beta-2_i386 added +[+] sensu_0.9.13.beta-1_i386 added +[+] sensu_0.9.13-1_i386 added +[+] sensu_0.9.12.beta.6-2_i386 added +[+] sensu_0.9.12.beta.6-1_i386 added +[+] sensu_0.9.12.beta.5-5_i386 added +[+] sensu_0.9.12.beta.5-4_i386 added +[+] sensu_0.9.12.beta.5-3_i386 added +[+] sensu_0.9.12.beta.5-2_i386 added +[+] sensu_0.9.12.beta.5-1_i386 added +[+] sensu_0.9.12.beta.4-1_i386 added +[+] sensu_0.9.12.beta.3-3_i386 added +[+] sensu_0.9.12.beta.3-2_i386 added +[+] sensu_0.9.12.beta.3-1_i386 added +[+] sensu_0.9.12.beta.2-1_i386 added +[+] sensu_0.9.12.beta.1-1_i386 added +[+] sensu_0.9.12.beta-1_i386 added +[+] sensu_0.9.12-3_i386 added +[+] sensu_0.9.12-2_i386 added +[+] sensu_0.9.12-1_i386 added +[+] sensu_0.9.11-1_i386 added +[+] sensu_0.9.10-1_i386 added +[+] sensu_0.9.9.beta.4-1_i386 added +[+] sensu_0.9.9.beta.3-2_i386 added +[+] sensu_0.9.9.beta.3-1_i386 added +[+] sensu_0.9.9.beta.2-1_i386 added +[+] sensu_0.9.9.beta.1-1_i386 added +[+] sensu_0.9.9.beta-1_i386 added +[+] sensu_0.9.9-1_i386 added +[+] sensu_0.9.8.beta.4-1_i386 added +[+] sensu_0.9.8.beta.3-1_i386 added +[+] sensu_0.9.8.beta.2-1_i386 added +[+] sensu_0.9.8.beta.1-1_i386 added +[+] sensu_0.9.8.beta-1_i386 added +[+] sensu_0.9.8-1_i386 added +[+] sensu_0.9.7.beta.4-1_i386 added +[+] sensu_0.9.7.beta.3-1_i386 added +[+] sensu_0.9.7.beta.2-1_i386 added +[+] sensu_0.9.7.beta.1-1_i386 added +[+] sensu_0.9.7.beta-1_i386 added +[+] sensu_0.9.7-1_i386 added +[+] sensu_0.9.6.beta.7-1_i386 added +[+] sensu_0.9.6.beta.6-1_i386 added +[+] sensu_0.9.6.beta.3-1_i386 added +[+] sensu_0.9.6.beta.2-1_i386 added +[+] sensu_0.9.6-4_i386 added +[+] sensu_0.9.6-3_i386 added +[+] sensu_0.9.6-2_i386 added +[+] sensu_0.9.6-1_i386 added +[+] sensu_0.9.5-36_i386 added +[+] sensu_0.9.5-35_i386 added +[+] sensu_0.9.5-34_i386 added +[+] sensu_0.9.5-32_i386 added + +Snapshot destination successfully created. +You can run 'aptly publish snapshot destination' to publish snapshot as Debian repository. diff --git a/system/t05_snapshot/PullSnapshot14Test_gold b/system/t05_snapshot/PullSnapshot14Test_gold new file mode 100644 index 00000000..21d64d38 --- /dev/null +++ b/system/t05_snapshot/PullSnapshot14Test_gold @@ -0,0 +1,62 @@ +Dependencies would be pulled into snapshot: + [empty]: Created as empty +from snapshot: + [sensu]: Snapshot from mirror [sensu]: http://repos.sensuapp.org/apt/ sensu +and result would be saved as new snapshot destination. +Loading packages (154)... +Building indexes... +[+] sensu_0.12.6-5_amd64 added +[+] sensu_0.12.6-4_amd64 added +[+] sensu_0.12.6-3_amd64 added +[+] sensu_0.12.6-2_amd64 added +[+] sensu_0.12.6-1_amd64 added +[+] sensu_0.12.5-1_amd64 added +[+] sensu_0.12.4-1_amd64 added +[+] sensu_0.12.3-1_amd64 added +[+] sensu_0.12.2-1_amd64 added +[+] sensu_0.12.1-1_amd64 added +[+] sensu_0.12.0-1_amd64 added +[-] sensu_0.12.6-5_amd64 removed +[-] sensu_0.12.6-4_amd64 removed +[-] sensu_0.12.6-3_amd64 removed +[-] sensu_0.12.6-2_amd64 removed +[-] sensu_0.12.6-1_amd64 removed +[-] sensu_0.12.5-1_amd64 removed +[-] sensu_0.12.4-1_amd64 removed +[-] sensu_0.12.3-1_amd64 removed +[-] sensu_0.12.2-1_amd64 removed +[-] sensu_0.12.1-1_amd64 removed +[-] sensu_0.12.0-1_amd64 removed +[+] sensu_0.9.5-36_amd64 added +[+] sensu_0.9.5-35_amd64 added +[+] sensu_0.9.5-34_amd64 added +[+] sensu_0.9.5-30_amd64 added +[+] sensu_0.12.6-5_i386 added +[+] sensu_0.12.6-4_i386 added +[+] sensu_0.12.6-3_i386 added +[+] sensu_0.12.6-2_i386 added +[+] sensu_0.12.6-1_i386 added +[+] sensu_0.12.5-1_i386 added +[+] sensu_0.12.4-1_i386 added +[+] sensu_0.12.3-1_i386 added +[+] sensu_0.12.2-1_i386 added +[+] sensu_0.12.1-1_i386 added +[+] sensu_0.12.0-1_i386 added +[-] sensu_0.12.6-5_i386 removed +[-] sensu_0.12.6-4_i386 removed +[-] sensu_0.12.6-3_i386 removed +[-] sensu_0.12.6-2_i386 removed +[-] sensu_0.12.6-1_i386 removed +[-] sensu_0.12.5-1_i386 removed +[-] sensu_0.12.4-1_i386 removed +[-] sensu_0.12.3-1_i386 removed +[-] sensu_0.12.2-1_i386 removed +[-] sensu_0.12.1-1_i386 removed +[-] sensu_0.12.0-1_i386 removed +[+] sensu_0.9.5-36_i386 added +[+] sensu_0.9.5-35_i386 added +[+] sensu_0.9.5-34_i386 added +[+] sensu_0.9.5-32_i386 added + +Snapshot destination successfully created. +You can run 'aptly publish snapshot destination' to publish snapshot as Debian repository. diff --git a/system/t05_snapshot/pull.py b/system/t05_snapshot/pull.py index 28bab575..69229366 100644 --- a/system/t05_snapshot/pull.py +++ b/system/t05_snapshot/pull.py @@ -207,3 +207,27 @@ class PullSnapshot12Test(BaseTest): "aptly snapshot create sensu from mirror sensu", ] runCmd = "aptly snapshot pull -architectures=amd64,i386 empty sensu destination sensu" + + +class PullSnapshot13Test(BaseTest): + """ + pull snapshot: pull all versions + """ + fixtureDB = True + fixtureCmds = [ + "aptly snapshot create empty empty", + "aptly snapshot create sensu from mirror sensu", + ] + runCmd = "aptly snapshot pull -architectures=amd64,i386 -all-matches empty sensu destination sensu" + + +class PullSnapshot14Test(BaseTest): + """ + pull snapshot: pull with query + """ + fixtureDB = True + fixtureCmds = [ + "aptly snapshot create empty empty", + "aptly snapshot create sensu from mirror sensu", + ] + runCmd = "aptly snapshot pull -architectures=amd64,i386 -all-matches empty sensu destination 'sensu (>0.12)' 'sensu (<0.9.6)'"