Skip to content

Commit 099f96c

Browse files
committed
feat(packages): add snapshot version support with URL placeholders
1 parent fa99208 commit 099f96c

6 files changed

Lines changed: 254 additions & 18 deletions

File tree

crates/soar-cli/src/download.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ pub async fn handle_direct_downloads(
157157
conn,
158158
query.name.as_deref(),
159159
query.pkg_id.as_deref(),
160-
query.version.as_deref(),
160+
None,
161161
None,
162162
None,
163163
)
@@ -176,7 +176,7 @@ pub async fn handle_direct_downloads(
176176
conn,
177177
query.name.as_deref(),
178178
query.pkg_id.as_deref(),
179-
query.version.as_deref(),
179+
None,
180180
None,
181181
None,
182182
)?;
@@ -191,17 +191,28 @@ pub async fn handle_direct_downloads(
191191
})?
192192
};
193193

194+
let packages: Vec<Package> = if let Some(ref version) = query.version {
195+
packages
196+
.into_iter()
197+
.filter(|p| p.has_version(version))
198+
.collect()
199+
} else {
200+
packages
201+
};
202+
194203
if packages.is_empty() {
195204
error!("Invalid download resource '{}'", link);
196205
break;
197206
}
198207

199208
let package = if packages.len() == 1 || ctx.yes {
200-
packages.first().unwrap()
209+
packages.first().unwrap().clone()
201210
} else {
202-
&select_package_interactively(packages, link)?.unwrap()
211+
select_package_interactively(packages, link)?.unwrap()
203212
};
204213

214+
let package = package.resolve(query.version.as_deref());
215+
205216
info!(
206217
"Downloading package: {}#{}",
207218
package.pkg_name, package.pkg_id

crates/soar-cli/src/inspect.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ pub async fn inspect_log(package: &str, inspect_type: InspectType) -> SoarResult
7171
conn,
7272
query.name.as_deref(),
7373
query.pkg_id.as_deref(),
74-
query.version.as_deref(),
74+
None,
7575
None,
7676
Some(SortDirection::Asc),
7777
)
@@ -90,7 +90,7 @@ pub async fn inspect_log(package: &str, inspect_type: InspectType) -> SoarResult
9090
conn,
9191
query.name.as_deref(),
9292
query.pkg_id.as_deref(),
93-
query.version.as_deref(),
93+
None,
9494
None,
9595
Some(SortDirection::Asc),
9696
)?;
@@ -105,6 +105,15 @@ pub async fn inspect_log(package: &str, inspect_type: InspectType) -> SoarResult
105105
})?
106106
};
107107

108+
let packages: Vec<Package> = if let Some(ref version) = query.version {
109+
packages
110+
.into_iter()
111+
.filter(|p| p.has_version(version))
112+
.collect()
113+
} else {
114+
packages
115+
};
116+
108117
if packages.is_empty() {
109118
error!("Package {} not found", package);
110119
} else {

crates/soar-cli/src/install.rs

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ fn resolve_packages(
286286
conn,
287287
query.name.as_deref(),
288288
None,
289-
query.version.as_deref(),
289+
None,
290290
None,
291291
Some(SortDirection::Asc),
292292
)
@@ -305,7 +305,7 @@ fn resolve_packages(
305305
conn,
306306
query.name.as_deref(),
307307
None,
308-
query.version.as_deref(),
308+
None,
309309
None,
310310
Some(SortDirection::Asc),
311311
)?;
@@ -320,6 +320,15 @@ fn resolve_packages(
320320
})?
321321
};
322322

323+
let repo_pkgs: Vec<Package> = if let Some(ref version) = query.version {
324+
repo_pkgs
325+
.into_iter()
326+
.filter(|p| p.has_version(version))
327+
.collect()
328+
} else {
329+
repo_pkgs
330+
};
331+
323332
if repo_pkgs.is_empty() {
324333
error!("Package {} not found", name);
325334
continue;
@@ -392,6 +401,8 @@ fn resolve_packages(
392401
}
393402
}
394403

