From 1be5f6d0e47785f36be0b59e2799fecc9e90d007 Mon Sep 17 00:00:00 2001 From: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Date: Wed, 6 Nov 2024 14:43:34 +0100 Subject: [PATCH] feat: add `pixi upgrade` (#2368) Design proposal: https://github.com/prefix-dev/pixi/issues/912 Implementation in this PR: ``` # Resolve all the dependencies of the default feature without any constraints and installs the solved solution. pixi upgrade # Resolve a specific dependency pixi upgrade package # Resolve multiple dependencies pixi upgrade package_a package_b # Upgrade all dependencies in a single feature pixi upgrade --feature test # Upgrade all dependencies except python and julia pixi upgrade --exclude python --exclude julia # Run upgrade logic without writing to disk pixi upgrade --dry-run # Run upgrade and get output in json format pixi upgrade --json ``` This PR is important as it is not easy enough right now to update a full setup with pixi as it automatically pins most of your dependencies to a major or minor version. --------- Co-authored-by: Ruben Arts --- docs/reference/cli.md | 27 + src/cli/add.rs | 397 ++------------ src/cli/cli_config.rs | 20 +- src/cli/mod.rs | 3 + src/cli/remove.rs | 8 +- src/cli/update.rs | 514 +----------------- src/cli/upgrade.rs | 255 +++++++++ src/diff.rs | 509 +++++++++++++++++ src/lib.rs | 1 + src/project/mod.rs | 366 ++++++++++++- .../linux-64/dummy-a-0.1.0-hb0f4dca_0.conda | Bin 1240 -> 1242 bytes .../linux-64/dummy-b-0.1.0-hb0f4dca_0.conda | Bin 1154 -> 1156 bytes .../linux-64/dummy-c-0.1.0-hb0f4dca_0.conda | Bin 1157 -> 1157 bytes .../linux-64/dummy-d-0.1.0-hb0f4dca_0.conda | Bin 1169 -> 1168 bytes .../linux-64/dummy_e-0.1.0-hb0f4dca_0.conda | Bin 1156 -> 1157 bytes .../dummy_channel_1/linux-64/repodata.json | 38 +- .../osx-64/dummy-a-0.1.0-h0dc7051_0.conda | Bin 1240 -> 1241 bytes .../osx-64/dummy-b-0.1.0-h0dc7051_0.conda | Bin 1149 -> 1150 bytes .../osx-64/dummy-c-0.1.0-h0dc7051_0.conda | Bin 1150 -> 1151 bytes .../osx-64/dummy-d-0.1.0-h0dc7051_0.conda | Bin 1166 -> 1167 bytes .../osx-64/dummy_e-0.1.0-h0dc7051_0.conda | Bin 1149 -> 1150 bytes .../dummy_channel_1/osx-64/repodata.json | 40 +- .../osx-arm64/dummy-a-0.1.0-h60d57d3_0.conda | Bin 1237 -> 1240 bytes .../osx-arm64/dummy-b-0.1.0-h60d57d3_0.conda | Bin 1154 -> 1155 bytes .../osx-arm64/dummy-c-0.1.0-h60d57d3_0.conda | Bin 1155 -> 1154 bytes .../osx-arm64/dummy-d-0.1.0-h60d57d3_0.conda | Bin 1166 -> 1168 bytes .../osx-arm64/dummy_e-0.1.0-h60d57d3_0.conda | Bin 1153 -> 1155 bytes .../dummy_channel_1/osx-arm64/repodata.json | 40 +- .../win-64/dummy-a-0.1.0-h9490d1a_0.conda | Bin 1246 -> 1246 bytes .../win-64/dummy-b-0.1.0-h9490d1a_0.conda | Bin 1159 -> 1157 bytes .../win-64/dummy-c-0.1.0-h9490d1a_0.conda | Bin 1157 -> 1157 bytes .../win-64/dummy-d-0.1.0-h9490d1a_0.conda | Bin 1176 -> 1173 bytes .../win-64/dummy_e-0.1.0-h9490d1a_0.conda | Bin 1158 -> 1158 bytes .../dummy_channel_1/win-64/repodata.json | 34 +- .../linux-64/dummy-b-0.1.0-hb0f4dca_0.conda | Bin 1158 -> 1157 bytes .../linux-64/dummy-x-0.1.0-hb0f4dca_0.conda | Bin 1156 -> 1156 bytes .../dummy_channel_2/linux-64/repodata.json | 14 +- .../osx-64/dummy-b-0.1.0-h0dc7051_0.conda | Bin 1151 -> 1150 bytes .../osx-64/dummy-x-0.1.0-h0dc7051_0.conda | Bin 1149 -> 1149 bytes .../dummy_channel_2/osx-64/repodata.json | 14 +- .../osx-arm64/dummy-b-0.1.0-h60d57d3_0.conda | Bin 1156 -> 1155 bytes .../osx-arm64/dummy-x-0.1.0-h60d57d3_0.conda | Bin 1154 -> 1154 bytes .../dummy_channel_2/osx-arm64/repodata.json | 14 +- .../win-64/dummy-b-0.1.0-h9490d1a_0.conda | Bin 1157 -> 1157 bytes .../win-64/dummy-x-0.1.0-h9490d1a_0.conda | Bin 1157 -> 1159 bytes .../dummy_channel_2/win-64/repodata.json | 14 +- .../linux-64/package-0.1.0-hb0f4dca_0.conda | Bin 1237 -> 0 bytes .../linux-64/package-0.2.0-hb0f4dca_0.conda | Bin 1240 -> 0 bytes .../linux-64/package2-0.1.0-hb0f4dca_0.conda | Bin 1158 -> 0 bytes .../linux-64/package2-0.2.0-hb0f4dca_0.conda | Bin 1159 -> 0 bytes .../osx-64/package-0.1.0-h0dc7051_0.conda | Bin 1230 -> 0 bytes .../osx-64/package-0.2.0-h0dc7051_0.conda | Bin 1231 -> 0 bytes .../osx-64/package2-0.1.0-h0dc7051_0.conda | Bin 1158 -> 0 bytes .../osx-64/package2-0.2.0-h0dc7051_0.conda | Bin 1157 -> 0 bytes .../osx-arm64/package-0.1.0-h60d57d3_0.conda | Bin 1237 -> 0 bytes .../osx-arm64/package-0.2.0-h60d57d3_0.conda | Bin 1239 -> 0 bytes .../osx-arm64/package2-0.1.0-h60d57d3_0.conda | Bin 1158 -> 0 bytes .../osx-arm64/package2-0.2.0-h60d57d3_0.conda | Bin 1157 -> 0 bytes .../win-64/package-0.1.0-h9490d1a_0.conda | Bin 1238 -> 0 bytes .../win-64/package-0.2.0-h9490d1a_0.conda | Bin 1241 -> 0 bytes .../win-64/package2-0.1.0-h9490d1a_0.conda | Bin 1171 -> 0 bytes .../win-64/package2-0.2.0-h9490d1a_0.conda | Bin 1170 -> 0 bytes .../linux-64/package-0.1.0-hb0f4dca_0.conda | Bin 0 -> 1237 bytes .../linux-64/package-0.2.0-hb0f4dca_0.conda | Bin 0 -> 1239 bytes .../linux-64/package2-0.1.0-hb0f4dca_0.conda | Bin 0 -> 1161 bytes .../linux-64/package2-0.2.0-hb0f4dca_0.conda | Bin 0 -> 1158 bytes .../linux-64/repodata.json | 30 +- .../noarch/repodata.json | 0 .../osx-64/package-0.1.0-h0dc7051_0.conda | Bin 0 -> 1231 bytes .../osx-64/package-0.2.0-h0dc7051_0.conda | Bin 0 -> 1230 bytes .../osx-64/package2-0.1.0-h0dc7051_0.conda | Bin 0 -> 1159 bytes .../osx-64/package2-0.2.0-h0dc7051_0.conda | Bin 0 -> 1158 bytes .../osx-64/repodata.json | 32 +- .../osx-arm64/package-0.1.0-h60d57d3_0.conda | Bin 0 -> 1238 bytes .../osx-arm64/package-0.2.0-h60d57d3_0.conda | Bin 0 -> 1230 bytes .../osx-arm64/package2-0.1.0-h60d57d3_0.conda | Bin 0 -> 1159 bytes .../osx-arm64/package2-0.2.0-h60d57d3_0.conda | Bin 0 -> 1151 bytes .../osx-arm64/repodata.json | 32 +- .../win-64/package-0.1.0-h9490d1a_0.conda | Bin 0 -> 1240 bytes .../win-64/package-0.2.0-h9490d1a_0.conda | Bin 0 -> 1241 bytes .../win-64/package2-0.1.0-h9490d1a_0.conda | Bin 0 -> 1169 bytes .../win-64/package2-0.2.0-h9490d1a_0.conda | Bin 0 -> 1168 bytes .../win-64/repodata.json | 30 +- .../linux-64/jupyter-0.1.0-hb0f4dca_0.conda | Bin 992 -> 993 bytes .../jupyter-core-0.1.0-hb0f4dca_0.conda | Bin 1180 -> 1179 bytes .../linux-64/repodata.json | 16 +- .../osx-64/jupyter-0.1.0-h0dc7051_0.conda | Bin 990 -> 991 bytes .../jupyter-core-0.1.0-h0dc7051_0.conda | Bin 1178 -> 1177 bytes .../osx-64/repodata.json | 16 +- .../osx-arm64/jupyter-0.1.0-h60d57d3_0.conda | Bin 990 -> 991 bytes .../jupyter-core-0.1.0-h60d57d3_0.conda | Bin 1178 -> 1178 bytes .../osx-arm64/repodata.json | 14 +- .../win-64/jupyter-0.1.0-h9490d1a_0.conda | Bin 993 -> 992 bytes .../jupyter-core-0.1.0-h9490d1a_0.conda | Bin 1184 -> 1184 bytes .../win-64/repodata.json | 14 +- .../linux-64/jupyter-0.1.0-hb0f4dca_0.conda | Bin 992 -> 993 bytes .../jupyter-core-0.2.0-hb0f4dca_0.conda | Bin 1180 -> 1179 bytes .../linux-64/repodata.json | 16 +- .../osx-64/jupyter-0.1.0-h0dc7051_0.conda | Bin 991 -> 991 bytes .../jupyter-core-0.2.0-h0dc7051_0.conda | Bin 1177 -> 1177 bytes .../osx-64/repodata.json | 12 +- .../osx-arm64/jupyter-0.1.0-h60d57d3_0.conda | Bin 990 -> 991 bytes .../jupyter-core-0.2.0-h60d57d3_0.conda | Bin 1178 -> 1178 bytes .../osx-arm64/repodata.json | 14 +- .../win-64/jupyter-0.1.0-h9490d1a_0.conda | Bin 992 -> 993 bytes .../jupyter-core-0.2.0-h9490d1a_0.conda | Bin 1185 -> 1185 bytes .../win-64/repodata.json | 14 +- .../dummy-trampoline-0.1.0-hb0f4dca_0.conda | Bin 1624 -> 1624 bytes .../trampoline_1/linux-64/repodata.json | 6 +- .../dummy-trampoline-0.1.0-h0dc7051_0.conda | Bin 1622 -> 1622 bytes .../trampoline_1/osx-64/repodata.json | 6 +- .../dummy-trampoline-0.1.0-h60d57d3_0.conda | Bin 1622 -> 1622 bytes .../trampoline_1/osx-arm64/repodata.json | 6 +- .../dummy-trampoline-0.1.0-h9490d1a_0.conda | Bin 1603 -> 1602 bytes .../trampoline_1/win-64/repodata.json | 8 +- .../dummy-trampoline-0.2.0-hb0f4dca_0.conda | Bin 1632 -> 1630 bytes .../trampoline_2/linux-64/repodata.json | 8 +- .../dummy-trampoline-0.2.0-h0dc7051_0.conda | Bin 1633 -> 1629 bytes .../trampoline_2/osx-64/repodata.json | 8 +- .../dummy-trampoline-0.2.0-h60d57d3_0.conda | Bin 1632 -> 1629 bytes .../trampoline_2/osx-arm64/repodata.json | 8 +- .../dummy-trampoline-0.2.0-h9490d1a_0.conda | Bin 1610 -> 1610 bytes .../trampoline_2/win-64/repodata.json | 6 +- tests/data/channels/mappings.toml | 4 +- ...l => multiple_versions_channel_1_010.yaml} | 3 +- ...l => multiple_versions_channel_1_020.yaml} | 2 +- tests/integration_python/conftest.py | 4 +- .../integration_python/global/test_global.py | 26 +- tests/integration_python/test_main_cli.py | 215 ++++++++ tests/integration_rust/common/builders.rs | 10 +- 130 files changed, 1701 insertions(+), 1167 deletions(-) create mode 100644 src/cli/upgrade.rs create mode 100644 src/diff.rs delete mode 100644 tests/data/channels/channels/global_update_channel_1/linux-64/package-0.1.0-hb0f4dca_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/linux-64/package-0.2.0-hb0f4dca_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/linux-64/package2-0.1.0-hb0f4dca_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/linux-64/package2-0.2.0-hb0f4dca_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/osx-64/package-0.1.0-h0dc7051_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/osx-64/package-0.2.0-h0dc7051_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/osx-64/package2-0.1.0-h0dc7051_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/osx-64/package2-0.2.0-h0dc7051_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/osx-arm64/package-0.1.0-h60d57d3_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/osx-arm64/package-0.2.0-h60d57d3_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/osx-arm64/package2-0.1.0-h60d57d3_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/osx-arm64/package2-0.2.0-h60d57d3_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/win-64/package-0.1.0-h9490d1a_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/win-64/package-0.2.0-h9490d1a_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/win-64/package2-0.1.0-h9490d1a_0.conda delete mode 100644 tests/data/channels/channels/global_update_channel_1/win-64/package2-0.2.0-h9490d1a_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/linux-64/package-0.1.0-hb0f4dca_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/linux-64/package-0.2.0-hb0f4dca_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/linux-64/package2-0.1.0-hb0f4dca_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/linux-64/package2-0.2.0-hb0f4dca_0.conda rename tests/data/channels/channels/{global_update_channel_1 => multiple_versions_channel_1}/linux-64/repodata.json (62%) rename tests/data/channels/channels/{global_update_channel_1 => multiple_versions_channel_1}/noarch/repodata.json (100%) create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-64/package-0.1.0-h0dc7051_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-64/package-0.2.0-h0dc7051_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-64/package2-0.1.0-h0dc7051_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-64/package2-0.2.0-h0dc7051_0.conda rename tests/data/channels/channels/{global_update_channel_1 => multiple_versions_channel_1}/osx-64/repodata.json (62%) create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.1.0-h60d57d3_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.2.0-h60d57d3_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package2-0.1.0-h60d57d3_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package2-0.2.0-h60d57d3_0.conda rename tests/data/channels/channels/{global_update_channel_1 => multiple_versions_channel_1}/osx-arm64/repodata.json (59%) create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/win-64/package-0.1.0-h9490d1a_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/win-64/package-0.2.0-h9490d1a_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.1.0-h9490d1a_0.conda create mode 100644 tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.2.0-h9490d1a_0.conda rename tests/data/channels/channels/{global_update_channel_1 => multiple_versions_channel_1}/win-64/repodata.json (60%) rename tests/data/channels/recipes/{global_update_channel_1_010.yaml => multiple_versions_channel_1_010.yaml} (95%) rename tests/data/channels/recipes/{global_update_channel_1_020.yaml => multiple_versions_channel_1_020.yaml} (96%) diff --git a/docs/reference/cli.md b/docs/reference/cli.md index 03e248fcd..3bd9242a9 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -189,6 +189,33 @@ pixi update --dry-run pixi update --no-install boto3 ``` +## `upgrade` + +The `upgrade` command checks if there are newer versions of the dependencies and upgrades them in the [manifest file](project_configuration.md). +`update` updates dependencies in the lock file while still fulfilling the version requirements set in the manifest. +`upgrade` loosens the requirements for the given packages, updates the lock file and the adapts the manifest accordingly. + +##### Arguments + +1. `[PACKAGES]...` The packages to upgrade, space separated. If no packages are provided, all packages will be upgraded. + +##### Options +- `--manifest-path `: the path to [manifest file](project_configuration.md), by default it searches for one in the parent directories. +- `--feature (-e)`: The feature to upgrade, if none are provided all features are upgraded. +- `--no-install`: Don't install the (solve) environment needed for solving pypi-dependencies. +- `--json`: Output the changes in json format. +- `--dry-run (-n)`: Only show the changes that would be made, without actually updating the manifest, lock file, or environment. + +```shell +pixi upgrade +pixi upgrade numpy +pixi upgrade numpy pandas +pixi upgrade --manifest-path ~/myproject/pixi.toml numpy +pixi upgrade --feature lint python +pixi upgrade --json +pixi upgrade --dry-run +``` + ## `run` The `run` commands first checks if the environment is ready to use. diff --git a/src/cli/add.rs b/src/cli/add.rs index 35b4d53bd..0c79a6f8b 100644 --- a/src/cli/add.rs +++ b/src/cli/add.rs @@ -1,38 +1,14 @@ -use std::{ - collections::{HashMap, HashSet}, - str::FromStr, -}; - use clap::Parser; use indexmap::IndexMap; -use itertools::Itertools; -use pep440_rs::VersionSpecifiers; -use pep508_rs::{Requirement, VersionOrUrl::VersionSpecifier}; -use pixi_config::PinningStrategy; -use pixi_manifest::{ - pypi::PyPiPackageName, DependencyOverwriteBehavior, FeatureName, FeaturesExt, HasFeaturesIter, - SpecType, -}; -use rattler_conda_types::{MatchSpec, Platform, Version}; -use rattler_lock::{LockFile, Package}; +use pixi_manifest::FeatureName; use super::has_specs::HasSpecs; -use crate::environment::LockFileUsage; use crate::{ cli::cli_config::{DependencyConfig, PrefixUpdateConfig, ProjectConfig}, environment::verify_prefix_location_unchanged, - load_lock_file, - lock_file::{filter_lock_file, LockFileDerivedData, UpdateContext, UpdateMode}, - project::{grouped_environment::GroupedEnvironment, DependencyType, Project}, + project::{DependencyType, Project}, }; -/// List of packages that are not following the semver versioning scheme -/// but will use the minor version by default when adding a dependency. -// Don't forget to add to the docstring if you add a package here! -const NON_SEMVER_PACKAGES: [&str; 11] = [ - "python", "rust", "julia", "gcc", "gxx", "gfortran", "nodejs", "deno", "r", "r-base", "perl", -]; - /// Adds dependencies to the project /// /// The dependencies should be defined as MatchSpec for conda package, or a PyPI @@ -101,9 +77,9 @@ pub struct Args { pub async fn execute(args: Args) -> miette::Result<()> { let (dependency_config, prefix_update_config, project_config) = ( - args.dependency_config, - args.prefix_update_config, - args.project_config, + &args.dependency_config, + &args.prefix_update_config, + &args.project_config, ); let mut project = Project::load_or_else_discover(project_config.manifest_path.as_deref())? @@ -115,349 +91,44 @@ pub async fn execute(args: Args) -> miette::Result<()> { // Add the platform if it is not already present project .manifest - .add_platforms(dependency_config.platform.iter(), &FeatureName::Default)?; + .add_platforms(dependency_config.platforms.iter(), &FeatureName::Default)?; - // Add the individual specs to the project. - let mut conda_specs_to_add_constraints_for = IndexMap::new(); - let mut pypi_specs_to_add_constraints_for = IndexMap::new(); - let mut conda_packages = HashSet::new(); - let mut pypi_packages = HashSet::new(); - match dependency_config.dependency_type() { + let (match_specs, pypi_deps) = match dependency_config.dependency_type() { DependencyType::CondaDependency(spec_type) => { - let specs = dependency_config.specs()?; - let channel_config = project.channel_config(); - for (name, spec) in specs { - let added = project.manifest.add_dependency( - &spec, - spec_type, - &dependency_config.platform, - &dependency_config.feature_name(), - DependencyOverwriteBehavior::Overwrite, - &channel_config, - )?; - if added { - if spec.version.is_none() { - conda_specs_to_add_constraints_for.insert(name.clone(), (spec_type, spec)); - } - conda_packages.insert(name); - } - } + let match_specs = dependency_config + .specs()? + .into_iter() + .map(|(name, spec)| (name, (spec, spec_type))) + .collect(); + let pypi_deps = IndexMap::default(); + (match_specs, pypi_deps) } DependencyType::PypiDependency => { - let specs = dependency_config.pypi_deps(&project)?; - for (name, spec) in specs { - let added = project.manifest.add_pep508_dependency( - &spec, - &dependency_config.platform, - &dependency_config.feature_name(), - Some(args.editable), - DependencyOverwriteBehavior::Overwrite, - )?; - if added { - if spec.version_or_url.is_none() { - pypi_specs_to_add_constraints_for.insert(name.clone(), spec); - } - pypi_packages.insert(name.as_normalized().clone()); - } - } + let match_specs = IndexMap::default(); + let pypi_deps = dependency_config.pypi_deps(&project)?; + (match_specs, pypi_deps) } - } - - // If the lock-file should not be updated we only need to save the project. - if prefix_update_config.lock_file_usage() != LockFileUsage::Update { - project.save()?; - - // Notify the user we succeeded. - dependency_config.display_success("Added", HashMap::default()); - - Project::warn_on_discovered_from_env(project_config.manifest_path.as_deref()); - return Ok(()); - } - - // Load the current lock-file - let lock_file = load_lock_file(&project).await?; - - // Determine the environments that are affected by the change. - let feature_name = dependency_config.feature_name(); - let affected_environments = project - .environments() - .iter() - // Filter out any environment that does not contain the feature we modified - .filter(|e| e.features().any(|f| f.name == feature_name)) - // Expand the selection to also included any environment that shares the same solve - // group - .flat_map(|e| { - GroupedEnvironment::from(e.clone()) - .environments() - .collect_vec() - }) - .unique() - .collect_vec(); - let default_environment_is_affected = - affected_environments.contains(&project.default_environment()); - - tracing::debug!( - "environments affected by the add command: {}", - affected_environments.iter().map(|e| e.name()).format(", ") - ); - - // Determine the combination of platforms and environments that are affected by - // the command - let affect_environment_and_platforms = affected_environments - .into_iter() - // Create an iterator over all environment and platform combinations - .flat_map(|e| e.platforms().into_iter().map(move |p| (e.clone(), p))) - // Filter out any platform that is not affected by the changes. - .filter(|(_, platform)| { - dependency_config.platform.is_empty() || dependency_config.platform.contains(platform) - }) - .map(|(e, p)| (e.name().to_string(), p)) - .collect_vec(); - - // Create an updated lock-file where the dependencies to be added are removed - // from the lock-file. - let unlocked_lock_file = unlock_packages( - &project, - &lock_file, - conda_packages, - pypi_packages, - affect_environment_and_platforms - .iter() - .map(|(e, p)| (e.as_str(), *p)) - .collect(), - ); - - // Solve the updated project. - let LockFileDerivedData { - project: _, // We don't need the project here - lock_file, - package_cache, - uv_context, - updated_conda_prefixes, - updated_pypi_prefixes, - io_concurrency_limit, - } = UpdateContext::builder(&project) - .with_lock_file(unlocked_lock_file) - .with_no_install(prefix_update_config.no_install()) - .finish()? - .update() - .await?; - - // Update the constraints of specs that didn't have a version constraint based - // on the contents of the lock-file. - let implicit_constraints = if !conda_specs_to_add_constraints_for.is_empty() { - update_conda_specs_from_lock_file( - &mut project, - &lock_file, - conda_specs_to_add_constraints_for, - affect_environment_and_platforms, - &feature_name, - &dependency_config.platform, - )? - } else if !pypi_specs_to_add_constraints_for.is_empty() { - update_pypi_specs_from_lock_file( - &mut project, - &lock_file, - pypi_specs_to_add_constraints_for, - affect_environment_and_platforms, - &feature_name, - &dependency_config.platform, - args.editable, - )? - } else { - HashMap::new() - }; - - // Write the lock-file and the project to disk - project.save()?; - - // Reconstruct the lock-file derived data. - let mut updated_lock_file = LockFileDerivedData { - project: &project, - lock_file, - package_cache, - updated_conda_prefixes, - updated_pypi_prefixes, - uv_context, - io_concurrency_limit, }; - if !prefix_update_config.no_lockfile_update { - updated_lock_file.write_to_disk()?; - } + // TODO: add dry_run logic to add + let dry_run = false; + + let update_deps = project + .update_dependencies( + match_specs, + pypi_deps, + prefix_update_config, + &args.dependency_config.feature, + &args.dependency_config.platforms, + args.editable, + dry_run, + ) + .await?; - // Install/update the default environment if: - // - we are not skipping the installation, - // - there is only the default environment, - // - and the default environment is affected by the changes, - if !prefix_update_config.no_install() - && project.environments().len() == 1 - && default_environment_is_affected - { - updated_lock_file - .prefix(&project.default_environment(), UpdateMode::Revalidate) - .await?; + if let Some(update_deps) = update_deps { + // Notify the user we succeeded + dependency_config.display_success("Added", update_deps.implicit_constraints); } - // Notify the user we succeeded. - dependency_config.display_success("Added", implicit_constraints); - Project::warn_on_discovered_from_env(project_config.manifest_path.as_deref()); Ok(()) } - -/// Update the pypi specs of newly added packages based on the contents of the -/// updated lock-file. -fn update_pypi_specs_from_lock_file( - project: &mut Project, - updated_lock_file: &LockFile, - pypi_specs_to_add_constraints_for: IndexMap, - affect_environment_and_platforms: Vec<(String, Platform)>, - feature_name: &FeatureName, - platforms: &[Platform], - editable: bool, -) -> miette::Result> { - let mut implicit_constraints = HashMap::new(); - - let pypi_records = affect_environment_and_platforms - .into_iter() - // Get all the conda and pypi records for the combination of environments and - // platforms - .filter_map(|(env, platform)| { - let locked_env = updated_lock_file.environment(&env)?; - locked_env.pypi_packages_for_platform(platform) - }) - .flatten() - .collect_vec(); - - let pinning_strategy = project.config().pinning_strategy.unwrap_or_default(); - - // Determine the versions of the packages in the lock-file - for (name, req) in pypi_specs_to_add_constraints_for { - let version_constraint = pinning_strategy.determine_version_constraint( - pypi_records - .iter() - .filter_map(|(data, _)| { - if &data.name == name.as_normalized() { - Version::from_str(&data.version.to_string()).ok() - } else { - None - } - }) - .collect_vec() - .iter(), - ); - - let version_spec = - version_constraint.and_then(|spec| VersionSpecifiers::from_str(&spec.to_string()).ok()); - if let Some(version_spec) = version_spec { - implicit_constraints.insert(name.as_source().to_string(), version_spec.to_string()); - let req = Requirement { - version_or_url: Some(VersionSpecifier(version_spec)), - ..req - }; - project.manifest.add_pep508_dependency( - &req, - platforms, - feature_name, - Some(editable), - DependencyOverwriteBehavior::Overwrite, - )?; - } - } - - Ok(implicit_constraints) -} - -/// Update the conda specs of newly added packages based on the contents of the -/// updated lock-file. -fn update_conda_specs_from_lock_file( - project: &mut Project, - updated_lock_file: &LockFile, - conda_specs_to_add_constraints_for: IndexMap< - rattler_conda_types::PackageName, - (SpecType, MatchSpec), - >, - affect_environment_and_platforms: Vec<(String, Platform)>, - feature_name: &FeatureName, - platforms: &[Platform], -) -> miette::Result> { - let mut implicit_constraints = HashMap::new(); - - // Determine the conda records that were affected by the add. - let conda_records = affect_environment_and_platforms - .into_iter() - // Get all the conda and pypi records for the combination of environments and - // platforms - .filter_map(|(env, platform)| { - let locked_env = updated_lock_file.environment(&env)?; - locked_env - .conda_repodata_records_for_platform(platform) - .ok()? - }) - .flatten() - .collect_vec(); - - let mut pinning_strategy = project.config().pinning_strategy; - let channel_config = project.channel_config(); - for (name, (spec_type, spec)) in conda_specs_to_add_constraints_for { - // Edge case: some packages are a special case where we want to pin the minor version by default. - // This is done to avoid early user confusion when the minor version changes and environments magically start breaking. - // This move a `>=3.13, <4` to a `>=3.13, <3.14` constraint. - if NON_SEMVER_PACKAGES.contains(&name.as_normalized()) && pinning_strategy.is_none() { - tracing::info!( - "Pinning {} to minor version by default", - name.as_normalized() - ); - pinning_strategy = Some(PinningStrategy::Minor); - } - - let version_constraint = pinning_strategy - .unwrap_or_default() - .determine_version_constraint(conda_records.iter().filter_map(|record| { - if record.package_record.name == name { - Some(record.package_record.version.version()) - } else { - None - } - })); - - if let Some(version_constraint) = version_constraint { - implicit_constraints - .insert(name.as_source().to_string(), version_constraint.to_string()); - let spec = MatchSpec { - version: Some(version_constraint), - ..spec - }; - project.manifest.add_dependency( - &spec, - spec_type, - platforms, - feature_name, - DependencyOverwriteBehavior::Overwrite, - &channel_config, - )?; - } - } - - Ok(implicit_constraints) -} - -/// Constructs a new lock-file where some of the constraints have been removed. -fn unlock_packages( - project: &Project, - lock_file: &LockFile, - conda_packages: HashSet, - pypi_packages: HashSet, - affected_environments: HashSet<(&str, Platform)>, -) -> LockFile { - filter_lock_file(project, lock_file, |env, platform, package| { - if affected_environments.contains(&(env.name().as_str(), platform)) { - match package { - Package::Conda(package) => !conda_packages.contains(&package.package_record().name), - Package::Pypi(package) => !pypi_packages.contains(&package.data().package.name), - } - } else { - true - } - }) -} diff --git a/src/cli/cli_config.rs b/src/cli/cli_config.rs index 9fe27b09e..9fcd00eb4 100644 --- a/src/cli/cli_config.rs +++ b/src/cli/cli_config.rs @@ -151,12 +151,12 @@ pub struct DependencyConfig { pub pypi: bool, /// The platform(s) for which the dependency should be modified - #[arg(long, short)] - pub platform: Vec, + #[arg(long = "platform", short)] + pub platforms: Vec, /// The feature for which the dependency should be modified - #[arg(long, short)] - pub feature: Option, + #[clap(long, short, default_value_t)] + pub feature: FeatureName, } impl DependencyConfig { @@ -171,11 +171,7 @@ impl DependencyConfig { DependencyType::CondaDependency(SpecType::Run) } } - pub(crate) fn feature_name(&self) -> FeatureName { - self.feature - .clone() - .map_or(FeatureName::Default, FeatureName::Named) - } + pub(crate) fn display_success( &self, operation: &str, @@ -207,14 +203,14 @@ impl DependencyConfig { } // Print something if we've modified for platforms - if !self.platform.is_empty() { + if !self.platforms.is_empty() { eprintln!( "{operation} these only for platform(s): {}", - console::style(self.platform.iter().join(", ")).bold() + console::style(self.platforms.iter().join(", ")).bold() ) } // Print something if we've modified for features - if let Some(feature) = &self.feature { + if let FeatureName::Named(feature) = &self.feature { { eprintln!( "{operation} these only for feature: {}", diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 7c749dc2a..d526639eb 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -35,6 +35,7 @@ pub mod shell_hook; pub mod task; pub mod tree; pub mod update; +pub mod upgrade; pub mod upload; #[derive(Parser, Debug)] @@ -106,6 +107,7 @@ pub enum Command { #[clap(visible_alias = "i")] Install(install::Args), Update(update::Args), + Upgrade(upgrade::Args), #[clap(visible_alias = "r")] Run(run::Args), @@ -290,6 +292,7 @@ pub async fn execute_command(command: Command) -> miette::Result<()> { Command::List(cmd) => list::execute(cmd).await, Command::Tree(cmd) => tree::execute(cmd).await, Command::Update(cmd) => update::execute(cmd).await, + Command::Upgrade(cmd) => upgrade::execute(cmd).await, Command::Exec(args) => exec::execute(args).await, } } diff --git a/src/cli/remove.rs b/src/cli/remove.rs index 8bea71e24..7dde9f224 100644 --- a/src/cli/remove.rs +++ b/src/cli/remove.rs @@ -47,8 +47,8 @@ pub async fn execute(args: Args) -> miette::Result<()> { .manifest .remove_pypi_dependency( name, - &dependency_config.platform, - &dependency_config.feature_name(), + &dependency_config.platforms, + &dependency_config.feature, ) .wrap_err(format!( "failed to remove PyPI dependency: '{}'", @@ -63,8 +63,8 @@ pub async fn execute(args: Args) -> miette::Result<()> { .remove_dependency( name, spec_type, - &dependency_config.platform, - &dependency_config.feature_name(), + &dependency_config.platforms, + &dependency_config.feature, ) .wrap_err(format!( "failed to remove dependency: '{}'", diff --git a/src/cli/update.rs b/src/cli/update.rs index 15876f1fe..e10ecaf3a 100644 --- a/src/cli/update.rs +++ b/src/cli/update.rs @@ -1,32 +1,24 @@ -use std::{ - borrow::Cow, - cmp::Ordering, - collections::HashSet, - io::{stdout, Write}, -}; +use std::{cmp::Ordering, collections::HashSet}; use fancy_display::FancyDisplay; -use crate::cli::cli_config::ProjectConfig; +use crate::{ + cli::cli_config::ProjectConfig, + diff::{LockFileDiff, LockFileJsonDiff}, +}; use crate::{ load_lock_file, lock_file::{filter_lock_file, UpdateContext}, Project, }; -use ahash::HashMap; use clap::Parser; -use indexmap::IndexMap; -use itertools::{Either, Itertools}; +use itertools::Itertools; use miette::{Context, IntoDiagnostic, MietteDiagnostic}; use pixi_config::ConfigCli; use pixi_consts::consts; use pixi_manifest::EnvironmentName; -use pixi_manifest::FeaturesExt; use rattler_conda_types::Platform; use rattler_lock::{LockFile, Package}; -use serde::Serialize; -use serde_json::Value; -use tabwriter::TabWriter; /// Update dependencies as recorded in the local lock file #[derive(Parser, Debug, Default)] @@ -186,7 +178,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { let json = serde_json::to_string_pretty(&json_diff).expect("failed to convert to json"); println!("{}", json); } else if diff.is_empty() { - println!( + eprintln!( "{}Lock-file was already up-to-date", console::style(console::Emoji("✔ ", "")).green() ); @@ -279,495 +271,3 @@ fn unlock_packages(project: &Project, lock_file: &LockFile, specs: &UpdateSpecs) !specs.should_relax(env.name(), &platform, package) }) } - -// Represents the differences between two sets of packages. -#[derive(Default, Clone)] -pub struct PackagesDiff { - pub added: Vec, - pub removed: Vec, - pub changed: Vec<(rattler_lock::Package, rattler_lock::Package)>, -} - -impl PackagesDiff { - /// Returns true if the diff is empty. - pub(crate) fn is_empty(&self) -> bool { - self.added.is_empty() && self.removed.is_empty() && self.changed.is_empty() - } -} - -/// Contains the changes between two lock-files. -pub struct LockFileDiff { - pub environment: IndexMap>, -} - -impl LockFileDiff { - /// Determine the difference between two lock-files. - pub(crate) fn from_lock_files(previous: &LockFile, current: &LockFile) -> Self { - let mut result = Self { - environment: IndexMap::new(), - }; - - for (environment_name, environment) in current.environments() { - let previous = previous.environment(environment_name); - - let mut environment_diff = IndexMap::new(); - - for (platform, packages) in environment.packages_by_platform() { - // Determine the packages that were previously there. - let (mut previous_conda_packages, mut previous_pypi_packages): ( - HashMap<_, _>, - HashMap<_, _>, - ) = previous - .as_ref() - .and_then(|e| e.packages(platform)) - .into_iter() - .flatten() - .partition_map(|p| match p { - rattler_lock::Package::Conda(p) => { - Either::Left((p.package_record().name.clone(), p)) - } - rattler_lock::Package::Pypi(p) => { - Either::Right((p.data().package.name.clone(), p)) - } - }); - - let mut diff = PackagesDiff::default(); - - // Find new and changed packages - for package in packages { - match package { - Package::Conda(p) => { - let name = &p.package_record().name; - match previous_conda_packages.remove(name) { - Some(previous) if previous.url() != p.url() => { - diff.changed - .push((Package::Conda(previous), Package::Conda(p))); - } - None => { - diff.added.push(Package::Conda(p)); - } - _ => {} - } - } - Package::Pypi(p) => { - let name = &p.data().package.name; - match previous_pypi_packages.remove(name) { - Some(previous) if previous.url() != p.url() => { - diff.changed - .push((Package::Pypi(previous), Package::Pypi(p))); - } - None => { - diff.added.push(Package::Pypi(p)); - } - _ => {} - } - } - } - } - - // Determine packages that were removed - for (_, p) in previous_conda_packages { - diff.removed.push(Package::Conda(p)); - } - for (_, p) in previous_pypi_packages { - diff.removed.push(Package::Pypi(p)); - } - - environment_diff.insert(platform, diff); - } - - // Find platforms that were completely removed - for (platform, packages) in previous - .as_ref() - .map(|e| e.packages_by_platform()) - .into_iter() - .flatten() - .filter(|(platform, _)| !environment_diff.contains_key(platform)) - .collect_vec() - { - let mut diff = PackagesDiff::default(); - for package in packages { - match package { - Package::Conda(p) => { - diff.removed.push(Package::Conda(p)); - } - Package::Pypi(p) => { - diff.removed.push(Package::Pypi(p)); - } - } - } - environment_diff.insert(platform, diff); - } - - // Remove empty diffs - environment_diff.retain(|_, diff| !diff.is_empty()); - - result - .environment - .insert(environment_name.to_string(), environment_diff); - } - - // Find environments that were completely removed - for (environment_name, environment) in previous - .environments() - .filter(|(name, _)| !result.environment.contains_key(*name)) - .collect_vec() - { - let mut environment_diff = IndexMap::new(); - for (platform, packages) in environment.packages_by_platform() { - let mut diff = PackagesDiff::default(); - for package in packages { - match package { - Package::Conda(p) => { - diff.removed.push(Package::Conda(p)); - } - Package::Pypi(p) => { - diff.removed.push(Package::Pypi(p)); - } - } - } - environment_diff.insert(platform, diff); - } - result - .environment - .insert(environment_name.to_string(), environment_diff); - } - - // Remove empty environments - result.environment.retain(|_, diff| !diff.is_empty()); - - result - } - - /// Returns true if the diff is empty. - pub(crate) fn is_empty(&self) -> bool { - self.environment.is_empty() - } - - // Format the lock-file diff. - pub(crate) fn print(&self) -> std::io::Result<()> { - let mut writer = TabWriter::new(stdout()); - for (idx, (environment_name, environment)) in self - .environment - .iter() - .sorted_by(|(a, _), (b, _)| a.cmp(b)) - .enumerate() - { - // Find the changes that happened in all platforms. - let changes_by_platform = environment - .into_iter() - .map(|(platform, packages)| { - let changes = Self::format_changes(packages) - .into_iter() - .collect::>(); - (platform, changes) - }) - .collect::>(); - - // Find the changes that happened in all platforms. - let common_changes = changes_by_platform - .iter() - .fold(None, |acc, (_, changes)| match acc { - None => Some(changes.clone()), - Some(acc) => Some(acc.intersection(changes).cloned().collect()), - }) - .unwrap_or_default(); - - // Add a new line between environments - if idx > 0 { - writeln!(writer, "\t\t\t",)?; - } - - writeln!( - writer, - "{}: {}\t\t\t", - console::style("Environment").underlined(), - consts::ENVIRONMENT_STYLE.apply_to(environment_name) - )?; - - // Print the common changes. - for (_, line) in common_changes.iter().sorted_by_key(|(name, _)| name) { - writeln!(writer, " {}", line)?; - } - - // Print the per-platform changes. - for (platform, changes) in changes_by_platform { - let mut changes = changes - .iter() - .filter(|change| !common_changes.contains(change)) - .sorted_by_key(|(name, _)| name) - .peekable(); - if changes.peek().is_some() { - writeln!( - writer, - "{}: {}:{}\t\t\t", - console::style("Platform").underlined(), - consts::ENVIRONMENT_STYLE.apply_to(environment_name), - consts::PLATFORM_STYLE.apply_to(platform), - )?; - for (_, line) in changes { - writeln!(writer, " {}", line)?; - } - } - } - } - - writer.flush()?; - - Ok(()) - } - - fn format_changes(packages: &PackagesDiff) -> Vec<(Cow<'_, str>, String)> { - enum Change<'i> { - Added(&'i Package), - Removed(&'i Package), - Changed(&'i Package, &'i Package), - } - - fn format_package_identifier(package: &Package) -> String { - match package { - Package::Conda(p) => format!( - "{} {}", - &p.package_record().version.as_str(), - &p.package_record().build - ), - Package::Pypi(p) => p.data().package.version.to_string(), - } - } - - itertools::chain!( - packages.added.iter().map(Change::Added), - packages.removed.iter().map(Change::Removed), - packages.changed.iter().map(|a| Change::Changed(&a.0, &a.1)) - ) - .sorted_by_key(|c| match c { - Change::Added(p) => p.name(), - Change::Removed(p) => p.name(), - Change::Changed(p, _) => p.name(), - }) - .map(|p| match p { - Change::Added(p) => ( - p.name(), - format!( - "{} {} {}\t{}\t\t", - console::style("+").green(), - match p { - Package::Conda(_) => consts::CondaEmoji.to_string(), - Package::Pypi(_) => consts::PypiEmoji.to_string(), - }, - p.name(), - format_package_identifier(p) - ), - ), - Change::Removed(p) => ( - p.name(), - format!( - "{} {} {}\t{}\t\t", - console::style("-").red(), - match p { - Package::Conda(_) => consts::CondaEmoji.to_string(), - Package::Pypi(_) => consts::PypiEmoji.to_string(), - }, - p.name(), - format_package_identifier(p) - ), - ), - Change::Changed(previous, current) => { - fn choose_style<'a>(a: &'a str, b: &'a str) -> console::StyledObject<&'a str> { - if a == b { - console::style(a).dim() - } else { - console::style(a) - } - } - - let name = previous.name(); - let line = match (previous, current) { - (Package::Conda(previous), Package::Conda(current)) => { - let previous = previous.package_record(); - let current = current.package_record(); - - format!( - "{} {} {}\t{} {}\t->\t{} {}", - console::style("~").yellow(), - consts::CondaEmoji, - name, - choose_style(&previous.version.as_str(), ¤t.version.as_str()), - choose_style(previous.build.as_str(), current.build.as_str()), - choose_style(¤t.version.as_str(), &previous.version.as_str()), - choose_style(current.build.as_str(), previous.build.as_str()), - ) - } - (Package::Pypi(previous), Package::Pypi(current)) => { - let previous = previous.data().package; - let current = current.data().package; - - format!( - "{} {} {}\t{}\t->\t{}", - console::style("~").yellow(), - consts::PypiEmoji, - name, - choose_style( - &previous.version.to_string(), - ¤t.version.to_string() - ), - choose_style( - ¤t.version.to_string(), - &previous.version.to_string() - ), - ) - } - _ => unreachable!(), - }; - - (name, line) - } - }) - .collect() - } -} - -#[derive(Serialize, Clone)] -pub struct JsonPackageDiff { - name: String, - before: Option, - after: Option, - #[serde(rename = "type")] - ty: JsonPackageType, - #[serde(skip_serializing_if = "std::ops::Not::not")] - explicit: bool, -} - -#[derive(Serialize, Copy, Clone)] -#[serde(rename_all = "kebab-case")] -pub enum JsonPackageType { - Conda, - Pypi, -} - -#[derive(Serialize, Clone)] -pub struct LockFileJsonDiff { - pub version: usize, - pub environment: IndexMap>>, -} - -impl LockFileJsonDiff { - fn new(project: &Project, value: LockFileDiff) -> Self { - let mut environment = IndexMap::new(); - - for (environment_name, environment_diff) in value.environment { - let mut environment_diff_json = IndexMap::new(); - - for (platform, packages_diff) in environment_diff { - let conda_dependencies = project - .environment(environment_name.as_str()) - .map(|env| env.dependencies(None, Some(platform))) - .unwrap_or_default(); - - let pypi_dependencies = project - .environment(environment_name.as_str()) - .map(|env| env.pypi_dependencies(Some(platform))) - .unwrap_or_default(); - - let add_diffs = packages_diff.added.into_iter().map(|new| match new { - Package::Conda(pkg) => JsonPackageDiff { - name: pkg.package_record().name.as_normalized().to_string(), - before: None, - after: Some(serde_json::to_value(&pkg).unwrap()), - ty: JsonPackageType::Conda, - explicit: conda_dependencies.contains_key(&pkg.package_record().name), - }, - Package::Pypi(pkg) => JsonPackageDiff { - name: pkg.data().package.name.as_dist_info_name().into_owned(), - before: None, - after: Some(serde_json::to_value(&pkg).unwrap()), - ty: JsonPackageType::Pypi, - explicit: pypi_dependencies.contains_key(&pkg.data().package.name), - }, - }); - - let removed_diffs = packages_diff.removed.into_iter().map(|old| match old { - Package::Conda(pkg) => JsonPackageDiff { - name: pkg.package_record().name.as_normalized().to_string(), - before: Some(serde_json::to_value(&pkg).unwrap()), - after: None, - ty: JsonPackageType::Conda, - explicit: conda_dependencies.contains_key(&pkg.package_record().name), - }, - - Package::Pypi(pkg) => JsonPackageDiff { - name: pkg.data().package.name.as_dist_info_name().into_owned(), - before: Some(serde_json::to_value(&pkg).unwrap()), - after: None, - ty: JsonPackageType::Pypi, - explicit: pypi_dependencies.contains_key(&pkg.data().package.name), - }, - }); - - let changed_diffs = packages_diff.changed.into_iter().map(|(old, new)| match (old, new) { - (Package::Conda(old), Package::Conda(new)) => - { - let before = serde_json::to_value(&old).unwrap(); - let after = serde_json::to_value(&new).unwrap(); - let (before, after) = compute_json_diff(before, after); - JsonPackageDiff { - name: old.package_record().name.as_normalized().to_string(), - before: Some(before), - after: Some(after), - ty: JsonPackageType::Conda, - explicit: conda_dependencies.contains_key(&old.package_record().name), - } - } - (Package::Pypi(old), Package::Pypi(new)) => { - let before = serde_json::to_value(&old).unwrap(); - let after = serde_json::to_value(&new).unwrap(); - let (before, after) = compute_json_diff(before, after); - JsonPackageDiff { - name: old.data().package.name.as_dist_info_name().into_owned(), - before: Some(before), - after: Some(after), - ty: JsonPackageType::Pypi, - explicit: pypi_dependencies.contains_key(&old.data().package.name), - } - } - _ => unreachable!("packages cannot change type, they are represented as removals and inserts instead"), - }); - - let packages_diff_json = add_diffs - .chain(removed_diffs) - .chain(changed_diffs) - .sorted_by_key(|diff| diff.name.clone()) - .collect_vec(); - - environment_diff_json.insert(platform, packages_diff_json); - } - - environment.insert(environment_name, environment_diff_json); - } - - Self { - version: 1, - environment, - } - } -} - -fn compute_json_diff( - mut a: serde_json::Value, - mut b: serde_json::Value, -) -> (serde_json::Value, serde_json::Value) { - if let (Some(a), Some(b)) = (a.as_object_mut(), b.as_object_mut()) { - a.retain(|key, value| { - if let Some(other_value) = b.get(key) { - if other_value == value { - b.remove(key); - return false; - } - } else { - b.insert(key.to_string(), Value::Null); - } - true - }); - } - (a, b) -} diff --git a/src/cli/upgrade.rs b/src/cli/upgrade.rs new file mode 100644 index 000000000..428e3a5b0 --- /dev/null +++ b/src/cli/upgrade.rs @@ -0,0 +1,255 @@ +use std::cmp::Ordering; +use std::sync::Arc; + +use crate::cli::cli_config::ProjectConfig; +use crate::Project; +use clap::Parser; +use fancy_display::FancyDisplay; +use itertools::Itertools; +use miette::MietteDiagnostic; +use miette::{Context, IntoDiagnostic}; + +use super::cli_config::PrefixUpdateConfig; +use crate::diff::LockFileJsonDiff; +use pep508_rs::MarkerTree; +use pep508_rs::Requirement; +use pixi_manifest::FeatureName; +use pixi_manifest::PyPiRequirement; +use pixi_manifest::SpecType; +use pixi_spec::PixiSpec; +use rattler_conda_types::MatchSpec; + +/// Update dependencies as recorded in the local lock file +#[derive(Parser, Debug, Default)] +pub struct Args { + #[clap(flatten)] + pub project_config: ProjectConfig, + + #[clap(flatten)] + pub prefix_update_config: PrefixUpdateConfig, + + #[clap(flatten)] + pub specs: UpgradeSpecsArgs, + + /// Output the changes in JSON format. + #[clap(long)] + pub json: bool, + + /// Only show the changes that would be made, without actually updating the manifest, lock file, or environment. + #[clap(short = 'n', long)] + pub dry_run: bool, +} + +#[derive(Parser, Debug, Default)] +pub struct UpgradeSpecsArgs { + /// The packages to upgrade + pub packages: Option>, + + /// The feature to update + #[clap(long = "feature", short = 'f', default_value_t)] + pub feature: FeatureName, + + /// The packages which should be excluded + #[clap(long, conflicts_with = "packages")] + pub exclude: Option>, +} + +pub async fn execute(args: Args) -> miette::Result<()> { + let mut project = Project::load_or_else_discover(args.project_config.manifest_path.as_deref())? + .with_cli_config(args.prefix_update_config.config.clone()); + + // Ensure that the given feature exists + let Some(feature) = project.manifest.feature(&args.specs.feature) else { + miette::bail!( + "could not find a feature named {}", + args.specs.feature.fancy_display() + ) + }; + + // TODO: Also support build and host + let spec_type = SpecType::Run; + let match_spec_iter = feature + .dependencies(Some(spec_type), None) + .into_iter() + .flat_map(|deps| deps.into_owned()); + + let pypi_deps_iter = feature + .pypi_dependencies(None) + .into_iter() + .flat_map(|deps| deps.into_owned()); + + // If the user specified a package name, check to see if it is even there. + if let Some(package_names) = &args.specs.packages { + let available_packages = match_spec_iter + .clone() + .map(|(name, _)| name.as_normalized().to_string()) + .chain( + pypi_deps_iter + .clone() + .map(|(name, _)| name.as_normalized().to_string()), + ) + .collect_vec(); + + for package in package_names { + ensure_package_exists(package, &available_packages)? + } + } + + let match_specs = match_spec_iter + // Don't upgrade excluded packages + .filter(|(name, _)| match &args.specs.exclude { + None => true, + Some(exclude) if exclude.contains(&name.as_normalized().to_string()) => false, + _ => true, + }) + // If specific packages have been requested, only upgrade those + .filter(|(name, _)| match &args.specs.packages { + None => true, + Some(packages) if packages.contains(&name.as_normalized().to_string()) => true, + _ => false, + }) + // Only upgrade version specs + .filter_map(|(name, req)| match req { + PixiSpec::DetailedVersion(version_spec) => { + let channel = version_spec + .channel + .and_then(|c| c.into_channel(&project.channel_config()).ok()) + .map(Arc::new); + Some(( + name.clone(), + ( + MatchSpec { + name: Some(name), + channel, + ..Default::default() + }, + spec_type, + ), + )) + } + PixiSpec::Version(_) => Some((name.clone(), (MatchSpec::from(name), spec_type))), + _ => None, + }) + .collect(); + + let pypi_deps = pypi_deps_iter + // Don't upgrade excluded packages + .filter(|(name, _)| match &args.specs.exclude { + None => true, + Some(exclude) if exclude.contains(&name.as_normalized().to_string()) => false, + _ => true, + }) + // If specific packages have been requested, only upgrade those + .filter(|(name, _)| match &args.specs.packages { + None => true, + Some(packages) if packages.contains(&name.as_normalized().to_string()) => true, + _ => false, + }) + // Only upgrade version specs + .filter_map(|(name, req)| match req { + PyPiRequirement::Version { extras, .. } => Some(( + name.clone(), + Requirement { + name: name.as_normalized().clone(), + extras, + marker: MarkerTree::default(), + origin: None, + version_or_url: None, + }, + )), + PyPiRequirement::RawVersion(_) => Some(( + name.clone(), + Requirement { + name: name.as_normalized().clone(), + extras: Vec::default(), + marker: MarkerTree::default(), + origin: None, + version_or_url: None, + }, + )), + _ => None, + }) + .collect(); + + let update_deps = project + .update_dependencies( + match_specs, + pypi_deps, + &args.prefix_update_config, + &args.specs.feature, + &[], + false, + args.dry_run, + ) + .await?; + + // Is there something to report? + if let Some(update_deps) = update_deps { + let diff = update_deps.lock_file_diff; + // Format as json? + if args.json { + let json_diff = LockFileJsonDiff::new(&project, diff); + let json = serde_json::to_string_pretty(&json_diff).expect("failed to convert to json"); + println!("{}", json); + } else { + diff.print() + .into_diagnostic() + .context("failed to print lock-file diff")?; + } + } else { + eprintln!( + "{}All packages are already up-to-date", + console::style(console::Emoji("✔ ", "")).green() + ); + } + + Project::warn_on_discovered_from_env(args.project_config.manifest_path.as_deref()); + Ok(()) +} + +/// Ensures the existence of the specified package +/// +/// # Returns +/// +/// Returns `miette::Result` with a descriptive error message +/// if the package does not exist. +fn ensure_package_exists(package_name: &str, available_packages: &[String]) -> miette::Result<()> { + let similar_names = available_packages + .iter() + .unique() + .filter_map(|name| { + let distance = strsim::jaro(package_name, name); + if distance > 0.6 { + Some((name, distance)) + } else { + None + } + }) + .sorted_by(|(_, a), (_, b)| b.partial_cmp(a).unwrap_or(Ordering::Equal)) + .take(5) + .map(|(name, _)| name) + .collect_vec(); + + if similar_names.first().map(|s| s.as_str()) == Some(package_name) { + return Ok(()); + } + + let message = format!("could not find a package named '{package_name}'"); + + Err(MietteDiagnostic { + message, + code: None, + severity: None, + help: if !similar_names.is_empty() { + Some(format!( + "did you mean '{}'?", + similar_names.iter().format("', '") + )) + } else { + None + }, + url: None, + labels: None, + } + .into()) +} diff --git a/src/diff.rs b/src/diff.rs new file mode 100644 index 000000000..b14560d4f --- /dev/null +++ b/src/diff.rs @@ -0,0 +1,509 @@ +use std::{ + borrow::Cow, + collections::HashSet, + io::{stderr, Write}, +}; + +use crate::Project; +use ahash::HashMap; +use indexmap::IndexMap; +use itertools::{Either, Itertools}; +use pixi_consts::consts; +use pixi_manifest::FeaturesExt; +use rattler_conda_types::Platform; +use rattler_lock::{LockFile, Package}; +use serde::Serialize; +use serde_json::Value; +use tabwriter::TabWriter; + +// Represents the differences between two sets of packages. +#[derive(Default, Clone)] +pub struct PackagesDiff { + pub added: Vec, + pub removed: Vec, + pub changed: Vec<(rattler_lock::Package, rattler_lock::Package)>, +} + +impl PackagesDiff { + /// Returns true if the diff is empty. + pub(crate) fn is_empty(&self) -> bool { + self.added.is_empty() && self.removed.is_empty() && self.changed.is_empty() + } +} + +/// Contains the changes between two lock-files. +pub struct LockFileDiff { + pub environment: IndexMap>, +} + +impl LockFileDiff { + /// Determine the difference between two lock-files. + pub(crate) fn from_lock_files(previous: &LockFile, current: &LockFile) -> Self { + let mut result = Self { + environment: IndexMap::new(), + }; + + for (environment_name, environment) in current.environments() { + let previous = previous.environment(environment_name); + + let mut environment_diff = IndexMap::new(); + + for (platform, packages) in environment.packages_by_platform() { + // Determine the packages that were previously there. + let (mut previous_conda_packages, mut previous_pypi_packages): ( + HashMap<_, _>, + HashMap<_, _>, + ) = previous + .as_ref() + .and_then(|e| e.packages(platform)) + .into_iter() + .flatten() + .partition_map(|p| match p { + rattler_lock::Package::Conda(p) => { + Either::Left((p.package_record().name.clone(), p)) + } + rattler_lock::Package::Pypi(p) => { + Either::Right((p.data().package.name.clone(), p)) + } + }); + + let mut diff = PackagesDiff::default(); + + // Find new and changed packages + for package in packages { + match package { + Package::Conda(p) => { + let name = &p.package_record().name; + match previous_conda_packages.remove(name) { + Some(previous) if previous.url() != p.url() => { + diff.changed + .push((Package::Conda(previous), Package::Conda(p))); + } + None => { + diff.added.push(Package::Conda(p)); + } + _ => {} + } + } + Package::Pypi(p) => { + let name = &p.data().package.name; + match previous_pypi_packages.remove(name) { + Some(previous) if previous.url() != p.url() => { + diff.changed + .push((Package::Pypi(previous), Package::Pypi(p))); + } + None => { + diff.added.push(Package::Pypi(p)); + } + _ => {} + } + } + } + } + + // Determine packages that were removed + for (_, p) in previous_conda_packages { + diff.removed.push(Package::Conda(p)); + } + for (_, p) in previous_pypi_packages { + diff.removed.push(Package::Pypi(p)); + } + + environment_diff.insert(platform, diff); + } + + // Find platforms that were completely removed + for (platform, packages) in previous + .as_ref() + .map(|e| e.packages_by_platform()) + .into_iter() + .flatten() + .filter(|(platform, _)| !environment_diff.contains_key(platform)) + .collect_vec() + { + let mut diff = PackagesDiff::default(); + for package in packages { + match package { + Package::Conda(p) => { + diff.removed.push(Package::Conda(p)); + } + Package::Pypi(p) => { + diff.removed.push(Package::Pypi(p)); + } + } + } + environment_diff.insert(platform, diff); + } + + // Remove empty diffs + environment_diff.retain(|_, diff| !diff.is_empty()); + + result + .environment + .insert(environment_name.to_string(), environment_diff); + } + + // Find environments that were completely removed + for (environment_name, environment) in previous + .environments() + .filter(|(name, _)| !result.environment.contains_key(*name)) + .collect_vec() + { + let mut environment_diff = IndexMap::new(); + for (platform, packages) in environment.packages_by_platform() { + let mut diff = PackagesDiff::default(); + for package in packages { + match package { + Package::Conda(p) => { + diff.removed.push(Package::Conda(p)); + } + Package::Pypi(p) => { + diff.removed.push(Package::Pypi(p)); + } + } + } + environment_diff.insert(platform, diff); + } + result + .environment + .insert(environment_name.to_string(), environment_diff); + } + + // Remove empty environments + result.environment.retain(|_, diff| !diff.is_empty()); + + result + } + + /// Returns true if the diff is empty. + pub(crate) fn is_empty(&self) -> bool { + self.environment.is_empty() + } + + // Format the lock-file diff. + pub(crate) fn print(&self) -> std::io::Result<()> { + let mut writer = TabWriter::new(stderr()); + for (idx, (environment_name, environment)) in self + .environment + .iter() + .sorted_by(|(a, _), (b, _)| a.cmp(b)) + .enumerate() + { + // Find the changes that happened in all platforms. + let changes_by_platform = environment + .into_iter() + .map(|(platform, packages)| { + let changes = Self::format_changes(packages) + .into_iter() + .collect::>(); + (platform, changes) + }) + .collect::>(); + + // Find the changes that happened in all platforms. + let common_changes = changes_by_platform + .iter() + .fold(None, |acc, (_, changes)| match acc { + None => Some(changes.clone()), + Some(acc) => Some(acc.intersection(changes).cloned().collect()), + }) + .unwrap_or_default(); + + // Add a new line between environments + if idx > 0 { + writeln!(writer, "\t\t\t",)?; + } + + writeln!( + writer, + "{}: {}\t\t\t", + console::style("Environment").underlined(), + consts::ENVIRONMENT_STYLE.apply_to(environment_name) + )?; + + // Print the common changes. + for (_, line) in common_changes.iter().sorted_by_key(|(name, _)| name) { + writeln!(writer, " {}", line)?; + } + + // Print the per-platform changes. + for (platform, changes) in changes_by_platform { + let mut changes = changes + .iter() + .filter(|change| !common_changes.contains(change)) + .sorted_by_key(|(name, _)| name) + .peekable(); + if changes.peek().is_some() { + writeln!( + writer, + "{}: {}:{}\t\t\t", + console::style("Platform").underlined(), + consts::ENVIRONMENT_STYLE.apply_to(environment_name), + consts::PLATFORM_STYLE.apply_to(platform), + )?; + for (_, line) in changes { + writeln!(writer, " {}", line)?; + } + } + } + } + + writer.flush()?; + + Ok(()) + } + + fn format_changes(packages: &PackagesDiff) -> Vec<(Cow<'_, str>, String)> { + enum Change<'i> { + Added(&'i Package), + Removed(&'i Package), + Changed(&'i Package, &'i Package), + } + + fn format_package_identifier(package: &Package) -> String { + match package { + Package::Conda(p) => format!( + "{} {}", + &p.package_record().version.as_str(), + &p.package_record().build + ), + Package::Pypi(p) => p.data().package.version.to_string(), + } + } + + itertools::chain!( + packages.added.iter().map(Change::Added), + packages.removed.iter().map(Change::Removed), + packages.changed.iter().map(|a| Change::Changed(&a.0, &a.1)) + ) + .sorted_by_key(|c| match c { + Change::Added(p) => p.name(), + Change::Removed(p) => p.name(), + Change::Changed(p, _) => p.name(), + }) + .map(|p| match p { + Change::Added(p) => ( + p.name(), + format!( + "{} {} {}\t{}\t\t", + console::style("+").green(), + match p { + Package::Conda(_) => consts::CondaEmoji.to_string(), + Package::Pypi(_) => consts::PypiEmoji.to_string(), + }, + p.name(), + format_package_identifier(p) + ), + ), + Change::Removed(p) => ( + p.name(), + format!( + "{} {} {}\t{}\t\t", + console::style("-").red(), + match p { + Package::Conda(_) => consts::CondaEmoji.to_string(), + Package::Pypi(_) => consts::PypiEmoji.to_string(), + }, + p.name(), + format_package_identifier(p) + ), + ), + Change::Changed(previous, current) => { + fn choose_style<'a>(a: &'a str, b: &'a str) -> console::StyledObject<&'a str> { + if a == b { + console::style(a).dim() + } else { + console::style(a) + } + } + + let name = previous.name(); + let line = match (previous, current) { + (Package::Conda(previous), Package::Conda(current)) => { + let previous = previous.package_record(); + let current = current.package_record(); + + format!( + "{} {} {}\t{} {}\t->\t{} {}", + console::style("~").yellow(), + consts::CondaEmoji, + name, + choose_style(&previous.version.as_str(), ¤t.version.as_str()), + choose_style(previous.build.as_str(), current.build.as_str()), + choose_style(¤t.version.as_str(), &previous.version.as_str()), + choose_style(current.build.as_str(), previous.build.as_str()), + ) + } + (Package::Pypi(previous), Package::Pypi(current)) => { + let previous = previous.data().package; + let current = current.data().package; + + format!( + "{} {} {}\t{}\t->\t{}", + console::style("~").yellow(), + consts::PypiEmoji, + name, + choose_style( + &previous.version.to_string(), + ¤t.version.to_string() + ), + choose_style( + ¤t.version.to_string(), + &previous.version.to_string() + ), + ) + } + _ => unreachable!(), + }; + + (name, line) + } + }) + .collect() + } +} + +#[derive(Serialize, Clone)] +pub struct JsonPackageDiff { + name: String, + before: Option, + after: Option, + #[serde(rename = "type")] + ty: JsonPackageType, + #[serde(skip_serializing_if = "std::ops::Not::not")] + explicit: bool, +} + +#[derive(Serialize, Copy, Clone)] +#[serde(rename_all = "kebab-case")] +pub enum JsonPackageType { + Conda, + Pypi, +} + +#[derive(Serialize, Clone)] +pub struct LockFileJsonDiff { + pub version: usize, + pub environment: IndexMap>>, +} + +impl LockFileJsonDiff { + pub fn new(project: &Project, value: LockFileDiff) -> Self { + let mut environment = IndexMap::new(); + + for (environment_name, environment_diff) in value.environment { + let mut environment_diff_json = IndexMap::new(); + + for (platform, packages_diff) in environment_diff { + let conda_dependencies = project + .environment(environment_name.as_str()) + .map(|env| env.dependencies(None, Some(platform))) + .unwrap_or_default(); + + let pypi_dependencies = project + .environment(environment_name.as_str()) + .map(|env| env.pypi_dependencies(Some(platform))) + .unwrap_or_default(); + + let add_diffs = packages_diff.added.into_iter().map(|new| match new { + Package::Conda(pkg) => JsonPackageDiff { + name: pkg.package_record().name.as_normalized().to_string(), + before: None, + after: Some(serde_json::to_value(&pkg).unwrap()), + ty: JsonPackageType::Conda, + explicit: conda_dependencies.contains_key(&pkg.package_record().name), + }, + Package::Pypi(pkg) => JsonPackageDiff { + name: pkg.data().package.name.as_dist_info_name().into_owned(), + before: None, + after: Some(serde_json::to_value(&pkg).unwrap()), + ty: JsonPackageType::Pypi, + explicit: pypi_dependencies.contains_key(&pkg.data().package.name), + }, + }); + + let removed_diffs = packages_diff.removed.into_iter().map(|old| match old { + Package::Conda(pkg) => JsonPackageDiff { + name: pkg.package_record().name.as_normalized().to_string(), + before: Some(serde_json::to_value(&pkg).unwrap()), + after: None, + ty: JsonPackageType::Conda, + explicit: conda_dependencies.contains_key(&pkg.package_record().name), + }, + + Package::Pypi(pkg) => JsonPackageDiff { + name: pkg.data().package.name.as_dist_info_name().into_owned(), + before: Some(serde_json::to_value(&pkg).unwrap()), + after: None, + ty: JsonPackageType::Pypi, + explicit: pypi_dependencies.contains_key(&pkg.data().package.name), + }, + }); + + let changed_diffs = packages_diff.changed.into_iter().map(|(old, new)| match (old, new) { + (Package::Conda(old), Package::Conda(new)) => + { + let before = serde_json::to_value(&old).unwrap(); + let after = serde_json::to_value(&new).unwrap(); + let (before, after) = compute_json_diff(before, after); + JsonPackageDiff { + name: old.package_record().name.as_normalized().to_string(), + before: Some(before), + after: Some(after), + ty: JsonPackageType::Conda, + explicit: conda_dependencies.contains_key(&old.package_record().name), + } + } + (Package::Pypi(old), Package::Pypi(new)) => { + let before = serde_json::to_value(&old).unwrap(); + let after = serde_json::to_value(&new).unwrap(); + let (before, after) = compute_json_diff(before, after); + JsonPackageDiff { + name: old.data().package.name.as_dist_info_name().into_owned(), + before: Some(before), + after: Some(after), + ty: JsonPackageType::Pypi, + explicit: pypi_dependencies.contains_key(&old.data().package.name), + } + } + _ => unreachable!("packages cannot change type, they are represented as removals and inserts instead"), + }); + + let packages_diff_json = add_diffs + .chain(removed_diffs) + .chain(changed_diffs) + .sorted_by_key(|diff| diff.name.clone()) + .collect_vec(); + + environment_diff_json.insert(platform, packages_diff_json); + } + + environment.insert(environment_name, environment_diff_json); + } + + Self { + version: 1, + environment, + } + } +} + +fn compute_json_diff( + mut a: serde_json::Value, + mut b: serde_json::Value, +) -> (serde_json::Value, serde_json::Value) { + if let (Some(a), Some(b)) = (a.as_object_mut(), b.as_object_mut()) { + a.retain(|key, value| { + if let Some(other_value) = b.get(key) { + if other_value == value { + b.remove(key); + return false; + } + } else { + b.insert(key.to_string(), Value::Null); + } + true + }); + } + (a, b) +} diff --git a/src/lib.rs b/src/lib.rs index 5470fa23d..ce8438777 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ pub mod activation; pub mod cli; pub(crate) mod conda_pypi_clobber; +mod diff; pub mod environment; mod global; mod install_pypi; diff --git a/src/project/mod.rs b/src/project/mod.rs index ccc8bac59..14254daee 100644 --- a/src/project/mod.rs +++ b/src/project/mod.rs @@ -14,31 +14,44 @@ use std::{ fmt::{Debug, Formatter}, hash::Hash, path::{Path, PathBuf}, + str::FromStr, sync::{Arc, OnceLock}, }; use async_once_cell::OnceCell as AsyncCell; pub use environment::Environment; +use grouped_environment::GroupedEnvironment; pub use has_project_ref::HasProjectRef; -use indexmap::Equivalent; +use indexmap::{Equivalent, IndexMap}; use itertools::Itertools; use miette::IntoDiagnostic; use once_cell::sync::OnceCell; -use pixi_config::Config; +use pep440_rs::VersionSpecifiers; +use pep508_rs::{Requirement, VersionOrUrl::VersionSpecifier}; +use pixi_config::{Config, PinningStrategy}; use pixi_consts::consts; use pixi_manifest::{ - EnvironmentName, Environments, HasManifestRef, Manifest, ParsedManifest, SpecType, + pypi::PyPiPackageName, DependencyOverwriteBehavior, EnvironmentName, Environments, FeatureName, + FeaturesExt, HasFeaturesIter, HasManifestRef, Manifest, ParsedManifest, SpecType, }; use pixi_utils::reqwest::build_reqwest_clients; use pypi_mapping::{ChannelName, CustomMapping, MappingLocation, MappingSource}; -use rattler_conda_types::{Channel, ChannelConfig, Version}; +use rattler_conda_types::{Channel, ChannelConfig, MatchSpec, PackageName, Platform, Version}; +use rattler_lock::{LockFile, Package}; use rattler_repodata_gateway::Gateway; use reqwest_middleware::ClientWithMiddleware; pub use solve_group::SolveGroup; use url::{ParseError, Url}; use xxhash_rust::xxh3::xxh3_64; -use crate::activation::{initialize_env_variables, CurrentEnvVarBehavior}; +use crate::{ + activation::{initialize_env_variables, CurrentEnvVarBehavior}, + cli::cli_config::PrefixUpdateConfig, + diff::LockFileDiff, + environment::LockFileUsage, + load_lock_file, + lock_file::{filter_lock_file, LockFileDerivedData, UpdateContext, UpdateMode}, +}; static CUSTOM_TARGET_DIR_WARN: OnceCell<()> = OnceCell::new(); @@ -93,6 +106,13 @@ impl EnvironmentVars { } } +/// List of packages that are not following the semver versioning scheme +/// but will use the minor version by default when adding a dependency. +// Don't forget to add to the docstring if you add a package here! +const NON_SEMVER_PACKAGES: [&str; 11] = [ + "python", "rust", "julia", "gcc", "gxx", "gfortran", "nodejs", "deno", "r", "r-base", "perl", +]; + /// The pixi project, this main struct to interact with the project. This struct /// holds the `Manifest` and has functions to modify or request information from /// it. This allows in the future to have multiple environments or manifests @@ -604,6 +624,342 @@ impl Project { pub fn manifest(&self) -> &Manifest { &self.manifest } + + /// Update the manifest with the given package specs, and upgrade the packages if possible + /// + /// 1. Modify the manifest with the given package specs, if no version is given, use `no-pin` strategy + /// 2. Update the lock file + /// 3. Given packages without version restrictions will get a semver restriction + #[allow(clippy::too_many_arguments)] + pub async fn update_dependencies( + &mut self, + match_specs: IndexMap, + pypi_deps: IndexMap, + prefix_update_config: &PrefixUpdateConfig, + feature_name: &FeatureName, + platforms: &[Platform], + editable: bool, + dry_run: bool, + ) -> Result, miette::Error> { + let mut conda_specs_to_add_constraints_for = IndexMap::new(); + let mut pypi_specs_to_add_constraints_for = IndexMap::new(); + let mut conda_packages = HashSet::new(); + let mut pypi_packages = HashSet::new(); + let channel_config = self.channel_config(); + for (name, (spec, spec_type)) in match_specs { + let added = self.manifest.add_dependency( + &spec, + spec_type, + platforms, + feature_name, + DependencyOverwriteBehavior::Overwrite, + &channel_config, + )?; + if added { + if spec.version.is_none() { + conda_specs_to_add_constraints_for.insert(name.clone(), (spec_type, spec)); + } + conda_packages.insert(name); + } + } + + for (name, spec) in pypi_deps { + let added = self.manifest.add_pep508_dependency( + &spec, + platforms, + feature_name, + Some(editable), + DependencyOverwriteBehavior::Overwrite, + )?; + if added { + if spec.version_or_url.is_none() { + pypi_specs_to_add_constraints_for.insert(name.clone(), spec); + } + pypi_packages.insert(name.as_normalized().clone()); + } + } + + // Only save to disk if not a dry run + if !dry_run { + self.save()?; + } + + if prefix_update_config.lock_file_usage() != LockFileUsage::Update { + return Ok(None); + } + + let original_lock_file = load_lock_file(self).await?; + let affected_environments = self + .environments() + .iter() + // Filter out any environment that does not contain the feature we modified + .filter(|e| e.features().any(|f| f.name == *feature_name)) + // Expand the selection to also included any environment that shares the same solve + // group + .flat_map(|e| { + GroupedEnvironment::from(e.clone()) + .environments() + .collect_vec() + }) + .unique() + .collect_vec(); + let default_environment_is_affected = + affected_environments.contains(&self.default_environment()); + tracing::debug!( + "environments affected by the add command: {}", + affected_environments.iter().map(|e| e.name()).format(", ") + ); + let affect_environment_and_platforms = affected_environments + .into_iter() + // Create an iterator over all environment and platform combinations + .flat_map(|e| e.platforms().into_iter().map(move |p| (e.clone(), p))) + // Filter out any platform that is not affected by the changes. + .filter(|(_, platform)| platforms.is_empty() || platforms.contains(platform)) + .map(|(e, p)| (e.name().to_string(), p)) + .collect_vec(); + let unlocked_lock_file = self.unlock_packages( + &original_lock_file, + conda_packages, + pypi_packages, + affect_environment_and_platforms + .iter() + .map(|(e, p)| (e.as_str(), *p)) + .collect(), + ); + let LockFileDerivedData { + project: _, // We don't need the project here + lock_file, + package_cache, + uv_context, + updated_conda_prefixes, + updated_pypi_prefixes, + io_concurrency_limit, + } = UpdateContext::builder(self) + .with_lock_file(unlocked_lock_file) + .with_no_install(prefix_update_config.no_install() || dry_run) + .finish()? + .update() + .await?; + + let mut implicit_constraints = HashMap::new(); + if !conda_specs_to_add_constraints_for.is_empty() { + let conda_constraints = self.update_conda_specs_from_lock_file( + &lock_file, + conda_specs_to_add_constraints_for, + affect_environment_and_platforms.clone(), + feature_name, + platforms, + )?; + implicit_constraints.extend(conda_constraints); + } + + if !pypi_specs_to_add_constraints_for.is_empty() { + let pypi_constraints = self.update_pypi_specs_from_lock_file( + &lock_file, + pypi_specs_to_add_constraints_for, + affect_environment_and_platforms, + feature_name, + platforms, + editable, + )?; + implicit_constraints.extend(pypi_constraints); + } + + // Only write to disk if not a dry run + if !dry_run { + self.save()?; + } + + let mut updated_lock_file = LockFileDerivedData { + project: self, + lock_file, + package_cache, + updated_conda_prefixes, + updated_pypi_prefixes, + uv_context, + io_concurrency_limit, + }; + if !prefix_update_config.no_lockfile_update && !dry_run { + updated_lock_file.write_to_disk()?; + } + if !prefix_update_config.no_install() + && !dry_run + && self.environments().len() == 1 + && default_environment_is_affected + { + updated_lock_file + .prefix(&self.default_environment(), UpdateMode::Revalidate) + .await?; + } + + let lock_file_diff = + LockFileDiff::from_lock_files(&original_lock_file, &updated_lock_file.lock_file); + + Ok(Some(UpdateDeps { + implicit_constraints, + lock_file_diff, + })) + } + + /// Constructs a new lock-file where some of the constraints have been removed. + fn unlock_packages( + &self, + lock_file: &LockFile, + conda_packages: HashSet, + pypi_packages: HashSet, + affected_environments: HashSet<(&str, Platform)>, + ) -> LockFile { + filter_lock_file(self, lock_file, |env, platform, package| { + if affected_environments.contains(&(env.name().as_str(), platform)) { + match package { + Package::Conda(package) => { + !conda_packages.contains(&package.package_record().name) + } + Package::Pypi(package) => !pypi_packages.contains(&package.data().package.name), + } + } else { + true + } + }) + } + + /// Update the conda specs of newly added packages based on the contents of the + /// updated lock-file. + fn update_conda_specs_from_lock_file( + &mut self, + updated_lock_file: &LockFile, + conda_specs_to_add_constraints_for: IndexMap, + affect_environment_and_platforms: Vec<(String, Platform)>, + feature_name: &FeatureName, + platforms: &[Platform], + ) -> miette::Result> { + let mut implicit_constraints = HashMap::new(); + + // Determine the conda records that were affected by the add. + let conda_records = affect_environment_and_platforms + .into_iter() + // Get all the conda and pypi records for the combination of environments and + // platforms + .filter_map(|(env, platform)| { + let locked_env = updated_lock_file.environment(&env)?; + locked_env + .conda_repodata_records_for_platform(platform) + .ok()? + }) + .flatten() + .collect_vec(); + + let mut pinning_strategy = self.config().pinning_strategy; + let channel_config = self.channel_config(); + for (name, (spec_type, spec)) in conda_specs_to_add_constraints_for { + // Edge case: some packages are a special case where we want to pin the minor version by default. + // This is done to avoid early user confusion when the minor version changes and environments magically start breaking. + // This move a `>=3.13, <4` to a `>=3.13, <3.14` constraint. + if NON_SEMVER_PACKAGES.contains(&name.as_normalized()) && pinning_strategy.is_none() { + tracing::info!( + "Pinning {} to minor version by default", + name.as_normalized() + ); + pinning_strategy = Some(PinningStrategy::Minor); + } + let version_constraint = pinning_strategy + .unwrap_or_default() + .determine_version_constraint(conda_records.iter().filter_map(|record| { + if record.package_record.name == name { + Some(record.package_record.version.version()) + } else { + None + } + })); + + if let Some(version_constraint) = version_constraint { + implicit_constraints + .insert(name.as_source().to_string(), version_constraint.to_string()); + let spec = MatchSpec { + version: Some(version_constraint), + ..spec + }; + self.manifest.add_dependency( + &spec, + spec_type, + platforms, + feature_name, + DependencyOverwriteBehavior::Overwrite, + &channel_config, + )?; + } + } + + Ok(implicit_constraints) + } + + /// Update the pypi specs of newly added packages based on the contents of the + /// updated lock-file. + fn update_pypi_specs_from_lock_file( + &mut self, + updated_lock_file: &LockFile, + pypi_specs_to_add_constraints_for: IndexMap, + affect_environment_and_platforms: Vec<(String, Platform)>, + feature_name: &FeatureName, + platforms: &[Platform], + editable: bool, + ) -> miette::Result> { + let mut implicit_constraints = HashMap::new(); + + let pypi_records = affect_environment_and_platforms + .into_iter() + // Get all the conda and pypi records for the combination of environments and + // platforms + .filter_map(|(env, platform)| { + let locked_env = updated_lock_file.environment(&env)?; + locked_env.pypi_packages_for_platform(platform) + }) + .flatten() + .collect_vec(); + + let pinning_strategy = self.config().pinning_strategy.unwrap_or_default(); + + // Determine the versions of the packages in the lock-file + for (name, req) in pypi_specs_to_add_constraints_for { + let version_constraint = pinning_strategy.determine_version_constraint( + pypi_records + .iter() + .filter_map(|(data, _)| { + if &data.name == name.as_normalized() { + Version::from_str(&data.version.to_string()).ok() + } else { + None + } + }) + .collect_vec() + .iter(), + ); + + let version_spec = version_constraint + .and_then(|spec| VersionSpecifiers::from_str(&spec.to_string()).ok()); + if let Some(version_spec) = version_spec { + implicit_constraints.insert(name.as_source().to_string(), version_spec.to_string()); + let req = Requirement { + version_or_url: Some(VersionSpecifier(version_spec)), + ..req + }; + self.manifest.add_pep508_dependency( + &req, + platforms, + feature_name, + Some(editable), + DependencyOverwriteBehavior::Overwrite, + )?; + } + } + + Ok(implicit_constraints) + } +} + +pub struct UpdateDeps { + pub implicit_constraints: HashMap, + pub lock_file_diff: LockFileDiff, } impl<'source> HasManifestRef<'source> for &'source Project { diff --git a/tests/data/channels/channels/dummy_channel_1/linux-64/dummy-a-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/dummy_channel_1/linux-64/dummy-a-0.1.0-hb0f4dca_0.conda index 978134a5128de6e2c3298135e76a8e9b5f14c17e..14e7471992270aaca29dfd0f486d10b21627106c 100644 GIT binary patch delta 559 zcmcb?d5e=Lz?+#xmjMLaGA8mwbGT)sMP4j#`8hG)B%%~7&cFbpHMZ*iO<>@TWoAe^ z!Y4H0Jfp&=#95#J7h7j=cl@2wp}FGss{>{c%smekJzUdm?FBENt#R&h>?kp+RXg*i zSm=Ii=kK^w=53-Af0~2sY5F)bcCrOyP`#W(x7>|mhnx5;U20tw9;@;mZdl&xo8|ey zqWz(ZIh#L&FM}5Ym$GHE4FlU!hVBpD4+L!2)jo)@pYGtHl98XL>ENj9ofVgz{w|2? zfy0!p8gJo46U1g`_b6Vl)mWM>Y^Jj5m;}?pl#V);BMJWfrH3}Zkh$SEN&U6#_3#4) zbLu&h|6WL5Hc51EsoGkDqxx;!n|bm+r7&}Qxn4RNbTTRLNx;7C6>B~>1#Os7k~ht3 zny~HZZ)`!| z#hnKyFLUfAd_b{ooQ}*6eIKKUh-@QOS2Iq%+ zze^pLWX?2CJ@!28-m7`1p6)V}+|uh*l|1{#uJ)I~?LS_A$*BKz*-Csz%&!MW8{2dC zONL#H{OPtXZ(G#I`(28u|K@Cd&pP=Y(-kJSjLBP=eR*Ng3X00o$$Tu4hzQ7M5#!Kc hWMIh5OUs{Fr#ji2MM#8|4HWgvKqv#0S-}kA0RWX$?Gpe1 delta 533 zcmcb`d4rQDz?+#xmjMK(x=!SY=9uc57CBc}J%3`pNmwyhoPhyGYi!m3o4~;B%gm7E z!Y8=kZN-b%w>Gc(G|fU&_uIWj&DNhU8uZMYs~;*ls6762&m{3)t-M+8EdGc2@85Y_ zR+p({We4+a51RPf9Bj)L5wXh2R*XUQ5&_@;_!wxfx~1a$?u<`vOM=7&^&>ul583@0 z{1|*0&NM$||Iy?sz?AW&tzezj@0gT#t8*nd)BgTn)BST-{ysL#?DkA1{nakMK)azUe-Td!Xd=ebIB> z>lGWruZKLFdE&|0Y~inm)io|NubH;7qS=XQer;-&=3T4r0&Aw-Fyi+O@K7iXJ$rug z(Le8Eejb)m-)j;j$Ho4Bu5$aFZLc05h!nNT zx&!-C-Z^gGCOuR3cA9@>@>QYmJ^YnB=S_LsSNv4=e$9)z;^QZBvo;&9oy|Xg>fhp7 z9|bO3bIc4^;&?CpQ1rOZ^D9%>CO=@h!Zg)&@-}8)URb1pBC>e0081ny0t#8g7}X|s Mu=uboV+KVx04fUSJpcdz diff --git a/tests/data/channels/channels/dummy_channel_1/linux-64/dummy-b-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/dummy_channel_1/linux-64/dummy-b-0.1.0-hb0f4dca_0.conda index cf94e8764e6f6b113c9d230169aa5ebe04adcb12..a984f91351442b7936c4f5e875c45c7f54e78faf 100644 GIT binary patch delta 721 zcmZqTY~kby@MdPwWdH%UjEOwa9BvtDkxa`9H74epgeHQ;85m%+##a5m2@LFenHYpv z_=F~$XH@uQK#(Sv`rYq8|PL*E;tc@uamGTAmf5_Whv z!Lh>jxPaak<82HlLK@W{^BoA;nWnMbdX;prs5_qANu$VQ0~Q~)AZCyd0HnwuApigX delta 725 zcmZqSY~thz@MdPwWdMPxt`m8pIi|X%MOIAM5jZj5BqRYW&cFbpHMZ*iO<-W(%ETaa zgjaCE+lm*jZ*5-nX_|$m?zel5n(QSzCGT+aGb%|w|Gu2_^Sj?0GB4L~)K{0spSrnO zJurH9){d!66Mv|I?RdUUL}aoWqiOv!Mu;si8e)m~Q$B`k(>){tzW?z_3EPsy-F|20 z%&O)IJTE4@Ejz2o=E&g0;K(qe)mm-CyJ^89UHkv_EAfb}aPfb8ukeWr2Qz_=`lZdLgY|vu`p-;URxzzLA~$)W zu9K=8U)$@Yx3A4Tp4G1VdQMkBr)Zk3d~o<@^OlG5tCt)zeR8!@xKf5O{(ytTktBO& z5fS&gS92~&+!Oykd(mf^*%j%gHD5l8sv2_M)P1*cZRnGrBS9<^kIfBl-G5*7zr=OR z&xZUlp{Z5jJG@u83))$Ke_nLCa zogTM${hgl^#2s^*GE$;EH{PjIKVI0Ye$q7i$TRla%I*pUT^$oWUb9K|yyo9?e*0BJ zGlszS3jU@~ll%hNE2QN#V&-zo8$Da05>!@gIe2@6d!`<@~_6M|FUr_(y+72Zd zw!4WLjuC<#g3}loc5pK%9h7`!DmmSgy+V=aW#ZNs`pO|c>q#exD=35tGO;p`Rl5Zx9dFoK6OxJ&0=yZSbeTC|iEnZOvo9|!^?_1c!sK1dk%}M@P+9>c4-i&m c5P_r@Ai1Pbn2}+!A*0shI2HxA0A`Q`03BQ*lmGw# diff --git a/tests/data/channels/channels/dummy_channel_1/linux-64/dummy-c-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/dummy_channel_1/linux-64/dummy-c-0.1.0-hb0f4dca_0.conda index 2d4d4284445ff2a30362017e962d1999951a8a91..e7a664506edcece034078c82221f3824a7c45988 100644 GIT binary patch delta 539 zcmZqWY~|z$@MdPwWdH%UjEOwa9BvtDk%n6j1x(B@kUApcw5z_$Qd4vhU*+_7c22AK z@4NJU+@&bbJ@Ka+Smp6+v-eC^XY{WRlkk!YSZO1%lC6!YHJ2sWRkL@-O#OY@SxLf- z8S2InUnQIvoEaP$8k=1I{(bUtshn$J!PMd_5=IGrhlBQhU%cF~&4BONn)5%beiigY z$9(@NRxhCE_ugoCy%~ft8o368LVOQ-PtaVwteyWo9(_1%FvR}-5tWkf}s?an3RMKjtB>nE)H;$Awu3mP2ho4#Wv~%3s z)fdcI)_v_|zVY(NQZ|mn2k-QJ*LxHkGqvW-a0u7koOCKXH8$eK)n}Tma`JNp&9*MQ z_kY35q&XYYTlZDYsNZAdk!<~CS>K`dJ$3Ap7c%+R&sq9tPvOK82BAX}dGou*zF*u56Rl8U5?sB)sGTR@z9cWLwtYmctV4s@XeZX8xLtRm&n6 zZk^-_vt@H+aAI&^XtlBZ_e6W1jBBRJR`VlbMiIQ1Cm#Kw*uJ*apl|D^{8-t#AD3c^ z?PV@6>RxBKLAKlcJM*Cz?DMuL-n{A(KU1!Tx#CyN@OS${r@|73byc zws?9j4gS67K;*s3ZAZ2K9(}&`>W}lA-~VTtypYMi{#;Q0$sHb644jD`{EJ+#8#%SU zZ;s|q==~hTlhCT(a450)z*ipUii~s}#t93V{Eo>USXp#7Ag?^ce43Y2n*u9`KqW&_ zYxIgPn+D&WM*hTxiA-A)1aEuSFudf5WMfT8dXy00&B&z742#{g$kPm|dUC*+2I0y1 S%=Ylep1h4Y4iTR+ESUhnLgKdo diff --git a/tests/data/channels/channels/dummy_channel_1/linux-64/dummy-d-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/dummy_channel_1/linux-64/dummy-d-0.1.0-hb0f4dca_0.conda index a7c81fdb5780e9c0a295158996206c35926a1468..442a1c0cc0affadbcd096b69bcb9d809e4701d94 100644 GIT binary patch delta 601 zcmbQpIf0WWz?+#xmjMLaGA8mwbGT)sMLy$e@0^%#QlA7CXJCNQ8e8@MCNQucWny@A zm{(}Rc}9g#iL*ZcFSdTO&~T>ec@g$)2TvJ%nz?k*=6&{V-+49J6pbcH=3lyNum1IJ z@Khjrk&GOHaZ!=2Pi(TK9d$)2+#f?qp zR&q>^NWAvhxYV%TIpW_(uc%(F_2*`uc+T;oiS>|zn6-&}-K#m5BJPQQpSkF>no;1R z%-S!XMO6(sZ|c6=xK?)3B`f|X6Ryq(pSu6P=zodpzRya9%BTJ|D+ryMdH4I)tu3BM z$__5N5~UrQ+V|o9d;6LE=l|}UT*73)Xg+xfncBkR z$R(igiQx&?_7c&V47VkjB@ZzwTV@?p-ZtUKfy<1W_^l2cd2%4Yn~_PE8I}OjB2P1< y>P;?YcISnq15n&2O+L;XDGw3>MF=PkKv}2N?CE^~ delta 601 zcmbQhIgyhmz?+#xmjMK(x=!SY=9uc57CFy4^5MjMllnxkI0FNW*4V25H-UkDFB5|h z3!l)0^Nb3g5@&t>Uu>Ph-SKxyhbH^BgHj1R{Ek{yuYbn+n1A-nauIl$^2=w&&*v)p ztcAbtJ;j!z&BgF$XaD~ztU>_{W*iz5ejM;U?kdK^#ZacUfCbqxX^|}6U+Rh`t23Hf ze_@2U1V%#~A|A@muq?t`BH;TUpOmmIN!>~B&-naxo5b>9vfHw=ifk?nKsb3iqpHG$ z@=Kbk4!xb4%Pwya-cjVm8PTnJL04bUe)FuD2><7dlW#Lh){9=>m3y~xOT~>%=T>q| zj!3-r*|^lO-Z|pmMX#t{t@Y<-o_Nmjqlxv9f|&L6XD9sU21}j({m3r3tMS%rgU&Mm#Ihl+U~I$1Z{I`5s(W6cnJ^lU(0d5HNmFQ+yIRt|wm zhN9N!U0ps6Z+jYf9yUyr+4?{*+N0*dONN{5vI$8=2?5@WOuEdl1dtYanjuwhauKsT sFDxB^;y!WmG3H2lkO(M7K#>5#sth8~^ufTeq)}wD9g7cJJTpiL0Fd(E!~g&Q diff --git a/tests/data/channels/channels/dummy_channel_1/linux-64/dummy_e-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/dummy_channel_1/linux-64/dummy_e-0.1.0-hb0f4dca_0.conda index d48612ef29c3559d07bc89dd71d3be3fc032b61a..9be8f35ec2b2185223403927aa6d4017aed672cc 100644 GIT binary patch delta 639 zcmZqSY~|z$@MdPwWdH%UjEOwa9BvtDk+w4?^H0n-2}=TtGcdqtjjj5B6ByW!GBF6b z@Ci*gSzF^l8p|NITTNAE1)&}9E{Qu+xGf1_UX``_tv40q*w7;;RUc&1|VyMLA| z`QL~1eKb>)=brdO4Q$H`Mt{c1YK;E%VG>>v0pI`lq=aor>JGX$bLOwJ6ImWic3XB< zkt?eOg;6FFw~?(7kf`TDxCAyC%(Oc_a4y#x()Y%()&-C#ue@K6U?nSAEZGwasA@#?4ovv_n(-KHPtAzwyJ}o%YusoYVRE&Z6i-S4Oj4-_^<2tiId! zy_D#`W+^@OT&(=wmp?=6VYbHCl5HO@oQq&maAuv;W8Dz^bk@Q4$+~Nuwwu!(>B7t;umL3T(m5 GAPE45T?Zck delta 642 zcmZqWY~kby@MdPwWdMPxt`m8pIi|X%MdnoQ*O{1a5}F7WXJCNQ8e8@MCNQw?WnvIw z;S-v0o>AdbViw2G|M^#R=lq=#p~=4Opi}}6zoVMf>z_-!%|9Q{G(Pjf`IpU%pG#%- zSv!B0_WXY{Xklkk!V`2NQyC2UL5(T(M4%gme%cwS6)TXt5F z&56O8!HGd2?d3Yow#6Fabg{+UuV32KPVCN;`R$=rq%qIXX-oOe%5H(qz~;>Em)qvn zpIf~5@U&7t*N!7xo9C@xnf+7x(3k$OOI@q?Sj8)?SAM`P!qFV@CY|G$>59HTS1g|< zRK?$k?>aYghl@?_*NfM~ryNm9*}miWwlw2qKQGNmJ^Fdom+!kD$v@_s{Bwu+x>ZK$ z;k&#$Tyl&<#TqAFiP8?u?E7&4y}kIu-Np5Nkyi0KWyg(|nOd{eO1<`pdVNRy@lA>T z#~HaHR^_!i$+I)R7r)4k$;zBu99-P|{p{ogOab-hg7Q!9@UUXwO!VMicPM6ak84=B4FNtW%vF&!WH<#0-)I E01-a^1^@s6 diff --git a/tests/data/channels/channels/dummy_channel_1/linux-64/repodata.json b/tests/data/channels/channels/dummy_channel_1/linux-64/repodata.json index 819327f5d..cf54aabe4 100644 --- a/tests/data/channels/channels/dummy_channel_1/linux-64/repodata.json +++ b/tests/data/channels/channels/dummy_channel_1/linux-64/repodata.json @@ -11,13 +11,13 @@ "depends": [ "dummy-c" ], - "md5": "b4372fef02827c469883d7895af3e56a", + "md5": "9e3022e5b3092c45015196ed3a679bca", "name": "dummy-a", "platform": "linux", - "sha256": "e84dd5c11f72f6714f81e6bafeadadfef021be09de27f9d065d51672174d873e", - "size": 1240, + "sha256": "602570943a8b4856bd4a6ad04c3ddea01d0a165cf5c0299fce45f7641ac2ac8e", + "size": 1242, "subdir": "linux-64", - "timestamp": 1730882682784, + "timestamp": 1730898132208, "version": "0.1.0" }, "dummy-b-0.1.0-hb0f4dca_0.conda": { @@ -25,13 +25,13 @@ "build": "hb0f4dca_0", "build_number": 0, "depends": [], - "md5": "b1ae5b6aa955304bf2dbe70dbba144a1", + "md5": "ba79f8081f0a1e87356c82a169c29b5b", "name": "dummy-b", "platform": "linux", - "sha256": "09c142a72559535bad3f101d46461838677c22df0cc2c9c0d0b897ea2dbcdac8", - "size": 1154, + "sha256": "daf38b547f42b8b581da0c50a54bee4d4a8bcbfc8c8790c8315e844e0f961f23", + "size": 1156, "subdir": "linux-64", - "timestamp": 1730882682784, + "timestamp": 1730898132208, "version": "0.1.0" }, "dummy-c-0.1.0-hb0f4dca_0.conda": { @@ -39,13 +39,13 @@ "build": "hb0f4dca_0", "build_number": 0, "depends": [], - "md5": "de1bcaea088baae533c9a0322123eca4", + "md5": "0ea2b9fed053c6618c82a8f54ecb9391", "name": "dummy-c", "platform": "linux", - "sha256": "247433e0bb1f79e82b7d48e4f933babc146358edcca69146714ae45347f111b9", + "sha256": "b9ccb4610c0e77694197a4c9a83c0e034c586d733367fef7167032826069b3b7", "size": 1157, "subdir": "linux-64", - "timestamp": 1730882682784, + "timestamp": 1730898132208, "version": "0.1.0" }, "dummy-d-0.1.0-hb0f4dca_0.conda": { @@ -55,13 +55,13 @@ "depends": [ "dummy-x" ], - "md5": "ac7ba71425f5a31c9d3e3b72a9586007", + "md5": "4e12f116517dad87732e54df1ec216a1", "name": "dummy-d", "platform": "linux", - "sha256": "d0e38029083dbff0a5bf434f4004c99ecbe040531bcd23e006c573eef0d14802", - "size": 1169, + "sha256": "1b2193383211a8b9eac6418a6d1ca84d92c88fe6c25d9227e2b3b573e0e87c6f", + "size": 1168, "subdir": "linux-64", - "timestamp": 1730882682784, + "timestamp": 1730898132208, "version": "0.1.0" }, "dummy_e-0.1.0-hb0f4dca_0.conda": { @@ -69,13 +69,13 @@ "build": "hb0f4dca_0", "build_number": 0, "depends": [], - "md5": "8ca3e5384e4c15e4aafd862cff970a83", + "md5": "44a05cf560c85eff8cd31d597eac9e04", "name": "dummy_e", "platform": "linux", - "sha256": "c40d1efec234270877a6dbbd8ccc7ee440020757869c02fd78d3a00346a127c3", - "size": 1156, + "sha256": "2dedb0328e6ccb55ebfc6e52ca09823713febf54c09aaf7117fb66ad1160ca0c", + "size": 1157, "subdir": "linux-64", - "timestamp": 1730882682784, + "timestamp": 1730898132208, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/dummy_channel_1/osx-64/dummy-a-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/dummy_channel_1/osx-64/dummy-a-0.1.0-h0dc7051_0.conda index bd5cbfa650a5f17fedc8fb939bcfa7095c5c162f..aff48a099e122c2cef81155dc7f599e3619773b6 100644 GIT binary patch delta 525 zcmcb?d6SbTz?+#xmjMLaGA8mwbGT)sMP4j#`8hG)B%%~7&cFbpHMZ*iO<>@TWoAe^ z!Y4H0Jfp&=#95#J7h7j=cl@2wp}FGss{>{c%smekJzUdm?FBENt#R&h>?kp+RXg*i zSm=Ii=kK^w=53-Af0~2sVg0#a+GGnxQyC2=h)r-BY?1g^0R}Od$(@WL^+Ifs$=Ryw zcZw$`f7-~Rw=L{bT#RR(Nzw*!|I$N;Q)GTzYb|r#`}ii8OyA}m=JsF8Rb5@<=eovS zJM>`Ew{_37J}hFp((OHmcdE$M8z;hx*L^fk{<>(vLiwp8PhI#o$1>{v=AW4VG^{w! zQBt4rs%6E0{nj-{!xiUDzsi2SG=0AL)Gwr1CL8&mAM@MbUrpNaZa(Gc(G|fU&_uIWj&DNhU8uZMYs~;*ls6762&m{3)t-M+8EdGc2@85Y_ zR+p({We4+a51RPf9BhkBuU_3`D@IcpO(uvvFdAZw_+J4AwV27>j3IuLSR<3ORed+z zNJ{>+kwtG?*r&J{&pMN&4dVW#hYqL6Y}ebO{Yv(H*n@&ONB90*xL;dS>(?utPn*Qp zrf(@X4Q~`TT@V-ZC}+iz702B4;wS4ei3eT{E6#J2)Mq?*@OQmtitawHhkMr8?O131 zd(D#gxnbMYVz<_|oRyw?BBD^a{=`Ocr(>bIT5fl9+OJ4$ICzTx+C^i9CAr7Uo)=AW z?92blcTbRS@>C`_rqzs-?=VerFD(;2EM3mv6>4yJ=k3LPhF9M7v}8IwIKli!`_8A3 z6vl0KY*sDIJuFw69CIQcF?+V3s0(0FQ)6cf@MdJvWrjt^rW5}F7WXJCNQ8e8@MCNQw?WnvIw z;S-v0o>Adb;;hgAi>==*G@Pk=UW9$y!BYmGW-eW{dEfn`Jr`@8yBs@uQjX0o`F`HB z_Pgl2>ZzPJ!X|!K16wln(Zk}&s*L{iYBxOP0#@2ctYm9r>g?r-b=B;hF;oBE*Vt$~ zhPNqftL2y-8Jrj#7+Ac1{W*DC$Fl3vi_H8EU6&0~%lOTox65o3J7jTfQQhlT9~SGL zHT}-Ki#@r-_fVP6y*vCIi{&FPwWfpz)w)(0@tLkND!nB(y|46yTtO%!kDF9_)7m!2 zdcLoEv5#)`NcJ?gOuLa4;o^Dz-(i>Ussa0N7Jr}TFB$A%Ut%)hU=&C2J7JEmKX>eC z-=g@qdFemDF5js=+KbO5H~TyPR)6N{ZQ~sgEUq~7dED$XU(|1l{Jmy=X!fCPVY99_ zD0OL7FFwCd%I)q6hY$Cv+h2%w-uv~=jj{K}yReY@S%!PLYgBVYtwQzqwp{XjtsnPt zyPn?jo-bb?gx*44nCU_ljn^Yw}w31=A1hf1h24&W)gG$?`|6sTzxQU1Bz>y;d z1H2iTbeUnPD=qRgL#mz}Fin9lFM|jqbxkf{Hsgh*I#5bWoV=MiQV}EqN+JUlrV g6{a4jVo9S2Bg13^My<&on1v>1vhcC_FoO&O04zHr`~Uy| delta 693 zcmeyz@t1=qz?+#xmjMK(x=!SY=9uc57FjW2N8rSKlaK_kI0FNW*4V25H-UkDD-(mz z5njOsZ!2EBzO{MPr)d_Ny5H_KYOBK z){ybZbNd3BuZ_KhT`#2D@*5qixz1S&SN?u7eUoW!#02-!tV<_%c)Yy$F8bEXJ?fS9 zR~9~=(bK)hgy+@uQ*+iSzb*5eFLf-vx=5u?Re@)g1ao9YM#q*fUVCm$p1O6l@p|i{ z^EQ+$ncIGFX`S)UBPw;t!q-jO6}Wu0d?%T|IkWEe&V9?)`AX);JUY00o$l+`@A|v1 znC#mo>v&kAEivNySB`r--(40wWL5fo!)A5&`pMhsj~_YStoupkX3*@dwY?L!dj?Ha zQQvI0cm3utfg@5An)v5T?phc<(N&?Kt7D?aYew-YulWyL7BB7LO?br+*Sw%*N$?fM zdu{C8;p&Imdn~8AoXT5&Z1cuH-5-^TE3OJZ5%2mSC2~(Hyyfr$YaU$=ZKjW0-V6+9 zniyjW%DztOd7ZI@IfTQ#EJF9kX%104e!WshsTsEz!ge&8x5u%xq)QxXEn~|*|7r(w z#HwkM=kE4d9b1={rsBuUAwOdfq@rIo>A*m=K zz?+dtml>A0CPy**^1@OVC`Bbq-ohNI2oeFMg@=p`3?Qt^AOe(wfF+H>j0}?v8MP)y Luqd#3GlN6{?lmM| diff --git a/tests/data/channels/channels/dummy_channel_1/osx-64/dummy-c-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/dummy_channel_1/osx-64/dummy-c-0.1.0-h0dc7051_0.conda index 14808fa3d68e4850bb60005dd5d2776c11704971..3b44a6a4aa06851d99efb9c7e3a8da1fc7a911b2 100644 GIT binary patch delta 412 zcmeyz@t=byz?+#xmjMLaGA8mwbGT)sMH+5B6fiNrK|07@%N^r0g4QujzRhS58hLlc)$K91Q|h=RnB7k$h($;- z#jkYjS^j0J_M4)9^8$OKYFtSDUo&O~^Q9wKGpnV6tO+&p3HLlW#p!`bvxZ7!}zDCyPzZ83(ua1U&p) z@RIw|4H5PYk9bRpZ@4;Cv?zJA=J4y*Cd}4UQwLL(z zl3}(4v-}|jW!9{NO53LYV7Mf>iHGaJks}8KycwBvnPK6X7I~T>RZk8WG9b*$ATl|d f*#;iMlh-rH@q&UI6o{a3dpKE&C63LP85EKLXJVH5 delta 411 zcmey*@sEQiz?+#xmjMK(x=!SY=9uc57AcbV;^)Nt0;ya+#k=}lOD1szw(s#Smsh;n zp09Mg;_ifg)`>sWz$%+I`#VimXEc?0zz8;j0Y+^&_}howv`H5x2R+4~M#O)$+B+d65E284MTL?-7j f+rR^O@&@KOUQlR*!VnZ}4<<{q#IgA>g8~u&D7lt5 diff --git a/tests/data/channels/channels/dummy_channel_1/osx-64/dummy-d-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/dummy_channel_1/osx-64/dummy-d-0.1.0-h0dc7051_0.conda index 0106dd533c95eb0034a83d4c4cf6b2a5f5265eba..e3f3057d08f8a0e8254a411122cba1b44019d20e 100644 GIT binary patch delta 496 zcmeCAdb;;hgAi>==*G@Pk=UW9$y!BYmGW-eW{d7r)8cV104MWacQ`Iqk6tAD*4 zx#NAPT0%4j(PXWP3Jt);xa9w z+-5zBRCei>tjQ5nGc4MmlezZxwYl!y?PsF})ixel^E~}k(!aJ1f0Cze39BqU=VIr6 zKwL+FZQ~99>CaC1&kdG3{riz!aLGLvwMUt?Up|Yf8gky$eW$*0ZQ_zkR{T#UT%8d< zb^m?Q{}R`IpOp%gPyKCH5IQyU?)R-*TRe|2O-^8PWMrJYh^fi#e1N{nW4;3+rN(o1 z%a-;meU_%;!OY|$*AVk?+BzlS1nXo4XNv?CcioC3VnXs2Ru11B*=NjS4ZOg3cHnw-I+z!u94 Gk^lg+e7Sl6 delta 489 zcmeC@?BnDK@MdPwWdMPxt`m8pIi|X%Mb5L1d^j=Rq&^WW&cFbpHMZ*iO<-W(%fukW z!Y4H0Jfp&=#95#J7h7j=cl@2wp~=4Opi}}6zoVAb>z}bc=AS*YTm)XG{PLOc^SR1C zYvJ#EPqF1_b1}Tx+5i6vt55)g8HdJ%9|wGoyNdB}F_ft-U_o|FS|p1*>xm1K)fxR6 z+a{MYy3{+|^ISfK!BlP848OyE4^C;SCg@Ic*uKZ*&zY>EMBBOSzEexxj6QoEzG!qw zXC^%|X?C-MsW)pOs*waCqoYhQD0&#FIv z*ZnxYBhP64%IEdI^=nmql(sQXPGoXqG@rbfsmX2b!lVz!WE)n#O0y`p zekI|3_N>PQHkJ+>hMk9WV_nq_lpS+uD>&fM7xke-SHAcQ0yPt}*K3e~OF-J42*2Uo6-(@TX4;^4uIP&Scq(Wn+kJVBZoweWM ztoW@No&7W!v)8lidaC*;J!~@f>z6jZQ%iL|nml=!A(`2g-Yf9-sQ68#kfbLGk#Z&V zw|9Ncc)y`i+etNS#@9bSu|M)TPTPlhW={=&Zt=;IXS)wpVRDp zT3aYDKG$5(y>j_lyI()MCe3JhBli8qwZ0{ntR}Kd{5m6i>i+wp|0S;bK6`vDCN#Aw ze5dycmmGG+%~ztdLsR=c+<$Ms@x$Gn_SYYr`}j`VqUb_bMzdYt)ydbazT5V_l<2=^ zDLwUEto-eW^jm*beo9S`dZo}2EcpBeq@;p$M)rf9RpIHGz@pLIjf))^1)yj_v3V`{GKC?%lqiQx&?_5jgJ zhS?I#@`o6dS+fo*ZJYjs;gaAc9Y0c}9g#iCG*!|L0%Po%44}geLp8gHj1R{Eli?uYWG_HvfD))A-B_=U+B6elC^S zXYKrb?=F@ct%*O?z?QHDcH~V~XY{WZo8c)D@coZZN?6ENSIzfleEzykVtFvxZP{5x zHYWyW1}6sow3q8R_wK$b;`(U)|AidPtZEm7_muOR3LZMZtZ?MZcS!}tO7*!xOjl;i zNV4L!Zq!~rrD1CX)7?)(AC0>&wm$u$;WPEC&gVUsGPbptiKg}l=$`v=L&-M)_S?r6WJU;nph7hh~1H7l93mWU!`dO zwd2-|XX4+BFDk1&%kYV|{qj{*)sXY%+7rn!yTuo>FFUTd+Hk#B{rS}|k}swi$yYvG zrFDDHrPxC%Nj3);U5U~T&FuSd|Fiw(4-Ze;AAcg3s(sJ3-SPEC{Zgsj>T64jawInI zJa;eZzL)y?zSJCJ-Ex6m{bke4j$gd8*pO-Rd?w%erp;HPjr1n*IVj59blmbF%5BAm z${k-=GjqC_BR;b2vV5bYU~^bN?v~^l+py!Z4lAS16uc|DVmNKq?1>7z90HXLMXk{* zx@;PJdm8x@8zwSsO%S~8UBmE_Ba)3ZA?Z;@TWoAe^ z!Y4H0Jfp&=#95#J7h7j=cl@2wp}FGss{>{c%smekJzUdm?FBENt#R&h>?kp+RXg*i zSm=Ii=kK^w=53-Af0~2sd35CNipds?ruOPg5Sw5$#3J#x0t{v`A#wrTayQyK-~MQN z60e;5IV&WTxoy?56-hSBCuXuSarrU$PF}-kP=9C=+wANf)$?DwFPi?0Vv0=Gsnp-} z#7)BRM0bakV%9rh|9NuW;y0#$op4{Pz~RE7TfZ+wFPmm++bT9a(I=Wyx4SRYhFdBk zE7EW7oxSgl-Tu8seBnt}UK!o3IvHKF-f(rEte;_{uNl4h_>$iSjD2O!zw* zmhyI&Z|bILzD+id+nE@g7w(Q`+?m{9{O^tg=k3fjUB4w~znYcOzwKvQt8dh+Tj%Eg zd*lCd!oDx_yK>@!)AwgFPrPAgtx+uhOuqk7O0dZ9(2e;<`HbR|Z!ukEa?6;!k=d6Q z7K@;mE1k^E5~&6f0fjdxh(TDDK?EAR3=B&eH5eHfGV{{%C)TM>UeBVywu~7h2>@9= B+6n*w delta 555 zcmcb?d6knVz?+#xmjMK(x=!SY=9uc57CBc}J%3`pNmwyhoPhyGYi!m3o4~;B%gm7E z!Y8=kZN-b%w>Gc(G|fU&_uIWj&DNhU8uZMYs~;*ls6762&m{3)t-M+8EdGc2@85Y_ zR+p({We4+a51RPf9Bhl&^Ec9ytr$)1)tDgmz-Wjy;!gz_%w$630=ngHv~|Ay(exx< zIrno`NGNmLs#Tj5e=eDr$;QOx%iuG49iu`0B~RyT5#^Uux^>OeI%zk9Ox#>rlT zqzU4JrA}AwsQb^8^A^7`{p*DLS_KXl4&C~F>2}!ZS@WE_Pn$em)3R-Gvgr9HwrNq* zg4NT{?>u(<_ZsnqCs}!Abhqkcbj^Ch)p@dhhRu47nXj*3s-4km#r}4Gs6zI~K#t|9 zUk+}2_iA;0P~|JGQroG^-YVz3dvK&yr0mmlnVE`r+Vz$leWp~l$$K?>&IR+T4_|mB z(`Royd(+Q|^HYyJ7lZRb%jY5!tl2CcpYNG?!Lm0r(>^&^dh%b5+4*57mMlGc^XKLH ze>G(@oe_1lJ&P7R5qRGJ9Vf1=kdiRCq<6dg}#~nb{*^FyG&P^rn*kv!tBcn zi$PGV6;I}4iBtoLfI=G-z#y#3AOek928Jb#YK#mFnR#jX6YEqbd$S0Mu(E+9nSoFS KD6^Ou!~+21!{B!S diff --git a/tests/data/channels/channels/dummy_channel_1/osx-arm64/dummy-b-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/dummy_channel_1/osx-arm64/dummy-b-0.1.0-h60d57d3_0.conda index 584ca58caab9a19c07fd0f64d96da155d48ead31..d4ca876ed1d240e65a5154d920a90da700d9a35b 100644 GIT binary patch delta 711 zcmZqTZ06(%@MdPwWdH%UjEOwa9BvtDkxa`9H74epgeHQ;85m%+##a5m2@LFenHYpv z_=F~$XH@uyA%VYX}z42}%;43$-XPKMi9b{)#d%J0xk*&wk@x%;CtUo>~3O!m|JyR80Xco(1j z+wkt7MC{}Zvfbw2nGd~SpSMNv=2e&YnQ}GEA*%`=pIu$FQf{Ht-7cmZNfJ+<)cfsf zsbBlUNMh-q#+G?El4eXyXmFBnb)tiYfH-aO%0oMvB7E5 zs;s5Q_eo64h=@@$6Q8*jocu-!jaueWaMhQJpAJ1sVNsjuFju{3(u zjyc9$X>)aVRd2t_HO+OOyMyA|V!!%{Y_19uJdU_6DP@-Gc+J1-?DngMW(ME^60jlZT!L&&A>3F zi81zpkLc^(+x1JBCkS+XP>9;5uN?8izF-aGf`co00$8PgJloLy;7~EoT_<0r-RA|) z2f3;|<~tB#Epp~-->YLmo+kvBFfc0dJFF}44xh-mVXol>MHz!hi^Xh`xI6i6WEFld zVD|Ch112y=CS7J&5=)Cb&5)`m2TWKX%*!CcFu8!)nirPpKq)P8@($)md5{Pwi9BOu YU;trNpi&rE(kL?7fW?O`kQpQb01THK6951J delta 692 zcmZqXY~thz@MdPwWdMPxt`m8pIi|X%MOIAM5jZj5BqRYW&cFbpHMZ*iO<-W(%ETaa zgjaCE+lm*jZ*5-nX_|$m?zel5n(QSzCGT+aGb%|w|Gu2_^Sj?0GB4L~)K{0spSrnO zJurH9){d!66Mv|I?f80$fA?fHM*sRYaSw@r?|*z!!nP!Fx8IpLv#NOl&x^@!%g!pY zIWRafI56x;W_q1x>ALX8>;D>u5*od}TzMz!?$=`Qfq}#DPc55=gWP04O~$I_OQ)TS zRxdcAsT#0)s>Aj@E`QFP+Oc8YIp*FRo?3q0+$EaxQWc$4-T2xx_mE$ikj859Dfs!6V;}bIxGysI z`Hdsis~;}zU$4>Wc_Oc{Klg1^i_$cu4wH9#wEp~E_v84Eb2IxZAFR^4y!%kBlWLN6 zcqBjLW{I}M0MTb0|Ns8mENEx_{dv*l%FWjM^5^cXxB4mPcXfK)-t~8WP7rs@Y05~6 z^4xf*O8t0Yulh;T>?6Qf<@mNyIEY*0h2em% z#0A#$)zeSz@W{1d;9SVTzbLg{a^a!>jmf+WyndMtTDKU?+Vz_R=Ow-n%M!X#+g7nm zOHHzz!Q0f~V9fg!c|KEncq+LB3_dY@!A&V z*qoSlI8*MGDr2u>Zr8itmvlI-a&!5EzB6;in6jC^3JdzzENZNJ=lt5tIp4ESU$b~P zzmLr*fhUt|DpSilh0T9jc(=(ttIg6Z3dxzOyRGe=<-AYPYlWw8S*x{AbfBgd=(bv7V zmoQHd==z`#wM}0+;)i{~8pZ_&SMmg~O8RN{A7SKu8!k#oab!wHHq29p+x*(7my^4rKN{9eH9}=BMV@9z)sq88pB%&FY-UGz3YffwIgS^U96*r_iq|KTND4FC*j?3Dlj delta 573 zcmZqTZ06(%@MdPwWdMPxt`m8pIi|X%MT+FT_&G7ZKq{9{@veT?l1W^F?R&h-dGou*(0_HZx3CXEd#U$_O@t0Y+XTP%+_GB`0fGR*n*vvYrBcURNJ+xM_^^#r2I}^S%p9Vps#}uRT3Jze@PY zuBCcmr4tNPjaPP5ANJ_szaMkb%?s>Z*Dd&YrbR9^`1kggEUGryQ=e^^9&t2a%|eYh z;a#cwP0y`58!G0RBM&+9qQJo&Kk@|7spZxGdG&SAT=svyFX zJ?>vz^wh^rU9lgER{vLY3<*>?s;Kik@Bu)tMNt_JimfP5Rgnb_0gxU*?YHI9k0p5&E yy3DXxPm4Uwkg6vKj6XSs$yv;f@FXyKGjkj-C_R8;85FTkC(E(Ku>~@Nq8b2KSMLb` diff --git a/tests/data/channels/channels/dummy_channel_1/osx-arm64/dummy-d-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/dummy_channel_1/osx-arm64/dummy-d-0.1.0-h60d57d3_0.conda index db6a67e2f5c776d87a6bacabc13bb9d487dd4d79..5dcf0f6e6f32a40c17fc38b4dec7a8b677ba4c0a 100644 GIT binary patch delta 711 zcmeCx5nwS;I!ZiY8I`~P2I6$)T5rzqg-xe#Y-&-piJot?OQH_1ibw>-oWu@Tl^+sUsYtNeQbvyYDqFs(5% zap^L{lH24gW?x=ddIP1gq{&B^BNag+poj;>H3+LRh(OaJ1H+O=QAUQzhKyR1GguVZ I;+R1a0H=r?JOBUy delta 703 zcmbQh*~iHf;LXgU%K!pXT_^HHb4+zji=1a2`EX*sNqr(%oPhyGYi!m3o4~-nmx)1$ zg->Y0c}9g#iL*ZcFSgF$?)W>ULz8{mL8$~Den%~<*FR%@%s+c(xd^;W`Q~pM8NkyJ}F@#TU|Gnr!BkZF^T2DWVdB!71^8^oEe-L_|sml z>G$B2rfP!j zG>7ebT>hL%DoM1o<&vmRU$sWRXr=XiUBfLaHIiF6CUTh0n78d(?|V7dZfzg_+1r&| zl3F9rUB9xm=3l}u_c`fP!{ThC6xJ&~;1=O%jwndyn4WdQ-*%DNvY$u)E`1>=JblLU zuNSU|PdTEJvR$daP&c_*YKBzXn##DT|K^2XJih2`N}ck=@Ll=L;h{J0&2@{f@$NX% zIO$51c4%hbhx?!Hr}O*&vrKz=@zCxUm$Id6EvNQQez|T-(b+SV<;yD1AG^W#?AE2j zmJ-$a=kJ^p@;_$r?C!a(7Lyk+IoG!=ZLDZjWq6<=v4HzrKtAU&FDnP`L>J*jslSby zTK_W~mu^t9ZIyb!cj@8F9eYBa^7S~(l01~;$Z_7dq)m#oY`)^Wm0h04WDf-KYRq_T zd$o71kdpHRCYBBxhMk9W-CXq!upK|Zr`Rx&YiokQ?TJ4eE*Wm(w>og-$iV<_MkZZO zW>{jIoWtzP3rlUF6qY#o7;~gNNCXt`pr{66RR$4gDr8_-(kL?7j>U&9h8ZLT0OIKu AmH+?% diff --git a/tests/data/channels/channels/dummy_channel_1/osx-arm64/dummy_e-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/dummy_channel_1/osx-arm64/dummy_e-0.1.0-h60d57d3_0.conda index 409c8e1418cb39f0f2341112883fa6c40366df72..b02eede3dac5326f194ea32ed3c8451be1e3b19b 100644 GIT binary patch delta 478 zcmZqVZ06(%@MdPwWdH%UjEOwa9BvtDk+w4?^H0n-2}=TtGcdqtjjj5B6ByW!GBF6b z@Ci*gSzF^l8p|NITTNAE1)&}9E{Qu+xGf1_UX``_tv40q*w7;;RUc&1|VyMLA| z`QL~1eKb>)=brdO4Q$KKt1CB6R%0}keaZ;22S!7z5x>jFz$W22xq{J=bD81GDMA~z z+^U{@h*67i>g2bKlA%W`!ZM#;wG{p-!x+E8LE=b~J+nxAA@3|@`%=G5o%h|peJ)lC z&(wIo<*K`Ve4x9DvN>856%j zlP}Zm^8)9CTvZT5vXYpYRWCjTV0R6AdbViw2G|M^#R=lq=#p~=4Opi}}6zoVMf>z_-!%|9Q{G(Pjf`IpU%pG#%- zSv!BW|8j(>l}-pEI+5&`?R)jzNS^a zlJLhZSKaO71BE6}xcf-%w$wg$TRmI8$d7wg{rS7@$MGF`M)Kx|LqnI9Pu<<(d8BM| z43op;xlI1`1+ImnN@NN#O`;V3^3R5WZvS>JuzC&PkjQ;FCBR$St?A^$7bs zz6rG#7}eC+*#f*7nRJ<9fu9z6njuwB4j2}443o2&9eH6f0Sf)Z$vc@N@~ diff --git a/tests/data/channels/channels/dummy_channel_1/osx-arm64/repodata.json b/tests/data/channels/channels/dummy_channel_1/osx-arm64/repodata.json index 4ab127c69..0b8032a23 100644 --- a/tests/data/channels/channels/dummy_channel_1/osx-arm64/repodata.json +++ b/tests/data/channels/channels/dummy_channel_1/osx-arm64/repodata.json @@ -11,13 +11,13 @@ "depends": [ "dummy-c" ], - "md5": "b059a8930497742b4f1803f919517b52", + "md5": "838eb7e1214fae014d0a987859f859af", "name": "dummy-a", "platform": "osx", - "sha256": "d5ed2d936a173deb6d59e625f2b6f52f8ff7f2201b83225bb5c2c4bed4b920cd", - "size": 1237, + "sha256": "d76bd1ace7187f11ae12bb6bffe3006e43a36e7d29ceda51ce0116477a259bb2", + "size": 1240, "subdir": "osx-arm64", - "timestamp": 1730882682867, + "timestamp": 1730898132307, "version": "0.1.0" }, "dummy-b-0.1.0-h60d57d3_0.conda": { @@ -25,13 +25,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "459d9b61cbd83823b306417fdc5e44d3", + "md5": "ed8f85c5c7b99235b77f729c77da5e20", "name": "dummy-b", "platform": "osx", - "sha256": "cbc8b1af3cbc320113901f7d3b0ee31885ebaac4d6d8fa4b8226613742242942", - "size": 1154, + "sha256": "fc19ef430dce6fe01f1172e7a99f2d6d24279149ab1df370120da93bbb958f69", + "size": 1155, "subdir": "osx-arm64", - "timestamp": 1730882682867, + "timestamp": 1730898132307, "version": "0.1.0" }, "dummy-c-0.1.0-h60d57d3_0.conda": { @@ -39,13 +39,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "9ed09c9981c8f1dc5b2d3f3b9b445259", + "md5": "51422bf40c92483b988ae0329c5cabe7", "name": "dummy-c", "platform": "osx", - "sha256": "227d10c2558f17eea02d6301338f0dbb0b8561fce075518c3dde987251185fb3", - "size": 1155, + "sha256": "63847478ea06ea5c025e29a803dc43f48e05b701258cc060e8a570b4ab634018", + "size": 1154, "subdir": "osx-arm64", - "timestamp": 1730882682867, + "timestamp": 1730898132307, "version": "0.1.0" }, "dummy-d-0.1.0-h60d57d3_0.conda": { @@ -55,13 +55,13 @@ "depends": [ "dummy-x" ], - "md5": "ae6dbf7c3ab36afa5002ac4a584c14f1", + "md5": "9b5038e47b58cb8b848f4c653e032bb5", "name": "dummy-d", "platform": "osx", - "sha256": "609d73e95c912efd835af0e1730405e8707ba6492f56ad6e6d597a1d474e86b9", - "size": 1166, + "sha256": "2b16ec795114f502afa2395b123c63ed0ecbd56b021d1f0b396d072c87f627a2", + "size": 1168, "subdir": "osx-arm64", - "timestamp": 1730882682867, + "timestamp": 1730898132307, "version": "0.1.0" }, "dummy_e-0.1.0-h60d57d3_0.conda": { @@ -69,13 +69,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "99f43eb754564b03c0b3b0246cc78ef3", + "md5": "307c471891a2cef3b53523682b65711c", "name": "dummy_e", "platform": "osx", - "sha256": "63af46a043b6b02feb687553114561239ba46c6780bc5d07b79c5472b78bce92", - "size": 1153, + "sha256": "44886db4bf8db2b3223c4aa7bf8eb7b07748d86b13da4ebd644fc7cd1a444f61", + "size": 1155, "subdir": "osx-arm64", - "timestamp": 1730882682867, + "timestamp": 1730898132307, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/dummy_channel_1/win-64/dummy-a-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/dummy_channel_1/win-64/dummy-a-0.1.0-h9490d1a_0.conda index 1984ccb8e7484dc4390807bf03fa113e950d7bf4..dbf4b4cb03794eeaca67119a414bc9c0cbe38c16 100644 GIT binary patch delta 701 zcmV;u0z&=X3El||P)h>@EdT%j002g4kqlc1MrdYPOX2-~k#AEvJ>cleKKcK>ostVWNgz!60XN^zYk?bR@< zK9K@D?Yz^LPeL?t6;FV@=tQQ$R>Po4eK+SCmEy}@6yVEXt6>o(+5Cyg$<;u8X0Dra zJq5OHFAMB`37=i$)3QDP+OyN^>}jpfj?ZCi)_H{Op$dU-f>K{6M|J`%|Dz1>eVD^u ze6fP^Ppp3xR~k#VqUz!`Z_XLXv|D_NJ_mpT!8zv=(L0nXyVI>r$2j{Qh1O-Aw(ERf z7ug;tU(<)}|MMq>Pn~<#Rd0|k?~9A|9TSL1ui5c9_&W7*U!>DMu6;k|7g@apOdxH(U(}3j^^AO8~#4U_ci*Tg6Q9MbZIC2ql;hE!dY4 zEPMuB?t(>X3N-*8q{Gv3d8x`BAb~VPgpEbQGY#QFJA*w-y_$?W08{nMaPIchF}9jH zBSAA75FqjZ@EdT%j005Omkqlc1l|^P*6ExJ|k#AEv?cnIkKKcK>CPXR) zSKom$eb_9B^ex9|a4&2KFv&Rg`+oDkjrjCwMuxZa|25`(Wl|%F+S**iF%^;gI0%(R zW?B8SM9-5v0Z)I{+*KYxiyqjvJ&QktvWW4TxXNJ|?f((usts>;Id4^IG3080Qm zH_r4<5&;yH0<6Ks0)qs-e&wx(>R`Z3(caEd0D@xHl(<^IQKk3_idoX7 zk3u)zJhMLEbZjCkXkfkA#HFzmvz#iue9gJWwK}gC1v)d9V%8%;cz+^l_BBYqSM%na zM**y1$1Wvw{|O(KllpA*UwgQ+TfJh;s>jD*Y}l~~+dC6N=Y*C1MvmPC)_$rCbf&9W zF1|Q9`=fv53R7G|d6Mpe&DfU3on+DTdkTO8!8zv=&pVW9v&LJiZgKcM3o)CwV!!qM zm9tSepWBDd{_9r@-#YiOyR1PgpGg<*yCo2r>~05bbZ+h=zi2C_uD!qI<-7q+pdl4S z#4$uN%WSn~fJnqfM(YL_lDww88-S<^hyZ`EzLYc;gx~C8ggp zc%bYGoRiGuT-wst0!frg)|}cY7)| zwmLJ;6QqCu(E-SXZ!zj!&<01v4nBaSq6CjmObp_T=V;@$k9g||Eo$e ztLa?|-(9X_Yjli(CF#tE?@|VgSr@#Xv*d04ZlUF>$J*ohoaLRZ+68@k!T8-qdU`89 z->kp1%UIUuYsfmKmtEPB6TTPpEty<6@zUgnomcW+pL=TCcFs~#JTq1NOJS>Jy}RVU zOXsrQ9z>?Rn4f>9LQ<-1L_xswJ*hy-fD;YZBTV ze=`!o9(Kx@5Ut_$r9}=D&xCp7NztsavYiQ^u1{U)8z$I&v9O9e$=IHtH;{o`JCn5QQ;TU=Xb1+wGtP< zQhBTXQkC&+pZPQIxKwGa%XEypldxoR;KWIjpH^PUv!8pqyZxM{q-bWU_?O~V(|Y&F zf1A!_y**-;uQFd%foFyUb7W2i$Bh+{pF*Bro&2=7a=+k{^RqOpu5X$sCVjo?Wx9`F zlhEe)JL%PnIoEL*y>&FyuHUcw&-h=)S#R5lX-jQypK`Btb4{~m+#Hdeo0{7H;r@Gn zX+@tG|K{ac<$pW=u{hf{W8cjnUda;mD=VamcyevTog?M9NAcQrTXy2ohh?sL7k)D!t*^hVC67)+oAUlyCU9q|drxsn(2#ciyf@ z_A#|ru9Olm_{8vyYkP_4OorQ%%#uz_ZcJC2+;g-)HZD<4kq&9-JlV(?;LXUS%M6S1 i$%)Lq@Hn5mjX91NlmI|+35vcKlNDLw*g}~>5efiiE$UMM diff --git a/tests/data/channels/channels/dummy_channel_1/win-64/dummy-c-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/dummy_channel_1/win-64/dummy-c-0.1.0-h9490d1a_0.conda index fb48758c67215569c7c77063b352f3ef71487574..890e6cbb30469c242e5b6c671a34e87e71a547f5 100644 GIT binary patch delta 407 zcmZqWY~|z$@MdPwWdH%UjEOwa9BvtDktQXsJ16G*)hn^^32w06bCW5kS;$36({#^l z>i|t|rP|Ymr`~-ua#neKr|i<+_fLBZi{|Bge0Q(@vUZ@5)|G3|r23X}GrZjS|Nj+U zp#TOm4vh&G6~g;>Zt7-`5Ml7~VL-7oE%K=Tl;rHc?nZYyyU_|&mUeAU$Rk?FX5>4i)S0U8$R$jS7fAb_!c2s&agDg z@bJ#tfyX1V^4ywC6dax~o)FDjsP&1#%#h8lh0%@cN|S4j{zt|o$|;f}4V|6Mi~-(^ dOuEdlaGspV>%ciqDXE^dVY{o~9p zZ~m{(o8ZT2!L;f~!xT}039=>!j%+!AY$?z>@jDy;LxC!T2t#IGTE1>dY3^hjMr)?9 zh{=_V&I$)iGL{xIeO<8QkypPrWAY`-#_EqOzn-c;%AS7iC~K+Q+D>enij zf9fzM9ylU#BFUNYc2dq2oyt|8U!DAPY|nj;PwBoQbF*)HboXZO{bH=9?$~)#|J~-j z7g@q5doo2bS-MPK#uSq{Gk{fx@!a91`X0%_G6%ZMFPu#jXM8Bx_Tj?0gtr^5-Z6Mx zO=>INzPNAWl{-BwnGOvnm?vo8aSDCHn3Kd)!@=AmvVyhyM%*K25BC#B8Vth1?92h) ej7+-BuyCH7$m|Ob=*iod;~*ShFie(V$piqfBdV|f diff --git a/tests/data/channels/channels/dummy_channel_1/win-64/dummy-d-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/dummy_channel_1/win-64/dummy-d-0.1.0-h9490d1a_0.conda index 408aa1ad14c7f9e6ca58778d857e8ffb84a16147..2a2f72eca959ee435d1ebd58b8b3d91226f05a2a 100644 GIT binary patch delta 676 zcmbQiIhB(qz?+#xmjMLaGA8mwbGT)sMViGPdoeNJq&^8O&cFbpHMZ*iO<-U@%EX|= z!Y8=k?SmJm?SB5>8@c85;T0VRHQ6Wbdnyt8{o8JXlNRS&4fc1xEar0b&EqoO|NBE~ zP*UryTQP?XMY$CM^p7*Yy!pRAZ-O7A1=Fe{4Jk3KDeSxkhPnpGu1RB!oLhDK&}0op zQ|a%F5U0Rsh)cwC`5BH)u3(gBbe=qeQMG;n+u9Pp2VvEQ>%Qy|F;JT;yhGf7L42Lk zzB0?5I~JT{HoD!n^lO^g%vUq-xLgvwF5?(?Ct=Ctz=@Y8KaE`bcH6s{IGd7lCs%lA z?_Mxpd(BVlQ=g`ng=MQ>t5p7}!w~mI|_4{@I8LyK)o9&vX{XOr4j`!tV`8ls8r%p~~ za;iTYfA+qAIwZ-c35%QrM$RuW5LFA zm-3X)i1&7V9mu=(zrR)hd)_GwxK1UiSuI9 z{+@t`pC1H?>ojSeVW{}S$A3IEaH^FmibGJefv_rr2sBACFf3^l1&UiuiA;zhgWnQ)MTHy@2N!W_iwumPFkGzopHZoj-BrWMg6m9%%6Qo z4N7Xgbt~qup(r=Q%boxKU*Q!BU@+s*m|#&MynpAWZUzYv1|J^=6z8y|MOuA$n=o0O z(Ny{;Bg8E*8sZf3T7HIQlgk<98C@n%XH>19!M3)*AS^#c8Q4*UPO z)VwV!Ds-I7ezQzxt@-AYA?Kf{O4J5JNNF+JrytJOb(nF zR_16Q9`U(+%2WNDZq89G}wLHLS{0ly%M4 zO|LulL`74>@b}T$ZRWEcbSYex6WRRf`|U^ek8fSv6ZT|V(R;S@n@raJKDKRM;6%pB z$xKf5yq*dT9!ETulroD?dCh;|^7gBSW(H*mj(2;7)PY9jM!Vqp0H}3 zl4{Gr7n$#5@#RtR$Y$oSe`uaKNKA>O)7as@;bYhDbKvgruN^0B=Sn zU1nI~nOw;1%L_|ApcIol`80E+8b|~bi=c=DVO0hZXsTjhSkfp46v@m>%b!@MIys+3 Kfh~<0Bnbe$iUsQc diff --git a/tests/data/channels/channels/dummy_channel_1/win-64/dummy_e-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/dummy_channel_1/win-64/dummy_e-0.1.0-h9490d1a_0.conda index 6c93ed3bcb50785994c196c40069b0898bddbdad..cbdb346a58bc94039f9dd50ff1fe2f6323a0600f 100644 GIT binary patch delta 531 zcmZqUY~$n!@MdPwWdH%UjEOwa9BvtDk*j`n{F|5`ZTKl-(jI?#22F0I+Ea$7-hDK3 zR(X6U?y}vU>iP-#sXHp;jdoT4_g?R!xh6PzwwJ{;ris7Rzy_?&J9BcfCZm6SScI2c zz)2g4l~F4kuU*J2>nLuYJ#(Q{Y{6-k1cv0a`OUhH49*OW42(=^fB!yNobA~4>4En1 zlcp{g@kw(czleJ8 zGK*LmT9$tP`--_Qd<0XCxe5aPZmPso*WY1Dynn{~%8MxR)CW;5+5M{xyifVZ8izA| zyLqrq;9Ke2IUoGpnI*ThSuFKpEUL6mJiIlerFO4KB~wh@ERE|y=CM<}TPjY~@AR{I znH|}4)w$;10&~C16F#o~)svlSoTfZ0F?{)=Rhw3X)$g{|JK?~f*b?%!izPi~v%kaP zkF)eeOX93wAG#KCdv);3lWvn#V)i)Q^Zjc&@e04~sXw1YqU@{$4jaU0Z`VKLv{;`K_m8CLHrkWYE6hVA3Aba%eNJqSNl?t?H$B7?*?7`& zMn+}+g!Kj9t52}p$m6NuVC^wk$;!R4^$7ck!vg0`l`x!Gfw=i1~#ChB&Bz7E2CC8Ub~Qajp3|pURqmL$-${l92riXv3{-V$l%1_z`%0m)9X(6>rEn04~Czc zoZYd&mM^$|z5j%4-b9(TiSr7}zFa)ry#9B?nb`%0j-M#k`MZl>GhP1rp;ndju+pQG z*70sVrI-6kKg-=J*yZLLra5y;%s8*hnb$kcFlQE)kA3}wC#JjLZJ}tI=gpPf&(ss< z$>vBT$6vq1`Mbnqf@5|^a2yv)aid-0;jJMpKjXW681<@sr(~~Qtar}U%_en!jJp2I z?8u(K4=shweBGbLPEG$a_3Vt^thT$suA!+H!|Qh2^8G&HAduV>^0bR3{m;)phr^Zg zMW^biRAR}7hbR9H=B5c@8GE)k3^$ltOO1l{JZ~GEN!LW6h_y{ zOPS&mn1na5S}^O?J4(&C#1OWHF`I8EM{ByYQ%f0pw*RXg%n_@YjOXl@E$vzPEM3K) znaNG=K-|M=VG}tw+?Dttz$K9x#4VP@-N~;at9W|>laCJ{FoqeKbeUmsJUNNk7aqxz Nw=>5fB21Pg69DAt-!lLJ diff --git a/tests/data/channels/channels/dummy_channel_1/win-64/repodata.json b/tests/data/channels/channels/dummy_channel_1/win-64/repodata.json index e0179cfb3..389b9f52f 100644 --- a/tests/data/channels/channels/dummy_channel_1/win-64/repodata.json +++ b/tests/data/channels/channels/dummy_channel_1/win-64/repodata.json @@ -11,13 +11,13 @@ "depends": [ "dummy-c" ], - "md5": "63aabe516762edc60fd2125a48804608", + "md5": "3f444debe78692289e67811c2316fc6a", "name": "dummy-a", "platform": "win", - "sha256": "f5e370e17eea2f30c2712d7fd7182cf6d32584a4ed7e6ea23ab59367824c40a4", + "sha256": "8222d7e5f9b215559e8ac911b064c4d87dceaab4d9054308eaa33276488e6e27", "size": 1246, "subdir": "win-64", - "timestamp": 1730882682691, + "timestamp": 1730898132124, "version": "0.1.0" }, "dummy-b-0.1.0-h9490d1a_0.conda": { @@ -25,13 +25,13 @@ "build": "h9490d1a_0", "build_number": 0, "depends": [], - "md5": "7108066567485324ad6878ffcfe6322f", + "md5": "3b5dd75611f655ad1aabe21a846ea3ac", "name": "dummy-b", "platform": "win", - "sha256": "8a73a081adf6c4ddb6d66f62b7be8be83726ff287168e505f5dabf6e598212cb", - "size": 1159, + "sha256": "08c1afaee9577ab6aeabf4c9918719b77ad890d63082e55f7edddd411c06b009", + "size": 1157, "subdir": "win-64", - "timestamp": 1730882682691, + "timestamp": 1730898132124, "version": "0.1.0" }, "dummy-c-0.1.0-h9490d1a_0.conda": { @@ -39,13 +39,13 @@ "build": "h9490d1a_0", "build_number": 0, "depends": [], - "md5": "2095877190911b58cfbc5403e4c567a3", + "md5": "088b5e2e04b51f3650653d524fa4c8a5", "name": "dummy-c", "platform": "win", - "sha256": "078d295c689ff3b4fa7dac6beef706d7979f27725fb17c5a173a8ee755b778e1", + "sha256": "00e1b007fab059653a7bb953de1b8745ed1cb1811953d742290504be6e888774", "size": 1157, "subdir": "win-64", - "timestamp": 1730882682691, + "timestamp": 1730898132124, "version": "0.1.0" }, "dummy-d-0.1.0-h9490d1a_0.conda": { @@ -55,13 +55,13 @@ "depends": [ "dummy-x" ], - "md5": "5be8b235959148e6027431e708a9140b", + "md5": "1663e50d6bb75b95808c877bd79628ef", "name": "dummy-d", "platform": "win", - "sha256": "f336584618f41a561e6004c1e64bd3345679a838c4a011df1bbbb1d8baae143f", - "size": 1176, + "sha256": "00d4b0579b61eff982db49f3227f68dd6b25fc1bdaf7e4736b3c876e4c06550c", + "size": 1173, "subdir": "win-64", - "timestamp": 1730882682691, + "timestamp": 1730898132124, "version": "0.1.0" }, "dummy_e-0.1.0-h9490d1a_0.conda": { @@ -69,13 +69,13 @@ "build": "h9490d1a_0", "build_number": 0, "depends": [], - "md5": "3e7f9cb688e7840e0bc4816ee16a01ad", + "md5": "4814b700ab73c8ca0cda30de842d4770", "name": "dummy_e", "platform": "win", - "sha256": "b9359b192cd8e35a302e69f640fa49db67395f0a52d3414a436ef3025dc830ce", + "sha256": "2f3a1cc01daecfc007d80858805e1a79b89adcc21c91e9a4b8ae125a1e658891", "size": 1158, "subdir": "win-64", - "timestamp": 1730882682691, + "timestamp": 1730898132124, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/dummy_channel_2/linux-64/dummy-b-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/dummy_channel_2/linux-64/dummy-b-0.1.0-hb0f4dca_0.conda index 22a04d058251348525f959ef340f3adb3213a5f9..b8fcd674f9bf1b268b330255159122b938b39e9b 100644 GIT binary patch delta 628 zcmZqUY~|z$@MdPwWdH%UjEOwa9BvtDkxa`9H74fA>bzNKI8*h!2>Z5!rwl<)JrU zzWYaeF4j7CId=4<9GhM8{k&)GchPs%Q#o&hP5hw-)*BymcjII=M$`Hij9^n4V6?_o z{l5te;$Qg~!XmsR0>1z8NeSDM#NB>p=FF;Q1&tq*-IkqIWOHV4VQ^+(Zi(EH%=9|X z(skjF*Z(yRB{X_{x$;id-LJ*q0|STQpISDL1i8yIf|#x@xEhsw&#KYcPqQ&LwWwp3*Jw!Rti_jFvcHnkT{ZL&-nA;H-myF%g<@{KCCU=uW5CDW9OxF zUbSC7imDoN-qd}!ajoPRgBLDBE|;v=bJg$H{%5$Z_*t^tj#a0=aI7ns9?*H?9OL9@ zCZ&4St-nvr<*yVxqSoQIY%1Hd==V=7^lB%?Y<3fH36geInBaB9ZPG4A$)4lC>ch0qhylavC9Xxp|G2tx_o}lQx_8^67!nIsR;}58VzfGIUwNT++Uf zKhag8X9G8b!%hPR?m0^z?J1mC!XR{Lf}BhDy3`h~`1|bJNq)~tg{ z+ou0uxFooVhwH$RBL@S#8JTpMVF_n)60n$yfbV~NQo^<*akt-@IkT!+LF30{w`FG)*&G?17#tbI-px3$E7~tm zHD{^JO-M&RC zYKps$+HNyFBE_Nfa&CC*{`;c;C9Ye3Hsp^9O|1&w;l08o=egGFUZxzT$%#x#_1~vj z%YRbp@D=Fw(dO0Je(z*q%rBLlX}vf8Bvi9_C?s_CO!RooCfW0vf6w{tR}IY=0^2_b zu&7Sz3uI4_meUBB%gti+Y=uftS+(iB-ly?B;xi8i&r{eR&~kmjhif~OWZ3Q|W;jL& zo>2B-Vh9jpJHnK{a>l(KepU|Li5~omT+`|!H5juBWFC|;M=ahG!W?ms)5Ri3VE4Rq z4&JvC(F`dejp~p2999OUX>7L+F>mwgo72m_Z2w E06x9|X8-^I diff --git a/tests/data/channels/channels/dummy_channel_2/linux-64/dummy-x-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/dummy_channel_2/linux-64/dummy-x-0.1.0-hb0f4dca_0.conda index e60abc044298c069e1d9a463869c91b32ce5e86a..22a36e7c6c12c443b43666adac3a41740776bf52 100644 GIT binary patch delta 618 zcmZqSY~kby@MdPwWdH%UjEOwa9BvtDktRZBjuZ1^b>1vAoT++Vgniq=QwE=AE?u;F zUw@zE;@@o|%>t4qd(2D(K9e)fWY!C&R8G zeoxuIL)U&>3jKcneO$cW`wJ&u&HK*X+gq%kz4WeL^3?N+HN6Z??;hJTNx3Ra@H*l) zX&0kp&vE`e=eJ)qG-C)nUcuG$Y0|j>_6%t`jgYzAyhh7bsT7q-o6URq^g!txe>T^L zZU+|`DqZ0&VPDRl=&I1Oft$f$rvU@^oTZQQ_7qMmVGuerLC&RnU1|&0efI5g2c(`a zJ#m0bx#4(Xufyja2aD|IdfF2fGWi{oJ+QLqY(QRli1{=xr#1yv4uMLBqSojYT{aEA zJ&pW{4HKERCJ5g4u3>n|5y{4ykn|`az?+dtml>9HCMPia!qd*=t;}(V#30R*2>`5z B4zd6M delta 618 zcmZqSY~kby@MdPwWdMPxt`m8pIi|X%MOxG!ZJwAPtCPXq@pnpxCi}L7QVBf#j#^f) zf4-QJ_iXx=4uwl6zsxlFeBQIBT>D-1RNfn56Mv|I^)7Wt;GC?+=wB~3!&5F`rH#Z& zwl=2LT$XI1RMSPPRv8BeqzW@;s2fLom2hNmVsK<&?f&$-(|LN8$kKzM=K_;YG??;w z*ROZ?Pv%LK>4}{8vGmJBvF|b88JAD?w=-XCJ+17nd(WnR??mTG`lkw8S6yeDZuXVE zYwKK&NpGGqL`?}X>O3|}%ywG+@t;Ecv9}lTsI1FgdTf?iWXM^)P?P$DpYBYnD>$@n z-BQ7CFESKZj!jrr!^?6(C|2*ha?OsgCY}FY6IT|ky_}K#Qt3$Gw^gN&ChePY^qR87 zPl;s@ORheV{GYNpRq^>DUBLjK%dCH&Y>&LWrhJ(;MEa`u420A$JI?q+# z9_L-3nEmJFs^9O+*V|7of00&t?l)^!PqBS=>#o{kR`Z>INE~Fod%T>5(M_SDtEX3` zlv%RpIRBpW+pij$F$A_(a5W`)rmtY$!pkqR>Rcr{Sr!IS-#b8PM)kWEn8jMK=H3hF3*A&Ke z@vJdms+YOMF*}{zX+zojT}(5zW~AI<)Cp~nJoUEk)v=J1CnhXsU{vN$SYP11`UK03 zJf0d3)*h3UtlS%0kFZbbn~)p8sHVow7U0duq{|FTI+GKaec@?m@>b?JL}HL;$piq< C!3X>R diff --git a/tests/data/channels/channels/dummy_channel_2/linux-64/repodata.json b/tests/data/channels/channels/dummy_channel_2/linux-64/repodata.json index 9de50ee45..f34b7c9d8 100644 --- a/tests/data/channels/channels/dummy_channel_2/linux-64/repodata.json +++ b/tests/data/channels/channels/dummy_channel_2/linux-64/repodata.json @@ -9,13 +9,13 @@ "build": "hb0f4dca_0", "build_number": 0, "depends": [], - "md5": "511324c0c6369a876ece2b53c737fbf7", + "md5": "5999cc251f2427c4020179f874a44ec6", "name": "dummy-b", "platform": "linux", - "sha256": "811c3ecaa81f3680d5deb18e71e923249485d18247f64c22473e69da7a1af3ae", - "size": 1158, + "sha256": "5973cc8ff460a97fcbbd31cecd02d41f4dfbf191e170176351a65f8549219b9e", + "size": 1157, "subdir": "linux-64", - "timestamp": 1730882683088, + "timestamp": 1730898132532, "version": "0.1.0" }, "dummy-x-0.1.0-hb0f4dca_0.conda": { @@ -23,13 +23,13 @@ "build": "hb0f4dca_0", "build_number": 0, "depends": [], - "md5": "1a00531fb43d3ebac5269ad31d509d85", + "md5": "83e6f2e970e6a485bbdde0ba355ad9cc", "name": "dummy-x", "platform": "linux", - "sha256": "1fcfc6126d2f3d4eacf87bd7e119a86bed85fbe9d6a7f9a3189238210668f8d4", + "sha256": "6a2ba209a1736f9bbc91e4770fd1dd9a6f448dc1be3504f2b934c33c284bc0fe", "size": 1156, "subdir": "linux-64", - "timestamp": 1730882683088, + "timestamp": 1730898132532, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/dummy_channel_2/osx-64/dummy-b-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/dummy_channel_2/osx-64/dummy-b-0.1.0-h0dc7051_0.conda index 7bce0373541c2cdfa5b6994194de2f2f1fa7f380..441e2b57921ae49476578e26e3fe66186857e4c9 100644 GIT binary patch delta 651 zcmey*@sEQiz?+#xmjMLaGA8mwbGT)sMKUcb)R>qbtMg`|;Y`)@BJA4^o-+6}bLpbZ z`|cm@xmfGm<=D}aa%^_V_w$~$-$mb5PvyK3Ht~lVSnr!j34W8+7)|RRGJ;KIfYBOT z_5UU?i0|cNP`lwN8E~EXkIz~G!ONR=sLY&MDDUjnZGQB`mYYYM7@QfL7$&yet?is` z{!QfQq0RSHC7IRqCPi1h*S0k}#=w$vCGWZPhXXdt4F5M~UC3H%IMJ%{@pJot)wK!9 zbCiCyJ&aDcFpsJJ$E|Ij&)LXTe)7IK%S`7)mh9{jBfX%iEx$W1zTBf8`SwDg&oS3H zDYmcKseacdmhE1WAMoquJekgTPL5`^V-8|cQcM!Nz8S1Lvf4H>a<|pzUBPcSz1{cC zom#Z=zK@+@=lvT;Owame@mdM1R(73vvup0_>{qv@d_1Nqx99b(P5bKK{oCQ;%kFqM zz-wh`Z2yC~ukB5Mkf&h_|HphO0wGo1)DYi`%O7G;X3aXNv~BtihD(B*c(@K6IdU+-n~_PE8JwJ$f$3>- hG_x-}K~3Jk9LEbvU7!>KN)!(#OS8nW`7nc$2>`(A9Etz{ delta 652 zcmeyz@t=byz?+#xmjMK(x=!SY=9uc57MbSt?cl`xSe*>+j=xhnG}*TuluF>?chs_a z{WHeL{IhqKi@?j2Up_N_K3CcITj=}VQ*1ff6Mv|I_40|W@t&;4Xj=b>5o{_0jMmty z|2Kg_{3sv8GjUJ3fR#29E7{tZT60-~T{U}W%*yA%VYX}z42}#A3{$@R zoV-0UOQiMU<$L_mClU;OoXwxtOKlT7WN~d#-RoB$7VDlh{r>o*SZs;!p)#F&clbFL z%ST>nO9>CEb*(Ql;tO5ocl*(%jsGGz!bJ}xEGbmGk#ys7!23(8>(0(NDB+ROsoUl{ z<;k0NwO#p*zs}Cv{k`VY47*?R7dHxAbDB{!*Fmwc@c#?vV-uGC^Xu}R+M~VrOmefo z{crVWp58Xz5y9eu>D9)&EdQP~bKU>7_rtOcYp14}F6dZv>fVdZ`t@yr+uayB51^>WEq@%3M##itj$9o(|nwfz0{xPzNc zJm=6_Q+DiCjf+AY5u9v;tOPB*V z+{*-XZ%h}|sga9$)nsC@lyOZ4^EH_=LGgK}EgWz8uFbnr$i5+j)p*Ws+0ves&(c-= znVH<=4#Yj2woXYn!8%#N+2epmL)3?kTvfXXB`rD4Tn2`g1_9oTOuEdV^uz*6P?MvW fec>r;@_ObtUQqG^B@s}ncr;mxC63LP8I(={7g7@N diff --git a/tests/data/channels/channels/dummy_channel_2/osx-64/dummy-x-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/dummy_channel_2/osx-64/dummy-x-0.1.0-h0dc7051_0.conda index 61584cd5af8ae8ec31485b79cdff4f41dc936e47..bfcff63eb6e4dfe9d9f3f815df28e4f93f21548e 100644 GIT binary patch delta 427 zcmV;c0aX6|2>l2QP)h>@EdT%j002g4kqlc1MrdYPG!iyJk#Air?4dE4CC?NGw!z9U z@|mTgv%Zgx8Ke7#6oU{M$&5GY?w^zT?l#=_Dig4+k@zMEMrdYPW$h#(lO_RDe;H8M z1N=;_5K#zKZ0wzxssBw006xXYv^m5=07C#m02HTrcEY8sMMc5rZSQKzppnef*yrq3 zG^GqgKuXTH?f?qZqZ*Y`;2QQKh*6VUfrC~`fqM}OWKCPd?li~?ZOS-M*5!vj^`J>4 z(MrN_2MO~c52AciGP8;}r-|{sf0XgO$na@xN@ix9Hf_hYXFtXHo|YQc(kuL-(pScq#QAUFeu|8t`Amw`Yjw4Ko0O;o%^KF+d(|R_t;(WMo764y ztv|z?!xGf#`3+!}b<$^^sbnVi0fEz4Yb};JNa(G9*GCwU`Wu9vjGqtjD0DxmQ~js! zK7De$+nP)jGX9XRQtKzvBvIZ{&|tXv{6R4X24@CG2G%p5UUj-(Z4z0!@%rA$*(Vm5o(qa! z?LQ%#H&JG7VqI?8hl}3()9fDP{Cx6S@^{3Jnf(%~@>e&tJxROvxJxxu%71ET``ow+ zCqaKf*Ujt?7L}+>E?8SA++umYe)^9ULE@2-X%M2=D%4Oq;=?z{?XDYUh>Z^rpYdxyDq+OvfqxVD@pwme4O3v z+7c~(uljRq{fna+UsA5AGIgywwP^jGqHLLOj2wv!iY*~eyN<;D-Y)Cl{4M_IysjibF SnSJ4bKY1N<93nJDSTX?w+QbI{ diff --git a/tests/data/channels/channels/dummy_channel_2/osx-64/repodata.json b/tests/data/channels/channels/dummy_channel_2/osx-64/repodata.json index ed4e00617..3a21f0664 100644 --- a/tests/data/channels/channels/dummy_channel_2/osx-64/repodata.json +++ b/tests/data/channels/channels/dummy_channel_2/osx-64/repodata.json @@ -9,13 +9,13 @@ "build": "h0dc7051_0", "build_number": 0, "depends": [], - "md5": "5128f8b1901245f0a3e9948982fa553c", + "md5": "017d34f4de6894ab134b67aeaf314b11", "name": "dummy-b", "platform": "osx", - "sha256": "80477e99f4a5762c156b326cfeeead05066f1a2e04156bf2df0e92c459dfed75", - "size": 1151, + "sha256": "c7a6c8596c39218a0b11fd40ef8ae1b5ab63995b94ec3644dcca6fb8ffefe763", + "size": 1150, "subdir": "osx-64", - "timestamp": 1730882683186, + "timestamp": 1730898132631, "version": "0.1.0" }, "dummy-x-0.1.0-h0dc7051_0.conda": { @@ -23,13 +23,13 @@ "build": "h0dc7051_0", "build_number": 0, "depends": [], - "md5": "32a4a13e3b35b8296d29ba3afadae3ad", + "md5": "54adbbf15ee081c9d6728556263b5f0b", "name": "dummy-x", "platform": "osx", - "sha256": "5467e5c8e3d01c694cf60d9a75fcd3f073185d684d2a528464b48c906caee3e4", + "sha256": "75454ecb66f5921652e704ae4681862f37e379e8c8eb09fb4ad8cd78069464a2", "size": 1149, "subdir": "osx-64", - "timestamp": 1730882683186, + "timestamp": 1730898132631, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/dummy_channel_2/osx-arm64/dummy-b-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/dummy_channel_2/osx-arm64/dummy-b-0.1.0-h60d57d3_0.conda index 88a9383672dad0d33d281a53f964c787d1f6a48b..d0629152129ea83453c24989878a5f4658695362 100644 GIT binary patch delta 656 zcmZqSZ06(%@MdPwWdH%UjEOwa9BvtDkxa`9H74fA>bzNKI8*h!2>Z5!rwl<)JrU zzWYaeF4j7CId=4<9GhM8{k&)GchPs%Q#o&hP5hw-*4w6Z^4(-LM$`Idj9^n4V6?_o z{l5te;!pV)u3h(#2>AZTCnao45_kKZnKP@J6*PWKc3XBsR6tTjApW_Fmx=7Y=6r27$x((;HZx8TM+b2Jl9$HGQ^L*y70)p%quX7DUG> z)upAzMEE~v+*yCBN?Cf<`-Mw;O^$BXaanQX#6bhobsKZR8DDFB zV$a?eXsh2-9u)cXYNc?c3}gHO2Z$MpOiX$1$uq7d3CnmJ6Ra>OJ!$T zuR_NXGj=zH29F~iOG=rgI$rbdI=lUb)o@qI9}3E5#KVV80y&~wR~ zZ&^0dr}s61Bn}oECxXf#cYzIJNa#79i}-l&zK=15#Y_pq|3|!OH`8+ gn0?`?YVua*I9^Z^10@qs%6K+efhCSDkQtO#0KGL5MgRZ+ delta 657 zcmZqXY~kby@MdPwWdMPxt`m8pIi|X%MW%UuJ2){vRwskIyA%VYY1c42}%;43{7K z?|XDIP{b{`+BrwD`KWT*gXgu5EDfSaC2uJfw{`BQd z|BAHRPXEp>$vM9;_=nkqx)&J=En5Ya-B1rW!Ps5xA^)K_tIk`qZ1Dr{$ip^fKTNjF zPnx&o$j6e>Z5=;v&Axc{rN5ciueEDS%J)qTn{~0lY0|2!rN{S4Osm(O%EXcQ;a>H` zFI_JAx#igmy*J*3U0}O^OmE%P4S_ELc3N!kQeVA4V`=oR9dnGi(&p;!s@{H;Yntmm zcL&9_#+RNayD3cYIO4XXlv%3dHUF-&+pij$F$A(#h_f73kzK_1z|1COgO!9%%9%jV zC2ziE+DM;%e3Wr{^U2d%i!Llls9&V(vVw6>`@+@@mJ{LI+DS(&uAaCQlU zkdvUC%js{aEZqOu`%D>3ET%H9N?^V(QzjTw(YG*qg=fNd$w!f^I#TX1&d6$S+IcVV zZiE)6WRr-3!xP36qIoa1j2O2Wvl+E8yA@q&a?erx*tncIMZTn=^JF7qfHxzPE+;cA kRZWg(_Jt>_$y=D?ctL3llukfNQ`W>8`Q0R3AQlK=n! diff --git a/tests/data/channels/channels/dummy_channel_2/osx-arm64/dummy-x-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/dummy_channel_2/osx-arm64/dummy-x-0.1.0-h60d57d3_0.conda index 344ac8df7827dcd6bca85f51a0fccdc17cbe4aa7..0376a2323ee0b62f6712468485a3d985812daf86 100644 GIT binary patch delta 194 zcmZqTY~thz@MdPwWdH%UjEOwa9BvtDktRZBjuZ1^b>1vAoT++Vgniq=QwE=AE?u;F zUw@zE;@@o|%>t4qd(2&#<@~Vcbk15TOD$f z$V+26)Hc!UW^<9g)~D84Q`sipWlU1&dT#J;t8&4QqwCc6e^am0)mnUdn`?ui@AN+> hwKp%1l%E{W^q0vkV{#m`FWgO&H#5f}ERkf%1OWWZP<;RZ delta 194 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 a#Ag7QJ{TR~&B_L1GXtR<(4-({5Dx(7*O7w& diff --git a/tests/data/channels/channels/global_update_channel_1/linux-64/package2-0.2.0-hb0f4dca_0.conda b/tests/data/channels/channels/global_update_channel_1/linux-64/package2-0.2.0-hb0f4dca_0.conda deleted file mode 100644 index b6b583d19e55959b6d0e7c487a7a8f8126b1a537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1159 zcmWIWW@gc40D-BlX_2QHQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIfd?V)@bC}_(K*NE0bPE!bvlG)(jdTt4 zjPwk2Gm;F_Oj42);|=sm5{vYzic3J2CPOWS(HdLz|0Xc7pJieQYT*-Hkgu>XU&1P6 z>c4A2XV+P@Y4WUVHaj2@wI_owahaE{`F!U)yJsrc*WU{)w7Y*dhbOD<+NEeuz84`} z49|AP|Njyz6u@TYp)ujd0pH`UVmw?7)6_n&qPl$7s%%@B%hiA`&&*59C(h|l7$I(l z(GaJLU*%(Plkk!YSZO1%lC6!YHJ2sWRkL@-%zT}IC6kgEGt`YEzDhVUI59Xduy+6Y zee$xmZP%j*TF+M)rW}~lwzTTKyMHoIqD)WZ{Ewwy9*R9*_q(E}Tkfvm1zGRi@0btW zIKFg);z@DS_=O9ynZvjJX?I$Y?xI@l>(Cr{Ozq-~%ZrZxI#IFcQnqwYu&nwJ@w4igxWms-^p>|*H3ZOmzW4JC3^&GiE!xa{S&l{(GGl_z4S!T&N8!`iw?Ih z{uBE8$mD%fj)u9qu86{TO5$#0Kjc3jUi$0ynar@cmqj@eKisRn z^red>J!bRdhPLXnU7G8smL|#{ap2$Oz_9nD#OC@wWNW|F@t}# z>t~}whrT!5=4;^n9K=)5>ia;#a*m+cdA^p^w-MiczP24JXIR!{O zz>-D~3nPocq+v9=aiDAj$_XG0%0@7-q%juABsx>Uw83a}Yd~oplxjg3l;&YzNuxMW bg!mi)(+8siyjj^mY-S*o1DX`f4B`O*81|2N diff --git a/tests/data/channels/channels/global_update_channel_1/osx-64/package-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/global_update_channel_1/osx-64/package-0.1.0-h0dc7051_0.conda deleted file mode 100644 index f9b296ba8dd6e7a136d4dc6be0a9484092aa67b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1230 zcmWIWW@gc40D-BlX_2QHQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIf+(W}{3(Rm8py5D0x&?{J*@@|?x(0fN zdIq`~1}Vwr2BwDb26`olMS4}mB_KPipmxG&jjj5B6BxK#nHd(f@C!{i&lsTpT4Lv2 zTd5qUwyU4{Qv5k%1wOJ#ddWQDk#&l_{-{p4gyZLJjY(cwF0z;O|4S==?R$H#EBB(J zBDbIdL*Yzaz8{{f-#At{FfLix_w$^JY=gyyhu5C8(y_E%KI|-FnBOrQ%q&D&|r;dsb}fX{Pc=>zUd?ur-NSKoxB-&R&99m zD7(}{Zz+S2>&lbsb2Zi&w3!}T^CfxR&SUouiL^;>-lWqvRqE!E2WE?2w7ghpa^0@^ zUgx_(92L}yY@(iUEW(%Ohx_qbvb+O*luB) zoGl@VhRa^;+&5v)?~ar2v-0lhguZfM%+Gw6(9=I_ zSrZBQ<0kEE7F{|z=a1@%QjV#|p00TwW6d2qU5x)mL$=G?FMZESov$lAsq;yyXlP!z zyZT_ki34%ZSoqd#jkz)Vy>#>WO22P2^5^xw&Y#nAq0s#E;r5B8-aAb6joww}+r5=8 zYwS#}SG>6L%1@45o1KOEar?6wy%Z*RE%BIaB|hab|AEWXUr9(iTrn(SI`nJOxg-zH zBMkc#mOL(bA8|rx;n&7ehXrq>XJlC45GX6UQ(3WWZTVRaZPvd63m)W&-1?>6bbP^Y z-dK*=%nwD`7#K9T*=ib%Lwd~hCi87@ve?v|aWKYh!w1WPncSCdTw&jEh&Q45glkO2 zKE;rX^bOw}WXl7-V%TQPX4k^##+7wYaoe;X z2QC|K;*&aXMC3q#HzSiSGivSxWk3)H#ZVD3^c|ItYVu2@EW0)MaEKKF`3k!RP>QR$weJFfaq54A7uC%pe{B D!v?C7 diff --git a/tests/data/channels/channels/global_update_channel_1/osx-64/package-0.2.0-h0dc7051_0.conda b/tests/data/channels/channels/global_update_channel_1/osx-64/package-0.2.0-h0dc7051_0.conda deleted file mode 100644 index 6d76bfdf2b3c1ee163c4d072b0da93984392476a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1231 zcmWIWW@gc40D-BlX_2QHQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIfT;7HMG|X@npy5D0x&?{J*@@|?x(0ei zdIq`~1}Vwr2BwDb26`olMS4}mB_KPipmxG&jjj5B6BxK#nHeUv@C!{i&lsTpT4Lv2 zTd5qUwyU4{QZyHKE8SCY?rfg3(0Rq{s5|*he2Vqbu0fuyE1Z8ltyf-hZ{ywQjk;DU zDU5;&423gw`F?n^e&bl-z_?=JqM2ux$T!^Bl-&A1R>6`rfn$Y`yn^h+)BpzS-~c96 z|7@0jSOxQsD$qZfd1?7Xc}S88;v*Oh@sN0}0K>K0L2?ega(C{yWiN^GmZYC0TkH5NHC)-hPGp3%%WgB6GI{>a1}Vc0an@&TrfIEl_dB=2wk|AVub55F zmXJilWgT(x9_MP0JSn%#JGU`J@j2%Q(|k2It<>WCYP&V%d;k2+OXSXdD_wsw?(wu^ zF1NftAJ@{_GGp?7mYsYHoeC|v%XV)&Uz+)G0q+jC33KmVEGYCbZ%bsKdE`Sw^Fhn! zVm$3UZ&Ljp9EkdC%#-@*vAw6X-kUh{5|Lj^Hbu^xd|o;G+3u5SMro5KmTWum-qIlR zo4C+iE=&1FDgV4X(l7Q!dn+__c}$#eg;9LUWBvn|r@xYrcDSNg#B?ZY5?`W+Bl)1}}$5WkXqO^sX+S2Hw6#9z{mw#;Aghx2kp@ zN;=jwa~T-=8U%PVGU+m-W=~KK1YuD2gn=cEAQnbug-OF`bmKr75|pVx7?dGlU`b;v zkV$Ozgz19O=(d2e2`Ht5FesbAz>-E?Mh4R diff --git a/tests/data/channels/channels/global_update_channel_1/osx-64/package2-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/global_update_channel_1/osx-64/package2-0.1.0-h0dc7051_0.conda deleted file mode 100644 index ab79a17d12504db30a8be57fc385dbed29d338c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1158 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 L01aBo4B`O*PM4)( diff --git a/tests/data/channels/channels/global_update_channel_1/osx-arm64/package2-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/global_update_channel_1/osx-arm64/package2-0.1.0-h60d57d3_0.conda deleted file mode 100644 index 59e218fad4e827b6201b876c5dd9ed836f32b1e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1158 zcmWIWW@gc40D-BlX_2QHQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIf{DcEX2h4C)py5D0x&?{J*@@|?M!E)i zhI$6N8D<74rsgTe@dkP&iA8!<#U&t1lcAQvXpODQC%Lt@?izci;L&oddWy_KclO9z1+_-dG`NWPBoR|JZEh&@C*L`1@X^`s4MWyl3#XyRuXn8XIE+jmHjqZ*85cd z*a^PGA3MDk20nC+<_Ki|ux^gnp=SAbQ|Z<%)A7dRi%I;oJoU==^tv#RjYL{r>|QVkPiAHg@MdJvWk$_Yplk!epgaWw zOBz8ej2s4&hSBK8fpQTjBY-d{7s0@i##kVe=sX3}2BXof0VR1*q6J}4l81pMjp9HN a;xhnDAB+z0W@Q7hnSoFaXi^X}hz9`6Nrff= diff --git a/tests/data/channels/channels/global_update_channel_1/osx-arm64/package2-0.2.0-h60d57d3_0.conda b/tests/data/channels/channels/global_update_channel_1/osx-arm64/package2-0.2.0-h60d57d3_0.conda deleted file mode 100644 index fdd726c7ef0035f74f114456ddb808df25fb71a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1157 zcmWIWW@gc40D-BlX_2QHQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIfd?V)@bC}_(K*NE0bPE!bvlG)(jdTt4 zjPwk2Gt3N9OwCh_;|=sm5{vYzic3J2CPOWS(HdLz|0Xc7pJieQYT*-Hkgu>XU&1P6 z>c4A2XV+P@Y4WUVHaj2@wI_owahaE{`F!U)yJsrc*WU{)w7Y*dhbOD<+NEeuz84`} z49|AP|Njyz6u@TYp)ujd0pH`UVmw?7)6_n&qPqO|-pZ9Qm#YC?o|%`HPn^>qF+$u9 zqajWgKg!4O?Yf6tz)Bm5m2Arz+;UigT{%ymJtJoj8hX=(;nqo>Fk3cz21f>ahRUix zC&O(lyAEY!<#*_&Y>-%{-2Ks+FPb}1Cj06AT~>cGHtu{@x98@P$?JS?^u0Lyw;|wH zqk67Knd!ywW$gDuRuw!xyV^KxdO&ZUD`So!Ptm8t=COyuY9yxw{c~{g&oT5lb$PS> zqFK4zKh0-vwr%%&c-!IE!o`gO*PLb~&390go8R+JvG#!Zs-L<`Z}c|lr}9qbv*Ufc ze1^JSp-t>uU8P+=#9mH2dOv5%m+0u1?`pKyZrR*wZ{Z*La-)7*sx(L9hkMl%zjV3e z=ay$P@IHSNc7g5wF}-)y&ps~@=2#FtXUe@N|2JLndilre@!@=bx1aA<_B*E*KbMc4 zRea^5q^rULk0WkeuNkF2@b5ai-0Ikpz7KjFU7l9XvI}xcRs@t9n4FlkYSD=sxff?F zo6dZ_&`vUEN9ckV{E8I}_YS^vijd$?e#6M1!OeV#X$#}Bd-ryDSRLSQ)Zky4`q_x7 z^?%c29);fdPCN;%r4OWVZCmKPA~xZ>ro+l1 zQOQu<8oi>+rop$Tkw5W($Bd{A9dA8q4!o4O$;N76m}n5-&B&z7jGCoDxdwzmSqcW0 zG=f+d84M;3qtT56Wg<{M0AWxjf`KKCu|Ou#Sqi2NMx$E;O7WmH3&Nlj4+BdY#epKk Zr+=6}7#-lv$_8RH1ECzyq(Ej64*+&nj!pmo diff --git a/tests/data/channels/channels/global_update_channel_1/win-64/package-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/global_update_channel_1/win-64/package-0.1.0-h9490d1a_0.conda deleted file mode 100644 index cfeff2940dec9b9003127096d7943a16869ab391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1238 zcmWIWW@gc40D-BlX_2QHQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIfykp-+37Fw3K*NE0bPE!bvlG)(bq(|k z^$c_~EKMv8QVbL04fIM9i}b3BOF(wkL+ymo8e8@MCNOZXWo8g+6%bsIuaLnp&pKr4 z{9Eg8iXJy$J+|N5)pJY1MV=SE+`FU`cw`Q_OpW@dcJJ)d9g1x~DxW*;n*HCm*wu4G z+dQWthv`g03Jirab@_gHvVP-O;lQ|LA)j%Xr#XY+gubi)%bTBwG$=0c;_Y7c zYGBA}fa*@H24{Co{k~_abmEaok`w

df1H!jTX^a_@62Bo)ekPm zOuc&0Dm`UFX8xRA#%~qp>cgbT0R%)Zr8CeR!^u{yVvWb%#;l?&v;+kvF38D^IYHbd*NQvV(~_N3lDS1 zUq82R-|n<28xJf=G<9B5yf#>Q+djA1|DW4zlk`%U;B~}pvX%Ih$NUE_Pk$vL?Qq4g zi0RO;N#~MIa2#RSr||gWp6WMg6E%JvuzIjwz~fA(ybpuDWu8UNTjH8I9N;1PY?dwL1;8iBqy3Q+~R${{~&VtzH5n0;kj zQ^0&frc6*^ULptoTb^rjs~__n2q{goDF6LR!ujkOj~Q$%Z8it?9nuYPl{=tz>_EH0 z0S`xAizC;B!K^YN*LAewLmNbG`7Z4WrSG1LaFl z-U4AzzJ!4#jj=!`vAGnc3r3^c0?H_$v<||ci~<8o8jTnkh|e}KZ7@2(o0Sd3W(GnT Kpg~KRK|BEUO{`1+ diff --git a/tests/data/channels/channels/global_update_channel_1/win-64/package-0.2.0-h9490d1a_0.conda b/tests/data/channels/channels/global_update_channel_1/win-64/package-0.2.0-h9490d1a_0.conda deleted file mode 100644 index f37d96b0ba2255487afb37d5781c2aa78f6bf75a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1241 zcmWIWW@gc40D-BlX_2QHQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIf{FY|j9hl)NK*NE0bPE!bvlG)(bq(~4 z^bB+}EKMv8QVbL04fIM9i}b3BOF(wkL+ymo8e8@MCNOZXWo8g+6%bsIuaLnp&pKr4 z@~t78wfhpej(bn;nw0Tzk>mww@e=a`5*96;T3cg&?VWwH@bk03BI%#*o?SZQS=Xcl zUfb3u4SK9X3Jirab@_gHvVP-O;lQ|LA)j%Xr#XY+gubi)%bTBwG$=0c;_Y7c zYGBA}faPpJYum6?~8Pn56Zm>}MQ(GXvWFBM=&lL?h`$d$V@DgPe-SwF)Q z9WD0_dGZgv3-V6Z=3ng>(ZJ--;LG5}(7X6d*!W|{A)Rg0KFP&+)tMyS>}mh? zV5cNIPt=cV`wv(jnr5`+SF`#m=lvh{2syg?i}&1Fb8KepXW!#m2F+|&nt7-2PvtnZ za^m_Ma{0z#{9Hz5D_jD)U+las8nF4lz|XKe)8}GS3i+I>=bo~9=^gp&Fc_~crI^s6jN_@&={sWh%zmkx4 zxMEnubm-Tlb4e#Sjxg*~c>Hls^_#Sb8ov%$DFl3*I3wA9hCp4>oq`|B*2YUOG-Qx> z5{y0E6#bZM>Ap*U*XgyiHh$o;W?=APW!`r{QtO!XbWipOMVXt9TOLHYt@u#6;|ptM z&MW4Khin@x-zX{A92StfCAr2n?6_>h%2#I!-hI1j*fwkCL<3$9p2~*W*60;oHVwW# zjr@rX6Puz6I@YS%eJJT!)651*bc{^8%%~X^lovr5lu=<|Nh64bk!@kpFgm~+)i_Yr z1Z6J}24zhcSkf2^WD=WEVY*;6x-Fo*0!r>649Y7ou%yw5k%9P}1Jeeh1H4(;Kx}3p MlmQyFoEgLe0HRH;{{R30 diff --git a/tests/data/channels/channels/global_update_channel_1/win-64/package2-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/global_update_channel_1/win-64/package2-0.1.0-h9490d1a_0.conda deleted file mode 100644 index b7df01936cd4572fa5f03ae9c11cc1fb3c6a8f30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1171 zcmWIWW@gc40D-BlX_2QHQuY2r0WX6HLvCtGVoG93qFz>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIf{4hu90+`{dK*NE0bPE!bvlG)(jdTt4 z4D}3jGb~Lk4N?pf;|=sm5{vYzic3J2rb8`-(HdLz|0Xc7zhz=L)WR>gAYUPaW1e-$ z)a6@4Hf#4Ka`C+A<=!Qoz@r;u(rysAblU9GzpKqBKYn)hx8^y&U9-In&x)#kT(fZb z1eps_;ZXF2`1|1&;9#q%gmg9DVxn2$E`pmqveBzw{ zh7sa^7!7g0xF|ovv7E2CC8Ub~Q4)=}I(d*(tZCH_r}`Uc5q^P6>@8JroM z7=juaBJ1sczKEKz$mYkX$|7FDEyojA-TN*4B+6OBJ^M!b9NG67%M$mOyWHfH-4^pJ zA#Q)UPWS%DQ9C9)IkRYe#HFo_e5<#ddROz=y6W5`AHh^(u7Ym=e4%x=c}*MIbrTo4 zUEg(-`MOd}bxdnyP~EFpJB2o!*Rzv&ynEeT;eRhP6q>IIEWdL1+=2NU9!6;$+85Vl z!>DKPJ0*MN?7qTyrFoy?->J^slO5S}^{`N4j*Qva?oI1o8Lyjqc1CYTTcYY7#$T($ z>f@`KPB;i8_k?`yVo8rF_IGG*G}V5wr|eqm)R;?blVWerPg&q@;Pk@N^pwXhuem1@ zRhF%sc-bMNuzaQL_h~CqQmjo~6ef5a@tCxWQGCjA{sWh{Uo|vi2xPAiXE~}OyNK_B znNh+9D`}mSz|g`cZ@y*qTt40S+Jc{l>(E^%*JO^iiI-$s*ji#6O%9ncFg!iPpi?ld z>+>UejX!(0D~M@DFd9YR!Yv# zOG%6`$WD(>%P-1JEQv2mEh^5;&r`B8strIfy!x&%Bg}ABpy5D0x&?{J*@@|?M!E)i zMtTOi8I~rN1}TP#@dkP&iA8!<#U&t1)1j8aXpODhi52o3;BAxp-dma_^E(;L(jUX*UR5I&Jpp-__=mA3r<$Tl1XXuG!v(XGK*%u35Nz zg3N`bTnxvG?f<>ZR$0K5BM_kQv2k`^w~mAegN_da531|U7VOc6xn2$E`pmqveBzw{ zni1lD7!7g0I4?g#+6*s=fbW0yJDLP8pO+&YdUeOqfGHW1-IkqIV{>Kz!zr;l)0JM= z*}5*QcvJ6rETOaO%hh+b-u*p>42=?-|LkS+X^`4-$&#@;Af|BX@udxhFXtTCTfy}A zlkmr_r%xVbEtR{yam&3kYQeUXXM5~=G)wtJw{%a5kycRErkIz3yVqJz7w4Z_Y@~JR zl-`TyT-pEnHvL&T_v)?A(t93u-VPE5hHRT|1h}1@wA^Za$u#q4f88e7Tf1D`sVtqD zP_uS=-LWSsT86)m)^0Oj64(8pOX0Gd$mUPqZ$GkseCuM(-N0q@dUCbDON!29W!xN* zotv84|Ka|7e`!UNSO4Z+F1h!n|N4`{E$8}|U2t30?9kU3vv>LAJHOBTvgr)uwcWZb zI=(jJ#Eg?|?;1DnQlSaI*ylPH&bRyE(61p`2I-<{e zyO%Ie5a@ZQ5M?l3P^U(2#}$UG4cx{DMDI5~E_mTsVS8LaZ;SB_<15@JcQ6}-&XqiO zx6kTWP_ePl5=KTPeus4h-r*BDH_SDhpeSQ7X|b42QniqLftA}eN9Gwbm?Q$c8JTpM zQS%ol3xO~wf5E_#Mi2`lx51=gG`ex190kf0APmY;FtDUC7RV$zf5EiDXmo2pNgtGW lK^T2i~!RIqXWEI*+6V&Ad~}|6vqtW0RZ2WklO$N diff --git a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package-0.1.0-hb0f4dca_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..943a782c41fb2c17fe9bebd0357aea83961fccbd GIT binary patch literal 1237 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fc;kF0z;O|4S==?R$H#EBB(J zBDbIdL*Yzaz8{{f-#At{FfLix_w$^JY=gyyuXsrR5XlA$cZ(2>B$YLtL|Te zrk-*=D)+GKPcgMo~A~r00LJ)RE`9+RC$mU3!Pf4Xq97LH`zI+iaa`tC69T z(+U*mm^A10g)4X51L|fTT9^DeC0qETWqbFOb92_+56rWgul)1j_Ddqicc%YIulCW- zo5&Y3$A0Reu#TXAlOLP0M5|^;v}{QH8Z%#l|5n4=5balzKJM3Z6UE-$Sau@6p?TqM z>8?A5EAq0L&VH@Yz4T+9?!}px#HQvi<9U<*AV%!O-81|DC`EsdkrQ6ZG*@Ef<9Ue^ z9S6Q$SCo#PT_19Mie$OkH)nAlg$9o!9&WGLBzunY?>WEys-YP}Ao~XamanRFk4;b# zV6I^ZICpvNXGL!w(Z%PO*jP^OYwRv#=1tuGc-dj&+`Zjy5r!|?8IG1OK5#8w(1z`9 zVunM6M2FxsMur{YYzd9Vp?l2VP3B8*lDKp@>tejyiVw99!k8nN<7P3g`N8R8u|{Fn zyi5-9TawWXDXR`lE@V$w6=OW*w(Qm3m6Ika`ZF@Q$sLG$D7IKhJfS%`pqDancP26`olMS4}mB_KPipmxG&jjj5B6BxK#nHeUv@C!{i&lsTpT4Lv2 zTd5qUwyU4{QZyHKE8SCY?rfg3(0Rq{s5|*he2Vq+ll;6|S2+KATCcq1-p0Gp8+ENz zQWyml7z$_V^8N5+{l>AvfpNvcMKjMXk#D%MDY^B3tb!$L0>=s=c?H>tsR0bu!2wLD z{^8wiy&2{oRiJ+|^V0H(@{l4E#78h1;vw<90u0ZhgXJ7n+uS%dw=tqjJKWWG$$N>m z^5oN#LQcIZi6}kN$m_%4&EUy!L;lG`iECar9%Mgo@T`k{@WrdxK;ePr^Y*n%HgNDb z*RQvqymqR^gsmFqcQ{F9dKIsgZhUu8A~rg~c}m`0j+TuRwG&$u!Y6%c3|Y@R@$8hP zn-0Clz9BsE{pdAE1*-xn>R-;URN1+OZ;|KmK{?By12 z*H&267d(pU2>K_iY~7r#T6{z3arcjtb{oYk9OF+Wy%Ockxs&a4_)GLHk;-H8oeMwQ zs}6X=!+7p2qlx%$$z|JqetNj3aN%8zy?b_9tlb>=VD^R7?lbP@(l>YcriHyqIh=n$ zdE0rOmocwv4)0oacZd1u-!H^oF!?GZbahPZxyCEm^O}Fp`R!K?%@_jPKM1gxs>mLm zU?jj?z!1Q9d9Aa8cZlfXb4>gerr+XD{5#;fqmgaH?ZW2|B{$y-b&HVvQr_@rcVNQn zH5?6&-zBO9%2+>fOlDx1(#p8;K%~|(^L3N?E;vbCYRTd7D=sPbQau!Y76&T-$9#BOBKCH}WYm zDqC)SAb8umCgG*TCSI?G&XbLd0p5&Ey3DBA6qFM|7?e$6U`Zp0g^_7t(l8p`I8ep} zWiAi~WlR`Y(ijV55}Qq7x?nWAEuicIO7S2J$}TXlq*0fVf%wb=(*~mhyjj^mY-S*o L0UETF8N>qs2=B2> literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package2-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/linux-64/package2-0.1.0-hb0f4dca_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..327296c5a77afe89096d04677ab0d36ea2be15fe GIT binary patch literal 1161 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fcK~o3uz#6n$8IWo?NYQS--{3~ zhG#qD|9^=U3Scwy(3tS!fbVfvF&-|4X=)!>QC(i!-Qfvyxf;;rnR#jX#5w&LBgE}6 z8sc>Er+f@-!Cy0nK4n>IJL!9uL$k(oFCHvfmpv_7--% zkp5QF=o-y_d*(UkA8wy#ZdkhAeZu#Gz9o|jCkik5+jvFq@!F@hZF#qEO)8u?z0LLS z+A}XBFYWVA4(q-#Gxx2}A9V$uSrW{VPck^Z7`*b|bL-ZjThGtD_S^VXS+?>@_RlN! zlP51Ya%aY~sAnSGA>P8OGsPC({5to!ce(H5^v9;&@s9JKzW(0RedSYeE~De&i0rkc zd)+^rD_-6waBbG^?-tS4KQB*7>b~;R=2WqvpFbV;ypBTPzZPyWvY|!m*Y!f)(F+HlFW37tahmxM0W~Lc43?u@)8JTpMQL_~&=YTLM zTfxARMi2`llfk56G`ex1j0DOHAPmY#FtDUC7RV$zTfwx!Xmo2psUDPWK^T$=1fyn#&UGs@XeZrvCibMVUVtwoH~>Q^n)R;Kbm-z}o%m z_sPrNwp~gGLeB*zpJ?Een)Yh1ylt;xOQAtp?Xl|@+oR{~e#iW)*>G3#0_$mIciCGu z_IoEfPtwoY=j3>uEqvRbcBd8TE~?eO4$Xnb)Gp3g;M)In;zyUI*UcoDJ6}hwG<2M; z!*xnO)aZKC*PXg=`zvE(wUz%|yy(Euqv*RbKtW&cpP*fgcHrymr6+=RmYLmLbhv%- zpU~GwChwbaG|biF!pG-Q%U>Sfk@c(Rb;{<{mwPr`KO{eI{i`qAXD)~=^$X`n{BW=O z(w8ol^q9?)8``SRc4@AkTAC<-#DRa;V~2d3V`U%rXKKuyTxm7E{e4`_Bl`}g^F8b4 z*KaO-cUk?iw~N98uOn_;uNWmi@b5Xl-0IkpzK>EYM^$7O@*Oa<3Rqwz&XIC9ATZ_4 zw@jbz(~aJR`*_suXhxW{3gj@{J^0f3hVTicH;fD#;%o<)wlJ={x3_R=NduQ-2LEc; z&qjw1eQ&tU*TDNZh^L^{_ko1v96_`5d@ZSOBfk55Z97)Zu&m3-dFS20yAe|xcp|w3 z3_dY@;kF0z;O|4S==?R$H#EBB(J zBDbIdL*Yzaz8{{f-#At{FfLix_w$^JY=gyy5$^Z(ZyUbQsJ`!e`2crsj*Pi3;uV2x-gXX()V^on`8=`0qfgI?e5ycu~`ZFuu2 z`)j)1QU)Q{l_%HdYOLANYIQGN);k%7N%CjZzxT(w)uoUIGZpXY! z*d_JwI`H+#+j)226H`i>sGreicw+Nkp(V?*=8 z-PH#RP8^84#=^JeYY9)#k6zaoKAO#^&4ZtPHO@cwW5?{DkKIr1N-yD=a=KVyiC=YF ze8Q(2@f|r@S87Cmr9=aM`) zk1*_0Sn{~!eZ&c&g9TvQio{?dFL!hkaPG!ZiwdH3yv|0ZOEO?M7a_g6N)A0qr zd1EM@I6Rt58 z`xHYm(l>l_kS%9enq_!+=k4(05?N_(hfEXDn_UZ|8&}pr#ck7m z9Jp+_iBIal5s?D{-i%DT%&6HDlmkH+ls#c!Nh64bky&BVFdE%BP=*9$Di8)`NEles z7z<<)n>}H=U^Kcdplkw4=^zZsCNQw1QJ0Z{_)G)S2BQPKS%I;@z`zWIGC+goGJ|*k DzAdW> literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package-0.2.0-h0dc7051_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package-0.2.0-h0dc7051_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..89853bb29bb45ef2ed88a37e732814f61b8cb6a0 GIT binary patch literal 1230 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fcOBE72O5|EvhP&;9?##a5m2@Kq|%nXxU_yrf_D=f^HunL*_ z?N(4Pn?RrD^BQjPvk$B?n0p$XXRHi5efD45guFWaXEN$11oGbJ{c}ItAL*U1YPleo zQBZ-QaHcNb4^P%_94j0cS1epK^XwA&h8vrbTmQ!@Sh6N?tPqk{ke!$sz+fF5z=Z0Z zAa%pDFz=`Wy_1=jmQR#_B$*%{g3%EFh}Q}*9J?JP7tk$tqpkDpkEWFK)3#P7o;lON zaIZ91Ff!5gYSIE;Zw7A$4~Bm#f=3rj*~Avl+^+fQHPdqQS>nyju75g)(* zGM*m9r4pF+sYl#Xop;l*UBWl+bZ^}FbR&z|YrlKlbMJ5{vs4Ot%Da5M#edT#QcJwz z??K_qOWXf!Q(E&_=bWuw{Psmn=(pqL6As?GW&UsS-eU)kosdfW z%&xvJ^uo#bqLlQ4wK3;jsqX5S|K?Jbqwtqroq6*5yO+P=~UsJg7?t!?N*g4m39(ew&_@vV3jc469rA?kW)$HbbX@Sl+ zo1Lw$Tm9d#Hq-pw*++KUo^JJ4Xz22o*mI3he9CeD1DDlbNk}(bF}&BbVBZpFi69ok z19}`Ub?#bAZ#t4un_&Ln-i>O--^}8P>{18v`l9*Hw|&)}C6FH>~7s|L@m z`xhEESWbvbCX zpLrfS?QY)s{M8O-jnKP1&-2`6lUMzeJbAgHVIup6@EuE6pJ2K1K;ndekbzJDx7^0H zN7yIzO~?&kR8wPT3-D%S(q%@?ouCW|!l2v<14|k~ER4JglZMgg#)0x9C{KYfC_lo$ zlEzpdli1t|(*>i^Z2@HyP)Y}3P&R>qC5<|a48&&|m^K(4;LXYgVlxAw4A7uC%pe{B D{oJko literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package2-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package2-0.1.0-h0dc7051_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..10630b324f90dee13bf34cd0691936e9b04beeae GIT binary patch literal 1159 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fcK~o3uz#6n$8IWo?NYQS--{3~ zhG#qD|9^=U3Scwy(3tS!fbVfvF&-|4X=)!>QC-gF^{*J_ay6jKGxO5&iF5iBMu^*C zG{ouRSNRy!B)sGTR@z9cWLwtYmctV4s@XeZX8xLtRm&n6Zk^-_vt@H+aAI&^XtlBZ z_e6W1jBBRJR`VlbMiIQ1Cm#Kw*uJ*apl|D^{8-t#ElYPkt8@6C(6i2PgKW3?cjiMc z*yn9gym{3nex_Uvb5QH@^V=*QhqPyvXmcePoYN4_G36=xwENhOmbE{OB$zpEH(oW+ z^gsWvW7ci4Px;^O?0qh>PxunQEN{yOu|p!iS(w7M?by-&h4KE1XWOSF`Lo8KQtRfk z<9)k)hPrN{P3&AH` zFI_JAx#hDP+KS7xUmPjFbu@Ra-7(9hP33*5Gg__k9zG7T`~G2~clG&VK_h;ytlD|M z_*uQDuD!ON(M4f_*AX|aSB&Bx_zzrOZgp%)-$yByqbjls`3{&_MJ%wAT!8%72Vakc|YTNu~f+gmubq=D<;3%=E? zpN$S3dfsrFZ$VqRBHNBbRs}XPdK~N1r4O~0u~aXsn%rZ}5F9%5;hncDlGn_dIZ=m~ zL!y$Qx;1)Qm(GD{#~qwG5|()DS{w-zlCQ9G+vdpV<0HWn;LXUS%Z!?-K=}rQL755$ zmNbG`7+DM^4WrSG17#ynP5@z0HiCgAjj=!`(U}US4Mw9|14{FtR13nOG!Fwy8pVMk a#ODB*J{TR~&B_L1GXtR<(4=5y5Dx%36oJ41 literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package2-0.2.0-h0dc7051_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/package2-0.2.0-h0dc7051_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..2957953e741415e002e32e2e7c9f1aabe43de92e GIT binary patch literal 1158 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fcyN8fLgE&~Tt0-GapA?8Nj`BV7YM zBRvD%41<(pa|2VucmutX#3H?_;u4UhDNsvcw8mEbzX=TNSD6@sj_?UhIL{cM|5{?_ zU0bOfr?#t~`BHd|rdXVi)a$Bf54gT{$9*kHr+;oo=S<-WY%kIJFRl1h@7>xPVzNS; zxEP-8jQ{^7Rw#hY%tK?sj|0BPUB!5~7^bOxU`2I0uP%!S%;{=Cr)TD+{-3fF+ZX7&Fw3Bfd&FGB`0fFtB$2 z`hD`Uw{6#>2U^cp7^WPU)3&tgy}N%hPohjuoMap{441-fQRHTZdzC`?&dEDu>KG%RvXhznV z%*n2fKbLwvi`rmke&b(U`1Mm9^(7_(OvxU>S|S{K_w4xL{-a>6%i8r*mAs$cx|!0= zC*Suee66tmuOP8#QO4i(TQw$p#UkBhEYM^$7O@*OatO{&o^f=b1OCM@0W2s(NHMz%{AvkpA!#i(RB(Iq@bD|C} zheRbqb!+srE}a9@jypJWBrNgPwKx(cBwu0Ww#|{z$47!Ez?+dtml-urfwBzFmf178b+fV2g*gDi~z!*Tm%D48e@S>qVp6?8;nM`29)AKX%>V*DINxvG)e$P ah)@48eK0z}o0Sd3W(Gnzph-c@ARYi_T!kM1 literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/global_update_channel_1/osx-64/repodata.json b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/repodata.json similarity index 62% rename from tests/data/channels/channels/global_update_channel_1/osx-64/repodata.json rename to tests/data/channels/channels/multiple_versions_channel_1/osx-64/repodata.json index 6bb7166e0..608b2a966 100644 --- a/tests/data/channels/channels/global_update_channel_1/osx-64/repodata.json +++ b/tests/data/channels/channels/multiple_versions_channel_1/osx-64/repodata.json @@ -9,13 +9,13 @@ "build": "h0dc7051_0", "build_number": 0, "depends": [], - "md5": "e5b4b0f0147cf78038010b9b0515f635", + "md5": "4e840b763722d23947a58cb583598112", "name": "package", "platform": "osx", - "sha256": "36cde80b2c7a12f41e7cae52d5af2b172e59db3c41ee7e1006a22a508671a66e", - "size": 1230, + "sha256": "6879c4592a030f28f6d971b2f22668179ce4f795205b44a29b0338ab612f7a51", + "size": 1231, "subdir": "osx-64", - "timestamp": 1730882683379, + "timestamp": 1730898132845, "version": "0.1.0" }, "package-0.2.0-h0dc7051_0.conda": { @@ -23,13 +23,13 @@ "build": "h0dc7051_0", "build_number": 0, "depends": [], - "md5": "19235bf7d4d135339b0f60b29768d4bc", + "md5": "8cc0b6cec2e59931ddadca42240ff7f0", "name": "package", "platform": "osx", - "sha256": "9b8792daf9d9b8389286f06a64eac282f3232e801a16e69cd6f87c720432526c", - "size": 1231, + "sha256": "6dab29d04cf60699d6e3b63247dbbb76212f707f79d4ec7660d42553684a02fe", + "size": 1230, "subdir": "osx-64", - "timestamp": 1730882683576, + "timestamp": 1730898133054, "version": "0.2.0" }, "package2-0.1.0-h0dc7051_0.conda": { @@ -37,13 +37,13 @@ "build": "h0dc7051_0", "build_number": 0, "depends": [], - "md5": "28bfb8cea4844c74225df39605518dde", + "md5": "55569971ef4023d3d8bc4406e07dfd50", "name": "package2", "platform": "osx", - "sha256": "fb3555fb7f569b1c33d0be4a1f5a5ac34b36622e19062f07091354072e293533", - "size": 1158, + "sha256": "25f70b1283ccdc00cd052d0b392d2fc11753574073eb00140f5064b1c587eccd", + "size": 1159, "subdir": "osx-64", - "timestamp": 1730882683379, + "timestamp": 1730898132846, "version": "0.1.0" }, "package2-0.2.0-h0dc7051_0.conda": { @@ -51,13 +51,13 @@ "build": "h0dc7051_0", "build_number": 0, "depends": [], - "md5": "ebe04c93f9d2523aa322815945bc6e01", + "md5": "fbbb2080c0cf031504886eaf4e57c6a4", "name": "package2", "platform": "osx", - "sha256": "75c4a64dfcaa2dd4725ad92fb47dac5f8dba44f21c3f768b1a5d67382e492246", - "size": 1157, + "sha256": "7b0844fb3358077e0929c5c3da1d11c68514b8a29bba7ee766073f600be03a76", + "size": 1158, "subdir": "osx-64", - "timestamp": 1730882683576, + "timestamp": 1730898133054, "version": "0.2.0" } }, diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.1.0-h60d57d3_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..c5222ee8c7a14538f2dfea5a47bf56cd19250498 GIT binary patch literal 1238 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fc;kF0z;O|4S==?R$H#EBB(J zBDbIdL*Yzaz8{{f-#At{FfLix_w$^JY=gyym!ZryO-ska?;h{AIdExGA zLCcf`{bDBeYf)Bg>VJ+&ys%MkK5c&f*;jLaqce~5o~6(0ToY}yuCcI^zvXl0{SVwe za=*Dd{g$3{&v<;Yx0>17SD~PzV`9%WUa5}P{JYL>ziMd45Xk;PiX~K4_V5HF0pyMkZ!orZN6?Y-vuX)L(LgCF9ZUH5D5C-KI7+BJ%%g8`{-hpX@(E;A9Y#=r>5Xt}zTEYzC F0RRaSnXmu= literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.2.0-h60d57d3_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package-0.2.0-h60d57d3_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..2acdd9e19ba493d551cd1d087dc4df8d0f852564 GIT binary patch literal 1230 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fcOBE72O5|EvhP&;9?##a5m2@Kq|%nXxU_yrf_D=f^HunL*_ z?N(4Pn?RrD^BQjPvk$B?n0p$XXRHi5efD45guFWaXEN$11oGbJ{c}ItAL*U1YPleo zQBZ-QaHcNb4^P%_94j0cS1epK^XwA&h8vrbTmQ!@Sh6N?tPqk{ke!$sz+fF5z=Z0Z zvPF}o!@Q#k^iF18T0T+!kz|5+2u4HvBVH@OaBOyvoWp9H8^<~uBl5JvU456lmuM?b zK0PU9&i~Sg(j$$$-V9z09t?7d{Vf~94ozF%=w$k{^ytgE&o*%wOf5bVW)#8HCRo4T zee&9=78AB=owsN-c{Jl$l=-0@?8zl-8+j9Vl`0Dyb9>jq>*eQjY5K}IY03R5#i=WO z627t8`z(+9bldyDs_8+GoOo?-8Ei>*5j0a|%;AhM(eC#x>0W-_NMh+JW^S8}stG}+ zSKn}Oor+&!vpMg(lv$~+$V1)|xxdSmQ|DgZTfRkp?uJwUe)MPhl)jVyfAhg-iRUMz zB%ce~#dI&2YJc>^g`%}70@;tcEl&Au44ZSQeAAAqqt$0C=hXQwR^jJN{BWDl)NG6Vvf1I%%S-KeYJ_*?T>SasnR4{@muI}@=KSETIPz_# z;==5O`4QK*$bVm6DIe>jP|(%U+jEUqs^c~PuCv>(8k#W#wpZ{seVXLAk?(_IgOxw~ z`F5SaDE1Aq1&MF=PWao{eSn!aVf*7{hmF%@cVs;`cldZ$b3^GGj`qfKi70_EmZX+c z28MTs8X_9ns=gjey~G&D;ZYi)d*ieP%NOS3QVddaZZU-JXw2t}XHm8}d_nh$%7))Q zHW4XdtksYC5?1PI%y=z(wKrB(!Fdi7OP7tq?nAn6u6hU9jvwGlY?#;qsd~TwB literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package2-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/package2-0.1.0-h60d57d3_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..426cc44af8c8269270cd4a364331a75466cf762c GIT binary patch literal 1159 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fcK~o3uz#6n$8IWo?NYQS--{3~ zhG#qD|9^=U3Scwy(3tS!fbVfvF&-|4X=)!>QC-e>=AjPE%j@q?LX3q>P?@?l?>6(~X+`;I;;K<;>aO1tYTt1Ih zS8MuSeGxx2}A9V$uSrW{VPckNKX%DP_boH9pHM{h<@~*Y=FHbCvJH7nh%sDKo z&yJZ~HwqVB5;aTX)zYM@5+|4mtG(Fi|dz8{QmTqCDZ0>J06b6UR%1?{lmH9 z<$VIzX6^oN5pDhR@{~u<1NS*eI`**7`srrune$g#m2K<9wZ~oGgc|fI{izpaRu_4E z+;SnKo5BQ-BW@yT>{1{2cb#2sb!-ja2R)81Pb(K$hTM`B4OS9%DQ8z|1eN_ZS=Reh z|JVt>#2-7o76v|ajphhs{;+P2*r8_*QiY7}X1Ag%P3}309~+l5r^uHybe?Qv4De=T(q%@?RG@qV!k|nA z14|k~EQ~A$lZMgg#(}aCC?|k0C>z1RlEzpdljuwZ(*~o_tpTNZP^txCP@0EyN8fLgE&~Tt0-GapA?8Nj`BV7YM zBRvD%3^RiiQ}Yz#cmutX#3H?_;u4UhDNsvcw8mEbzX=TNSD6@sj_?UhIL{cM|5{?_ zU0bOfr?#t~`BHd|rdXVi)a$Bf54gT{$9*kHr+;oo=S<-WY%kIJFRl1h@7>xPVzNS; zxEP-8jQ{^7Rw#hY%tK?sj|0BPUB!5~7^bOxU`2I$VE5K2nA6pOPS4Cs%O}q5w;3Uh zhtUwXi}&&|Yzz003s`9*v65|BgIf+uuq)^3vuETCCN7?!vC%maUcKu?z{<+xi8-Fw#?n+)@J+166d&@@t z=tSp9>%H~`xo%^-k~+WcUdptafwO}5sw^;E?s?&FnvLV~wY+Yx>J%DRADiQLSL>90 zr2n$k-#bfxXWy8%w!bCbN{XY=aEYb~mq?zEzP{c+A-fw^XMbM_dg8t@blY;*c7E@l zYp->x=dSM3cir<`%JFi4q1ac+;8o9}m+#qd`H=jA?HXUV&AhBPm60Ry!@X+ZuU#zZ zKAWo%QQSa_0%rgY~-Y7&FoZi9urTH;E2h=0B=SnU1rqG1j;WU49ZL}u%r>h!pK@M zX&8-e94PyMasUW}vJVU_X^aIjiOx(gZ7>?$8c5^ug!= SZ&o%Cn;8h@fF^k}gLnYZ@PASO literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/global_update_channel_1/osx-arm64/repodata.json b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/repodata.json similarity index 59% rename from tests/data/channels/channels/global_update_channel_1/osx-arm64/repodata.json rename to tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/repodata.json index 47733950d..1896d3393 100644 --- a/tests/data/channels/channels/global_update_channel_1/osx-arm64/repodata.json +++ b/tests/data/channels/channels/multiple_versions_channel_1/osx-arm64/repodata.json @@ -9,13 +9,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "65bf49140037803094927ea00d1a7b63", + "md5": "066f9bdf289cc4e12ed885bcffdb026b", "name": "package", "platform": "osx", - "sha256": "41265f0165572ba6ceb2c5733f8fa500a2a92846f015333f4577cab98f14d821", - "size": 1237, + "sha256": "d81a3861e03f8f90dbb4ece27bafc267564a5dd6667f81af2a78fd0618ec7147", + "size": 1238, "subdir": "osx-arm64", - "timestamp": 1730882683331, + "timestamp": 1730898132792, "version": "0.1.0" }, "package-0.2.0-h60d57d3_0.conda": { @@ -23,13 +23,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "b3492a159f38452b118705ef7e854304", + "md5": "a38507e7536708b09b42ec84103eb635", "name": "package", "platform": "osx", - "sha256": "96851c508999ca72a7d54548d0328bfbe4619cfb797ca4f0ddbce05478444396", - "size": 1239, + "sha256": "a0562541a0cb6f91fba34734ff2fa4bf31dbe2d5f42b6bf7372160c7063f1bd2", + "size": 1230, "subdir": "osx-arm64", - "timestamp": 1730882683525, + "timestamp": 1730898133, "version": "0.2.0" }, "package2-0.1.0-h60d57d3_0.conda": { @@ -37,13 +37,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "841d2cbb31ec33865c5932b4fde3277f", + "md5": "d91c7863513e7900022e2847fa709c44", "name": "package2", "platform": "osx", - "sha256": "b1b9704c43b86c517507cfeeb088c22b90afe4d0d13aef6ba91a5e12aaddb495", - "size": 1158, + "sha256": "54b560e721fae0674ce64ede3cc12e93a33ccee0164b08af9b88de2ad1bf537a", + "size": 1159, "subdir": "osx-arm64", - "timestamp": 1730882683330, + "timestamp": 1730898132792, "version": "0.1.0" }, "package2-0.2.0-h60d57d3_0.conda": { @@ -51,13 +51,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "4e69c129c2b05cd2af183aa8b62be089", + "md5": "da479bbc76cf304ff31f5d4a3610364f", "name": "package2", "platform": "osx", - "sha256": "4a0fb25c7b0c27b1656a6f656290b124201cdff1aa9e4734cf4bdf4eaf38df1e", - "size": 1157, + "sha256": "6788f6d1d79bbdc280eee31d9565ca6e355cfe83198aa8c9b8468892e22f9d0a", + "size": 1151, "subdir": "osx-arm64", - "timestamp": 1730882683525, + "timestamp": 1730898133, "version": "0.2.0" } }, diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package-0.1.0-h9490d1a_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..e732d344043f220fc92f29d1a57c2f77547cbb5d GIT binary patch literal 1240 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fcOBE72O5|Et@P&;9?##a5m2@Kp@nHii|1%(=JGdkQmKH)vj zndyJ5W=1ZU!P7Bk_UdUn6dv*B%=0}Y^Mps%DfIfIy4jzd{@ERsY2os0-=g{dx6GG) zS)AWPQo8s!!vz%>3TNu_{qSV{#<9YIamhkH<1$Zk2Ez$`SO1qcKM`qAT;NsHP~tMp zk9aZSsck;1vvAT$o{WDC zMIU&(&rgoMqjT3v^75v3{|o(Z9u;aIn)D{dpy2Y^&9^?CT&|^;%y#YbvB$}phpJY5 z;k|u0tmb+#0dv)v+qMLQ{3G76HjF(FZo>Se9Y>c%nOtB z<)s&bq$E>rEe$VU_SabTLukm$T$Yo*2~X#rX1Kp|*3}F1{r&%Cd_6Sn*oC<&w>$31 zbQ^7J*5P7sK4|$|q`O@wIL-IKhp63iFI!qHTyn-=tv2eFUs(E;ncugCoqXhfOtC~_ z;p1C3ZQkdX%#BH*b_>{-|2QE*4B_Zu_ z#juF!(6347l1^|OVc4he_~V}HH)#_!ejTuSuwKC9OsBjLgS};*Ma|`F>w7OqH1IF% zSeJNkZDDIr{L8v<@k56kDq3Y37?w3L#y{W@ecXF`3G*6(zBdX{1+i)}-ZDFmux4gt zF-JUP+hF-dNx|l@fZQ#~HMU{LWgAw$I#clO+f~E1Su-aZ@N)1}Hq^F8ujsOA@a<{j zPi&aj6jji%R@Lr9Nza;QHUmReg8*+vCS7LKd-E|Mh4>Z4NM!14)A7W1F@Nb MPzGqwGG-7D0MALWaR2}S literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package-0.2.0-h9490d1a_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package-0.2.0-h9490d1a_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..8c6ad3e75a6fcdad3320a200161e27ee8b2e1f02 GIT binary patch literal 1241 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fcKf=7 z=^5x|SejTGq!=c~8|alJ7U@+Lmw@bSfZ7S8HMZ*iO<>^O%FN)zDk#)&o6+Ik@d@vF z&P@MfH8XO-44%$8vsX{sq49_}XP)mNnI}B5PNCNy)y@9w^v~|7ObeH1`xedrzh%Dc z%i{bVlG4S;87`>6P&iYU?}sPrH;xq!j7t{s8JBsQGZ;?jyZXPp`H4t_;sURlh7y-) zj*LD&j6A5m%1?5WfcZ)l=&Q`Uw0xqxCCdcy7mS8@OMI>XL)e`VIfq`kJCmemeoPB9 zoVWF(V3_N{r5fHr52N2Nd3qcODcN)uJqPya0&GKWMeobOyaQA>#(?D{zJzeC39U~6J5!_t!W|W#uPS} zS_aD>Y&uaD^XdvWm*}SYyyl;`LhkROLhVD7=IKf7czJB*+n>*pMW;J5zdp!z>UdDg z*N~Ie+m1)qTyJKok@Xh5=F~LjP1lN(^%HFLubh{>+!+ zS2C;mmtNi4Nv_Ktwum_``)REDAvEHoebW=Q4Vx~fHt5HmeZ?U^XWpBOua@feF0}T% z|Kg_1Dnv&A@~dQG1-L-5s^5AVEPoy=outehw%An}ReH`n$6(MpEd z63p_47?fGJJ`jlZu6giMB9fgqA&Dy?z?+dtml-vqg7P8=gEA@%ENKL>FtRO78b+fV z2g;faKuHh=Wlb1Z(ijV55}Q$Bx?nWAEugFdO6?#F$|^9hq|um>f%uFA(*~mhyjj^m PY-S*o0UETN8N>qsvk|g) literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.1.0-h9490d1a_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..d7d3597c8733ae198446889b9b04df943e48fe9a GIT binary patch literal 1169 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fcvv>OC2oi?|^++H)E=i}#dal2;!_bqny6u5RF*n{sy z5Vt~r{&D7Go8|w~WR`Ulx6hurP|EbiS&meOVKc)cW*Siu(KhjtYztdUY@^8`GX{pIhZuAUrgeQj z=6Z?IgTt*{KzGJz4lz6am@Ed<8?BNLy51iswD_X1XI?Ug_$|pdlCN4*?l8_+b<G zp1W-F%AJy&ml_x*vMYq|Si1TI%Z+mqCj|H;P6l#|ZM5y=w~$qSy@1ijhmj}1n~_PE z88v%>au5iEvKI_2X#}w_G8;@9Mxz@C%21#@0m7gR1p`YOV}VSfvlmPoj7GNxl=MM~ l7lc7c9|o2*N&!WP&j>JmFgn1Sl?}vZ20}TYNwLfz9ssN6hhzW% literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.2.0-h9490d1a_0.conda b/tests/data/channels/channels/multiple_versions_channel_1/win-64/package2-0.2.0-h9490d1a_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..14998289ea78510723ea1a2fe27087b45960e66e GIT binary patch literal 1168 zcmWIWW@gc400Fm*w8+y8se1pRfR{mpAvd)oF(t7iQ7@}FKaY_?fI$wdlmSjxD<$XW zr6k4|WT(fc?+`FU`cy!}T+6@AiPW!ue_UXwDs+wiQY>c=$;mrszn zu#{UNK>s-NvCZ=TingN#|mR! zFYPz9?DRTQS2+J|uGZB{E}qL=HPRlw-+r|ISn0KzyMoK)dUCnHON!5AbvzuAotv82 z|Ka|7e_2J7SO4P5tjfO~U;Qa%?Z?HMTPDvG){s7VwL0zTz4U9(1ADSwtTes*E6c_C zScqB4MCRACSzHw+cpUMVw2M)E%5nY!m$zRvG-C*4uMlTBsv^6H?}3?7!Uij8os_`P z!Y6OOW%XP>y4VV$-mGjOHZu^)0Zocw2JrxP>5G{F literal 0 HcmV?d00001 diff --git a/tests/data/channels/channels/global_update_channel_1/win-64/repodata.json b/tests/data/channels/channels/multiple_versions_channel_1/win-64/repodata.json similarity index 60% rename from tests/data/channels/channels/global_update_channel_1/win-64/repodata.json rename to tests/data/channels/channels/multiple_versions_channel_1/win-64/repodata.json index 78ca6bf61..dfa9f377a 100644 --- a/tests/data/channels/channels/global_update_channel_1/win-64/repodata.json +++ b/tests/data/channels/channels/multiple_versions_channel_1/win-64/repodata.json @@ -9,13 +9,13 @@ "build": "h9490d1a_0", "build_number": 0, "depends": [], - "md5": "49d5d6240f19c2928b3973f567e84b25", + "md5": "745d63cedc7ab134762eed55fa130224", "name": "package", "platform": "win", - "sha256": "349a37ec0022898e81a963916628593accaef30c9377b5990913fa9796debd00", - "size": 1238, + "sha256": "3ca104fc659f7e7d43f028665ff009b1afbd1df45c6a55787176eda973746a87", + "size": 1240, "subdir": "win-64", - "timestamp": 1730882683234, + "timestamp": 1730898132680, "version": "0.1.0" }, "package-0.2.0-h9490d1a_0.conda": { @@ -23,13 +23,13 @@ "build": "h9490d1a_0", "build_number": 0, "depends": [], - "md5": "e01e6d3106b436c37accac64ecf549bc", + "md5": "986f652f269e8ac205f395581a5cc59f", "name": "package", "platform": "win", - "sha256": "8d1e4104be07954631e6b5d445ee460437e7fea460247874be8d64bdb30bf028", + "sha256": "c5d72e133b9f37f2030a92149375f1ae1a6ac5bcfc3e373364c4bbf5dbeb8c98", "size": 1241, "subdir": "win-64", - "timestamp": 1730882683428, + "timestamp": 1730898132900, "version": "0.2.0" }, "package2-0.1.0-h9490d1a_0.conda": { @@ -37,13 +37,13 @@ "build": "h9490d1a_0", "build_number": 0, "depends": [], - "md5": "c669c43f74e3d7ebab21c1ed589ef187", + "md5": "ed3dbf7b4f1b80b63f9ff6e34c5501a8", "name": "package2", "platform": "win", - "sha256": "51f8a3cd73ebbfc7eee9a33916c8e2969b00213f51f09f5da7ffa7fa3db43711", - "size": 1171, + "sha256": "1038a96bafb2fb49357848d5c9aca6a67cdd89d6c4d04ed6ce4480eff6b81a81", + "size": 1169, "subdir": "win-64", - "timestamp": 1730882683234, + "timestamp": 1730898132681, "version": "0.1.0" }, "package2-0.2.0-h9490d1a_0.conda": { @@ -51,13 +51,13 @@ "build": "h9490d1a_0", "build_number": 0, "depends": [], - "md5": "51221484d48da06b158535f915aa14e5", + "md5": "07a7e70d365efdcc754bf329feb3d95a", "name": "package2", "platform": "win", - "sha256": "f63e2b193beea02bf7151cd432138fcfb71a9517dec0f35310132cf9aed50087", - "size": 1170, + "sha256": "ea6324a02aaf3f5ef7ad9f3e164aeb81f8c7dd46b5b25eb026101c53d81aca47", + "size": 1168, "subdir": "win-64", - "timestamp": 1730882683428, + "timestamp": 1730898132900, "version": "0.2.0" } }, diff --git a/tests/data/channels/channels/non_self_expose_channel_1/linux-64/jupyter-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/non_self_expose_channel_1/linux-64/jupyter-0.1.0-hb0f4dca_0.conda index f684e485ee1512698794641c3d15977886d24913..1d41343dd0e823f8f1dd4b6d17d57ab7049f6eb3 100644 GIT binary patch delta 511 zcmaFB{*av~z?+#xmjMLaGA8mwGXcrWG!D0nw8(1)M&Bo1H?5z{2$p7m(HdLz|0Xbq z`|>cbO}3T_xXS#Pr^n;U%qfx1X=y5AM{ig$xu(tYR$w$@Fabh=hy_BGrN!GW3oEkh zV1Kx6Zu0y1#1l^c>=)12a?MFD#P0Fa|BJW$J3TAd`S_M(PT5qMEnHI53Pl$RtzEk~ zZ}sYz_2IX+9shOI=2^U?x$ySOuNl~!6okx$maNU)*4(G9;`1@cUuRYVwmcMqt zu{~eh&GBcPc-4v{wX)o&&zgU0%=mJSB~+rg$s;>hP}fP-@BFsnODkhF9!oH6K4bYj zeA->Mdq3Z9;*^Nu|5fwqTbKQbhsoDwyq_&u-)G zRwfxwxgC48ckQH!CW?NHO#LG88a9p o0=yZSbeUl>Ie8D0FEA=6b2F##!r~GXf0HNIFvqd2X9C4200Vr;Jpcdz delta 510 zcmaFJ{(zk)z?+#xmjMK(x=!SYW&)C#X&h5s(;_z?+nF-)x@r9+MzAykjMmty|2Kg_ z+?9ucE!bKz;X3o;Jf_<^*Pfh;U|_hT$T(Z`q>G8ek2gjPCO{|ir(vQAd)GrPutaFTPZN8ho7gN;Ak(^QS(8uDZ}VGh8NBH$Eb?Pi zWgoO25ahbFD1YXmqifi-J1aGLF1XKj5M?{KdWyUUW3*D!5v4<$c@{cZH`{ve^*Sbd zAc!?hV|(=~>1b7#He&@=4v9|;Z@IS5=<;dcJ$8Ukv0)PU6 pg8|-*OuEdlh@8Ba$rl)tlX;j^cwtcqioQvcYnkKN)-i!16aWGE)yMz< diff --git a/tests/data/channels/channels/non_self_expose_channel_1/linux-64/jupyter-core-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/non_self_expose_channel_1/linux-64/jupyter-core-0.1.0-hb0f4dca_0.conda index bbd7419b327d5495458f5438be809ee283701287..0b30c5f7c78ccb88b49c2d01c37bd7d733250121 100644 GIT binary patch delta 525 zcmbQkIh&Iwz?+#xmjMLaGA8mwbGT)sMLx7zm^LxLRI=8`{PS6br*kf@_)=-`x!19# zeCLbat)0h1CjM0eE8Je!J87~uqm}h5Mz9eKFj`}){@(-!aaMkYXEVGd0>1z8NeSDM zq?!EwjL%=UNh}X0yDdAb$mYV}%HT420i&uFW0m^cAg1YI-G+19<{p?D>~$bYr!lXx z^T*7qPYzXC@$X)_>70jJ_HnySoibhNy#l&vA2zzqIO37~bMk*isnCc^Ss|6B=UnXE z4~Xjsux;e{aY^Rq%HmT8i?-;$Gj`Ik%2yIr-)8sgXV;_|EpNoW-?;W}O{v@o#npz1 zLhH5a_iO(%d}lKA{*0yUIrZ;OEs1@qmngJxaz2w|y}Pr*1g|4*lXfvm_8jNmbAJ0( zLo-SQ!??NHnmX3)%)am_oqU)%nHLnlplAcd)T_zHEXi!~%%Hdf07%Nz Aa{vGU delta 526 zcmbQuIfs)cz?+#xmjMK(x=!SY=9uc57I{_l+LDR+rIIy1=ASuV8K27t`DHWX=P`wS zyJNl_yLBX4YvNxuu)@&PCF>?@Gg?`{W&|6-0HZaw>iCaC1&kg3Awz#%%zF^YDO5vFr8^2yWA3o)XO3L;f$G4U7#_;>}JBKA7 zQi%)wR~P;#`A(+MenW5m8~^T1_1t|b_K->vewh0Xr8MY=UZkzDK z;gaAcUabR1o*W49W@OT3hDGV*TxMT*oK8N(oXiV~U{Jh)qU!ZzBbH>g1ZGg=0RZML B)Sv(W diff --git a/tests/data/channels/channels/non_self_expose_channel_1/linux-64/repodata.json b/tests/data/channels/channels/non_self_expose_channel_1/linux-64/repodata.json index f834a82a3..83354200f 100644 --- a/tests/data/channels/channels/non_self_expose_channel_1/linux-64/repodata.json +++ b/tests/data/channels/channels/non_self_expose_channel_1/linux-64/repodata.json @@ -11,13 +11,13 @@ "depends": [ "jupyter-core" ], - "md5": "cb595183e841d1923914490d729cac99", + "md5": "e21e5d39645428ebcc38113558eae5d8", "name": "jupyter", "platform": "linux", - "sha256": "2962dde9565b1ef6e9f048ae1f1214e6498ae413ba83162da7963bb0db58c356", - "size": 992, + "sha256": "f326acf6bcd44f203a9e2375c8a646f42c649a08de22f4a9c7758ee78fa16704", + "size": 993, "subdir": "linux-64", - "timestamp": 1730882683675, + "timestamp": 1730898133150, "version": "0.1.0" }, "jupyter-core-0.1.0-hb0f4dca_0.conda": { @@ -25,13 +25,13 @@ "build": "hb0f4dca_0", "build_number": 0, "depends": [], - "md5": "b9d3081d340d5fa547d44a4789c2625b", + "md5": "ffac5d2147953383cf34752e2996d066", "name": "jupyter-core", "platform": "linux", - "sha256": "5777385da69c36d4e6f3a42ba3d9b25bdcca3ee05c305edd7fb3f55271fb533c", - "size": 1180, + "sha256": "7a6f7fa35475b5370a4081c27d15f3e5f5cfe59a33fa010fa573badb503c16ff", + "size": 1179, "subdir": "linux-64", - "timestamp": 1730882683675, + "timestamp": 1730898133150, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/non_self_expose_channel_1/osx-64/jupyter-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/non_self_expose_channel_1/osx-64/jupyter-0.1.0-h0dc7051_0.conda index 3e10e4342ba3f9bed30b810e59ff799e6159be76..08882975583eeb16c586d04ffd8df67113b0bf7e 100644 GIT binary patch delta 346 zcmcb|exIEuz?+#xmjMLaGA8mwGXcrWG!D0nw8(EJS41aXH?5z@2$p7m(HdLz|0Xbq z+ww4M3$l_7xX!G+%!HX?yN=VnnKOUgpW^YLy)fja#R($@BL-sz24V5*)Aw! z!r)lU_G=FgADYnmr`^r)Wub`BLLn*r|B6eGAMW02n!{^9^}waIOn&^0mv20N6mjg* zy6|T?)=%qq&8;(hp1!?EBUbYVqi;`xaG21tp4V%gd-d8lk}lr7H|2PD^qRQYhAJt$ zcl&H!lx-|s8)I{u{qnlceI{~^i`6|^YKOyTET6|m zyk*=Zu#fv)N^Hvx6BAu^ZFz_vG60$>S&JWHMe$l$@#KR7Gzou g44%omn0!GLCvyrfJeYt%G;wkja~#`RCQx7j02y48r~m)} delta 345 zcmcc5evh3ez?+#xmjMK(x=!SYW&)C#X&h5s(;}_rW{Xd}ZdyNq5iHFBqcyhb|4m>J zH|1g2CS)afY^Mea;*O z{D)$;AG^1|;)v2ed(X!@X@V;S?|=OGU-H_Y;GSrr1#m!W}ek~Z-3K7-v`H1)D~I##1s|Tu9z~b_MOOqMIM?@!^7^f z?cI8JBImTsJ=4ne{%N=Pb9C}Kv&ECWQp7kuO>&#@BlYUqwd|&EZESg$F;5m^S`G}I e$-9|+K@=Br3NI{_Kp`_>ay4@t+ZrZNSOEZyN{re7 diff --git a/tests/data/channels/channels/non_self_expose_channel_1/osx-64/jupyter-core-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/non_self_expose_channel_1/osx-64/jupyter-core-0.1.0-h0dc7051_0.conda index dc220ea9d10653a7fbca80b51f9720370bf15b66..154b9be670499e074e2566e469507beeaa3da1bb 100644 GIT binary patch delta 384 zcmbQmIg^toz?+#xmjMLaGA8mwbGT)sMLx7zm^LxLRI=8`{PS6br*kf@_)=-`x!19# zeCLbat)0h1CjM0eD|~j^@9$)7Ml16dj9?=eV6?_o{l5te;$Qg~jzxG&1bqMFlM=Qi zNi+HV8K1vylUN>1c3XBSYK}^?@I7?1@A3489 zP5j#BO3x!@!Krg6p4oHhLSK(eS9-62ZrX>9t}~8!B;Pc6v2E_T#YYc6Tgx#yBJtX1 z<5I(V=ZJq7y`om{u}W8(ul#^pjH5Z?&Gcs{{O1PqOChsuy(i1?@M_ ziiz-l&gglhEI4)U#4}rjvfbVIj&64AIF|Zuqw9<#9?3tGcI7VroN*`db6AV#8iUtA zXYQJ@Us30OgzDPRxVgp?&kKHFJ zx8-427GxzEaGhCsnF%w)cAdVx#>QXwYfe1iZ)lXOHo=I&h{1$`L0EjHe)ap{2|a=z z5_*1azqa7;p&3U@+T9#q7m5h46qd5Po4B_9aQ9Zz9A10>gqLBAKUw{fCB-{ab>8kb zO24i7zkb>~)~~N_u9fk!XSH9@DLA2JYK!LM{q{8_hAsl#=e{jV;ptx{p1EBk!}j&)USP=LEmjF0HqmDKRRnPv>tAI_I{1($@n_4u=E0R>t2b zZ@zcy-Afi<+X=5`-J0(y|LlQyxYg~q0cuN)1BI5K=;=PgvElx$q^svbMJ5X}Ee8hA dE delta 345 zcmcc5evh3ez?+#xmjMK(x=!SYW&)C#X&h5s(;{ciGG(85-L!rJBUqXNMr&-<|C_)d zZpy>3Ovp+y;X3o;Jf`cCZ$xjcYF2oVti=~R$<<-XrwK+3MhwOb2biX=(5`;(?cXBs zK(6KI_G9zxD^ED>+V80vq|mygt)|`kd%8r&{%%v#93E@`gcp8{KUsYrb4<-h<$1e) zUD|Dp|Mh)SPQ7f4FV9l>d+9X;o0Ec&n9!o0|NlOGeblZXQu|idRf2EX)Qq+J%^tg- zD9aajyPB;ZEvsc1ef&_~ diff --git a/tests/data/channels/channels/non_self_expose_channel_1/osx-arm64/jupyter-core-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/non_self_expose_channel_1/osx-arm64/jupyter-core-0.1.0-h60d57d3_0.conda index 424a382f0aee9d4e803f6cb495310193bf3cb34b..dedb92d73f563999dbe9a659797b2a0f07f390e1 100644 GIT binary patch delta 402 zcmbQmIg67gz?+#xmjMLaGA8mwbGT)sMLx7zm^LxLRI=8`{PS6br*kf@_)=-`x!19# zeCLbat)0h1CjM0eD-^cmZlA2p7+0ThH0ap9nKOU!HYt9X?6&NzBAXL~GlLUD;C_SS zEOkGob~}B%@js~LAk)+r+Gj1N6}1?AVBoO+XUDAK@ODYC*MUn}cf6k``W!f=shS`W z&h+P#@W;)k4<2RxD0^$8(Y+JP?AmLeOr4jN-Y2k7Xz87gdyYGr|NS7_n_X&?^RFwQ zvp#J9f`08aKdoNOqGc9niYtDk`*%;o7~?=$ywgs~c9I-27Bidj%4Ol<#idBXK#`I;QK`)+#x(de<2) z^{eC0pBFv$hxh9r`Nn!u$qA$IlbUCH&yElJrJ>ThNxv6@ILe&Qs zU5Uz0P3`+||GmBB!`+(`cN}@+x9IDMzH_@Ozb)RXv}{XOwCdLLiJw0PbV`)U-Hf|s sasH}w@{y#>je)tzy)pgLlUFhwWSZ(aIfvO79>$XoGAAR#QHLcD09f(4o&W#< diff --git a/tests/data/channels/channels/non_self_expose_channel_1/osx-arm64/repodata.json b/tests/data/channels/channels/non_self_expose_channel_1/osx-arm64/repodata.json index b13c1cb74..536d79b69 100644 --- a/tests/data/channels/channels/non_self_expose_channel_1/osx-arm64/repodata.json +++ b/tests/data/channels/channels/non_self_expose_channel_1/osx-arm64/repodata.json @@ -11,13 +11,13 @@ "depends": [ "jupyter-core" ], - "md5": "03fa978eea80fa3d72b28ffdeeabae41", + "md5": "ab87fefd9d91e53bdf24e3fa81d8dc2f", "name": "jupyter", "platform": "osx", - "sha256": "da2d9bb9b19a49e1d13fb26f539e11519b8d963cab1148797c226ebdb55ffe5c", - "size": 990, + "sha256": "bdf53fb2268e9e9558dc4694550c34297c8bb0a9f9253aec5291a6303d6ef88a", + "size": 991, "subdir": "osx-arm64", - "timestamp": 1730882683723, + "timestamp": 1730898133196, "version": "0.1.0" }, "jupyter-core-0.1.0-h60d57d3_0.conda": { @@ -25,13 +25,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "bb1c733fb00e41254542e01e0d856902", + "md5": "9513cce3dd18ea97cda6210e5fd038c1", "name": "jupyter-core", "platform": "osx", - "sha256": "b4b37e45c580898f1861c96a255c6eeb9bb0731fdf03d21b79433967ec7cc441", + "sha256": "27b8c5b6e216129cd6a6d9cf7a43b627c038b2529660b6d81fc7459ab1e12965", "size": 1178, "subdir": "osx-arm64", - "timestamp": 1730882683723, + "timestamp": 1730898133196, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/non_self_expose_channel_1/win-64/jupyter-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/non_self_expose_channel_1/win-64/jupyter-0.1.0-h9490d1a_0.conda index ac133ab0b3eef42ddec11502b696ef9114acc883..5cab8c43aee32d5fd9b16b50c43b75f637dd7376 100644 GIT binary patch delta 347 zcmaFJ{(zk)z?+#xmjMLaGA8mwGXcrWG!D0nv`GElv%(Xvo7PWa1WPl(XpODf;9m%xeA)?v$L=f7*QTX~Wt)Uuc=3 z+G?=;erEk`y_e!s?51sWF7!UgpOM6(QmC4E>sFfe4UOy$1+l)bekUcm_e?)qp6zjC zdwE2d>(3UWOq0m;PoeAm$@{KY@k7~T(`z2(vpG0#sTGYco);7YaLFaA#2-TxT#WMQV| gzyO-OhshU2aWkjz!U75uIFl#WFvqd2X95Km0FN1qX8-^I diff --git a/tests/data/channels/channels/non_self_expose_channel_1/win-64/jupyter-core-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/non_self_expose_channel_1/win-64/jupyter-core-0.1.0-h9490d1a_0.conda index 8093dff4ff86bbbf44c8a69faf95da6eba6124ee..615edf4d59acd77a5fc533078b9d8ce285ae9260 100644 GIT binary patch delta 255 zcmZ3$xqy==z?+#xmjMLaGA8mwbGT)sMXub+{dQu0qCtLk+5TDsR-R?8uT5|Bo0Xq- zNl#5rs@r2d+wqj;-Y20Qk$&DI7`vNHe+cq zll#_Vd#5U~vG#dBXW@D5w;;YwXzKTw0o`f^kcGC&r@QSOpU#8 zT=dx=+0-B2$zj>**LEsb>M$l=I3jUE>HCU^Pa)5zp8IfY&wGwfkJ~k@>X#_@XGiGQ s_MG$#Ncz_OJ14(9C_8h}=5QuSMkcq6$wkb*a1TvB&YX;Joe@hO0AQ$Uq5uE@ delta 255 zcmZ3$xqy==z?+#xmjMK(x=!SY=9uc57TNZTsd8d|qQRe#&Dwp5Ts+HKUz;LZdOKh?p<19r6+l-~f zOkxYS-}4e|W;(v4n5nH${er%|VEk^mn3#a)jFVq7$_9$BynAh~_hY`f#YTFUPU*dP z%vJoa&*;z6xmRy>mcH|l^LCIhF=X4s@qIx@|P01gpv5dZ)H diff --git a/tests/data/channels/channels/non_self_expose_channel_1/win-64/repodata.json b/tests/data/channels/channels/non_self_expose_channel_1/win-64/repodata.json index d767008fe..41e8e1d9c 100644 --- a/tests/data/channels/channels/non_self_expose_channel_1/win-64/repodata.json +++ b/tests/data/channels/channels/non_self_expose_channel_1/win-64/repodata.json @@ -11,13 +11,13 @@ "depends": [ "jupyter-core" ], - "md5": "2c41f4f745411d30032d76f9539cc775", + "md5": "b084adf91a0b0cc9248389c203e6b0c6", "name": "jupyter", "platform": "win", - "sha256": "e174e76342a7648f06ba661d9dca624b0bf148b6da62ca7105a802b6406c2439", - "size": 993, + "sha256": "484c47d5b5715943af1589f08764eaed7fbd9a9eb156c76d8c195a8f4744ba03", + "size": 992, "subdir": "win-64", - "timestamp": 1730882683631, + "timestamp": 1730898133106, "version": "0.1.0" }, "jupyter-core-0.1.0-h9490d1a_0.conda": { @@ -25,13 +25,13 @@ "build": "h9490d1a_0", "build_number": 0, "depends": [], - "md5": "7c351321fa2921a0581eb65c67adf541", + "md5": "2ccc77fec0a0a6bd881e1114f2ac4ae8", "name": "jupyter-core", "platform": "win", - "sha256": "fb051f22a0f70203e694b64bcc37fe1dfb0a3cba8f0c27a14d26a36d7406d89a", + "sha256": "823222c9ea2f41898aec542eda9f68867f6f21b33d775f215be68568494690e5", "size": 1184, "subdir": "win-64", - "timestamp": 1730882683631, + "timestamp": 1730898133106, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/non_self_expose_channel_2/linux-64/jupyter-0.1.0-hb0f4dca_0.conda b/tests/data/channels/channels/non_self_expose_channel_2/linux-64/jupyter-0.1.0-hb0f4dca_0.conda index 64415cab4af567485e2852434ce692c7bf65cdcf..77190f350aafedadb8817c6ff3cbe4f97499bce8 100644 GIT binary patch delta 363 zcmaFB{*av~z?+#xmjMLaGA8mwGXcrWG!D0nv`A-r`^1UYP3tE!f~6T?w8mEbzX=TD zzB~-qgsi0kt};L7>G8NSb4sLhTAGU3(HmAwu4(hU6&Q^eOn^`zVu4U)Y4Ntp!ip?A z*dK12oBTdL@r2Vq`^7W1Tyv5Ov3vaV|KctGPR|NaefX_y$A2BQc@{5eF1-EnYX&wa1tD{xC2MoHHMef6<8XQy{yvz;YtOW^<*(gu zY|j^WbNm@6UbW&#tt|KHv*zC#GrpW-36&^r^2iPr)OAwzJHM^?(#lwk#}W*i&saVW zpLUn+-p{w2I3=R^f7QJD)@6U<;pSsC_jP6pc}|$$-r~ixN9Xp>tp)cbiVWl|CyO)L uazt7j>SbKdrZ72*DFGN>llL(Bf+%k06kb@kfx>F?(B-L!rZBUqXNMr&-<|C_)d z?#jc!7Hln!0qr`@>1@lYWh)XZXv~15An!T3TB)qD8MSw7XHnp>*;3y-Dnyw^t?2)^$Ho zmM?B*dn4{!<&27LzO9MRX1=l!{^eG+qT965|5SiW@r)f$os zL+`Tf-FkN-r1c3XBK}^%bx((;H%{?$R*y}))PGeqW z=Z~3JpB$>P;@`b;(>V{d?BjNuI%T@jdj)jUK5TTIal|9}=j8v4QlSx-vO+3L&$-yS z9}w3OVB5&?P|#npz1 zLhH5a_iO(%d}lKA{*0yUIrZ;OEs1@qmngJxaz2w|y}Pr*1g|4*lXfvm_8jNmbAJ0( zLo-SQ!??NHnmX3)%)am_oqU)%nHLnlplAcd)T_zHEXi!~%%Hdf0B@Gm At^fc4 delta 526 zcmbQuIfs)cz?+#xmjMK(x=!SY=9uc57I{_l+LDR+rIIy1=ASuV8K27t`DHWX=P`wS zyJNl_yLBX4YvNxuu)+t=T6iaGGg?`{W&|6-0HZaw>iCaC1&kg3Awz#%%zF^YDO5vFr8^2yWA3lXeHD&vbvewh0Xr8MY=UZkzDK z;gaAcUabR1o*W49W@OT3hDGV*TxMT*oK8N(oXiV~U{Jh)qU!ZzBbH>g1ZGg=0RWp4 B)m{Jq diff --git a/tests/data/channels/channels/non_self_expose_channel_2/linux-64/repodata.json b/tests/data/channels/channels/non_self_expose_channel_2/linux-64/repodata.json index 75af9795a..e16e5adb4 100644 --- a/tests/data/channels/channels/non_self_expose_channel_2/linux-64/repodata.json +++ b/tests/data/channels/channels/non_self_expose_channel_2/linux-64/repodata.json @@ -11,13 +11,13 @@ "depends": [ "jupyter-core" ], - "md5": "4f378a46d647f6727cd68a182ad9d2f6", + "md5": "f573365a3c55a98cc1fec9cd46994b6f", "name": "jupyter", "platform": "linux", - "sha256": "b0089d4a756b1469b9492c054a8882aa4ef74ca7f14fe5a183faccc658267480", - "size": 992, + "sha256": "1be25cb22a8315b150e6009dabcf5bd98ea084d4a92c3c89f0253451b0303e60", + "size": 993, "subdir": "linux-64", - "timestamp": 1730882683856, + "timestamp": 1730898133339, "version": "0.1.0" }, "jupyter-core-0.2.0-hb0f4dca_0.conda": { @@ -25,13 +25,13 @@ "build": "hb0f4dca_0", "build_number": 0, "depends": [], - "md5": "772667e1b6f96a356898f20c14f429da", + "md5": "9f9bd66dab65c8163aa352861bd9cbfd", "name": "jupyter-core", "platform": "linux", - "sha256": "056c6fc011158c4aaf1a14704ed71bcc2b9ff762543149b64ce81bca4f6190a0", - "size": 1180, + "sha256": "1a5b2ddf62347cf6c942c8d393d7d46cf960bc78ade4ee28e9d029771371d21a", + "size": 1179, "subdir": "linux-64", - "timestamp": 1730882683856, + "timestamp": 1730898133340, "version": "0.2.0" } }, diff --git a/tests/data/channels/channels/non_self_expose_channel_2/osx-64/jupyter-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/non_self_expose_channel_2/osx-64/jupyter-0.1.0-h0dc7051_0.conda index 356ebf68a685e76fefc006b148db1f72f44dea1d..792c382a017b5cbfbbde912ab63dfd4ea6f00c5a 100644 GIT binary patch delta 208 zcmcc5exIEuz?+#xmjMLaGA8mwGXcrWG!D0nw8$p`aV!(BCo$chGTE9@!RYXz39WzH z-3(tAiU=(flG6XLxb*np?yaUdy!KNMTw2TI$KQDQ#^Xm3$1bf4f0kqYbl2R;y^NMV zCUT97mM>a;Y2JaC4`n!?7Z!4z`s(oPNlwXXhr?$qpT|eMW!t;;?j_Dy&HI*>o&CdZ z`RC}=b7k6UbA#2qJ_%1O{K&I9I(p5mon3Oi?30CSfje|^8FMB8 Dbg*0r delta 208 zcmcc5exIEuz?+#xmjMK(x=!SYW&)C#X&h5s(<03{g2g6YPhxsIX|gq=f{}CO38#OD zJ3XQ+Ow?e>>qZ^ zKS!sYE3@WFRomh*X?{mfcY4I#TS-^Xg?`Dfnk>Y$9O%HwyP14J6c=*}+@X`pm@@(1 CcU;&2 diff --git a/tests/data/channels/channels/non_self_expose_channel_2/osx-64/jupyter-core-0.2.0-h0dc7051_0.conda b/tests/data/channels/channels/non_self_expose_channel_2/osx-64/jupyter-core-0.2.0-h0dc7051_0.conda index 6487fbd0937459885c6e766cbe8e92bfb8ce830a..34415703941066472bf1062d07ee1e19afa0ed89 100644 GIT binary patch delta 410 zcmbQqIg^toz?+#xmjMLaGA8mwbGT)sMLx7zm^LxLRI=8`{PS6br*kf@_)=-`x!19# zeCLbat)0h1CjM0eE7V)SXfj!wF{VBxY)g`6^7}JBf88drJecgZ?5rZ2GlL5do@Yo5 zdpGlh-}aI~m4CnNy9@#nglxA~pP$$#z$V9_IBoxV2F?rCFQ*9Y*b>$A(&P=xx;a5i z*OE9(PJ16YzeY{`+T}{mBW1y`e%{D51GqdDTu^k*mh=LYjlTU=W>Uoh!n zrSMFPk6W&~+s6kAO_^}_k=$*mwcD;$DzvXT*5bKm)t|rXejML%Ii)Unn%suJJGCd5 zP2JtXcyQ5`DDBYHz7O}`+eKUgKrR>WJ$8=YUAyN;c2@_MFSOl}#IvzdM2VLkZ(b23tRvg82(z8<{+ delta 410 zcmbQqIg^toz?+#xmjMK(x=!SY=9uc57I{_l+LDR+rIIy1=ASuV8K27t`DHWX=P`wS zyJNl_yLBX4YvNxuutG_@nR%178Dr|ttjIVTbnM>DnZJ0O6hBOMTXt5F&4s~*!I|NL zz*p{Kp9k&nJ2gc5|LVI+=md1`yEG?R)18BvzhT4U_r?xPm;J1kvb-|X-&-PgjAhN7 zAf~oL)dTwWg7&**VqygDGkU$bwbAI_iL|K7C+=SUTaDd2j^*lYa$Vt~Szg1x>t*}< z`iwh?pTk?cw)|qPjY&LvJ@B}Fm}mA>iTk}zHnP+(GA9af%T7x=8C(%o@p1;RM*Mb%)aojo_v5g87Vwj@&GHTv$OyJ diff --git a/tests/data/channels/channels/non_self_expose_channel_2/osx-64/repodata.json b/tests/data/channels/channels/non_self_expose_channel_2/osx-64/repodata.json index 8b50edc73..2c83bf9c4 100644 --- a/tests/data/channels/channels/non_self_expose_channel_2/osx-64/repodata.json +++ b/tests/data/channels/channels/non_self_expose_channel_2/osx-64/repodata.json @@ -11,13 +11,13 @@ "depends": [ "jupyter-core" ], - "md5": "9050eef2b2323a5fe1d96955a0c92546", + "md5": "5864c37ec76421f67fbbaa180f2a3255", "name": "jupyter", "platform": "osx", - "sha256": "32a9d5a24c33728d1609b8e7ac12354e64cd1b81207fd664da4e4e65749df153", + "sha256": "7580d8c3a5eec707ca9ce642425e083205385103414bab3fe3d8b6a18f6cf109", "size": 991, "subdir": "osx-64", - "timestamp": 1730882683945, + "timestamp": 1730898133432, "version": "0.1.0" }, "jupyter-core-0.2.0-h0dc7051_0.conda": { @@ -25,13 +25,13 @@ "build": "h0dc7051_0", "build_number": 0, "depends": [], - "md5": "91077143a2bbe9e8f4c585e1b5151bd9", + "md5": "8f2e95f21707480920e7b5dbac0f4d08", "name": "jupyter-core", "platform": "osx", - "sha256": "fb7aa3f1a9b211deb6fc8d488c280acba8451bf8fb5a7d1fea59938f1151afdf", + "sha256": "b88f90c20bf198878bc49ba806715590b7fbe0470b9db09c567489c36a0833ea", "size": 1177, "subdir": "osx-64", - "timestamp": 1730882683945, + "timestamp": 1730898133432, "version": "0.2.0" } }, diff --git a/tests/data/channels/channels/non_self_expose_channel_2/osx-arm64/jupyter-0.1.0-h60d57d3_0.conda b/tests/data/channels/channels/non_self_expose_channel_2/osx-arm64/jupyter-0.1.0-h60d57d3_0.conda index b72abb567efaed4e2a2e8348dcf13daadb25a2e9..5b29d20e45c1f456f54d73deea36c9bf1078a0db 100644 GIT binary patch delta 346 zcmcb|exIEuz?+#xmjMLaGA8mwGXcrWG!D0nw8%Y0-ZLg%H?5z@2$p7m(HdLz|0Xbq z+ww3h3$l_7xX!G+%!HX?yH4L;W8<&;H76eMH#Evsn_$FX#9+d}AS}L8zxsXfgdV{U z2|YizUt4ha(2S!c?QV{*3q^!i3QO7DO4Uq9^~>(^H|*UEU=v)V7{6r9j9wMFyse*2mdLl=SWbKjPw@boVe&)m4*EZO5k zS^3N~*XwC!pLU$ck@wl%XKmutbAn%Mm)2X(lo%D(r}H-lopakh>FWU|hrFT*qk;#Hg%Ynf& dc^8u}h~i{U;e`hiFo-5ju40a3TgwCrEC6aoi6;O6 delta 345 zcmcc5evh3ez?+#xmjMK(x=!SYW&)C#X&h5s(;}|~$Gc3tZdyNq5iHFBqcyhb|4m>J zH|1eiCS)ZUaGhCsnF%w)_NtIeXV0wItvd05zoAjC+5{s8BL-sz2Vu#T`ql4)C-w+_ zNa*>w{n~=Vm1mN6InVN0;?OlyLRil3?!rU`KK*OgHkk6*HZF~3{mJT=EGgNUs`GaL zru5sI|LdoD8m*L`clXu8FTo#}=SVPmMtIIJ`uF?r^={>+gpzIMs>u_UNoH=`Z}!;Z zL|OUFw5!?1(Y8iL(HxiGJ?39~GEjEmtI*5<1!d)x8vFg5i?-eKlHw3+xE$cMGX6$+ z^SxW|ezNen3LQ4xYCqZT%t8HiCEKDOa)(ZE3Y?>6Y-Dtpy)L^u)H>XBvJlg9VCYQV c&EyNBxR_ITVW9*HnF*7tnd8{jFoD7f0OMYTc>n+a diff --git a/tests/data/channels/channels/non_self_expose_channel_2/osx-arm64/jupyter-core-0.2.0-h60d57d3_0.conda b/tests/data/channels/channels/non_self_expose_channel_2/osx-arm64/jupyter-core-0.2.0-h60d57d3_0.conda index 2d45d8e704070fbb87899b2afe3158b3102d09f3..4f7336fd4cb2da3cdfb184fe2f5aa60ccd9db1b5 100644 GIT binary patch delta 409 zcmbQmIg67gz?+#xmjMLaGA8mwbGT)sMLx7zm^LxLRI=8`{PS6br*kf@_)=-`x!19# zeCLbat)0h1CjM0eE4-vV&114QV|cw>z)Bm5m2Arz+;Uig%_DnPta^1u#Py^COI|Wt zv;ms~gCh{O+SvYkB5M=snrO1s{D_!Q1kdG(M}I6lb-g+ra@OsXzi6wm zG+TI^a#gXt!j!rPp3;+Iea~uNZqDB}QOjqpUAo(G)h907vlwy=c~@&w%K&clC`jE&WEFFhw8g|Ca+{V$mEtWIfvO79@LW$GAAQ~Q->uF0Iq$vCjbBd delta 409 zcmbQmIg67gz?+#xmjMK(x=!SY=9uc57I{_l+LDR+rIIy1=ASuV8K27t`DHWX=P`wS zyJNl_yLBX4YvNxuu)?CMO&2C>Gltho1bqMFb7sYgEY0NiXMFYwHYt9X?6&NzBAXL~ zGlLUDz<#6iE@eNKb}N0n@jtMok!kXa)n_aFN?Hs)FmP1=vtw2$xsl)CC}pByMOWx}6HHTR{adf4jO@f;9m%xeA)?v$L=f7*QTX~Wt)Uuc=3 z+G?=;erEk`y_e!s?51sWF7!UgpOM6(QmC4E>sFfe4UOy$1+l)bekUcm_e?)qp6zjC zdwE2d>(3UWOq0m;PoeAm$@{KXYBO`rYFGG6GZJL!q0(PO2J^{30~^zWGW&Ff*eRG8qg z%*DlpUwq1Y_6IK~zmkw{xDv=>KEI^R>cIBEWG;tkZM#-9_^kVDeT!|wMbQ&%3#xoS zgkEBd<4~CEV9F>VFy~}Ecc-r+&jt6_4p$kQ)(6!ou;z4f2yt_tH)`Q}%kz!rtCD0n z!?IOp3*MDoHQY99{zPL7UJjd23~#x%Z|U-B;63KhR&c p2?5@WOuEdlh@8Ba$rl)tlX;j^cwtcqioQvcYnkKN)-i!16aZF{%Rm4C diff --git a/tests/data/channels/channels/non_self_expose_channel_2/win-64/jupyter-core-0.2.0-h9490d1a_0.conda b/tests/data/channels/channels/non_self_expose_channel_2/win-64/jupyter-core-0.2.0-h9490d1a_0.conda index 031b95017e8ecf2fbb3fc78a87d2f6c3578817d1..db986d3af76e66ff296b682fe0350efc69cb6cdd 100644 GIT binary patch delta 441 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 diff --git a/tests/data/channels/channels/trampoline_1/linux-64/repodata.json b/tests/data/channels/channels/trampoline_1/linux-64/repodata.json index 7f361f243..a11b5d683 100644 --- a/tests/data/channels/channels/trampoline_1/linux-64/repodata.json +++ b/tests/data/channels/channels/trampoline_1/linux-64/repodata.json @@ -9,13 +9,13 @@ "build": "hb0f4dca_0", "build_number": 0, "depends": [], - "md5": "0af1320be2d353a132d4d532fbae8597", + "md5": "347d5984630e6be5217bfbf485be24b9", "name": "dummy-trampoline", "platform": "linux", - "sha256": "d653d6c75b3fe8137c19b5f3e6575c86192659b48d591f9e5d2f693ba53926a4", + "sha256": "6ab98c0e5b7aba534d4b4e881cc8dab471a695bf47c53fd654cc3aed0fa776e7", "size": 1624, "subdir": "linux-64", - "timestamp": 1730882684037, + "timestamp": 1730898133538, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/trampoline_1/osx-64/dummy-trampoline-0.1.0-h0dc7051_0.conda b/tests/data/channels/channels/trampoline_1/osx-64/dummy-trampoline-0.1.0-h0dc7051_0.conda index 165807f0b0e2bf5909c2dedcc6dd4eef6b26bc5c..13934e10a4275410a7c56fe7a7c206278237d586 100644 GIT binary patch delta 1054 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 YsLxJ*lXV4W2$n@=SsgxTMw8?Pa*DaqkpKVy diff --git a/tests/data/channels/channels/trampoline_1/osx-arm64/repodata.json b/tests/data/channels/channels/trampoline_1/osx-arm64/repodata.json index c35ecf4da..31bd62f21 100644 --- a/tests/data/channels/channels/trampoline_1/osx-arm64/repodata.json +++ b/tests/data/channels/channels/trampoline_1/osx-arm64/repodata.json @@ -9,13 +9,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "efc5d391bc12a5e6b680e3318c16037f", + "md5": "276bdf61769e64a9b26cc5ffe9b91828", "name": "dummy-trampoline", "platform": "osx", - "sha256": "58721bb18088e785ad87e8caafbcdd9a5edf7d6df54c3937e8a26efc1051f55b", + "sha256": "912102acdd17263520f72afa7f080081615ffbf8e36b1be64ca923f039c9564f", "size": 1622, "subdir": "osx-arm64", - "timestamp": 1730882684077, + "timestamp": 1730898133580, "version": "0.1.0" } }, diff --git a/tests/data/channels/channels/trampoline_1/win-64/dummy-trampoline-0.1.0-h9490d1a_0.conda b/tests/data/channels/channels/trampoline_1/win-64/dummy-trampoline-0.1.0-h9490d1a_0.conda index 54ca63ef50497f91029f75e51e00fec3b40d4f84..1eb7dab0fb7ade2dcfd62a6ec6b7f1ff7b15ca66 100644 GIT binary patch delta 787 zcmX@ibBKp0z?+#xmjMLaGA8mwbGT)sMIH+96P%cDE4!KzEWrSyHMZ*iO<>^VhxNJ-NChDm7=$_Zuqn zT2}jouWR4_aeM!KQQzv9`g3(QYQ}lx^Y5R#B_=&mNv&#fHlrzv+245^Cog3*sW(?h zXzQ4wDjO|O$Dy;AOF~$D&ytposa_n843F4-MD%<(4fJlvJM#Wv<(-@?yRnbAPUW-{ z#~-f>?oK%t#UsbJSk2(tG$DeyjXl8rM)5u`ANk7@l6<-Ql76PG^I=M`L{1 z8hRREBrahV;_0~;!t+*EV2%mzy~+fS02MYiAub_iuSkZL38@#DbzHdRki#}DQp=)u z;p8f&nEHTjxf|PZQx1!({C2th?COeDY{IP_if7L^xTFb5E(&G{V(?{nXZ!HA!&PTb zmVf|}14(a`4FWDbj^CHmX>?}6tfIDQObQy!p{hE^_%ANiVDMO^apk$!#F9%=*CNU< znUudbWs~)um3FtYc)hSrXuGQRlAk?a9!T@u6scX8Q(|0S`Z^>;?0$=htAA>va+k@Y2KgC zlP9k^)W)rgerNjrdPx1*qh5P$>%W_+&f)Lw4dq%`92B*D;=W%d7v|5)-IupMlRvb> zYwui{o1AO@6eoU|n{qnxjcK#!l=`T>8?U8xQHM(o7IB zHJw)Kd-k^ery!Y)ty`Y)8>v(_1!>kX^8Sk7p0Mh1>4aOAQ-gJ+_>O&hvE|eai}xEn zZ8*c{u8ZN%f1EFGuRZJArFg5zq~JYM?#b0zXYM>_rO;eZVcHa-1n?uJj+B z(@q?Jd@Fvt^fw8-N{*8CVU6@y!FZT?1>d(R>x(WQH(w$VoNFuiTwU(rX+4O*v4WThkI6SfIH?^yZ)arB-fd7)62^f*5=m-s#5Pw)r8S z%4DI#?ZCTA*}>=H{q%YFGWgh7b)NoN!I}`k#ijph?|+}IIt-ngbS|f#35bepIU2V8 zQNHD~8&$cQEpd0fve!+Oe#kOea^fGyCo$6hrm@r>6WvrrhDHUp zwHNNkab>L%O1iUbcKnv)ZvNPaHl7vFq}b)NG*_hi-M^JpA5yh8%dcRqvo0&E@5IUV zil#f2mYqK}oAs<=zWaiA5zQr5#sA*<98;gmdUMg|z1Nb~*gY({qG(edW%P2ECDU(q z?H6A{o1UmG_~e~dur?*6H|zTAhwA&6%!>56f8x^t%gdlP z)m4FEyR^EK=aZcueucc_>gjDg$IoyoWk&E9&-j1;-~Wr}wq>wmuwp1<*?af5*xhga zQC0z=amy4~6dX#Ee?=}a(3)&C@np-kh!Z^vQ$?Il@hleMVso?1@HGFUQP=$P_Ync6 z`Yj8jy;6!MbiO=u%2i0#`boU4j_>NnCX-*QET27%^J&w{9LaN4XHKQPG?HHaI3mq- z)w`?v?)xzXcE7yA|BF3NCiGgq_qB)m6|tM8ejEB4pFzBq1PuVdMk$+Pmpme%R~3!Cj_--dTB zQ2Y?)QoDTJYu5nrb*GI_=I1?mv$bp1apm3N^Xo*a&&?KPby&b?`QpNfsYPB}r5)Nl z0`yigXBpI=(+O5Ixo8(7qF1)cu&}eIRBq7h>lTc7 zoA@^NnAhB*RA%o}2|s=*{1-R>vQ>_OjbW3Bh%jdWGmn}lui7PBPDiy}1*UEchuJI^ zf9FSz_q52xwt*J^p+Jv8gdsC8Enj!?Y9?K4Qzl3nfYFdNARa5o@GUk{BH;TUpOmmI zNt1bY8XJF|t;~5q{fLj?L-t^XAcnxn!pv68$(OPw2QY8qP!(DjqUI&UyqS|lo{`Bd zW3m>jFE1>yffCrs$t|o&Y9JAiV?fq{Fvu}5u%xjSC<1cY#5%pnR%{AvQmi030MBz4 A6#xJL delta 686 zcmcb|^MHpZz?+#xmjMK(xlZJX=9uQ17TJF;WyZvO+xjz%Uwoux9vI+n#6bp)I>& zmHuUZCV>UJ4FB2$Nlf*edBULQ(zYB$aiiN?dTuQ_W8k&$hQTRk>s?A7AEkX1ESdxs z*8gSsd}!v>er2z$3H7BLO?20vK67rebbgqM@afh=iB_i#HDit*E|AU-o;h{Jukhb> zzh5}(E?e^N!od$o-duZ`Blqh@w(oyfdN%Dr_s1>2>aOnQlAgECukBsP`<sdfi81b2ZELr!S6&*XvleWzG)Cxb^5X`-Ow^C%p;p zTCm_lm`m;Qb+3>6i?2KV`9yx&lQ&!YB-@pLhtF>ksXjM{H%&k>@U$ydx~Wv|SiDXr8ekYuFr zWDY}CYCYdKlh}G$(S3H}+&hl+1Z`WCl6B}=yZ^p0hiFOu6OR>`c;z`uGSUyoH7=4- zWY1xVn7!efUiDHx3nK=P zR?J-<){}jiH?g0z$WBV1bYwF-i##LKG}p-*tiHUkBn3)FXC^nXCaHl$K=y$Q1!0hV bFtDVt11OT2mzF=VPH(aWn*y5*D@YCi0=o=< diff --git a/tests/data/channels/channels/trampoline_2/linux-64/repodata.json b/tests/data/channels/channels/trampoline_2/linux-64/repodata.json index 5ce4d29be..e5e314e92 100644 --- a/tests/data/channels/channels/trampoline_2/linux-64/repodata.json +++ b/tests/data/channels/channels/trampoline_2/linux-64/repodata.json @@ -9,13 +9,13 @@ "build": "hb0f4dca_0", "build_number": 0, "depends": [], - "md5": "1f83a1294e46f34d5ad06b1ba21f1fe8", + "md5": "5cf3ff552794c2244ded9cb84111a5de", "name": "dummy-trampoline", "platform": "linux", - "sha256": "0316f0ae52043907d398c0eff2094981a9b09fa1bf96b0ccf721d97e12d7c2b3", - "size": 1632, + "sha256": "e0002e6221ca171cc2b87f981c997e58c1ea210da680b7f63182970d96a80c97", + "size": 1630, "subdir": "linux-64", - "timestamp": 1730882684201, + "timestamp": 1730898133718, "version": "0.2.0" } }, diff --git a/tests/data/channels/channels/trampoline_2/osx-64/dummy-trampoline-0.2.0-h0dc7051_0.conda b/tests/data/channels/channels/trampoline_2/osx-64/dummy-trampoline-0.2.0-h0dc7051_0.conda index bc19ec72ab37cbe4c587c1dfbac57d05acf26a37..880c96d6cbde806d87bc63a711d21d57217639fc 100644 GIT binary patch delta 1016 zcmaFJbC-uFz?+#xmjMLaGA8mwbGT)sMc!01W1g6ATYr)fEWrSyHMZ*iO<>^t%gdlP z)m4FEyR^EK=aZcueucc_>gjDg$IoyoWk&E9&-j1;-~Wr}wq>wmuwp1<*?af5*xhga zQC0z=amy4~6dX#Ee?=}a(3)&C@np-kh!Z^vQ$?Il@hleMVso?1@HGFUQP=$P_Ync6 z`Yj8jy;6!MbiO=u%2i0#`boU4j_>NnCX-*QET27%^J&w{9LaN4XHKQPG?HHaI3mq- z)w`?v?)xzXcE7yA|BF3NCiGgq_qB)m6|tM8ejEB4pFzBq1PuVdMk$+Pmpme%R~3!Cj_--dTB zQ2Y?)QoDTJYu5nrb*GI_=I1?mv$bp1apm3N^Xo*a&&?KPby&b?`QpNfsYPB}r5)Nl z0`yigXBpI=(+O5Ixo8(7qF1)cu&}eIRBq7h>lTc7 zoA@^NnAhB*RA%o}2|s=*{1-R>vQ>_OjbW3Bh%jdWGmn}lui7PBPDiy}1*UEchuJI^ zf9FSz_q51G!gAC8LxCQH2t#IGTE6b&)l9neCQOht0HYykKs;2C;o02?Ifrh!8^;b` zXpfs3AYa&cr7zLUx&4}o#h1OSHf{LL9K;aF;LC8Xa*E;Oj8_W$4vv}!g7yhYsC1;w zx-eUDwFa~7+qXKb3M&p?>O4Qws!Wr$K*7tiL#hbz*E166s+5I-XSQ!1kd3#I#+%M^K8Wy#CMIWe`_wt|f=G6x$?XwF`o0E89 z>E3sDSmtFV>^*U0XGGQp8STIyGj<=n-*dgYskLpI)Ef7uS-!%8o9`=J+&gc(#G#1X zTJP97Ywwwux=HKrUKh3h-QK_6*0S}#U#>U%`tZ`Cmh!^0lP|}+-B__$Fnp1`q1ob; z81c<9C3;&oXKt~{>`dp#ekpokd2x>3W#$H^gO<-b+l_?we$79|a%*<(%HF?8clF;| zCKqL{(LHZ3xoKhAec zHDXMg9L{oy$t`2DHmff$EOUY~woux9vI+n#6bp)I>& zmHuUZCV>UJ4FB2$Nlf*edBULQ(zYB$aiiN?dTuQ_W8k&$hQTRk>s?A7AEkX1ESdxs z*8gSsd}!v>er2z$3H7BLO?20vK67rebbgqM@afh=iB_i#HDit*E|AU-o;h{Jukhb> zzh5}(E?e^N!od$o-duZ`Blqh@w(oyfdN%Dr_s1>2>aOnQlAgECukBsP`<sdfi81b2ZELr!S6&*XvleWzG)Cxb^5X`-Ow^C%p;p zTCm_lm`m;Qb+3>6i?2KV`9yx&lQ&!YB-@pLhtF>ksXjM{H%&k>@U$ydx~Wv|SiDXr8ekYuFr zWDY}CYCYdKlh}G$(S3H}+&hl+1Z`WCl6B}=yZ^p0hiFOu6OR>`c;z`uGSUyoH7=4- zWY1xVn7!efUiDHx3nK=EHpvNG>keN4mDU(6HDH9|Oz-UMs5RVmPcqSVu=djx5#<97L z5qa9-?x8QO+aBKaxD*&X=l@p`Rvt!?V1^(DUxssEOV%GjkXn|MA#cIdbvc8<`uJ4q9IC^e_^c^D+Gy%dF$q&K%pf@ZIcZ zXC-o^vU`Kw<)6vTe7VI{GCMVI*Y{g;ZqhH#+-^BPTOe%Jr%0`wWkm~rGV_1Gmwv2- zX&ZQnU|J7u}*KY MIhz8TEGtM30G}$Yy8r+H diff --git a/tests/data/channels/channels/trampoline_2/osx-64/repodata.json b/tests/data/channels/channels/trampoline_2/osx-64/repodata.json index 94fc77525..cc9c6845e 100644 --- a/tests/data/channels/channels/trampoline_2/osx-64/repodata.json +++ b/tests/data/channels/channels/trampoline_2/osx-64/repodata.json @@ -9,13 +9,13 @@ "build": "h0dc7051_0", "build_number": 0, "depends": [], - "md5": "74f32d57ede54674516b3fe8de1a7d9e", + "md5": "ed82cfca5dc790ce8600cd7f93c7e685", "name": "dummy-trampoline", "platform": "osx", - "sha256": "76821e964b6fc2c6fda9ceecffa505d94facbf4df0f4efded3373f8bac01bdf9", - "size": 1633, + "sha256": "d352817b1fd10ef2816a94bcae75569f4d788341bfb09bea1c8ae80eac3f5719", + "size": 1629, "subdir": "osx-64", - "timestamp": 1730882684284, + "timestamp": 1730898133805, "version": "0.2.0" } }, diff --git a/tests/data/channels/channels/trampoline_2/osx-arm64/dummy-trampoline-0.2.0-h60d57d3_0.conda b/tests/data/channels/channels/trampoline_2/osx-arm64/dummy-trampoline-0.2.0-h60d57d3_0.conda index ada8c260f8b2ee3b2708f849c12039562ab01b08..c6f7c6e075b7d099a2578dff9992ec0edd3f8dba 100644 GIT binary patch delta 651 zcmaFBbC-uFz?+#xmjMLaGA8mwbGT)sMc!01W1g6ATYr)fEWrSyHMZ*iO<>^t%gdlP z)m4FEyR^EK=aZcueucc_>gjDg$IoyoWk&E9&-j1;-~Wr}wq>wmuwp1<*?af5*xhga zQC0z=amy4~6dX#Ee?=}a(3)&C@np-kh!Z^vQ$?Il@hleMVso?1@HGFUQP=$P_Ync6 z`Yj8jy;6!MbiO=u%2i0#`boU4j_>NnCX-*QET27%^J&w{9LaN4XHKQPG?HHaI3mq- z)w`?v?)xzXcE7yA|BF3NCiGgq_qB)m6|tM8ejEB4pFzBq1PuVdMk$+Pmpme%R~3!Cj_--dTB zQ2Y?)QoDTJYu5nrb*GI_=I1?mv$bp1apm3N^Xo*a&&?KPby&b?`QpNfsYPB}r5)Nl z0`yigXBpI=(+O5Ixo8(7qF1)cu&}eIRBq7h>lTc7 zoA@^NnAhB*RA%o}2|s=*{1-R>vQ>_OjbW3Bh%jdWGmn}lui7PBPDiy}1*UEchuJI^ zf9FSz_q52Mvf8-+P@u;k!jPGlmajW`HPb>VnaN?<%lCvbxlb`<+IowlvHJ4D5)dfSoSfXkngmW#APXkHV-@3QWnuuE SKCw=3vK5;Gnwoux9vI+n#6bp)I>& zmHuUZCV>UJ4FB2$Nlf*edBULQ(zYB$aiiN?dTuQ_W8k&$hQTRk>s?A7AEkX1ESdxs z*8gSsd}!v>er2z$3H7BLO?20vK67rebbgqM@afh=iB_i#HDit*E|AU-o;h{Jukhb> zzh5}(E?e^N!od$o-duZ`Blqh@w(oyfdN%Dr_s1>2>aOnQlAgECukBsP`<sdfi81b2ZELr!S6&*XvleWzG)Cxb^5X`-Ow^C%p;p zTCm_lm`m;Qb+3>6i?2KV`9yx&lQ&!YB-@pLhtF>ksXjM{H%&k>@U$ydx~Wv|SiDXr8ekYuFr zWDY}CYCYdKlh}G$(S3H}+&hl+1Z`WCl6B}=yZ^p0hiFOu6OR>`c;z`uGSUyoH7=4- zWY1xVn7!efUiDHx3nK=QjLK!%^>pc@^sr-X zPrqnPPG+9Xnl@K-qwr>C79~ceX|9viS$%n72?&&E&P;A(O;Q7ifJ`@GVqgGakm)e6 Zq_G1il9`v5Ke0}4vN@Xqn+z*R4gj@<4^IF9 diff --git a/tests/data/channels/channels/trampoline_2/osx-arm64/repodata.json b/tests/data/channels/channels/trampoline_2/osx-arm64/repodata.json index 87f1f95f7..18f124c37 100644 --- a/tests/data/channels/channels/trampoline_2/osx-arm64/repodata.json +++ b/tests/data/channels/channels/trampoline_2/osx-arm64/repodata.json @@ -9,13 +9,13 @@ "build": "h60d57d3_0", "build_number": 0, "depends": [], - "md5": "4e04031c0753ab3c0d0e71e6eb55d998", + "md5": "33dff0375ebac00e35f37e8140a7805f", "name": "dummy-trampoline", "platform": "osx", - "sha256": "0c688c0c6cf58c092202bf89d3dfe0b0c8238f80d1082e334c0c07e0a43ac652", - "size": 1632, + "sha256": "897ae0414a05ac9bbccf6b640ec60049f209a6f54158ab4b8700e70909be9f14", + "size": 1629, "subdir": "osx-arm64", - "timestamp": 1730882684242, + "timestamp": 1730898133762, "version": "0.2.0" } }, diff --git a/tests/data/channels/channels/trampoline_2/win-64/dummy-trampoline-0.2.0-h9490d1a_0.conda b/tests/data/channels/channels/trampoline_2/win-64/dummy-trampoline-0.2.0-h9490d1a_0.conda index aadc6a33b7173f25aa3cf5ca501a45ca4834c22f..4e8abc84bb875719cc72ac4867e330ecc06375a5 100644 GIT binary patch delta 1180 zcmX@bbBc#2z?+#xmjMLaGA8mwbGT)sMP4>?$(WdLTfdnREWrSyHMZ*iO<>^lLyNJ*rC5zw|;`8`(&kw z^$*3r<#hf3%Dv1gj(z3aaL+xbJT#>GSiis6w(Eh!z2?akLT;tEie&fn?vMSG6LD+v z{4W!aq*hG2$5;0|LsB-VzN7PAvAvpgJFnx`twPgN-@aScP&OyGc;4}sULG$$YwYky ze<1Ux&OK!L_a8}rw@U@eWTmg@>ztkRcb+k~a)Nlh>Zk4LKdyUCb9$tG_j{Y4z?Wy& znK-Hx&Mzu&aQm@!&fhrUPc}CX{w~|H^!XW9jjQn%3JGl;7iL-(te7Z&MqxeEF%~ur z55=UVLQVn=KNy8uxr3Q{xZT_WnClx`p5!>KsczOhxv7TXdvU~~mivBlG6llS-@HCp zpwOMo>Z5aTdh(3S=h163HF+z0YRykD_$7C9{h#{SO(gpaLvFtuRd@yFdLLc zSDQ-B+roLTGQlH&O;0FFh}kQWp=Cnq1!f%=ZaL%_PK#Wz`R&vHP@u;kGWjE`alJVc zB%Wb3B%Z}{1sT}lBIN?QD0POT=~EtER)+w#)m{-j@~gZ9878;{t~ftc z>E#mJYZ2w2W?6I8OLzCFu8%B#B=d&F`)cAzu1-5;+aGLlH$`gK<&+qg%C1_WvyU^g zYu+g)cM(k)Y1_Qi4I19cta-aCpM5D2E)oiNWIlb6?bNX#Httnd?2q4)zIL$OQscn% zjZ+SGX}ml+f5xmF-Yd_a?qa>>CieKV)za<9m!AIlrTT&K{k4nl|G!-S^R$?4S?^YP zi`T*RYaeFwhjO%6Sz8tfNBn$w=z(|mW{DgzZH@n1sxrNkUxrPIb>X->bIvB_2Bw2| zZ3XuxuPjP6&Stv!a<-w}w5#m%-LgOT`{neXpQ9=NE2i{ae{P7?1*ex6DuXWl`gbrZ2AOetau+ zV8ubd<817mmuv-OIkcH7TY%a7`=N%22Rx#$drvQ6-Xl=+&p}sWnxI~d*p4dr1CL8&mAM@sR-jB4VfE#Ol_;Q6Wb@=a)+Bk5 a2q+zb(i;c^(;*}Q0?8$f`IFzXMgsui8~DHg delta 1169 zcmX@bbBc#2z?+#xmjMK(xlZJX=9uQ17I`$}9p}V++xjhxUEE%MhF4`MWbAF1` z!Cvj_+`i?R_Os7ki3xXGV8pe0L)R&tRWmt6O--k@`ksw8C^8cHn7ZXDztQ6iKNTaE zdS>DOuf=^z?cN9OUEfu+)muZNm-YFFZMz=qI)Bi0pGWxIZ87Wb9J{aAWTx}>rvERG zM@BZD`Ri+bXY9Vl^jA@>>ipjsZ)D6^u3qzsnYMNJY^Ga<+s;t^dw5JTx`-n#!l`_31yZdzCpo(!Tq>%}?Nq+6^X- zDuwfl${XB%Y@PEr?(;{Ro7&&sW_X{U$sMrDQPWZ(psnM=T+4zL6Xnk+tYdkL#H>Bt?pD>F^up}BB6$00A?-xUTj zDTSeo!YV(wjCCVxR-5TARrKHRo=x&VW=`P4{Y7^iHmXT3Xx|!Qpw;GbbD`BArUMK< zcdy0uwyEbfl`~0P(q!i6WbJI8d}q^E9$o(R4IF_6Y{*fZ7HPbRC3JEllU=XVWmCt;SvyW8O4PX~PR^t^lb+| z+Hh6RzrK#md)Jr17sqC&Uz>T{!fc|b$%eR`M>#sC5q?wU?4GSFTzl@dYvZ||rEIS! zD(tZrH2p2L7eCvq4U;L zGB>L!$hP)O`LT&hId6;E_e);opJt}2E&Fiwxy-&^Kk58AdQleYYu`^eXm)?=sk{46 z?EV+@o!2F8PtF5KegcT_9NS~85Xly z%Sy|rczt&$QCP#lB6y9F!9$Gg2vhpX8TWShSvj;m_}qTADPMAHL{gJCpF(?igd+Qo zLskj)+)e^J=cRIp-jZCidG(HaJD3Aji5bt?ZTm{X`|O;F7Q7rHl?`RB(E+Y@2eu_I zaP~Oh;ip@1 XP;vudJq8g-`U8?n8Ve@BXN?8`IjruE diff --git a/tests/data/channels/channels/trampoline_2/win-64/repodata.json b/tests/data/channels/channels/trampoline_2/win-64/repodata.json index b126b3263..1158f6d52 100644 --- a/tests/data/channels/channels/trampoline_2/win-64/repodata.json +++ b/tests/data/channels/channels/trampoline_2/win-64/repodata.json @@ -9,13 +9,13 @@ "build": "h9490d1a_0", "build_number": 0, "depends": [], - "md5": "d4027e514f8e4dab24b285d33e8439f1", + "md5": "ce4e3a397793d4ddcc34398f4593b10d", "name": "dummy-trampoline", "platform": "win", - "sha256": "030dcaa53192a76593b6567da4041c7b7e07fb8c399db4743801b6b08d1cf0dd", + "sha256": "058f5d3c112b76ee73a4dbefb7bbcb977c088be84545ac7f4a2cd386a237051f", "size": 1610, "subdir": "win-64", - "timestamp": 1730882684160, + "timestamp": 1730898133667, "version": "0.2.0" } }, diff --git a/tests/data/channels/mappings.toml b/tests/data/channels/mappings.toml index 734f0a9d4..6912706be 100644 --- a/tests/data/channels/mappings.toml +++ b/tests/data/channels/mappings.toml @@ -1,7 +1,7 @@ "dummy_channel_1.yaml" = "dummy_channel_1" "dummy_channel_2.yaml" = "dummy_channel_2" -"global_update_channel_1_010.yaml" = "global_update_channel_1" -"global_update_channel_1_020.yaml" = "global_update_channel_1" +"multiple_versions_channel_1_010.yaml" = "multiple_versions_channel_1" +"multiple_versions_channel_1_020.yaml" = "multiple_versions_channel_1" "non_self_expose_channel_1.yaml" = "non_self_expose_channel_1" "non_self_expose_channel_2.yaml" = "non_self_expose_channel_2" "trampoline/trampoline_1.yaml" = "trampoline_1" diff --git a/tests/data/channels/recipes/global_update_channel_1_010.yaml b/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml similarity index 95% rename from tests/data/channels/recipes/global_update_channel_1_010.yaml rename to tests/data/channels/recipes/multiple_versions_channel_1_010.yaml index df78a0a0e..d1abfb773 100644 --- a/tests/data/channels/recipes/global_update_channel_1_010.yaml +++ b/tests/data/channels/recipes/multiple_versions_channel_1_010.yaml @@ -1,5 +1,5 @@ recipe: - name: global-update-channel + name: multiple-versions-channel version: 1.0.0 context: @@ -10,6 +10,7 @@ outputs: version: ${{ version }} build: + number: 0 script: - mkdir -p $PREFIX/bin # Expose two binaries, with and without version number diff --git a/tests/data/channels/recipes/global_update_channel_1_020.yaml b/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml similarity index 96% rename from tests/data/channels/recipes/global_update_channel_1_020.yaml rename to tests/data/channels/recipes/multiple_versions_channel_1_020.yaml index 090dddb19..6238927d1 100644 --- a/tests/data/channels/recipes/global_update_channel_1_020.yaml +++ b/tests/data/channels/recipes/multiple_versions_channel_1_020.yaml @@ -1,5 +1,5 @@ recipe: - name: global-update-channel + name: multiple-versions-channel version: 1.0.0 context: diff --git a/tests/integration_python/conftest.py b/tests/integration_python/conftest.py index aac4807fc..d897b4eba 100644 --- a/tests/integration_python/conftest.py +++ b/tests/integration_python/conftest.py @@ -34,8 +34,8 @@ def dummy_channel_2(channels: Path) -> str: @pytest.fixture -def global_update_channel_1(channels: Path) -> str: - return channels.joinpath("global_update_channel_1").as_uri() +def multiple_versions_channel_1(channels: Path) -> str: + return channels.joinpath("multiple_versions_channel_1").as_uri() @pytest.fixture diff --git a/tests/integration_python/global/test_global.py b/tests/integration_python/global/test_global.py index dcac849a5..b6ccd8605 100644 --- a/tests/integration_python/global/test_global.py +++ b/tests/integration_python/global/test_global.py @@ -1094,14 +1094,14 @@ def test_install_multi_env_install(pixi: Path, tmp_path: Path, dummy_channel_1: @pytest.mark.skipif(platform.system() == "Windows", reason="Not reliable on Windows") -def test_pixi_install_cleanup(pixi: Path, tmp_path: Path, global_update_channel_1: str) -> None: +def test_pixi_install_cleanup(pixi: Path, tmp_path: Path, multiple_versions_channel_1: str) -> None: env = {"PIXI_HOME": str(tmp_path)} package0_1_0 = tmp_path / "bin" / exec_extension("package0.1.0") package0_2_0 = tmp_path / "bin" / exec_extension("package0.2.0") verify_cli_command( - [pixi, "global", "install", "--channel", global_update_channel_1, "package==0.1.0"], + [pixi, "global", "install", "--channel", multiple_versions_channel_1, "package==0.1.0"], env=env, ) assert package0_1_0.is_file() @@ -1110,7 +1110,7 @@ def test_pixi_install_cleanup(pixi: Path, tmp_path: Path, global_update_channel_ # Install the same package but with a different version # The old version should be removed and the new version should be installed without error. verify_cli_command( - [pixi, "global", "install", "--channel", global_update_channel_1, "package==0.2.0"], + [pixi, "global", "install", "--channel", multiple_versions_channel_1, "package==0.2.0"], env=env, ) @@ -1339,7 +1339,7 @@ def test_uninstall_only_reverts_failing(pixi: Path, tmp_path: Path, dummy_channe def test_global_update_single_package( - pixi: Path, tmp_path: Path, global_update_channel_1: str + pixi: Path, tmp_path: Path, multiple_versions_channel_1: str ) -> None: env = {"PIXI_HOME": str(tmp_path)} # Test update with no environments @@ -1350,7 +1350,7 @@ def test_global_update_single_package( # Test update of a single package verify_cli_command( - [pixi, "global", "install", "--channel", global_update_channel_1, "package 0.1.0"], + [pixi, "global", "install", "--channel", multiple_versions_channel_1, "package 0.1.0"], env=env, ) # Replace the version with a "*" @@ -1397,7 +1397,7 @@ def test_global_update_single_package_with_transient_dependency( def test_global_update_all_packages( - pixi: Path, tmp_path: Path, global_update_channel_1: str + pixi: Path, tmp_path: Path, multiple_versions_channel_1: str ) -> None: env = {"PIXI_HOME": str(tmp_path)} @@ -1407,7 +1407,7 @@ def test_global_update_all_packages( "global", "install", "--channel", - global_update_channel_1, + multiple_versions_channel_1, "package2==0.1.0", "package==0.1.0", ], @@ -1450,7 +1450,7 @@ def test_global_update_all_packages( def test_global_update_multiple_packages_in_one_env( - pixi: Path, tmp_path: Path, global_update_channel_1: str + pixi: Path, tmp_path: Path, multiple_versions_channel_1: str ) -> None: env = {"PIXI_HOME": str(tmp_path)} @@ -1460,7 +1460,7 @@ def test_global_update_multiple_packages_in_one_env( "global", "install", "--channel", - global_update_channel_1, + multiple_versions_channel_1, "--environment", "my-packages", "package2==0.1.0", @@ -1506,14 +1506,14 @@ def test_global_update_multiple_packages_in_one_env( assert "0.2.0" in bin_file_package2.read_text() -def test_pixi_update_cleanup(pixi: Path, tmp_path: Path, global_update_channel_1: str) -> None: +def test_pixi_update_cleanup(pixi: Path, tmp_path: Path, multiple_versions_channel_1: str) -> None: env = {"PIXI_HOME": str(tmp_path)} package0_1_0 = tmp_path / "bin" / exec_extension("package0.1.0") package0_2_0 = tmp_path / "bin" / exec_extension("package0.2.0") verify_cli_command( - [pixi, "global", "install", "--channel", global_update_channel_1, "package==0.1.0"], + [pixi, "global", "install", "--channel", multiple_versions_channel_1, "package==0.1.0"], env=env, ) assert package0_1_0.is_file() @@ -1543,7 +1543,7 @@ def test_pixi_update_cleanup(pixi: Path, tmp_path: Path, global_update_channel_1 def test_pixi_update_subset_expose( - pixi: Path, tmp_path: Path, global_update_channel_1: str + pixi: Path, tmp_path: Path, multiple_versions_channel_1: str ) -> None: env = {"PIXI_HOME": str(tmp_path)} @@ -1551,7 +1551,7 @@ def test_pixi_update_subset_expose( package0_2_0 = tmp_path / "bin" / exec_extension("package0.2.0") verify_cli_command( - [pixi, "global", "install", "--channel", global_update_channel_1, "package==0.1.0"], + [pixi, "global", "install", "--channel", multiple_versions_channel_1, "package==0.1.0"], env=env, ) assert package0_1_0.is_file() diff --git a/tests/integration_python/test_main_cli.py b/tests/integration_python/test_main_cli.py index 36385231d..2fa34d978 100644 --- a/tests/integration_python/test_main_cli.py +++ b/tests/integration_python/test_main_cli.py @@ -1,5 +1,8 @@ +import os from pathlib import Path from .common import verify_cli_command, ExitCode, PIXI_VERSION +import tomllib +import json import pytest @@ -290,3 +293,215 @@ def test_pixi_init_pyproject(pixi: Path, tmp_path: Path) -> None: verify_cli_command([pixi, "init", tmp_path, "--format", "pyproject"], ExitCode.SUCCESS) # Verify that install works verify_cli_command([pixi, "install", "--manifest-path", manifest_path], ExitCode.SUCCESS) + + +def test_upgrade_package_does_not_exist( + pixi: Path, tmp_path: Path, multiple_versions_channel_1: str +) -> None: + manifest_path = tmp_path / "pixi.toml" + + # Create a new project + verify_cli_command([pixi, "init", "--channel", multiple_versions_channel_1, tmp_path]) + + # Add package + verify_cli_command([pixi, "add", "--manifest-path", manifest_path, "package"]) + + # Similar package names that don't exist should get suggestions + verify_cli_command( + [pixi, "upgrade", "--manifest-path", manifest_path, "package_similar_name"], + ExitCode.FAILURE, + stderr_contains=[ + "could not find a package named 'package_similar_name'", + "did you mean 'package'", + ], + ) + + verify_cli_command( + [pixi, "upgrade", "--manifest-path", manifest_path, "different_name"], + ExitCode.FAILURE, + stderr_contains="could not find a package named 'different_name'", + stderr_excludes="did you mean 'package'", + ) + + +def test_upgrade_conda_package( + pixi: Path, tmp_path: Path, multiple_versions_channel_1: str +) -> None: + manifest_path = tmp_path / "pixi.toml" + + # Create a new project + verify_cli_command([pixi, "init", "--channel", multiple_versions_channel_1, tmp_path]) + + # Add package pinned to version 0.1.0 + verify_cli_command( + [ + pixi, + "add", + "--manifest-path", + manifest_path, + f"package==0.1.0[channel={multiple_versions_channel_1},build_number=0]", + ] + ) + parsed_manifest = tomllib.loads(manifest_path.read_text()) + package = parsed_manifest["dependencies"]["package"] + assert package["version"] == "==0.1.0" + assert package["channel"] == multiple_versions_channel_1 + assert package["build-number"] == "==0" + + # Upgrade package, it should now be at 0.2.0, with semver ranges + # The channel should still be specified + verify_cli_command( + [pixi, "upgrade", "--manifest-path", manifest_path, "package"], + stderr_contains=["package", "0.1.0", "0.2.0"], + ) + parsed_manifest = tomllib.loads(manifest_path.read_text()) + package = parsed_manifest["dependencies"]["package"] + assert package["version"] == ">=0.2.0,<0.3" + assert package["channel"] == multiple_versions_channel_1 + assert "build-number" not in package + + +def test_upgrade_exclude(pixi: Path, tmp_path: Path, multiple_versions_channel_1: str) -> None: + manifest_path = tmp_path / "pixi.toml" + + # Create a new project + verify_cli_command([pixi, "init", "--channel", multiple_versions_channel_1, tmp_path]) + + # Add package pinned to version 0.1.0 + verify_cli_command( + [pixi, "add", "--manifest-path", manifest_path, "package==0.1.0", "package2==0.1.0"] + ) + parsed_manifest = tomllib.loads(manifest_path.read_text()) + assert parsed_manifest["dependencies"]["package"] == "==0.1.0" + assert parsed_manifest["dependencies"]["package2"] == "==0.1.0" + + # Upgrade package, it should now be at 0.2.0, with semver ranges + # package2, should still be at 0.1.0, since we excluded it + verify_cli_command( + [pixi, "upgrade", "--manifest-path", manifest_path, "--exclude", "package2"], + stderr_contains=["package", "0.1.0", "0.2.0"], + stderr_excludes="package2", + ) + parsed_manifest = tomllib.loads(manifest_path.read_text()) + assert parsed_manifest["dependencies"]["package"] == ">=0.2.0,<0.3" + assert parsed_manifest["dependencies"]["package2"] == "==0.1.0" + + +def test_upgrade_json_output(pixi: Path, tmp_path: Path, multiple_versions_channel_1: str) -> None: + manifest_path = tmp_path / "pixi.toml" + + # Create a new project + verify_cli_command([pixi, "init", "--channel", multiple_versions_channel_1, tmp_path]) + + # Add package pinned to version 0.1.0 + verify_cli_command( + [pixi, "add", "--manifest-path", manifest_path, "package==0.1.0", "package2==0.1.0"] + ) + parsed_manifest = tomllib.loads(manifest_path.read_text()) + assert parsed_manifest["dependencies"]["package"] == "==0.1.0" + assert parsed_manifest["dependencies"]["package2"] == "==0.1.0" + + # Check if json output is correct and readable + result = verify_cli_command( + [pixi, "upgrade", "--manifest-path", manifest_path, "--json"], + stdout_contains=["package", "package2", "0.1.0", "0.2.0", 'version": ', "before", "after"], + ) + + data = json.loads(result.stdout) + assert data["environment"]["default"] + + +def test_upgrade_dryrun(pixi: Path, tmp_path: Path, multiple_versions_channel_1: str) -> None: + manifest_path = tmp_path / "pixi.toml" + lock_file_path = tmp_path / "pixi.lock" + # Create a new project + verify_cli_command([pixi, "init", "--channel", multiple_versions_channel_1, tmp_path]) + + # Add package pinned to version 0.1.0 + verify_cli_command( + [pixi, "add", "--manifest-path", manifest_path, "package==0.1.0", "package2==0.1.0"] + ) + + manifest_content = manifest_path.read_text() + lock_file_content = lock_file_path.read_text() + # Rename .pixi folder, no remove to avoid remove logic. + os.renames(tmp_path / ".pixi", tmp_path / ".pixi_backup") + + parsed_manifest = tomllib.loads(manifest_path.read_text()) + assert parsed_manifest["dependencies"]["package"] == "==0.1.0" + assert parsed_manifest["dependencies"]["package2"] == "==0.1.0" + + verify_cli_command( + [pixi, "upgrade", "--manifest-path", manifest_path, "--dry-run"], + stderr_contains=["package", "0.1.0", "0.2.0"], + ) + + # Verify the manifest, lock file and .pixi folder are not modified + assert manifest_path.read_text() == manifest_content + assert lock_file_path.read_text() == lock_file_content + assert not os.path.exists(tmp_path / ".pixi") + + +@pytest.mark.slow +def test_upgrade_pypi_package(pixi: Path, tmp_path: Path) -> None: + manifest_path = tmp_path / "pixi.toml" + + # Create a new project + verify_cli_command([pixi, "init", tmp_path]) + + # Add python + verify_cli_command([pixi, "add", "--manifest-path", manifest_path, "python=3.13"]) + + # Add httpx pinned to version 0.26.0 + verify_cli_command( + [ + pixi, + "add", + "--manifest-path", + manifest_path, + "--pypi", + "httpx[cli]==0.26.0", + ] + ) + parsed_manifest = tomllib.loads(manifest_path.read_text()) + assert parsed_manifest["pypi-dependencies"]["httpx"]["version"] == "==0.26.0" + assert parsed_manifest["pypi-dependencies"]["httpx"]["extras"] == ["cli"] + + # Upgrade httpx, it should now be upgraded + # Extras should be preserved + verify_cli_command( + [pixi, "upgrade", "--manifest-path", manifest_path, "httpx"], + stderr_contains=["httpx", "0.26.0"], + ) + parsed_manifest = tomllib.loads(manifest_path.read_text()) + assert parsed_manifest["pypi-dependencies"]["httpx"]["version"] != "==0.26.0" + assert parsed_manifest["pypi-dependencies"]["httpx"]["extras"] == ["cli"] + + +@pytest.mark.slow +def test_upgrade_pypi_and_conda_package(pixi: Path, tmp_path: Path) -> None: + manifest_path = tmp_path / "pyproject.toml" + + # Create a new project + verify_cli_command([pixi, "init", "--format", "pyproject", tmp_path]) + + # Add pinned numpy as conda and pypi dependency + verify_cli_command([pixi, "add", "--manifest-path", manifest_path, "numpy==1.*"]) + verify_cli_command([pixi, "add", "--manifest-path", manifest_path, "--pypi", "numpy==1.*"]) + + parsed_manifest = tomllib.loads(manifest_path.read_text()) + numpy_pypi = parsed_manifest["project"]["dependencies"][0] + assert numpy_pypi == "numpy==1.*" + numpy_conda = parsed_manifest["tool"]["pixi"]["dependencies"]["numpy"] + assert numpy_conda == "1.*" + + # Upgrade numpy, both conda and pypi should be upgraded + verify_cli_command( + [pixi, "upgrade", "--manifest-path", manifest_path, "numpy"], + stderr_contains=["numpy", "1."], + ) + parsed_manifest = tomllib.loads(manifest_path.read_text()) + numpy_pypi = parsed_manifest["project"]["dependencies"][0] + assert "1.*" not in numpy_pypi + numpy_conda = parsed_manifest["tool"]["pixi"]["dependencies"]["numpy"] + assert numpy_conda != "1.*" diff --git a/tests/integration_rust/common/builders.rs b/tests/integration_rust/common/builders.rs index 2e551c10a..4bdef2660 100644 --- a/tests/integration_rust/common/builders.rs +++ b/tests/integration_rust/common/builders.rs @@ -37,7 +37,7 @@ use pixi::{ task::TaskName, DependencyType, }; -use pixi_manifest::{EnvironmentName, SpecType}; +use pixi_manifest::{EnvironmentName, FeatureName, SpecType}; use rattler_conda_types::{NamedChannelOrUrl, Platform}; use url::Url; @@ -138,8 +138,8 @@ pub trait HasDependencyConfig: Sized { host: false, build: false, pypi: false, - platform: Default::default(), - feature: None, + platforms: Default::default(), + feature: Default::default(), } } @@ -175,7 +175,7 @@ pub trait HasDependencyConfig: Sized { } fn set_platforms(mut self, platforms: &[Platform]) -> Self { - self.dependency_config().platform.extend(platforms.iter()); + self.dependency_config().platforms.extend(platforms.iter()); self } } @@ -193,7 +193,7 @@ impl AddBuilder { } pub fn with_feature(mut self, feature: impl ToString) -> Self { - self.args.dependency_config.feature = Some(feature.to_string()); + self.args.dependency_config.feature = FeatureName::Named(feature.to_string()); self } }