diff --git a/aptly/interfaces.go b/aptly/interfaces.go index f272f707..e17471a0 100644 --- a/aptly/interfaces.go +++ b/aptly/interfaces.go @@ -69,7 +69,7 @@ type PublishedStorage interface { // Remove removes single file under public path Remove(path string) error // LinkFromPool links package file from pool to dist's pool location - LinkFromPool(publishedDirectory, baseName string, sourcePool PackagePool, sourcePath string, sourceChecksums utils.ChecksumInfo, force bool) error + LinkFromPool(publishedDirectory, fileName string, sourcePool PackagePool, sourcePath string, sourceChecksums utils.ChecksumInfo, force bool) error // Filelist returns list of files under prefix Filelist(prefix string) ([]string, error) // RenameFile renames (moves) file diff --git a/files/public_test.go b/files/public_test.go index c7f4fd84..16f724cb 100644 --- a/files/public_test.go +++ b/files/public_test.go @@ -181,39 +181,40 @@ func (s *PublishedStorageSuite) TestRemove(c *C) { func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { tests := []struct { - prefix string - component string - sourcePath string - poolDirectory string - expectedFilename string + prefix string + sourcePath string + publishedDirectory string + expectedFilename string }{ { // package name regular - prefix: "", - component: "main", - sourcePath: "mars-invaders_1.03.deb", - poolDirectory: "m/mars-invaders", - expectedFilename: "pool/main/m/mars-invaders/mars-invaders_1.03.deb", + prefix: "", + sourcePath: "mars-invaders_1.03.deb", + publishedDirectory: "pool/main/m/mars-invaders", + expectedFilename: "pool/main/m/mars-invaders/mars-invaders_1.03.deb", }, { // lib-like filename - prefix: "", - component: "main", - sourcePath: "libmars-invaders_1.03.deb", - poolDirectory: "libm/libmars-invaders", - expectedFilename: "pool/main/libm/libmars-invaders/libmars-invaders_1.03.deb", + prefix: "", + sourcePath: "libmars-invaders_1.03.deb", + publishedDirectory: "pool/main/libm/libmars-invaders", + expectedFilename: "pool/main/libm/libmars-invaders/libmars-invaders_1.03.deb", }, { // duplicate link, shouldn't panic - prefix: "", - component: "main", - sourcePath: "mars-invaders_1.03.deb", - poolDirectory: "m/mars-invaders", - expectedFilename: "pool/main/m/mars-invaders/mars-invaders_1.03.deb", + prefix: "", + sourcePath: "mars-invaders_1.03.deb", + publishedDirectory: "pool/main/m/mars-invaders", + expectedFilename: "pool/main/m/mars-invaders/mars-invaders_1.03.deb", }, { // prefix & component - prefix: "ppa", - component: "contrib", - sourcePath: "libmars-invaders_1.04.deb", - poolDirectory: "libm/libmars-invaders", - expectedFilename: "pool/contrib/libm/libmars-invaders/libmars-invaders_1.04.deb", + prefix: "ppa", + sourcePath: "libmars-invaders_1.04.deb", + publishedDirectory: "pool/contrib/libm/libmars-invaders", + expectedFilename: "pool/contrib/libm/libmars-invaders/libmars-invaders_1.04.deb", + }, + { // installer file + prefix: "", + sourcePath: "netboot/boot.img.gz", + publishedDirectory: "dists/jessie/non-free/installer-i386/current/images", + expectedFilename: "dists/jessie/non-free/installer-i386/current/images/netboot/boot.img.gz", }, } @@ -221,6 +222,7 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { for _, t := range tests { tmpPath := filepath.Join(c.MkDir(), t.sourcePath) + os.MkdirAll(filepath.Dir(tmpPath), 0777) err := ioutil.WriteFile(tmpPath, []byte("Contents"), 0644) c.Assert(err, IsNil) @@ -231,7 +233,7 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Assert(err, IsNil) // Test using hardlinks - err = s.storage.LinkFromPool(filepath.Join(t.prefix, "pool", t.component, t.poolDirectory), t.sourcePath, pool, srcPoolPath, sourceChecksum, false) + err = s.storage.LinkFromPool(filepath.Join(t.prefix, t.publishedDirectory), t.sourcePath, pool, srcPoolPath, sourceChecksum, false) c.Assert(err, IsNil) st, err := os.Stat(filepath.Join(s.storage.rootPath, t.prefix, t.expectedFilename)) @@ -241,7 +243,7 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Check(int(info.Nlink), Equals, 3) // Test using symlinks - err = s.storageSymlink.LinkFromPool(filepath.Join(t.prefix, "pool", t.component, t.poolDirectory), t.sourcePath, pool, srcPoolPath, sourceChecksum, false) + err = s.storageSymlink.LinkFromPool(filepath.Join(t.prefix, t.publishedDirectory), t.sourcePath, pool, srcPoolPath, sourceChecksum, false) c.Assert(err, IsNil) st, err = os.Lstat(filepath.Join(s.storageSymlink.rootPath, t.prefix, t.expectedFilename)) @@ -252,7 +254,7 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Check(int(info.Mode&syscall.S_IFMT), Equals, int(syscall.S_IFLNK)) // Test using copy with checksum verification - err = s.storageCopy.LinkFromPool(filepath.Join(t.prefix, "pool", t.component, t.poolDirectory), t.sourcePath, pool, srcPoolPath, sourceChecksum, false) + err = s.storageCopy.LinkFromPool(filepath.Join(t.prefix, t.publishedDirectory), t.sourcePath, pool, srcPoolPath, sourceChecksum, false) c.Assert(err, IsNil) st, err = os.Stat(filepath.Join(s.storageCopy.rootPath, t.prefix, t.expectedFilename)) @@ -262,7 +264,7 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Check(int(info.Nlink), Equals, 1) // Test using copy with size verification - err = s.storageCopySize.LinkFromPool(filepath.Join(t.prefix, "pool", t.component, t.poolDirectory), t.sourcePath, pool, srcPoolPath, sourceChecksum, false) + err = s.storageCopySize.LinkFromPool(filepath.Join(t.prefix, t.publishedDirectory), t.sourcePath, pool, srcPoolPath, sourceChecksum, false) c.Assert(err, IsNil) st, err = os.Stat(filepath.Join(s.storageCopySize.rootPath, t.prefix, t.expectedFilename)) diff --git a/s3/public.go b/s3/public.go index 2374f8f9..75f11128 100644 --- a/s3/public.go +++ b/s3/public.go @@ -263,10 +263,10 @@ func (storage *PublishedStorage) RemoveDirs(path string, progress aptly.Progress // sourcePath is filepath to package file in package pool // // LinkFromPool returns relative path for the published file to be included in package index -func (storage *PublishedStorage) LinkFromPool(publishedDirectory, baseName string, sourcePool aptly.PackagePool, +func (storage *PublishedStorage) LinkFromPool(publishedDirectory, fileName string, sourcePool aptly.PackagePool, sourcePath string, sourceChecksums utils.ChecksumInfo, force bool) error { - relPath := filepath.Join(publishedDirectory, baseName) + relPath := filepath.Join(publishedDirectory, fileName) poolPath := filepath.Join(storage.prefix, relPath) if storage.pathCache == nil { diff --git a/s3/public_test.go b/s3/public_test.go index 6a799163..305f3830 100644 --- a/s3/public_test.go +++ b/s3/public_test.go @@ -3,6 +3,7 @@ package s3 import ( "bytes" "io/ioutil" + "os" "path/filepath" . "gopkg.in/check.v1" @@ -236,10 +237,18 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Assert(err, IsNil) cksum2 := utils.ChecksumInfo{MD5: "e9dfd31cc505d51fc26975250750deab"} + tmpFile3 := filepath.Join(c.MkDir(), "netboot/boot.img.gz") + os.MkdirAll(filepath.Dir(tmpFile3), 0777) + err = ioutil.WriteFile(tmpFile3, []byte("Contents"), 0644) + c.Assert(err, IsNil) + cksum3 := utils.ChecksumInfo{MD5: "c1df1da7a1ce305a3b60af9d5733ac1d"} + src1, err := pool.Import(tmpFile1, "mars-invaders_1.03.deb", &cksum1, true, cs) c.Assert(err, IsNil) src2, err := pool.Import(tmpFile2, "mars-invaders_1.03.deb", &cksum2, true, cs) c.Assert(err, IsNil) + src3, err := pool.Import(tmpFile3, "netboot/boot.img.gz", &cksum3, true, cs) + c.Assert(err, IsNil) // first link from pool err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), "mars-invaders_1.03.deb", pool, src1, cksum1, false) @@ -279,6 +288,11 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Check(s.GetFile(c, "lala/pool/main/m/mars-invaders/mars-invaders_1.03.deb"), DeepEquals, []byte("Contents")) + // link from pool with nested file name + err = s.storage.LinkFromPool("dists/jessie/non-free/installer-i386/current/images", "netboot/boot.img.gz", pool, src3, cksum3, false) + c.Check(err, IsNil) + + c.Check(s.GetFile(c, "dists/jessie/non-free/installer-i386/current/images/netboot/boot.img.gz"), DeepEquals, []byte("Contents")) } func (s *PublishedStorageSuite) TestSymLink(c *C) { diff --git a/swift/public.go b/swift/public.go index 93c7f7a7..0ca4796c 100644 --- a/swift/public.go +++ b/swift/public.go @@ -193,10 +193,10 @@ func (storage *PublishedStorage) RemoveDirs(path string, progress aptly.Progress // sourcePath is filepath to package file in package pool // // LinkFromPool returns relative path for the published file to be included in package index -func (storage *PublishedStorage) LinkFromPool(publishedDirectory, baseName string, sourcePool aptly.PackagePool, +func (storage *PublishedStorage) LinkFromPool(publishedDirectory, fileName string, sourcePool aptly.PackagePool, sourcePath string, sourceChecksums utils.ChecksumInfo, force bool) error { - relPath := filepath.Join(publishedDirectory, baseName) + relPath := filepath.Join(publishedDirectory, fileName) poolPath := filepath.Join(storage.prefix, relPath) var ( diff --git a/swift/public_test.go b/swift/public_test.go index 9a4069c6..31b633e8 100644 --- a/swift/public_test.go +++ b/swift/public_test.go @@ -4,6 +4,7 @@ import ( "fmt" "io/ioutil" "math/rand" + "os" "path/filepath" "time" @@ -157,10 +158,18 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Assert(err, IsNil) cksum2 := utils.ChecksumInfo{MD5: "e9dfd31cc505d51fc26975250750deab"} + tmpFile3 := filepath.Join(c.MkDir(), "netboot/boot.img.gz") + os.MkdirAll(filepath.Dir(tmpFile3), 0777) + err = ioutil.WriteFile(tmpFile3, []byte("Contents"), 0644) + c.Assert(err, IsNil) + cksum3 := utils.ChecksumInfo{MD5: "c1df1da7a1ce305a3b60af9d5733ac1d"} + src1, err := pool.Import(tmpFile1, "mars-invaders_1.03.deb", &cksum1, true, cs) c.Assert(err, IsNil) src2, err := pool.Import(tmpFile2, "mars-invaders_1.03.deb", &cksum2, true, cs) c.Assert(err, IsNil) + src3, err := pool.Import(tmpFile3, "netboot/boot.img.gz", &cksum3, true, cs) + c.Assert(err, IsNil) // first link from pool err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), "mars-invaders_1.03.deb", pool, src1, cksum1, false) @@ -193,6 +202,14 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { data, err = s.storage.conn.ObjectGetBytes("test", "pool/main/m/mars-invaders/mars-invaders_1.03.deb") c.Check(err, IsNil) c.Check(data, DeepEquals, []byte("Spam")) + + // link from pool with nested file name + err = s.storage.LinkFromPool("dists/jessie/non-free/installer-i386/current/images", "netboot/boot.img.gz", pool, src3, cksum3, false) + c.Check(err, IsNil) + + data, err = s.storage.conn.ObjectGetBytes("test", "dists/jessie/non-free/installer-i386/current/images/netboot/boot.img.gz") + c.Check(err, IsNil) + c.Check(data, DeepEquals, []byte("Contents")) } func (s *PublishedStorageSuite) TestSymLink(c *C) {