diff --git a/s3/public.go b/s3/public.go index 4d567209..f4577982 100644 --- a/s3/public.go +++ b/s3/public.go @@ -304,6 +304,8 @@ func (storage *PublishedStorage) LinkFromPool(publishedDirectory string, sourceP err = storage.putFile(relPath, source) if err == nil { storage.pathCache[relPath] = sourceMD5 + } else { + err = errors.Wrap(err, fmt.Sprintf("error uploading %s to %s: %s", sourcePath, storage, poolPath)) } return err diff --git a/swift/public.go b/swift/public.go index c17f0f26..d8236c03 100644 --- a/swift/public.go +++ b/swift/public.go @@ -3,14 +3,15 @@ package swift import ( "encoding/json" "fmt" + "io" "net/http" "os" "path/filepath" "time" "github.com/ncw/swift" + "github.com/pkg/errors" "github.com/smira/aptly/aptly" - "github.com/smira/aptly/files" "github.com/smira/aptly/utils" ) @@ -129,12 +130,18 @@ func (storage *PublishedStorage) PutFile(path string, sourceFilename string) err } defer source.Close() - _, err = storage.conn.ObjectPut(storage.container, filepath.Join(storage.prefix, path), source, false, "", "", nil) - + err = storage.putFile(path, source) if err != nil { - return fmt.Errorf("error uploading %s to %s: %s", sourceFilename, storage, err) + err = errors.Wrap(err, fmt.Sprintf("error uploading %s to %s", sourceFilename, storage)) } - return nil + + return err +} + +func (storage *PublishedStorage) putFile(path string, source io.Reader) error { + _, err := storage.conn.ObjectPut(storage.container, filepath.Join(storage.prefix, path), source, false, "", "", nil) + + return err } // Remove removes single file under public path @@ -188,8 +195,6 @@ func (storage *PublishedStorage) RemoveDirs(path string, progress aptly.Progress // LinkFromPool returns relative path for the published file to be included in package index func (storage *PublishedStorage) LinkFromPool(publishedDirectory string, sourcePool aptly.PackagePool, sourcePath string, sourceChecksums utils.ChecksumInfo, force bool) error { - // verify that package pool is local pool in filesystem - _ = sourcePool.(*files.PackagePool) baseName := filepath.Base(sourcePath) relPath := filepath.Join(publishedDirectory, baseName) @@ -216,7 +221,18 @@ func (storage *PublishedStorage) LinkFromPool(publishedDirectory string, sourceP } } - return storage.PutFile(relPath, sourcePath) + source, err := sourcePool.Open(sourcePath) + if err != nil { + return err + } + defer source.Close() + + err = storage.putFile(relPath, source) + if err != nil { + err = errors.Wrap(err, fmt.Sprintf("error uploading %s to %s: %s", sourcePath, storage, poolPath)) + } + + return err } // Filelist returns list of files under prefix diff --git a/swift/public_test.go b/swift/public_test.go index 45a7bb09..5ebf78c4 100644 --- a/swift/public_test.go +++ b/swift/public_test.go @@ -4,7 +4,6 @@ import ( "fmt" "io/ioutil" "math/rand" - "os" "path/filepath" "time" @@ -147,22 +146,23 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { root := c.MkDir() pool := files.NewPackagePool(root) - sourcePath := filepath.Join(root, "pool/c1/df/mars-invaders_1.03.deb") - err := os.MkdirAll(filepath.Dir(sourcePath), 0755) + tmpFile1 := filepath.Join(c.MkDir(), "mars-invaders_1.03.deb") + err := ioutil.WriteFile(tmpFile1, []byte("Contents"), 0644) c.Assert(err, IsNil) + cksum1 := utils.ChecksumInfo{MD5: "c1df1da7a1ce305a3b60af9d5733ac1d"} - err = ioutil.WriteFile(sourcePath, []byte("Contents"), 0644) + tmpFile2 := filepath.Join(c.MkDir(), "mars-invaders_1.03.deb") + err = ioutil.WriteFile(tmpFile2, []byte("Spam"), 0644) c.Assert(err, IsNil) + cksum2 := utils.ChecksumInfo{MD5: "e9dfd31cc505d51fc26975250750deab"} - sourcePath2 := filepath.Join(root, "pool/e9/df/mars-invaders_1.03.deb") - err = os.MkdirAll(filepath.Dir(sourcePath2), 0755) + src1, err := pool.Import(tmpFile1, "mars-invaders_1.03.deb", &cksum1, true) c.Assert(err, IsNil) - - err = ioutil.WriteFile(sourcePath2, []byte("Spam"), 0644) + src2, err := pool.Import(tmpFile2, "mars-invaders_1.03.deb", &cksum2, true) c.Assert(err, IsNil) // first link from pool - err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath, utils.ChecksumInfo{MD5: "c1df1da7a1ce305a3b60af9d5733ac1d"}, false) + err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, src1, cksum1, false) c.Check(err, IsNil) data, err := s.storage.conn.ObjectGetBytes("test", "pool/main/m/mars-invaders/mars-invaders_1.03.deb") @@ -170,7 +170,7 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Check(data, DeepEquals, []byte("Contents")) // duplicate link from pool - err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath, utils.ChecksumInfo{MD5: "c1df1da7a1ce305a3b60af9d5733ac1d"}, false) + err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, src1, cksum1, false) c.Check(err, IsNil) data, err = s.storage.conn.ObjectGetBytes("test", "pool/main/m/mars-invaders/mars-invaders_1.03.deb") @@ -178,7 +178,7 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Check(data, DeepEquals, []byte("Contents")) // link from pool with conflict - err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath2, utils.ChecksumInfo{MD5: "e9dfd31cc505d51fc26975250750deab"}, false) + err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, src2, cksum2, false) c.Check(err, ErrorMatches, ".*file already exists and is different.*") data, err = s.storage.conn.ObjectGetBytes("test", "pool/main/m/mars-invaders/mars-invaders_1.03.deb") @@ -186,7 +186,7 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { c.Check(data, DeepEquals, []byte("Contents")) // link from pool with conflict and force - err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath2, utils.ChecksumInfo{MD5: "e9dfd31cc505d51fc26975250750deab"}, true) + err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, src2, cksum2, true) c.Check(err, IsNil) data, err = s.storage.conn.ObjectGetBytes("test", "pool/main/m/mars-invaders/mars-invaders_1.03.deb")