404+
let pkg = pkg.resolve(query.version.as_deref());
405+
395406
install_targets.push(InstallTarget {
396407
package: pkg,
397408
existing_install,
@@ -568,6 +579,8 @@ fn resolve_packages(
568579
}
569580
}
570581

582+
let pkg = pkg.resolve(query.version.as_deref());
583+
571584
install_targets.push(InstallTarget {
572585
package: pkg,
573586
existing_install,
@@ -587,7 +600,7 @@ fn resolve_packages(
587600
query.repo_name.as_deref(),
588601
query.name.as_deref(),
589602
query.pkg_id.as_deref(),
590-
query.version.as_deref(),
603+
None,
591604
None,
592605
None,
593606
None,
@@ -606,7 +619,7 @@ fn resolve_packages(
606619
conn,
607620
None,
608621
query.pkg_id.as_deref(),
609-
query.version.as_deref(),
622+
None,
610623
None,
611624
None,
612625
)
@@ -625,7 +638,7 @@ fn resolve_packages(
625638
conn,
626639
None,
627640
query.pkg_id.as_deref(),
628-
query.version.as_deref(),
641+
None,
629642
None,
630643
None,
631644
)?;
@@ -640,7 +653,18 @@ fn resolve_packages(
640653
})?
641654
};
642655

656+
let repo_pkgs: Vec<Package> = if let Some(ref version) = query.version {
657+
repo_pkgs
658+
.into_iter()
659+
.filter(|p| p.has_version(version))
660+
.collect()
661+
} else {
662+
repo_pkgs
663+
};
664+
643665
for pkg in repo_pkgs {
666+
let pkg = pkg.resolve(query.version.as_deref());
667+
644668
let existing_install = installed_packages
645669
.iter()
646670
.find(|ip| ip.pkg_name == pkg.pkg_name)
@@ -701,6 +725,8 @@ fn resolve_packages(
701725
.find(|ip| ip.version == db_pkg.version)
702726
.cloned();
703727

728+
let db_pkg = db_pkg.resolve(query.version.as_deref());
729+
704730
install_targets.push(InstallTarget {
705731
package: db_pkg,
706732
existing_install,
@@ -753,7 +779,7 @@ fn select_package(
753779
conn,
754780
query.name.as_deref(),
755781
query.pkg_id.as_deref(),
756-
query.version.as_deref(),
782+
None,
757783
None,
758784
None,
759785
)?;
@@ -776,7 +802,7 @@ fn select_package(
776802
conn,
777803
query.name.as_deref(),
778804
query.pkg_id.as_deref(),
779-
query.version.as_deref(),
805+
None,
780806
None,
781807
None,
782808
)
@@ -795,7 +821,7 @@ fn select_package(
795821
conn,
796822
query.name.as_deref(),
797823
query.pkg_id.as_deref(),
798-
query.version.as_deref(),
824+
None,
799825
None,
800826
None,
801827
)?;
@@ -810,6 +836,15 @@ fn select_package(
810836
})?
811837
};
812838

839+
let packages: Vec<Package> = if let Some(ref version) = query.version {
840+
packages
841+
.into_iter()
842+
.filter(|p| p.has_version(version))
843+
.collect()
844+
} else {
845+
packages
846+
};
847+
813848
match packages.len() {
814849
0 => {
815850
error!("Package {package_name} not found");

crates/soar-cli/src/list.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ pub async fn query_package(query_str: String) -> SoarResult<()> {
191191
conn,
192192
query.name.as_deref(),
193193
query.pkg_id.as_deref(),
194-
query.version.as_deref(),
194+
None,
195195
None,
196196
Some(SortDirection::Asc),
197197
)
@@ -210,7 +210,7 @@ pub async fn query_package(query_str: String) -> SoarResult<()> {
210210
conn,
211211
query.name.as_deref(),
212212
query.pkg_id.as_deref(),
213-
query.version.as_deref(),
213+
None,
214214
None,
215215
Some(SortDirection::Asc),
216216
)?;
@@ -225,7 +225,18 @@ pub async fn query_package(query_str: String) -> SoarResult<()> {
225225
})?
226226
};
227227

228+
let packages: Vec<Package> = if let Some(ref version) = query.version {
229+
packages
230+
.into_iter()
231+
.filter(|p| p.has_version(version))
232+
.collect()
233+
} else {
234+
packages
235+
};
236+
228237
for package in packages {
238+
let package = package.resolve(query.version.as_deref());
239+
229240
let mut builder = Builder::new();
230241

231242
builder.push_record([

crates/soar-cli/src/run.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub async fn run_package(
5151
conn,
5252
Some(package_name),
5353
pkg_id,
54-
version,
54+
None,
5555
None,
5656
None,
5757
)
@@ -70,7 +70,7 @@ pub async fn run_package(
7070
conn,
7171
Some(package_name),
7272
pkg_id,
73-
version,
73+
None,
7474
None,
7575
None,
7676
)?;
@@ -85,6 +85,15 @@ pub async fn run_package(
8585
})?
8686
};
8787

88+
let packages: Vec<Package> = if let Some(version) = version {
89+
packages
90+
.into_iter()
91+
.filter(|p| p.has_version(version))
92+
.collect()
93+
} else {
94+
packages
95+
};
96+
8897
let package = match packages.len() {
8998
0 => return Err(SoarError::PackageNotFound(package_name.clone())),
9099
1 => packages.into_iter().next(),
@@ -93,6 +102,8 @@ pub async fn run_package(
93102
}
94103
.unwrap();
95104

105+
let package = package.resolve(version);
106+
96107
fs::create_dir_all(&cache_bin)
97108
.with_context(|| format!("creating directory {}", cache_bin.display()))?;
98109

0 commit comments

Comments
 (0)