Merge lp:~sergiusens/snappy/downloadIcon into lp:~snappy-dev/snappy/snappy-moved-to-github

Proposed by Sergio Schvezov
Status: Merged
Approved by: John Lenton
Approved revision: 529
Merged at revision: 534
Proposed branch: lp:~sergiusens/snappy/downloadIcon
Merge into: lp:~snappy-dev/snappy/snappy-moved-to-github
Prerequisite: lp:~sergiusens/snappy/splitDown
Diff against target: 281 lines (+96/-19)
5 files modified
snappy/dirs.go (+5/-1)
snappy/install_test.go (+19/-11)
snappy/parts.go (+7/-0)
snappy/snapp.go (+31/-0)
snappy/snapp_test.go (+34/-7)
To merge this branch: bzr merge lp:~sergiusens/snappy/downloadIcon
Reviewer Review Type Date Requested Status
John Lenton (community) Approve
Review via email: mp+263296@code.launchpad.net

Commit message

Download store icon for package on install

Description of the change

This is in a directory on its own to later be able to publish the dir and export over http easily (webdm has immediate gains).

I'm not super convinced of the dirPath leaf name given that we may also consider downloading screenshots.

To post a comment you must log in.
Revision history for this message
John Lenton (chipaca) wrote :

modulo a nit

review: Approve
lp:~sergiusens/snappy/downloadIcon updated
528. By Sergio Schvezov

Merged splitDown into downloadIcon.

529. By Sergio Schvezov

