packages_rust.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Copyright 2019-2024 Tauri Programme within The Commons Conservancy
  2. // SPDX-License-Identifier: Apache-2.0
  3. // SPDX-License-Identifier: MIT
  4. use super::{ActionResult, SectionItem};
  5. use crate::{
  6. helpers::cargo_manifest::{
  7. crate_latest_version, crate_version, CargoLock, CargoManifest, CrateVersion,
  8. },
  9. interface::rust::get_workspace_dir,
  10. };
  11. use colored::Colorize;
  12. use std::fs::read_to_string;
  13. use std::path::{Path, PathBuf};
  14. pub fn items(app_dir: Option<&PathBuf>, tauri_dir: Option<&Path>) -> Vec<SectionItem> {
  15. let mut items = Vec::new();
  16. if tauri_dir.is_some() || app_dir.is_some() {
  17. if let Some(tauri_dir) = tauri_dir {
  18. let manifest: Option<CargoManifest> =
  19. if let Ok(manifest_contents) = read_to_string(tauri_dir.join("Cargo.toml")) {
  20. toml::from_str(&manifest_contents).ok()
  21. } else {
  22. None
  23. };
  24. let lock: Option<CargoLock> = get_workspace_dir()
  25. .ok()
  26. .and_then(|p| read_to_string(p.join("Cargo.lock")).ok())
  27. .and_then(|s| toml::from_str(&s).ok());
  28. for dep in ["tauri", "tauri-build", "wry", "tao"] {
  29. let crate_version = crate_version(tauri_dir, manifest.as_ref(), lock.as_ref(), dep);
  30. let item = rust_section_item(dep, crate_version);
  31. items.push(item);
  32. }
  33. }
  34. }
  35. let tauri_cli_rust_item = SectionItem::new().action(|| {
  36. std::process::Command::new("cargo")
  37. .arg("tauri")
  38. .arg("-V")
  39. .output()
  40. .ok()
  41. .map(|o| {
  42. if o.status.success() {
  43. let out = String::from_utf8_lossy(o.stdout.as_slice());
  44. let (package, version) = out.split_once(' ').unwrap_or_default();
  45. let latest_ver = crate_latest_version(package).unwrap_or_default();
  46. format!(
  47. "{} {}: {}{}",
  48. package,
  49. "🦀",
  50. version.split_once('\n').unwrap_or_default().0,
  51. if !(version.is_empty() || latest_ver.is_empty()) {
  52. let version = semver::Version::parse(version).unwrap();
  53. let target_version = semver::Version::parse(latest_ver.as_str()).unwrap();
  54. if version < target_version {
  55. format!(" ({}, latest: {})", "outdated".yellow(), latest_ver.green())
  56. } else {
  57. "".into()
  58. }
  59. } else {
  60. "".into()
  61. }
  62. )
  63. .into()
  64. } else {
  65. ActionResult::None
  66. }
  67. })
  68. .unwrap_or_default()
  69. });
  70. items.push(tauri_cli_rust_item);
  71. items
  72. }
  73. pub fn rust_section_item(dep: &str, crate_version: CrateVersion) -> SectionItem {
  74. let version = crate_version
  75. .version
  76. .as_ref()
  77. .and_then(|v| semver::Version::parse(v).ok());
  78. let version_suffix = match (version, crate_latest_version(dep)) {
  79. (Some(version), Some(target_version)) => {
  80. let target_version = semver::Version::parse(&target_version).unwrap();
  81. if version < target_version {
  82. Some(format!(
  83. " ({}, latest: {})",
  84. "outdated".yellow(),
  85. target_version.to_string().green()
  86. ))
  87. } else {
  88. None
  89. }
  90. }
  91. _ => None,
  92. };
  93. SectionItem::new().description(format!(
  94. "{} {}: {}{}",
  95. dep,
  96. "🦀",
  97. crate_version,
  98. version_suffix
  99. .clone()
  100. .map(|s| format!(",{s}"))
  101. .unwrap_or_else(|| "".into())
  102. ))
  103. }