-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathlist.go
117 lines (110 loc) · 2.37 KB
/
list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright (c) 2015, Daniel Martí <mvdan@mvdan.cc>
// See LICENSE for licensing information
package main
import (
"bufio"
"fmt"
"os"
"regexp"
"sort"
"strings"
)
var cmdList = &Command{
UsageLine: "list (categories/users)",
Short: "List all known values of a kind",
}
func init() {
cmdList.Run = runList
}
func runList(args []string) error {
if len(args) != 1 {
return fmt.Errorf("need exactly one argument")
}
apps, err := loadIndexes()
if err != nil {
return err
}
values := make(map[string]struct{})
switch args[0] {
case "categories":
for _, app := range apps {
for _, c := range app.Categories {
values[c] = struct{}{}
}
}
case "users":
if err := listUsers(); err != nil {
return err
}
default:
return fmt.Errorf("invalid argument")
}
result := make([]string, 0, len(values))
for s := range values {
result = append(result, s)
}
sort.Strings(result)
for _, s := range result {
fmt.Fprintln(os.Stdout, s)
}
return nil
}
var userIdNameRegex = regexp.MustCompile(`UserInfo{(\d+):([^:}]*):[^}]*}`)
func listUsers() error {
device, err := oneDevice()
if err != nil {
return err
}
cmd := device.AdbShell("pm", "list", "users")
stdout, err := cmd.StdoutPipe()
if err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
uidHeader := "UID"
nameHeader := "Name"
runningHeader := "Running"
scanner := bufio.NewScanner(stdout)
uids := make([]string, 0)
names := make([]string, 0)
running := make([]bool, 0)
maxUidLen := len(uidHeader)
maxNameLen := len(nameHeader)
for scanner.Scan() {
text := scanner.Text()
m := userIdNameRegex.FindStringSubmatch(text)
if m == nil {
continue
}
uid := m[1]
uids = append(uids, uid)
if uidLen := len(uid); uidLen > maxUidLen {
maxUidLen = uidLen
}
name := m[2]
names = append(names, name)
if nameLen := len(name); nameLen > maxNameLen {
maxNameLen = nameLen
}
currentRunning := false
if strings.HasSuffix(strings.TrimSpace(text), "running") {
currentRunning = true
}
running = append(running, currentRunning)
}
if len(uids) == 0 {
return nil
}
fmt.Printf("%-*s %-*s %s\n", maxUidLen, uidHeader, maxNameLen, nameHeader, runningHeader)
for i, uid := range uids {
name := names[i]
runningStr := ""
if running[i] {
runningStr = "Yes"
}
fmt.Printf("%*s %-*s %s\n", maxUidLen, uid, maxNameLen, name, runningStr)
}
return nil
}