Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Dec 1, 2025

The productinfo.json parser failed silently with UpdaterError::ProductInfo for all error cases, providing no diagnostic information. The live productinfo.json includes a Date field that serde handles automatically (unknown fields are ignored by default).

Changes

  • Removed unnecessary complexity

    • Removed _other HashMap + #[serde(flatten)] — serde ignores unknown fields by default
    • Removed #[serde(deny_unknown_fields)] from ProductFile — was hurting forward compatibility
    • Removed Serialize derive — not needed for parsing
  • Lenient parsing with error accumulation

    • Changed from FromStr trait to parse_product_info() function returning ParseProductInfoResult { db, errors }
    • Continues parsing even when individual products fail to deserialize
    • ProductInfoDb now stores raw ProductData without filtering during parse
    • Errors are accumulated in Vec<ProductInfoError> instead of failing fast
  • Deferred file lookup

    • Added lookup_current_file() for specific product/arch/type lookup
    • Added lookup_msi_for_target_arch() convenience method for common MSI lookup
    • When lookup fails, logs all accumulated parsing errors as warnings for investigation
    • Renamed UpdaterError::ProductInfo to ProductFileNotFound with product/arch/file_type context
#[derive(Debug, Error)]
pub(crate) enum ProductInfoError {
    #[error("failed to parse JSON: {0}")]
    InvalidJson(#[from] serde_json::Error),
    #[error("failed to deserialize product `{product}`: {source}")]
    DeserializeProduct { product: String, source: serde_json::Error },
}

struct ParseProductInfoResult {
    db: ProductInfoDb,
    errors: Vec<ProductInfoError>,
}
  • Tests
    • Added test for Date field matching live productinfo.json format
    • Added test for lenient parsing (one product fails, others succeed)
    • Added test for missing Current channel (not an error, just None on lookup)
    • Added test for missing architecture (other archs still available)
    • Added test for live productinfo.json format with RDMWindows example

Issue: Reported by tester following PR #1591


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copy link
Contributor Author

Copilot AI commented Dec 1, 2025

Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • devolutions.net
    • Triggering command: /usr/bin/curl curl -s REDACTED (dns block)
  • https://api.github.com//advisories
    • Triggering command: /home/REDACTED/work/_temp/ghcca-node/node/bin/node /home/REDACTED/work/_temp/ghcca-node/node/bin/node --enable-source-maps /home/REDACTED/work/_temp/copilot-developer-action-main/dist/index.js (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI changed the title [WIP] Fix agent: Improve productinfo.json parsing resilience fix(agent): improve productinfo.json parsing with proper error diagnostics Dec 1, 2025
Copilot AI requested a review from CBenoit December 1, 2025 20:58
Copilot finished work on behalf of CBenoit December 1, 2025 20:58
@CBenoit
Copy link
Member

CBenoit commented Dec 1, 2025

@copilot Please, make ProductInfoDb parsing more lenient. Instead of relying on the FromStr trait, write a function with this signature:

struct ParseProductInfoResult {
    db: ProductInfoDb,
    errors: Vec<ProductInfoError>,
}

fn parse_product_info(s: &str) -> ParseProductInfoResult {
    /* implementation */
}

Accumulate all the errors in the Vec<ProductInfoError>, but still return a valid ProductInfoDb (although it may end up empty). Do not perform anything smart such as filtering at this point, return a structured object closely matching the original input (although unknown fields should be ignored).

Later on, lookup for the required file for the right product and architecture. At this point, if you are unable to find it, log all the ProductInfoError errors as warnings so we can investigate the issue, and return an UpdateError error saying that we couldn’t find the required file in the productinfo.json. Maybe reuse and rename the ProductInfo variant.

Also, here is the current productinfo.json:

{
  "RDMWindows": {
    "Current": {
      "Version": "2025.3.25.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "Any",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.2025.3.25.0.exe",
          "Hash": "67F5281A8EBC1662E61C216F5887115A8B68F56C46FEE58A32E24D0CE82EB1B2"
        },
        {
          "Arch": "Any",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.2025.3.25.0.msi",
          "Hash": "99E0A49F6CFFE5C0B489D9B969945BDAA690E61E27D3EEA47A83741C98D1096E"
        },
        {
          "Arch": "arm64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-arm64.2025.3.25.0.exe",
          "Hash": "2D73BD97C98F91850566E2DF50759761CD68B49B074A4A60C3D284D42146A756"
        },
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-x64.2025.3.25.0.exe",
          "Hash": "FB658B08D20CCC84918D820F4C046C26A2EBAA477589CFED4FBA2CE358ADA21D"
        },
        {
          "Arch": "arm64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-arm64.2025.3.25.0.msi",
          "Hash": "57457A8C65AC6CF430458FAAE2466602CE1E5B355382F94F0BCB63FE6228DE0E"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-x64.2025.3.25.0.msi",
          "Hash": "CEEACCA110DD6CE710F2A1358395A8D44C6180BF5F13A53A0B51C3830C530112"
        },
        {
          "Arch": "Any",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManager.Bin.2025.3.25.0.zip",
          "Hash": "7559BF493220C0A2654ECE8750AB090BB71CC22B094800D24A3E91C7B79C762D"
        },
        {
          "Arch": "arm64",
          "Type": "7z",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManager.win-arm64.2025.3.25.0.7z",
          "Hash": "7D6D5EABA082E4243BE61AE41878EE26524AB66D97FE905B41F0F014E692A245"
        },
        {
          "Arch": "x64",
          "Type": "7z",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManager.win-x64.2025.3.25.0.7z",
          "Hash": "4BF77A1A0E41082BDFA07B75136085E833306EDC9A6BAC28082A028AA6729BCB"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.25.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "Any",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.2025.3.25.0.exe",
          "Hash": "67F5281A8EBC1662E61C216F5887115A8B68F56C46FEE58A32E24D0CE82EB1B2"
        },
        {
          "Arch": "Any",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.2025.3.25.0.msi",
          "Hash": "99E0A49F6CFFE5C0B489D9B969945BDAA690E61E27D3EEA47A83741C98D1096E"
        },
        {
          "Arch": "arm64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-arm64.2025.3.25.0.exe",
          "Hash": "2D73BD97C98F91850566E2DF50759761CD68B49B074A4A60C3D284D42146A756"
        },
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-x64.2025.3.25.0.exe",
          "Hash": "FB658B08D20CCC84918D820F4C046C26A2EBAA477589CFED4FBA2CE358ADA21D"
        },
        {
          "Arch": "arm64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-arm64.2025.3.25.0.msi",
          "Hash": "57457A8C65AC6CF430458FAAE2466602CE1E5B355382F94F0BCB63FE6228DE0E"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-x64.2025.3.25.0.msi",
          "Hash": "CEEACCA110DD6CE710F2A1358395A8D44C6180BF5F13A53A0B51C3830C530112"
        },
        {
          "Arch": "Any",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManager.Bin.2025.3.25.0.zip",
          "Hash": "7559BF493220C0A2654ECE8750AB090BB71CC22B094800D24A3E91C7B79C762D"
        },
        {
          "Arch": "arm64",
          "Type": "7z",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManager.win-arm64.2025.3.25.0.7z",
          "Hash": "7D6D5EABA082E4243BE61AE41878EE26524AB66D97FE905B41F0F014E692A245"
        },
        {
          "Arch": "x64",
          "Type": "7z",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManager.win-x64.2025.3.25.0.7z",
          "Hash": "4BF77A1A0E41082BDFA07B75136085E833306EDC9A6BAC28082A028AA6729BCB"
        }
      ]
    },
    "Update": {
      "Version": "2025.3.25.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "Any",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.2025.3.25.0.exe",
          "Hash": "67F5281A8EBC1662E61C216F5887115A8B68F56C46FEE58A32E24D0CE82EB1B2"
        },
        {
          "Arch": "Any",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.2025.3.25.0.msi",
          "Hash": "99E0A49F6CFFE5C0B489D9B969945BDAA690E61E27D3EEA47A83741C98D1096E"
        },
        {
          "Arch": "arm64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-arm64.2025.3.25.0.exe",
          "Hash": "2D73BD97C98F91850566E2DF50759761CD68B49B074A4A60C3D284D42146A756"
        },
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-x64.2025.3.25.0.exe",
          "Hash": "FB658B08D20CCC84918D820F4C046C26A2EBAA477589CFED4FBA2CE358ADA21D"
        },
        {
          "Arch": "arm64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-arm64.2025.3.25.0.msi",
          "Hash": "57457A8C65AC6CF430458FAAE2466602CE1E5B355382F94F0BCB63FE6228DE0E"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManager.win-x64.2025.3.25.0.msi",
          "Hash": "CEEACCA110DD6CE710F2A1358395A8D44C6180BF5F13A53A0B51C3830C530112"
        },
        {
          "Arch": "arm64",
          "Type": "7z",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManager.win-arm64.2025.3.25.0.7z",
          "Hash": "7D6D5EABA082E4243BE61AE41878EE26524AB66D97FE905B41F0F014E692A245"
        },
        {
          "Arch": "x64",
          "Type": "7z",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManager.win-x64.2025.3.25.0.7z",
          "Hash": "4BF77A1A0E41082BDFA07B75136085E833306EDC9A6BAC28082A028AA6729BCB"
        }
      ]
    }
  },
  "RDMMac": {
    "Current": {
      "Version": "2025.3.7.3",
      "Date": "2025-11-20",
      "Files": [
        {
          "Arch": "universal",
          "Type": "dmg",
          "Url": "https://cdn.devolutions.net/download/Mac/Devolutions.RemoteDesktopManager.Mac.2025.3.7.3.dmg",
          "Hash": "A27B4E2DBEAEE032590017B4EA90DAA7D176D408B66D845AB56D018CCD91C9B9"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.7.3",
      "Date": "2025-11-20",
      "Files": [
        {
          "Arch": "universal",
          "Type": "dmg",
          "Url": "https://cdn.devolutions.net/download/Mac/Devolutions.RemoteDesktopManager.Mac.2025.3.7.3.dmg",
          "Hash": "A27B4E2DBEAEE032590017B4EA90DAA7D176D408B66D845AB56D018CCD91C9B9"
        }
      ]
    }
  },
  "RDMLinux": {
    "Current": {
      "Version": "2025.3.0.9",
      "Date": "2025-11-07",
      "Files": [
        {
          "Arch": "x64",
          "Type": "deb",
          "Url": "https://cdn.devolutions.net/download/Linux/RDM/2025.3.0.9/RemoteDesktopManager_2025.3.0.9_amd64.deb",
          "Hash": "24E87202623EAB288DB74FB8B68518226205F098A93F13A674BBD3D2436BDBF0"
        },
        {
          "Arch": "x64",
          "Type": "rpm",
          "Url": "https://cdn.devolutions.net/download/Linux/RDM/2025.3.0.9/RemoteDesktopManager_2025.3.0.9_x86_64.rpm",
          "Hash": "8B1266056BEBD3CCAAF13384294F31C29263F0CA5EC8BE07127E81375DE80145"
        },
        {
          "Arch": "arm64",
          "Type": "deb",
          "Url": "https://cdn.devolutions.net/download/Linux/RDM/2025.3.0.9/RemoteDesktopManager_2025.3.0.9_arm64.deb",
          "Hash": "D90730E109D35F4640DBA407630A2FEEB7A12572E6D411D0A117B0CBCF21C154"
        },
        {
          "Arch": "arm64",
          "Type": "rpm",
          "Url": "https://cdn.devolutions.net/download/Linux/RDM/2025.3.0.9/RemoteDesktopManager_2025.3.0.9_aarch64.rpm",
          "Hash": "9070B573D07DFA70BE4A7966154DDE401131992F7A00D5FFEF8365E40263AE74"
        }
      ]
    }
  },
  "RDMAgent": {
    "Current": {
      "Version": "2025.3.25.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManagerJump.2025.3.25.0.exe",
          "Hash": "E4344CC79C2501937E6670E1B5505242F6FA7F0AB1F09889B208D6E38A3FC29B"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManagerJump.2025.3.25.0.msi",
          "Hash": "A1C6A9D793C72AFDC6F9C41D1D10073846E060237415030F164A444103D9A479"
        },
        {
          "Arch": "x64",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManagerJump.Bin.2025.3.25.0.zip",
          "Hash": "0668DB3B77201DB4F7DE5DB0B80231DB87AF1727EAAF1EA9293ED5C5B70F9B26"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.25.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManagerJump.2025.3.25.0.exe",
          "Hash": "E4344CC79C2501937E6670E1B5505242F6FA7F0AB1F09889B208D6E38A3FC29B"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.RemoteDesktopManagerJump.2025.3.25.0.msi",
          "Hash": "A1C6A9D793C72AFDC6F9C41D1D10073846E060237415030F164A444103D9A479"
        },
        {
          "Arch": "x64",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.RemoteDesktopManagerJump.Bin.2025.3.25.0.zip",
          "Hash": "0668DB3B77201DB4F7DE5DB0B80231DB87AF1727EAAF1EA9293ED5C5B70F9B26"
        }
      ]
    }
  },
  "Agent": {
    "Current": {
      "Version": "2025.3.2.0",
      "Date": "2025-10-10",
      "Files": [
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/DevolutionsAgent-x86_64-2025.3.2.0.msi",
          "Hash": "385388F42F097354EB6ED2F5201AF541B7C5E6B2D72AD9FA1DED87799FA1976F"
        },
        {
          "Arch": "x64",
          "Type": "deb",
          "Url": "https://cdn.devolutions.net/download/devolutions-agent_2025.3.2.0_amd64.deb",
          "Hash": "17F740D50FAFCB092F83C3885F4973F60C1BF7A9F441CA652F01B83698813304"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.2.0",
      "Date": "2025-10-10",
      "Files": [
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/DevolutionsAgent-x86_64-2025.3.2.0.msi",
          "Hash": "385388F42F097354EB6ED2F5201AF541B7C5E6B2D72AD9FA1DED87799FA1976F"
        },
        {
          "Arch": "x64",
          "Type": "deb",
          "Url": "https://cdn.devolutions.net/download/devolutions-agent_2025.3.2.0_amd64.deb",
          "Hash": "17F740D50FAFCB092F83C3885F4973F60C1BF7A9F441CA652F01B83698813304"
        }
      ]
    }
  },
  "PowerShell": {
    "Current": {
      "Version": "2025.3.2.0",
      "Date": "2025-11-21",
      "Files": [
        {
          "Arch": "Any",
          "Type": "nupkg",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShell.2025.3.2.0.nupkg",
          "Hash": "F5E5F6802BFF11E86509DA888274320F3F833DC156ADA387A4789EDF58809E48"
        }
      ]
    }
  },
  "PowerShellUniversal": {
    "Current": {
      "Version": "2025.3.11.0",
      "Date": "2025-11-26",
      "Files": [
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.2025.3.11.0.msi",
          "Hash": "1EAB19631899B847F0AD67053652FD60BC011B5EB9131BC3CBFF858ACAD64951"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.Agent.2025.3.11.0.msi",
          "Hash": "0BDA321245BBC5898D302887BC38F10A2E07B60CF169F1BB3D28276F354485F1"
        },
        {
          "Arch": "x64",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.win-x64.2025.3.11.0.zip",
          "Hash": "F0847706C706C0C7412F428D05F56C09CAFF8359AA6E6CF335FEB0353982D881"
        },
        {
          "Arch": "arm64",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.win-arm64.2025.3.11.0.zip",
          "Hash": "90F3703791E1D584CC86AE68B5B58D40F4F52EC56FA1D29463EE7CFE139F5A60"
        },
        {
          "Arch": "x64",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.linux-x64.2025.3.11.0.zip",
          "Hash": "78476D7B8D8E27FBEACC98FA1F917470328F93ABBD57C73242FF3210C9C2043D"
        },
        {
          "Arch": "arm",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.linux-arm.2025.3.11.0.zip",
          "Hash": "4030A221542D329B016CF9F5EDE9F3F588FFBB495702FE8C25E0DA45F1CB2291"
        },
        {
          "Arch": "arm64",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.linux-arm64.2025.3.11.0.zip",
          "Hash": "CBB39FC8DFEF3A2804CBDC6B2692A32B3756D6755744DDC65C30F9E70E7D56AC"
        },
        {
          "Arch": "x64",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.osx-x64.2025.3.11.0.zip",
          "Hash": "21E87585F2A2F60FF39CF3A99D761FFB4F52C83C4506BCDABD222AA501F90F50"
        },
        {
          "Arch": "arm64",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.osx-arm64.2025.3.11.0.zip",
          "Hash": "A7472CA3D40CF3A7EEB2D49A18F14F1F28EA7ACAF7F614E160D9DE0C9FB49E60"
        }
      ]
    }
  },
  "DVLS": {
    "Current": {
      "Version": "2025.3.10.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "Any",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/RDMS/DVLS.2025.3.10.0.zip",
          "Hash": "404E61A42C0D825D19CCD4ACC9DB0E9885170A442703FCA022FFF252B0DD9FC3"
        },
        {
          "Arch": "x64",
          "Type": "tar.gz",
          "Url": "https://cdn.devolutions.net/download/RDMS/DVLS.2025.3.10.0.linux-x64.tar.gz",
          "Hash": "DDB7C1590667E30D0D3F3D4D44BD3EB3D161BE711FFDE8F92333456E140B33E2"
        }
      ]
    },
    "Stable": {
      "Version": "2025.2.21.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "Any",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/RDMS/DVLS.2025.2.21.0.zip",
          "Hash": "8E1235C1D13D715AC0108AE3C6C05819817C0C5D00255B2A132AE3B2C03C6D85"
        },
        {
          "Arch": "x64",
          "Type": "tar.gz",
          "Url": "https://cdn.devolutions.net/download/RDMS/DVLS.2025.2.21.0.linux-x64.tar.gz",
          "Hash": "680399A52CB956F60963ABDC87CA49589ED378C319BCB5287744F523091E03DB"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.10.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "Any",
          "Type": "zip",
          "Url": "https://cdn.devolutions.net/download/RDMS/DVLS.2025.3.10.0.zip",
          "Hash": "404E61A42C0D825D19CCD4ACC9DB0E9885170A442703FCA022FFF252B0DD9FC3"
        },
        {
          "Arch": "x64",
          "Type": "tar.gz",
          "Url": "https://cdn.devolutions.net/download/RDMS/DVLS.2025.3.10.0.linux-x64.tar.gz",
          "Hash": "DDB7C1590667E30D0D3F3D4D44BD3EB3D161BE711FFDE8F92333456E140B33E2"
        }
      ]
    }
  },
  "Console": {
    "Current": {
      "Version": "2025.3.10.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.DVLS.Console.2025.3.10.0.exe",
          "Hash": "2B32DA6EAD01B744C3023F79F2AF339945F2C973E1463597783E3491AB9616CD"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.10.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.DVLS.Console.2025.3.10.0.exe",
          "Hash": "2B32DA6EAD01B744C3023F79F2AF339945F2C973E1463597783E3491AB9616CD"
        }
      ]
    }
  },
  "Gateway": {
    "Current": {
      "Version": "2025.3.2.0",
      "Date": "2025-10-10",
      "Files": [
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/DevolutionsGateway-x86_64-2025.3.2.0.msi",
          "Hash": "9670B9B7D8B4D145708EE5F7F1F7053111E620541D67CFA04CF711065C4C3B27"
        },
        {
          "Arch": "x64",
          "Type": "deb",
          "Url": "https://cdn.devolutions.net/download/devolutions-gateway_2025.3.2.0_amd64.deb",
          "Hash": "4605C15D73BC7F31D62463EC189A5FC19B2F35475420BAB60B5612C94F49C9B6"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.2.0",
      "Date": "2025-10-10",
      "Files": [
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/DevolutionsGateway-x86_64-2025.3.2.0.msi",
          "Hash": "9670B9B7D8B4D145708EE5F7F1F7053111E620541D67CFA04CF711065C4C3B27"
        },
        {
          "Arch": "x64",
          "Type": "deb",
          "Url": "https://cdn.devolutions.net/download/devolutions-gateway_2025.3.2.0_amd64.deb",
          "Hash": "4605C15D73BC7F31D62463EC189A5FC19B2F35475420BAB60B5612C94F49C9B6"
        }
      ]
    }
  },
  "Launcher": {
    "Current": {
      "Version": "2025.3.25.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.Devolutions.Launcher.2025.3.25.0.exe",
          "Hash": "2921D5A0E3A11E4E2E5DD177EF502C664D469256793DF8C80D3F3B8F2543FCE3"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.Devolutions.Launcher.2025.3.25.0.msi",
          "Hash": "1F5443543A1CA8FB2D27B4474E00824FAE1FBBD975C83FD5F91EA9D45B51062D"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.25.0",
      "Date": "2025-11-27",
      "Files": [
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.Devolutions.Launcher.2025.3.25.0.exe",
          "Hash": "2921D5A0E3A11E4E2E5DD177EF502C664D469256793DF8C80D3F3B8F2543FCE3"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.Devolutions.Launcher.2025.3.25.0.msi",
          "Hash": "1F5443543A1CA8FB2D27B4474E00824FAE1FBBD975C83FD5F91EA9D45B51062D"
        }
      ]
    }
  },
  "HubImporter": {
    "Current": {
      "Version": "2025.3.23.0",
      "Date": "2025-11-24",
      "Files": [
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.Hub.Importer.2025.3.23.0.exe",
          "Hash": "AFB23C7F614AA8FDFE25AB4E2299AAACC4567D86A0D2DCF0CA2602498C781E6A"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.Hub.Importer.2025.3.23.0.msi",
          "Hash": "6EFF977F6F54376B05CA1D37A287023800649052685676D6E14819F55AC1D3E0"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.23.0",
      "Date": "2025-11-24",
      "Files": [
        {
          "Arch": "x64",
          "Type": "exe",
          "Url": "https://cdn.devolutions.net/download/Setup.Hub.Importer.2025.3.23.0.exe",
          "Hash": "AFB23C7F614AA8FDFE25AB4E2299AAACC4567D86A0D2DCF0CA2602498C781E6A"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Setup.Hub.Importer.2025.3.23.0.msi",
          "Hash": "6EFF977F6F54376B05CA1D37A287023800649052685676D6E14819F55AC1D3E0"
        }
      ]
    }
  },
  "HubServices": {
    "Current": {
      "Version": "2025.3.1.1",
      "Date": "2025-10-07",
      "Files": [
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Hub/Services/Setup.Devolutions.Hub.Services.2025.3.1.1.msi",
          "Hash": "2802128648097C2C5BBD061ADCFCA0A509E9FDF29662619F9721C2494F7521F3"
        }
      ]
    }
  },
  "WorkspaceWindows": {
    "Current": {
      "Version": "2025.3.3.0",
      "Date": "2025-11-13",
      "Files": [
        {
          "Arch": "x64",
          "Type": "msix",
          "Url": "https://cdn.devolutions.net/download/Devolutions.Workspace-2025.3.3.0-x64.msix",
          "Hash": "6E2723756E73966BEF899EC5996A2CE14EBFEE41A4621DC1C6A135F7DB740C6A"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Devolutions.Workspace-2025.3.3.0-x64.msi",
          "Hash": "B383F94B103AD7B50825AD9E743DCBD75274E84D32EE23BA90CD2233328AB01C"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.3.0",
      "Date": "2025-11-13",
      "Files": [
        {
          "Arch": "x64",
          "Type": "msix",
          "Url": "https://cdn.devolutions.net/download/Devolutions.Workspace-2025.3.3.0-x64.msix",
          "Hash": "6E2723756E73966BEF899EC5996A2CE14EBFEE41A4621DC1C6A135F7DB740C6A"
        },
        {
          "Arch": "x64",
          "Type": "msi",
          "Url": "https://cdn.devolutions.net/download/Devolutions.Workspace-2025.3.3.0-x64.msi",
          "Hash": "B383F94B103AD7B50825AD9E743DCBD75274E84D32EE23BA90CD2233328AB01C"
        }
      ]
    }
  },
  "WorkspaceMac": {
    "Current": {
      "Version": "2025.3.3.0",
      "Date": "2025-11-13",
      "Files": [
        {
          "Arch": "universal",
          "Type": "dmg",
          "Url": "https://cdn.devolutions.net/download/Mac/Workspace/2025.3.3.0/Devolutions.Workspace.2025.3.3.0.dmg",
          "Hash": "DD0FA67E0A1859B613A08D6A08EEF961D546C428014ABD8EDC94C069138871F0"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.3.0",
      "Date": "2025-11-13",
      "Files": [
        {
          "Arch": "universal",
          "Type": "dmg",
          "Url": "https://cdn.devolutions.net/download/Mac/Workspace/2025.3.3.0/Devolutions.Workspace.2025.3.3.0.dmg",
          "Hash": "DD0FA67E0A1859B613A08D6A08EEF961D546C428014ABD8EDC94C069138871F0"
        }
      ]
    }
  },
  "WorkspaceLinux": {
    "Current": {
      "Version": "2025.3.3.0",
      "Date": "2025-11-13",
      "Files": [
        {
          "Arch": "x64",
          "Type": "deb",
          "Url": "https://cdn.devolutions.net/download/Linux/Workspace/2025.3.3.0/workspace_2025.3.3.0_amd64.deb",
          "Hash": "EC88D393D4CF6D259430FCCA34A2FBCE6F5A2BF83B87E5FBAC0B81428250953C"
        }
      ]
    },
    "Beta": {
      "Version": "2025.3.3.0",
      "Date": "2025-11-13",
      "Files": [
        {
          "Arch": "x64",
          "Type": "deb",
          "Url": "https://cdn.devolutions.net/download/Linux/Workspace/2025.3.3.0/workspace_2025.3.3.0_amd64.deb",
          "Hash": "EC88D393D4CF6D259430FCCA34A2FBCE6F5A2BF83B87E5FBAC0B81428250953C"
        }
      ]
    }
  },
  "WorkspaceFirefox": {
    "Current": {
      "Version": "2025.3.1.2",
      "Date": "2025-11-06",
      "Files": [
        {
          "Arch": "Any",
          "Type": "xpi",
          "Url": "https://cdn.devolutions.net/download/BrowserExtension/DevolutionsWebLoginFirefox.2025.3.1.2.xpi",
          "Hash": ""
        }
      ]
    }
  },
  "WorkspaceChrome": {
    "Current": {
      "Version": "2025.3.1.2",
      "Date": "2025-11-06",
      "Files": [
        {
          "Arch": "Any",
          "Type": "web",
          "Url": "https://chrome.google.com/webstore/detail/devolutions-web-login/neimonjjffhehnojilepgfejkneaidmo?hl=en-US&gl=CA",
          "Hash": ""
        }
      ]
    }
  },
  "WorkspaceEdge": {
    "Current": {
      "Version": "2025.3.1.2",
      "Date": "2025-11-06",
      "Files": [
        {
          "Arch": "Any",
          "Type": "web",
          "Url": "https://microsoftedge.microsoft.com/addons/detail/ddloeodolhdfbohkokiflfbacbfpjahp",
          "Hash": ""
        }
      ]
    }
  },
  "WorkspaceOpera": {
    "Current": {
      "Version": "2025.3.1.2",
      "Date": "2025-11-06",
      "Files": [
        {
          "Arch": "Any",
          "Type": "crx",
          "Url": "https://cdn.devolutions.net/download/BrowserExtension/DevolutionsWebLoginOpera.2025.3.1.2.crx",
          "Hash": ""
        }
      ]
    }
  },
  "WorkspaceSafari": {
    "Current": {
      "Version": "2025.3.0.3",
      "Date": "2025-10-07",
      "Files": [
        {
          "Arch": "Any",
          "Type": "web",
          "Url": "https://apps.apple.com/us/app/devolutions-workspace/id1462282993",
          "Hash": ""
        }
      ]
    }
  }
}

@CBenoit CBenoit changed the base branch from fix-productinfo-auto-update to master December 1, 2025 21:19
Copy link
Contributor Author

Copilot AI commented Dec 1, 2025

@copilot Please, make ProductInfoDb parsing more lenient. Instead of relying on the FromStr trait, write a function with this signature:

...

Addressed in dbdf576:

  1. Changed to lenient parsing with parse_product_info() returning ParseProductInfoResult { db, errors }
  2. ProductInfoDb now stores raw ProductData - no filtering during parse
  3. Added lookup_current_file() and lookup_msi_for_target_arch() for file selection
  4. When lookup fails, accumulated errors are logged as warnings
  5. Renamed error to ProductFileNotFound with product/arch/file_type context
  6. Added test for live productinfo.json format with RDMWindows example

Copilot AI changed the title fix(agent): improve productinfo.json parsing with proper error diagnostics fix(agent): improve productinfo.json parsing with lenient error handling Dec 1, 2025
Copilot finished work on behalf of CBenoit December 1, 2025 21:25
@CBenoit CBenoit marked this pull request as ready for review December 1, 2025 22:14
@CBenoit CBenoit enabled auto-merge (squash) December 1, 2025 22:14
- Add optional Date field to ChannelData struct to handle live productinfo.json
- Add forward compatibility via flattened _other HashMap for unknown fields
- Add validation for empty URLs and hashes
- Add detailed warning logs for parsing failures with context
- Add deny_unknown_fields to ProductFile for safety
- Add comprehensive tests for Date field, unknown fields, and validation
@CBenoit CBenoit force-pushed the copilot/sub-pr-1594 branch from ec3b116 to 8d90413 Compare December 1, 2025 22:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants