diff --git a/adb/adb.go b/adb/adb.go index becd078..c3618fa 100644 --- a/adb/adb.go +++ b/adb/adb.go @@ -45,7 +45,7 @@ type Device struct { var deviceRegex = regexp.MustCompile(`^([^\s]+)\s+device(.*)$`) -func Devices() ([]Device, error) { +func Devices() ([]*Device, error) { cmd := exec.Command("adb", "devices", "-l") stdout, err := cmd.StdoutPipe() if err != nil { @@ -54,7 +54,7 @@ func Devices() ([]Device, error) { if err := cmd.Start(); err != nil { return nil, err } - var devices []Device + var devices []*Device scanner := bufio.NewScanner(stdout) for scanner.Scan() { line := scanner.Text() @@ -62,7 +62,7 @@ func Devices() ([]Device, error) { if m == nil { continue } - device := Device{ + device := &Device{ Id: m[1], } extras := m[2] @@ -87,17 +87,17 @@ func Devices() ([]Device, error) { return devices, nil } -func (d Device) AdbCmd(args ...string) *exec.Cmd { +func (d *Device) AdbCmd(args ...string) *exec.Cmd { cmdArgs := append([]string{"-s", d.Id}, args...) return exec.Command("adb", cmdArgs...) } -func (d Device) AdbShell(args ...string) *exec.Cmd { +func (d *Device) AdbShell(args ...string) *exec.Cmd { shellArgs := append([]string{"shell"}, args...) return d.AdbCmd(shellArgs...) } -func (d Device) Install(path string) error { +func (d *Device) Install(path string) error { cmd := d.AdbCmd("install", path) if err := cmd.Start(); err != nil { return err @@ -105,7 +105,7 @@ func (d Device) Install(path string) error { return nil } -func (d Device) Uninstall(pkg string) error { +func (d *Device) Uninstall(pkg string) error { cmd := d.AdbCmd("uninstall", pkg) if err := cmd.Start(); err != nil { return err @@ -125,7 +125,7 @@ var ( verNameRegex = regexp.MustCompile(`^ versionName=(.+)`) ) -func (d Device) Installed() (map[string]Package, error) { +func (d *Device) Installed() (map[string]Package, error) { cmd := d.AdbShell("dumpsys", "package", "packages") stdout, err := cmd.StdoutPipe() if err != nil { diff --git a/cmd/fdroidcl/devices.go b/cmd/fdroidcl/devices.go index 231fdd7..83b55a1 100644 --- a/cmd/fdroidcl/devices.go +++ b/cmd/fdroidcl/devices.go @@ -40,16 +40,18 @@ func startAdbIfNeeded() { } } -func oneDevice() adb.Device { +func oneDevice() *adb.Device { devices, err := adb.Devices() if err != nil { log.Fatalf("Could not get devices: %v", err) } if len(devices) == 0 { - log.Fatalf("No devices found") + log.Printf("No devices found, no device info will be available") + return nil } if len(devices) > 1 { - log.Fatalf("Too many devices found") + log.Printf("Too many devices found, no device info will be available") + return nil } return devices[0] } diff --git a/cmd/fdroidcl/search.go b/cmd/fdroidcl/search.go index 3246ad0..7fd18f1 100644 --- a/cmd/fdroidcl/search.go +++ b/cmd/fdroidcl/search.go @@ -33,14 +33,18 @@ func runSearch(args []string) { fmt.Println("-i is redundant if -u is specified") cmdSearch.Flag.Usage() } + device := oneDevice() + if device == nil && (*installed || *updates) { + log.Fatalf("Exactly one connected device is needed") + } index := mustLoadIndex() apps := filterAppsSearch(index.Apps, args) if *installed { - instPkgs := mustInstalled(oneDevice()) + instPkgs := mustInstalled(device) apps = filterAppsInstalled(apps, instPkgs) } if *updates { - instPkgs := mustInstalled(oneDevice()) + instPkgs := mustInstalled(device) apps = filterAppsUpdates(apps, instPkgs) } if *quiet { @@ -104,7 +108,10 @@ func printApp(app fdroidcl.App, IDLen int) { fmt.Printf(" %s\n", app.Summary) } -func mustInstalled(device adb.Device) map[string]adb.Package { +func mustInstalled(device *adb.Device) map[string]adb.Package { + if device == nil { + return nil + } inst, err := device.Installed() if err != nil { log.Fatalf("Could not get installed packages: %v", err)