diff --git a/src-tauri/yaak-models/src/migrate.rs b/src-tauri/yaak-models/src/migrate.rs index dbcd1ac9..b1cf50ac 100644 --- a/src-tauri/yaak-models/src/migrate.rs +++ b/src-tauri/yaak-models/src/migrate.rs @@ -1,10 +1,10 @@ use crate::error::Error::MigrationError; use crate::error::Result; -use include_dir::{include_dir, Dir, DirEntry}; -use log::{debug, info}; +use include_dir::{Dir, DirEntry, include_dir}; +use log::info; use r2d2::Pool; use r2d2_sqlite::SqliteConnectionManager; -use rusqlite::{params, OptionalExtension, TransactionBehavior}; +use rusqlite::{OptionalExtension, TransactionBehavior, params}; use sha2::{Digest, Sha384}; static MIGRATIONS_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/migrations"); @@ -40,12 +40,18 @@ pub(crate) fn migrate_db(pool: &Pool) -> Result<()> { // Run each migration in a transaction let mut num_migrations = 0; + let mut ran_migrations = 0; for entry in entries { num_migrations += 1; let mut conn = pool.get()?; let mut tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?; match run_migration(entry, &mut tx) { - Ok(_) => tx.commit()?, + Ok(ran) => { + if ran { + ran_migrations += 1; + } + tx.commit()? + } Err(e) => { let msg = format!( "{} failed with {}", @@ -58,7 +64,11 @@ pub(crate) fn migrate_db(pool: &Pool) -> Result<()> { }; } - info!("Finished running {} migrations", num_migrations); + if ran_migrations == 0 { + info!("No migrations to run out of {}", num_migrations); + } else { + info!("Ran {}/{} migrations", ran_migrations, num_migrations); + } Ok(()) } @@ -76,9 +86,7 @@ fn run_migration(migration_path: &DirEntry, tx: &mut rusqlite::Transaction) -> R .optional()?; if row.is_some() { - debug!("Skipping migration {description}"); - // Migration was already run - return Ok(false); + return Ok(false); // Migration was already run } let sql = diff --git a/src-tauri/yaak-plugins/src/api.rs b/src-tauri/yaak-plugins/src/api.rs index 297f2564..cabcf26f 100644 --- a/src-tauri/yaak-plugins/src/api.rs +++ b/src-tauri/yaak-plugins/src/api.rs @@ -43,8 +43,10 @@ pub async fn download_plugin_archive( }; let resp = yaak_api_client(app_handle)?.get(url.clone()).send().await?; if !resp.status().is_success() { + warn!("Failed to download plugin: {name} {version}"); return Err(ApiErr(format!("{} response to {}", resp.status(), url.to_string()))); } + info!("Downloaded plugin: {url}"); Ok(resp) } diff --git a/src-tauri/yaak-plugins/src/install.rs b/src-tauri/yaak-plugins/src/install.rs index fdc182fe..2a84b986 100644 --- a/src-tauri/yaak-plugins/src/install.rs +++ b/src-tauri/yaak-plugins/src/install.rs @@ -13,7 +13,10 @@ use yaak_models::models::Plugin; use yaak_models::query_manager::QueryManagerExt; use yaak_models::util::UpdateSource; -pub async fn delete_and_uninstall(window: &WebviewWindow, plugin_id: &str) -> Result { +pub async fn delete_and_uninstall( + window: &WebviewWindow, + plugin_id: &str, +) -> Result { let plugin_manager = window.state::(); let plugin = window.db().delete_plugin_by_id(plugin_id, &UpdateSource::from_window(&window))?; plugin_manager.uninstall(&PluginWindowContext::new(&window), plugin.directory.as_str()).await?; @@ -25,6 +28,7 @@ pub async fn download_and_install( name: &str, version: Option, ) -> Result { + info!("Installing plugin {} {}", name, version.clone().unwrap_or_default()); let plugin_manager = window.state::(); let plugin_version = get_plugin(window.app_handle(), name, version).await?; let resp = download_plugin_archive(window.app_handle(), &plugin_version).await?; diff --git a/src-tauri/yaak-plugins/src/manager.rs b/src-tauri/yaak-plugins/src/manager.rs index fb2e9184..ed9bb1d2 100644 --- a/src-tauri/yaak-plugins/src/manager.rs +++ b/src-tauri/yaak-plugins/src/manager.rs @@ -209,6 +209,7 @@ impl PluginManager { dir: &str, ) -> Result<()> { info!("Adding plugin by dir {dir}"); + let maybe_tx = self.ws_service.app_to_plugin_events_tx.lock().await; let tx = match &*maybe_tx { None => return Err(ClientNotInitializedErr), @@ -233,6 +234,12 @@ impl PluginManager { ) .await??; + let mut plugins = self.plugins.lock().await; + + // Remove the existing plugin (if exists) before adding this one + plugins.retain(|p| p.dir != dir); + plugins.push(plugin_handle.clone()); + // Add the new plugin self.plugins.lock().await.push(plugin_handle.clone()); diff --git a/src-web/components/Settings/SettingsPlugins.tsx b/src-web/components/Settings/SettingsPlugins.tsx index 6c64239b..f0ad0b43 100644 --- a/src-web/components/Settings/SettingsPlugins.tsx +++ b/src-web/components/Settings/SettingsPlugins.tsx @@ -9,17 +9,17 @@ import { searchPlugins, uninstallPlugin, } from '@yaakapp-internal/plugins'; -import type { PluginUpdatesResponse } from '@yaakapp-internal/plugins/bindings/gen_api'; import { useAtomValue } from 'jotai'; import React, { useState } from 'react'; import { useDebouncedValue } from '../../hooks/useDebouncedValue'; import { useInstallPlugin } from '../../hooks/useInstallPlugin'; import { usePluginInfo } from '../../hooks/usePluginInfo'; -import { useRefreshPlugins } from '../../hooks/usePlugins'; +import { usePluginsKey, useRefreshPlugins } from '../../hooks/usePlugins'; import { showConfirmDelete } from '../../lib/confirm'; import { minPromiseMillis } from '../../lib/minPromiseMillis'; import { Button } from '../core/Button'; import { CountBadge } from '../core/CountBadge'; +import { Icon } from '../core/Icon'; import { IconButton } from '../core/IconButton'; import { InlineCode } from '../core/InlineCode'; import { Link } from '../core/Link'; @@ -57,7 +57,7 @@ export function SettingsPlugins() { - +