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
1=== modified file 'snappy/dirs.go'
2--- snappy/dirs.go 2015-06-16 07:13:22 +0000
3+++ snappy/dirs.go 2015-06-30 12:36:43 +0000
4@@ -33,6 +33,7 @@
5 snapSeccompDir string
6 snapUdevRulesDir string
7 localeDir string
8+ snapIconsDir string
9
10 snapBinariesDir string
11 snapServicesDir string
12@@ -42,6 +43,8 @@
13 cloudMetaDataFile string
14 )
15
16+var snappyDir = filepath.Join("var", "lib", "snappy")
17+
18 // SetRootDir allows settings a new global root directory, this is useful
19 // for e.g. chroot operations
20 func SetRootDir(rootdir string) {
21@@ -52,7 +55,8 @@
22 snapDataDir = filepath.Join(rootdir, "/var/lib/apps")
23 snapDataHomeGlob = filepath.Join(rootdir, "/home/*/apps/")
24 snapAppArmorDir = filepath.Join(rootdir, "/var/lib/apparmor/clicks")
25- snapSeccompDir = filepath.Join(rootdir, "/var/lib/snappy/seccomp/profiles")
26+ snapSeccompDir = filepath.Join(rootdir, snappyDir, "seccomp", "profiles")
27+ snapIconsDir = filepath.Join(rootdir, snappyDir, "icons")
28
29 snapBinariesDir = filepath.Join(snapAppsDir, "bin")
30 snapServicesDir = filepath.Join(rootdir, "/etc/systemd/system")
31
32=== modified file 'snappy/install_test.go'
33--- snappy/install_test.go 2015-06-11 06:33:12 +0000
34+++ snappy/install_test.go 2015-06-30 12:36:43 +0000
35@@ -97,7 +97,7 @@
36 c.Assert(err, IsNil)
37 defer snapR.Close()
38
39- var dlURL string
40+ var dlURL, iconURL string
41 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
42 switch r.URL.Path {
43 case "/details/foo":
44@@ -105,24 +105,27 @@
45 "package_name": "foo",
46 "version": "2",
47 "origin": "test",
48-"anon_download_url": "`+dlURL+`"
49+"anon_download_url": "`+dlURL+`",
50+"icon_url": "`+iconURL+`"
51 }`)
52 case "/dl":
53 snapR.Seek(0, 0)
54 io.Copy(w, snapR)
55+ case "/icon":
56+ fmt.Fprintf(w, "")
57 default:
58 panic("unexpected url path: " + r.URL.Path)
59 }
60 }))
61+ c.Assert(mockServer, NotNil)
62+ defer mockServer.Close()
63
64 dlURL = mockServer.URL + "/dl"
65+ iconURL = mockServer.URL + "/icon"
66
67 storeDetailsURI, err = url.Parse(mockServer.URL + "/details/")
68 c.Assert(err, IsNil)
69
70- c.Assert(mockServer, NotNil)
71- defer mockServer.Close()
72-
73 name, err := Install("foo", 0, &progress.NullProgress{})
74 c.Assert(err, IsNil)
75 c.Check(name, Equals, "foo")
76@@ -183,7 +186,7 @@
77 defer snapR.Close()
78
79 // details
80- var dlURL string
81+ var dlURL, iconURL string
82 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
83 switch r.URL.Path {
84 case "/details/foo":
85@@ -191,30 +194,35 @@
86 "package_name": "foo",
87 "version": "2",
88 "origin": "sideload",
89-"anon_download_url": "`+dlURL+`"
90+"anon_download_url": "`+dlURL+`",
91+"icon_url": "`+iconURL+`"
92 }`)
93 case "/dl":
94 snapR.Seek(0, 0)
95 io.Copy(w, snapR)
96+ case "/icon":
97+ fmt.Fprintf(w, "")
98 default:
99 panic("unexpected url path: " + r.URL.Path)
100 }
101 }))
102+ c.Assert(mockServer, NotNil)
103+ defer mockServer.Close()
104+
105 dlURL = mockServer.URL + "/dl"
106+ iconURL = mockServer.URL + "/icon"
107
108 storeDetailsURI, err = url.Parse(mockServer.URL + "/details/")
109 c.Assert(err, IsNil)
110
111- c.Assert(mockServer, NotNil)
112- defer mockServer.Close()
113-
114 // bulk
115 mockServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
116 io.WriteString(w, `[{
117 "package_name": "foo",
118 "version": "2",
119 "origin": "sideload",
120- "anon_download_url": "`+dlURL+`"
121+ "anon_download_url": "`+dlURL+`",
122+ "icon_url": "`+iconURL+`"
123 }]`)
124 }))
125
126
127=== modified file 'snappy/parts.go'
128--- snappy/parts.go 2015-05-20 17:24:29 +0000
129+++ snappy/parts.go 2015-06-30 12:36:43 +0000
130@@ -23,6 +23,7 @@
131 "fmt"
132 "net"
133 "net/url"
134+ "path/filepath"
135 "strings"
136 "time"
137
138@@ -321,3 +322,9 @@
139 func PackageNameActive(name string) bool {
140 return ActiveSnapByName(name) != nil
141 }
142+
143+// iconPath returns the would be path for the local icon
144+func iconPath(s Part) string {
145+ // TODO: care about extension ever being different than png
146+ return filepath.Join(snapIconsDir, fmt.Sprintf("%s_%s.png", QualifiedName(s), s.Version()))
147+}
148
149=== modified file 'snappy/snapp.go'
150--- snappy/snapp.go 2015-06-30 12:36:43 +0000
151+++ snappy/snapp.go 2015-06-30 12:36:43 +0000
152@@ -1488,6 +1488,33 @@
153 return w.Name(), w.Sync()
154 }
155
156+func (s *RemoteSnapPart) downloadIcon(pbar progress.Meter) error {
157+ if err := os.MkdirAll(snapIconsDir, 0755); err != nil {
158+ return err
159+ }
160+
161+ iconPath := iconPath(s)
162+ if helpers.FileExists(iconPath) {
163+ return nil
164+ }
165+
166+ req, err := http.NewRequest("GET", s.Icon(), nil)
167+ if err != nil {
168+ return err
169+ }
170+
171+ w, err := os.OpenFile(iconPath, os.O_WRONLY|os.O_CREATE, 0644)
172+ if err != nil {
173+ return err
174+ }
175+
176+ if err := download("icon for package", w, req, pbar); err != nil {
177+ return err
178+ }
179+
180+ return w.Sync()
181+}
182+
183 // Install installs the snap
184 func (s *RemoteSnapPart) Install(pbar progress.Meter, flags InstallFlags) (string, error) {
185 downloadedSnap, err := s.Download(pbar)
186@@ -1496,6 +1523,10 @@
187 }
188 defer os.Remove(downloadedSnap)
189
190+ if err := s.downloadIcon(pbar); err != nil {
191+ return "", err
192+ }
193+
194 return installClick(downloadedSnap, flags, pbar, s.Origin())
195 }
196
197
198=== modified file 'snappy/snapp_test.go'
199--- snappy/snapp_test.go 2015-06-09 19:11:54 +0000
200+++ snappy/snapp_test.go 2015-06-30 12:36:43 +0000
201@@ -652,20 +652,32 @@
202 c.Assert(envMap["SNAP_VERSION"], Equals, "1.10")
203 }
204
205-func (s *SnapTestSuite) TestUbuntuStoreRepositoryInstallRemoveSnap(c *C) {
206+func (s *SnapTestSuite) TestUbuntuStoreRepositoryInstallRemoteSnap(c *C) {
207 snapPackage := makeTestSnapPackage(c, "")
208 snapR, err := os.Open(snapPackage)
209 c.Assert(err, IsNil)
210
211+ iconContent := "this is an icon"
212+
213 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
214- io.Copy(w, snapR)
215+ switch r.URL.Path {
216+ case "/snap":
217+ io.Copy(w, snapR)
218+ case "/icon":
219+ fmt.Fprintf(w, iconContent)
220+ default:
221+ panic("unexpected url path: " + r.URL.Path)
222+ }
223 }))
224-
225 c.Assert(mockServer, NotNil)
226 defer mockServer.Close()
227
228 snap := RemoteSnapPart{}
229 snap.pkg.AnonDownloadURL = mockServer.URL + "/snap"
230+ snap.pkg.IconURL = mockServer.URL + "/icon"
231+ snap.pkg.Name = "foo"
232+ snap.pkg.Origin = "bar"
233+ snap.pkg.Version = "1.0"
234
235 p := &MockProgressMeter{}
236 name, err := snap.Install(p, 0)
237@@ -673,7 +685,11 @@
238 c.Check(name, Equals, "foo")
239 st, err := os.Stat(snapPackage)
240 c.Assert(err, IsNil)
241- c.Assert(p.written, Equals, int(st.Size()))
242+ c.Assert(p.written, Equals, int(st.Size())+len(iconContent))
243+
244+ iconPath := filepath.Join(snapIconsDir, "foo.bar_1.0.png")
245+ _, err = os.Stat(iconPath)
246+ c.Assert(err, IsNil)
247 }
248
249 func (s *SnapTestSuite) TestRemoteSnapUpgradeService(c *C) {
250@@ -686,17 +702,28 @@
251 snapR, err := os.Open(snapPackage)
252 c.Assert(err, IsNil)
253
254+ iconContent := "icon"
255 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
256- io.Copy(w, snapR)
257- snapR.Seek(0, 0)
258+ switch r.URL.Path {
259+ case "/snap":
260+ io.Copy(w, snapR)
261+ snapR.Seek(0, 0)
262+ case "/icon":
263+ fmt.Fprintf(w, iconContent)
264+ default:
265+ panic("unexpected url path: " + r.URL.Path)
266+ }
267 }))
268-
269 c.Assert(mockServer, NotNil)
270 defer mockServer.Close()
271
272 snap := RemoteSnapPart{}
273 snap.pkg.AnonDownloadURL = mockServer.URL + "/snap"
274 snap.pkg.Origin = testOrigin
275+ snap.pkg.IconURL = mockServer.URL + "/icon"
276+ snap.pkg.Name = "foo"
277+ snap.pkg.Origin = "bar"
278+ snap.pkg.Version = "1.0"
279
280 p := &MockProgressMeter{}
281 name, err := snap.Install(p, 0)

Subscribers

People subscribed via source and target branches