merge trunk

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'snappy/dirs.go'
--- snappy/dirs.go 2015-06-16 07:13:22 +0000
+++ snappy/dirs.go 2015-06-30 12:36:43 +0000
@@ -33,6 +33,7 @@
33 snapSeccompDir string33 snapSeccompDir string
34 snapUdevRulesDir string34 snapUdevRulesDir string
35 localeDir string35 localeDir string
36 snapIconsDir string
3637
37 snapBinariesDir string38 snapBinariesDir string
38 snapServicesDir string39 snapServicesDir string
@@ -42,6 +43,8 @@
42 cloudMetaDataFile string43 cloudMetaDataFile string
43)44)
4445
46var snappyDir = filepath.Join("var", "lib", "snappy")
47
45// SetRootDir allows settings a new global root directory, this is useful48// SetRootDir allows settings a new global root directory, this is useful
46// for e.g. chroot operations49// for e.g. chroot operations
47func SetRootDir(rootdir string) {50func SetRootDir(rootdir string) {
@@ -52,7 +55,8 @@
52 snapDataDir = filepath.Join(rootdir, "/var/lib/apps")55 snapDataDir = filepath.Join(rootdir, "/var/lib/apps")
53 snapDataHomeGlob = filepath.Join(rootdir, "/home/*/apps/")56 snapDataHomeGlob = filepath.Join(rootdir, "/home/*/apps/")
54 snapAppArmorDir = filepath.Join(rootdir, "/var/lib/apparmor/clicks")57 snapAppArmorDir = filepath.Join(rootdir, "/var/lib/apparmor/clicks")
55 snapSeccompDir = filepath.Join(rootdir, "/var/lib/snappy/seccomp/profiles")58 snapSeccompDir = filepath.Join(rootdir, snappyDir, "seccomp", "profiles")
59 snapIconsDir = filepath.Join(rootdir, snappyDir, "icons")
5660
57 snapBinariesDir = filepath.Join(snapAppsDir, "bin")61 snapBinariesDir = filepath.Join(snapAppsDir, "bin")
58 snapServicesDir = filepath.Join(rootdir, "/etc/systemd/system")62 snapServicesDir = filepath.Join(rootdir, "/etc/systemd/system")
5963
=== modified file 'snappy/install_test.go'
--- snappy/install_test.go 2015-06-11 06:33:12 +0000
+++ snappy/install_test.go 2015-06-30 12:36:43 +0000
@@ -97,7 +97,7 @@
97 c.Assert(err, IsNil)97 c.Assert(err, IsNil)
98 defer snapR.Close()98 defer snapR.Close()
9999
100 var dlURL string100 var dlURL, iconURL string
101 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {101 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
102 switch r.URL.Path {102 switch r.URL.Path {
103 case "/details/foo":103 case "/details/foo":
@@ -105,24 +105,27 @@
105"package_name": "foo",105"package_name": "foo",
106"version": "2",106"version": "2",
107"origin": "test",107"origin": "test",
108"anon_download_url": "`+dlURL+`"108"anon_download_url": "`+dlURL+`",
109"icon_url": "`+iconURL+`"
109}`)110}`)
110 case "/dl":111 case "/dl":
111 snapR.Seek(0, 0)112 snapR.Seek(0, 0)
112 io.Copy(w, snapR)113 io.Copy(w, snapR)
114 case "/icon":
115 fmt.Fprintf(w, "")
113 default:116 default:
114 panic("unexpected url path: " + r.URL.Path)117 panic("unexpected url path: " + r.URL.Path)
115 }118 }
116 }))119 }))
120 c.Assert(mockServer, NotNil)
121 defer mockServer.Close()
117122
118 dlURL = mockServer.URL + "/dl"123 dlURL = mockServer.URL + "/dl"
124 iconURL = mockServer.URL + "/icon"
119125
120 storeDetailsURI, err = url.Parse(mockServer.URL + "/details/")126 storeDetailsURI, err = url.Parse(mockServer.URL + "/details/")
121 c.Assert(err, IsNil)127 c.Assert(err, IsNil)
122128
123 c.Assert(mockServer, NotNil)
124 defer mockServer.Close()
125
126 name, err := Install("foo", 0, &progress.NullProgress{})129 name, err := Install("foo", 0, &progress.NullProgress{})
127 c.Assert(err, IsNil)130 c.Assert(err, IsNil)
128 c.Check(name, Equals, "foo")131 c.Check(name, Equals, "foo")
@@ -183,7 +186,7 @@
183 defer snapR.Close()186 defer snapR.Close()
184187
185 // details188 // details
186 var dlURL string189 var dlURL, iconURL string
187 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {190 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
188 switch r.URL.Path {191 switch r.URL.Path {
189 case "/details/foo":192 case "/details/foo":
@@ -191,30 +194,35 @@
191"package_name": "foo",194"package_name": "foo",
192"version": "2",195"version": "2",
193"origin": "sideload",196"origin": "sideload",
194"anon_download_url": "`+dlURL+`"197"anon_download_url": "`+dlURL+`",
198"icon_url": "`+iconURL+`"
195}`)199}`)
196 case "/dl":200 case "/dl":
197 snapR.Seek(0, 0)201 snapR.Seek(0, 0)
198 io.Copy(w, snapR)202 io.Copy(w, snapR)
203 case "/icon":
204 fmt.Fprintf(w, "")
199 default:205 default:
200 panic("unexpected url path: " + r.URL.Path)206 panic("unexpected url path: " + r.URL.Path)
201 }207 }
202 }))208 }))
209 c.Assert(mockServer, NotNil)
210 defer mockServer.Close()
211
203 dlURL = mockServer.URL + "/dl"212 dlURL = mockServer.URL + "/dl"
213 iconURL = mockServer.URL + "/icon"
204214
205 storeDetailsURI, err = url.Parse(mockServer.URL + "/details/")215 storeDetailsURI, err = url.Parse(mockServer.URL + "/details/")
206 c.Assert(err, IsNil)216 c.Assert(err, IsNil)
207217
208 c.Assert(mockServer, NotNil)
209 defer mockServer.Close()
210
211 // bulk218 // bulk
212 mockServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {219 mockServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
213 io.WriteString(w, `[{220 io.WriteString(w, `[{
214 "package_name": "foo",221 "package_name": "foo",
215 "version": "2",222 "version": "2",
216 "origin": "sideload",223 "origin": "sideload",
217 "anon_download_url": "`+dlURL+`"224 "anon_download_url": "`+dlURL+`",
225 "icon_url": "`+iconURL+`"
218}]`)226}]`)
219 }))227 }))
220228
221229
=== modified file 'snappy/parts.go'
--- snappy/parts.go 2015-05-20 17:24:29 +0000
+++ snappy/parts.go 2015-06-30 12:36:43 +0000
@@ -23,6 +23,7 @@
23 "fmt"23 "fmt"
24 "net"24 "net"
25 "net/url"25 "net/url"
26 "path/filepath"
26 "strings"27 "strings"
27 "time"28 "time"
2829
@@ -321,3 +322,9 @@
321func PackageNameActive(name string) bool {322func PackageNameActive(name string) bool {
322 return ActiveSnapByName(name) != nil323 return ActiveSnapByName(name) != nil
323}324}
325
326// iconPath returns the would be path for the local icon
327func iconPath(s Part) string {
328 // TODO: care about extension ever being different than png
329 return filepath.Join(snapIconsDir, fmt.Sprintf("%s_%s.png", QualifiedName(s), s.Version()))
330}
324331
=== modified file 'snappy/snapp.go'
--- snappy/snapp.go 2015-06-30 12:36:43 +0000
+++ snappy/snapp.go 2015-06-30 12:36:43 +0000
@@ -1488,6 +1488,33 @@
1488 return w.Name(), w.Sync()1488 return w.Name(), w.Sync()
1489}1489}
14901490
1491func (s *RemoteSnapPart) downloadIcon(pbar progress.Meter) error {
1492 if err := os.MkdirAll(snapIconsDir, 0755); err != nil {
1493 return err
1494 }
1495
1496 iconPath := iconPath(s)
1497 if helpers.FileExists(iconPath) {
1498 return nil
1499 }
1500
1501 req, err := http.NewRequest("GET", s.Icon(), nil)
1502 if err != nil {
1503 return err
1504 }
1505
1506 w, err := os.OpenFile(iconPath, os.O_WRONLY|os.O_CREATE, 0644)
1507 if err != nil {
1508 return err
1509 }
1510
1511 if err := download("icon for package", w, req, pbar); err != nil {
1512 return err
1513 }
1514
1515 return w.Sync()
1516}
1517
1491// Install installs the snap1518// Install installs the snap
1492func (s *RemoteSnapPart) Install(pbar progress.Meter, flags InstallFlags) (string, error) {1519func (s *RemoteSnapPart) Install(pbar progress.Meter, flags InstallFlags) (string, error) {
1493 downloadedSnap, err := s.Download(pbar)1520 downloadedSnap, err := s.Download(pbar)
@@ -1496,6 +1523,10 @@
1496 }1523 }
1497 defer os.Remove(downloadedSnap)1524 defer os.Remove(downloadedSnap)
14981525
1526 if err := s.downloadIcon(pbar); err != nil {
1527 return "", err
1528 }
1529
1499 return installClick(downloadedSnap, flags, pbar, s.Origin())1530 return installClick(downloadedSnap, flags, pbar, s.Origin())
1500}1531}
15011532
15021533
=== modified file 'snappy/snapp_test.go'
--- snappy/snapp_test.go 2015-06-09 19:11:54 +0000
+++ snappy/snapp_test.go 2015-06-30 12:36:43 +0000
@@ -652,20 +652,32 @@
652 c.Assert(envMap["SNAP_VERSION"], Equals, "1.10")652 c.Assert(envMap["SNAP_VERSION"], Equals, "1.10")
653}653}
654654
655func (s *SnapTestSuite) TestUbuntuStoreRepositoryInstallRemoveSnap(c *C) {655func (s *SnapTestSuite) TestUbuntuStoreRepositoryInstallRemoteSnap(c *C) {
656 snapPackage := makeTestSnapPackage(c, "")656 snapPackage := makeTestSnapPackage(c, "")
657 snapR, err := os.Open(snapPackage)657 snapR, err := os.Open(snapPackage)
658 c.Assert(err, IsNil)658 c.Assert(err, IsNil)
659659
660 iconContent := "this is an icon"
661
660 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {662 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
661 io.Copy(w, snapR)663 switch r.URL.Path {
664 case "/snap":
665 io.Copy(w, snapR)
666 case "/icon":
667 fmt.Fprintf(w, iconContent)
668 default:
669 panic("unexpected url path: " + r.URL.Path)
670 }
662 }))671 }))
663
664 c.Assert(mockServer, NotNil)672 c.Assert(mockServer, NotNil)
665 defer mockServer.Close()673 defer mockServer.Close()
666674
667 snap := RemoteSnapPart{}675 snap := RemoteSnapPart{}
668 snap.pkg.AnonDownloadURL = mockServer.URL + "/snap"676 snap.pkg.AnonDownloadURL = mockServer.URL + "/snap"
677 snap.pkg.IconURL = mockServer.URL + "/icon"
678 snap.pkg.Name = "foo"
679 snap.pkg.Origin = "bar"
680 snap.pkg.Version = "1.0"
669681
670 p := &MockProgressMeter{}682 p := &MockProgressMeter{}
671 name, err := snap.Install(p, 0)683 name, err := snap.Install(p, 0)
@@ -673,7 +685,11 @@
673 c.Check(name, Equals, "foo")685 c.Check(name, Equals, "foo")
674 st, err := os.Stat(snapPackage)686 st, err := os.Stat(snapPackage)
675 c.Assert(err, IsNil)687 c.Assert(err, IsNil)
676 c.Assert(p.written, Equals, int(st.Size()))688 c.Assert(p.written, Equals, int(st.Size())+len(iconContent))
689
690 iconPath := filepath.Join(snapIconsDir, "foo.bar_1.0.png")
691 _, err = os.Stat(iconPath)
692 c.Assert(err, IsNil)
677}693}
678694
679func (s *SnapTestSuite) TestRemoteSnapUpgradeService(c *C) {695func (s *SnapTestSuite) TestRemoteSnapUpgradeService(c *C) {
@@ -686,17 +702,28 @@
686 snapR, err := os.Open(snapPackage)702 snapR, err := os.Open(snapPackage)
687 c.Assert(err, IsNil)703 c.Assert(err, IsNil)
688704
705 iconContent := "icon"
689 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {706 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
690 io.Copy(w, snapR)707 switch r.URL.Path {
691 snapR.Seek(0, 0)708 case "/snap":
709 io.Copy(w, snapR)
710 snapR.Seek(0, 0)
711 case "/icon":
712 fmt.Fprintf(w, iconContent)
713 default:
714 panic("unexpected url path: " + r.URL.Path)
715 }
692 }))716 }))
693
694 c.Assert(mockServer, NotNil)717 c.Assert(mockServer, NotNil)
695 defer mockServer.Close()718 defer mockServer.Close()
696719
697 snap := RemoteSnapPart{}720 snap := RemoteSnapPart{}
698 snap.pkg.AnonDownloadURL = mockServer.URL + "/snap"721 snap.pkg.AnonDownloadURL = mockServer.URL + "/snap"
699 snap.pkg.Origin = testOrigin722 snap.pkg.Origin = testOrigin
723 snap.pkg.IconURL = mockServer.URL + "/icon"
724 snap.pkg.Name = "foo"
725 snap.pkg.Origin = "bar"
726 snap.pkg.Version = "1.0"
700727
701 p := &MockProgressMeter{}728 p := &MockProgressMeter{}
702 name, err := snap.Install(p, 0)729 name, err := snap.Install(p, 0)

Subscribers

People subscribed via source and target branches