mas-cli / mas

:package: Mac App Store command line interface
MIT License
10.84k stars 273 forks source link

🖥️ Only search, outdated and update macOS apps #505

Closed phatblat closed 7 months ago

phatblat commented 10 months ago

Resolves #336, #491

Obviates #496, #503, #504

Since the introduction of iOS apps on macOS (running on Apple Silicon), mas has had no knowledge of the difference and occasionally shows iOS apps in search results or attempts to update macOS apps with the iOS app metadata and fails with confusing errors.

This PR builds on @chris-araman's research and simply filters out iOS apps for now. I'm opening this as a draft for review and to show the community that I'm looking into resolving these issues, but this change will need some testing before release.

Explicit support for installing and updating iOS apps can be added, but that work will be outside this PR.

phatblat commented 10 months ago

I've published a build with this on the releases page: https://github.com/mas-cli/mas/releases/tag/v1.8.7-beta.1

rgoldberg commented 9 months ago

For 1.8.7 Beta 1 on macOS 12.7.2 on Intel:

$ mas outdated
899247664 TestFlight (3.3.0 -> 3.4.3)
545519333 Prime Video (10.11 -> 10.11.1)

3.3.0 & 10.11 are the most recent versions that can be installed on my machine, so the above output seems incorrect.

When I tested the change from #496 & #503 (they have the exact same one-line change) in Xcode 14.2, mas outdated correctly did not output anything.

Can you try #496 and/or #503 in Xcode? If that works for you, can you release 1.8.7 Beta 2 with just that change, not including the other changes from this PR?

Thanks.

Sorry for the delay. I should be able to quickly test anything you release in the upcoming weeks much more rapidly than my 3-week delay for 1.8.7 Beta 1.

phatblat commented 7 months ago

Updated this branch from main and actions workflow is stalling while it's running tests.

[225/226] Compiling MasKitTests resource_bundle_accessor.swift
[225/226] Linking masPackageTests
Build complete! (21.58s)
Test Suite 'All tests' started at 2024-02-17 19:09:14.201.
Test Suite 'masPackageTests.xctest' started at 2024-02-17 19:09:14.202.
Test Suite 'AppListsFormatterSpec' started at 2024-02-17 19:09:14.202.
Test Case '-[MasKitTests.AppListsFormatterSpec app_list_formatter__formats_nothing_as_empty_string]' started.
Test Case '-[MasKitTests.AppListsFormatterSpec app_list_formatter__formats_nothing_as_empty_string]' passed (0.001 seconds).
Test Case '-[MasKitTests.AppListsFormatterSpec app_list_formatter__can_format_a_single_product]' started.
Test Case '-[MasKitTests.AppListsFormatterSpec app_list_formatter__can_format_a_single_product]' passed (0.000 seconds).
Test Case '-[MasKitTests.AppListsFormatterSpec app_list_formatter__can_format_two_products]' started.
Test Case '-[MasKitTests.AppListsFormatterSpec app_list_formatter__can_format_two_products]' passed (0.000 seconds).
Test Suite 'AppListsFormatterSpec' passed at 2024-02-17 19:09:14.203.
     Executed 3 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
Test Suite 'HomeCommandSpec' started at 2024-02-17 19:09:14.203.
Test Case '-[MasKitTests.HomeCommandSpec home_command__fails_to_open_app_with_invalid_ID]' started.
Test Case '-[MasKitTests.HomeCommandSpec home_command__fails_to_open_app_with_invalid_ID]' passed (0.000 seconds).
Test Case '-[MasKitTests.HomeCommandSpec home_command__can_t_find_app_with_unknown_ID]' started.
Test Case '-[MasKitTests.HomeCommandSpec home_command__can_t_find_app_with_unknown_ID]' passed (0.000 seconds).
Test Case '-[MasKitTests.HomeCommandSpec home_command__opens_app_on_MAS_Preview]' started.
Test Case '-[MasKitTests.HomeCommandSpec home_command__opens_app_on_MAS_Preview]' passed (0.000 seconds).
Test Suite 'HomeCommandSpec' passed at 2024-02-17 19:09:14.204.
     Executed 3 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
Test Suite 'InfoCommandSpec' started at 2024-02-17 19:09:14.204.
Test Case '-[MasKitTests.InfoCommandSpec Info_command__fails_to_open_app_with_invalid_ID]' started.
Test Case '-[MasKitTests.InfoCommandSpec Info_command__fails_to_open_app_with_invalid_ID]' passed (0.000 seconds).
Test Case '-[MasKitTests.InfoCommandSpec Info_command__can_t_find_app_with_unknown_ID]' started.
Test Case '-[MasKitTests.InfoCommandSpec Info_command__can_t_find_app_with_unknown_ID]' passed (0.000 seconds).
Test Case '-[MasKitTests.InfoCommandSpec Info_command__displays_app_details]' started.
Test Case '-[MasKitTests.InfoCommandSpec Info_command__displays_app_details]' passed (0.003 seconds).
Test Suite 'InfoCommandSpec' passed at 2024-02-17 19:09:14.207.
     Executed 3 tests, with 0 failures (0 unexpected) in 0.003 (0.003) seconds
Test Suite 'InstallCommandSpec' started at 2024-02-17 19:09:14.207.
Test Case '-[MasKitTests.InstallCommandSpec install_command__installs_apps]' started.
Test Case '-[MasKitTests.InstallCommandSpec install_command__installs_apps]' passed (0.003 seconds).
Test Suite 'InstallCommandSpec' passed at 2024-02-17 19:09:14.211.
     Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.003) seconds
Test Suite 'ListCommandSpec' started at 2024-02-17 19:09:14.211.
Test Case '-[MasKitTests.ListCommandSpec list_command__lists_apps]' started.
Error: No installed apps found
Test Case '-[MasKitTests.ListCommandSpec list_command__lists_apps]' passed (0.109 seconds).
Test Suite 'ListCommandSpec' passed at 2024-02-17 19:09:14.320.
     Executed 1 test, with 0 failures (0 unexpected) in 0.109 (0.109) seconds
Test Suite 'LuckyCommandSpec' started at 2024-02-17 19:09:14.320.
Test Case '-[MasKitTests.LuckyCommandSpec lucky_command__installs_the_first_app_matching_a_search]' started.
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
2024-02-17 19:09:14.473 xctest[9957:41072] CoreData: XPC: sendMessage: failed #0
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000[272](https://github.com/mas-cli/mas/actions/runs/7943403809/job/21688393382#step:5:273)d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
2024-02-17 19:09:14.478 xctest[9957:41072] CoreData: XPC: sendMessage: failed #1
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
CoreData: error: Failed to create NSXPCConnection
2024-02-17 19:09:17.665 xctest[9957:41072] CoreData: XPC: sendMessage: failed #2
2024-02-17 19:09:17.665 xctest[9957:41072] CoreData: XPC: Unable to sendMessage: to server
CoreData: fault: Unable to create token NSXPCConnection.  NSXPCStoreServerEndpointFactory 0x60000272d1d0 -newEndpoint returned nil
phatblat commented 7 months ago

I'm not getting the same CoreData logs, but when running tests from this branch locally, it stops as MasKitTests.LuckyCommandSpec lucky_command__installs_the_first_app_matching_a_search with a Mac App Store login dialog waiting for a password.

Test Suite 'LuckyCommandSpec' started at 2024-02-17 20:14:32.782.
Test Case '-[MasKitTests.LuckyCommandSpec lucky_command__installs_the_first_app_matching_a_search]' started.
rgoldberg commented 7 months ago

@phatblat I assume that the test failure is from the change to LuckyCommandSpec.swift in cfc2bef9218e50188cc28517328b8ad309ace5a9. Can you revert that to see if it fixes the test?

phatblat commented 7 months ago

Yep, that was it. This test was disabled because it isn't properly mocked.

describe("lucky command") {
    xit("installs the first app matching a search")