| 483 | } |
| 484 | |
| 485 | func makeManifest(baseUrl string, app storage.App) ([]byte, error) { |
| 486 | t, err := textTemplate.New("").Funcs( |
| 487 | textTemplate.FuncMap{"escape": func(text string) (string, error) { |
| 488 | return escapeXML(text) |
| 489 | }}, |
| 490 | ).Parse(assets.ManifestPlist) |
| 491 | if err != nil { |
| 492 | return nil, err |
| 493 | } |
| 494 | appName, err := app.GetString(storage.AppName) |
| 495 | if err != nil { |
| 496 | return nil, err |
| 497 | } |
| 498 | bundleId, err := app.GetString(storage.AppBundleId) |
| 499 | if err != nil { |
| 500 | return nil, err |
| 501 | } |
| 502 | downloadUrl, err := util.JoinUrls(baseUrl, "/apps", app.GetId(), "signed") |
| 503 | if err != nil { |
| 504 | return nil, err |
| 505 | } |
| 506 | data := assets.ManifestData{ |
| 507 | DownloadUrl: downloadUrl, |
| 508 | BundleId: bundleId, |
| 509 | Title: appName, |
| 510 | } |
| 511 | var result bytes.Buffer |
| 512 | if err := t.Execute(&result, data); err != nil { |
| 513 | return nil, err |
| 514 | } |
| 515 | return result.Bytes(), nil |
| 516 | } |
| 517 | |
| 518 | func escapeXML(str string) (string, error) { |
| 519 | buff := bytes.NewBuffer(nil) |