Merge lp:~kyrofa/crackly/desktop_file_support into lp:crackly

Proposed by Kyle Fazzari
Status: Merged
Approved by: Kyle Fazzari
Approved revision: 2
Merged at revision: 2
Proposed branch: lp:~kyrofa/crackly/desktop_file_support
Merge into: lp:crackly
Diff against target: 271 lines (+245/-0)
5 files modified
main.go (+43/-0)
operations/generate_desktop_files.go (+104/-0)
operations/install.go (+51/-0)
operations/remove.go (+26/-0)
snap/metadata.go (+21/-0)
To merge this branch: bzr merge lp:~kyrofa/crackly/desktop_file_support
Reviewer Review Type Date Requested Status
Unity API Team Pending
Review via email: mp+276267@code.launchpad.net

Commit message

Add install/remove wrappers to deal with .desktop files.

Description of the change

Add install/remove wrappers to deal with .desktop files.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'main.go'
--- main.go 1970-01-01 00:00:00 +0000
+++ main.go 2015-10-30 14:11:44 +0000
@@ -0,0 +1,43 @@
1package main
2
3import (
4 "fmt"
5 "launchpad.net/crackly/operations"
6 "log"
7 "os"
8)
9
10func main() {
11 arguments := os.Args[1:]
12
13 if len(arguments) != 2 {
14 printUsageAndExit("Invalid number of arguments!")
15 }
16
17 switch arguments[0] {
18 case "install":
19 err := operations.Install(arguments[1])
20 if err != nil {
21 log.Fatalf(`Unable to install "%s": %s`, arguments[1], err)
22 }
23 case "remove":
24 err := operations.Remove(arguments[1])
25 if err != nil {
26 log.Fatalf(`Unable to remove "%s": %s`, arguments[1], err)
27 }
28 default:
29 printUsageAndExit("Unsupported action: %s", arguments[0])
30 }
31}
32
33func printUsageAndExit(format string, a ...interface{}) {
34 fmt.Printf(format, a...)
35 fmt.Println("\n")
36 printUsage()
37 os.Exit(1)
38}
39
40func printUsage() {
41 fmt.Println("Usage:")
42 fmt.Printf("%s install <snap>\n", os.Args[0])
43}
044
=== added directory 'operations'
=== added file 'operations/generate_desktop_files.go'
--- operations/generate_desktop_files.go 1970-01-01 00:00:00 +0000
+++ operations/generate_desktop_files.go 2015-10-30 14:11:44 +0000
@@ -0,0 +1,104 @@
1package operations
2
3import (
4 "fmt"
5 "path"
6 "os"
7 "io/ioutil"
8 "path/filepath"
9
10 "launchpad.net/crackly/snap"
11 "launchpad.net/snappy/snappy"
12)
13
14func GenerateDesktopFiles(part snappy.Part, metadata snap.Metadata) error {
15 rootDirectory := os.Getenv("SNAPPY_GLOBAL_ROOT")
16 if rootDirectory == "" {
17 rootDirectory = "/"
18 }
19
20 desktopFileRoot, err := getDesktopFileRoot()
21 if err != nil {
22 return fmt.Errorf("Unable to determine .desktop file destination: %s",
23 err)
24 }
25
26 qualifiedPartName := snappy.QualifiedName(part)
27 for _, binary := range metadata.Binaries {
28 qualifiedName := qualifiedPartName+"."+binary.Name
29 desktopFileName := fmt.Sprintf("%s.desktop", qualifiedName)
30
31 desktopFilePath := path.Join(desktopFileRoot, desktopFileName)
32
33 // .desktop file contents
34 desktopFile := "[Desktop Entry]\n"
35 desktopFile += "Type=Application\n"
36 desktopFile += "Terminal=false\n"
37 desktopFile += "X-Ubuntu-Touch=true\n"
38 desktopFile += fmt.Sprintf("Name=%s\n", binary.Name)
39 desktopFile += fmt.Sprintf("Icon=%s\n", part.Icon())
40// desktopFile += fmt.Sprintf("Exec=%s/%s -- --desktop_file_hint=%s",
41// rootDirectory+"apps/bin", metadata.Name+"."+binary.Name,
42// desktopFilePath)
43
44 desktopFile += fmt.Sprintf("Exec=%s/%s",
45 rootDirectory+"apps/bin", metadata.Name+"."+binary.Name)
46
47 err = ioutil.WriteFile(desktopFilePath, []byte(desktopFile), 0644)
48 if err != nil {
49 return fmt.Errorf(`Unable to write .desktop file "%s": %s`, desktopFilePath, err)
50 }
51 }
52
53 return nil
54}
55
56func RemoveDesktopFiles(part snappy.Part) error {
57 desktopFileRoot, err := getDesktopFileRoot()
58 if err != nil {
59 return fmt.Errorf("Unable to determine .desktop file destination: %s",
60 err)
61 }
62
63 desktopFiles, err := filepath.Glob(
64 filepath.Join(desktopFileRoot, snappy.QualifiedName(part) + ".*"))
65
66 for _, desktopFilePath := range desktopFiles {
67 err = os.Remove(desktopFilePath)
68 if err != nil {
69 return fmt.Errorf(`Unable to remove "%s": %s`, desktopFilePath, err)
70 }
71 }
72
73 return nil
74}
75
76func getDesktopFileRoot() (string, error) {
77// currentUser, err := user.Current()
78// if err != nil {
79// return "", fmt.Errorf("Unable to find current user: %s", err)
80// }
81
82// // Don't use root, use the person who called `sudo`
83// if currentUser.Uid == "0" {
84// userName := os.Getenv("SUDO_USER")
85// if userName == "" {
86// return "", fmt.Errorf("Unable to determine appropriate user")
87// }
88
89// currentUser, err = user.Lookup(userName)
90// if err != nil {
91// return "", fmt.Errorf(`Unable to find user with username "%s": %s`,
92// userName, err)
93// }
94// }
95
96// desktopFileRoot := path.Join(currentUser.HomeDir,
97// ".local/share/applications")
98
99// fmt.Println("Current user:", currentUser)
100
101// return desktopFileRoot, nil
102
103 return "/usr/share/applications", nil
104}
0105
=== added file 'operations/install.go'
--- operations/install.go 1970-01-01 00:00:00 +0000
+++ operations/install.go 2015-10-30 14:11:44 +0000
@@ -0,0 +1,51 @@
1package operations
2
3import (
4 "fmt"
5 "launchpad.net/crackly/snap"
6 "launchpad.net/snappy/clickdeb"
7 "launchpad.net/snappy/progress"
8 "launchpad.net/snappy/snappy"
9)
10
11func Install(snapFile string) error {
12 deb, err := clickdeb.Open(snapFile)
13 if err != nil {
14 return fmt.Errorf("Unable to open snap: %s", err)
15 }
16
17 defer deb.Close()
18
19 yamlData, err := deb.MetaMember("package.yaml")
20 if err != nil {
21 return fmt.Errorf("Unable to obtain package.yaml: %s", err)
22 }
23
24 metadata, err := snap.ParseMetadata(yamlData)
25 if err != nil {
26 return fmt.Errorf("Unable to parse package.yaml: %s", err)
27 }
28
29 if len(metadata.Services) > 0 {
30 return fmt.Errorf("Cannot install a snap that contains services")
31 }
32
33 packageName, err := snappy.Install(snapFile, snappy.AllowUnauthenticated|snappy.DoInstallGC, progress.MakeProgressBar())
34 if err != nil {
35 return fmt.Errorf(`Error installing snap "%s": %s`, snapFile, err)
36 }
37
38 fmt.Println("Package name:", packageName)
39
40 part := snappy.ActiveSnapByName(metadata.Name)
41 if part == nil {
42 return fmt.Errorf("Unable to find snap after install")
43 }
44
45 err = GenerateDesktopFiles(part, metadata)
46 if err != nil {
47 return fmt.Errorf("Error generating .desktop files: %s", err)
48 }
49
50 return nil
51}
052
=== added file 'operations/remove.go'
--- operations/remove.go 1970-01-01 00:00:00 +0000
+++ operations/remove.go 2015-10-30 14:11:44 +0000
@@ -0,0 +1,26 @@
1package operations
2
3import (
4 "fmt"
5 "launchpad.net/snappy/progress"
6 "launchpad.net/snappy/snappy"
7)
8
9func Remove(snapName string) error {
10 part := snappy.ActiveSnapByName(snapName)
11 if part == nil {
12 return fmt.Errorf(`No snap named "%s"`, snapName)
13 }
14
15 err := snappy.Remove(snapName, snappy.DoRemoveGC, progress.MakeProgressBar())
16 if err != nil {
17 return fmt.Errorf(`Error removing snap "%s": %s`, snapName, err)
18 }
19
20 err = RemoveDesktopFiles(part)
21 if err != nil {
22 return fmt.Errorf("Error removing .desktop files: %s", err)
23 }
24
25 return nil
26}
027
=== added directory 'snap'
=== added file 'snap/metadata.go'
--- snap/metadata.go 1970-01-01 00:00:00 +0000
+++ snap/metadata.go 2015-10-30 14:11:44 +0000
@@ -0,0 +1,21 @@
1package snap
2
3import (
4 "gopkg.in/yaml.v2"
5 "launchpad.net/snappy/snappy"
6)
7
8type Metadata struct {
9 Name string
10 Version string
11 Vendor string
12 Icon string
13
14 Services []snappy.ServiceYaml `yaml:"services,omitempty"`
15 Binaries []snappy.Binary `yaml:"binaries,omitempty"`
16}
17
18func ParseMetadata(data []byte) (metadata Metadata, err error) {
19 err = yaml.Unmarshal(data, &metadata)
20 return
21}

Subscribers

People subscribed via source and target branches

to all changes: