fix: fix CSM-010
This commit is contained in:
@@ -6,6 +6,7 @@ defmodule BDS.Desktop.ShellData do
|
||||
alias BDS.Git
|
||||
alias BDS.I18n
|
||||
alias BDS.Projects
|
||||
alias BDS.Repo
|
||||
alias BDS.UI.Dashboard
|
||||
alias BDS.UI.Sidebar
|
||||
alias BDS.UI.Workbench
|
||||
@@ -62,15 +63,11 @@ defmodule BDS.Desktop.ShellData do
|
||||
end
|
||||
|
||||
def project_snapshot do
|
||||
Projects.shell_snapshot()
|
||||
rescue
|
||||
error in [Exqlite.Error, DBConnection.OwnershipError] ->
|
||||
if match?(%Exqlite.Error{}, error) and
|
||||
not String.contains?(Exception.message(error), "no such table: projects") do
|
||||
reraise error, __STACKTRACE__
|
||||
end
|
||||
|
||||
default_project_snapshot()
|
||||
if Repo.ready?() do
|
||||
{:ok, Projects.shell_snapshot()}
|
||||
else
|
||||
{:error, :not_ready}
|
||||
end
|
||||
end
|
||||
|
||||
def current_project(projects_snapshot) do
|
||||
@@ -79,27 +76,19 @@ defmodule BDS.Desktop.ShellData do
|
||||
end
|
||||
|
||||
def dashboard(project_id) do
|
||||
Dashboard.snapshot(project_id)
|
||||
rescue
|
||||
error in [Exqlite.Error, DBConnection.OwnershipError] ->
|
||||
if match?(%Exqlite.Error{}, error) and
|
||||
not String.contains?(Exception.message(error), "no such table") do
|
||||
reraise error, __STACKTRACE__
|
||||
end
|
||||
|
||||
Dashboard.empty_snapshot()
|
||||
if Repo.ready?() do
|
||||
{:ok, Dashboard.snapshot(project_id)}
|
||||
else
|
||||
{:error, :not_ready}
|
||||
end
|
||||
end
|
||||
|
||||
def sidebar_view(project_id, view_id, params \\ %{}) do
|
||||
Sidebar.view(project_id, view_id, params)
|
||||
rescue
|
||||
error in [Exqlite.Error, DBConnection.OwnershipError] ->
|
||||
if match?(%Exqlite.Error{}, error) and
|
||||
not String.contains?(Exception.message(error), "no such table") do
|
||||
reraise error, __STACKTRACE__
|
||||
end
|
||||
|
||||
Sidebar.view(nil, view_id, params)
|
||||
if Repo.ready?() do
|
||||
{:ok, Sidebar.view(project_id, view_id, params)}
|
||||
else
|
||||
{:error, :not_ready}
|
||||
end
|
||||
end
|
||||
|
||||
def assistant_cards do
|
||||
@@ -146,14 +135,16 @@ defmodule BDS.Desktop.ShellData do
|
||||
|
||||
def git_badge_count(project_id, opts \\ [])
|
||||
|
||||
def git_badge_count(nil, _opts), do: 0
|
||||
def git_badge_count("default", _opts), do: 0
|
||||
def git_badge_count(nil, _opts), do: {:ok, 0}
|
||||
def git_badge_count("default", _opts), do: {:ok, 0}
|
||||
|
||||
def git_badge_count(project_id, opts) when is_binary(project_id) do
|
||||
provider = Keyword.get(opts, :provider, git_remote_state_provider())
|
||||
custom_provider? = provider != (&BDS.Git.remote_state/2)
|
||||
if not Repo.ready?() do
|
||||
{:error, :not_ready}
|
||||
else
|
||||
provider = Keyword.get(opts, :provider, git_remote_state_provider())
|
||||
custom_provider? = provider != (&BDS.Git.remote_state/2)
|
||||
|
||||
try do
|
||||
has_git =
|
||||
custom_provider? ||
|
||||
case BDS.Projects.get_project(project_id) do
|
||||
@@ -161,23 +152,18 @@ defmodule BDS.Desktop.ShellData do
|
||||
project -> File.dir?(Path.join(BDS.Projects.project_data_dir(project), ".git"))
|
||||
end
|
||||
|
||||
if has_git do
|
||||
case provider.(project_id, []) do
|
||||
{:ok, %{behind: behind}} when is_integer(behind) and behind > 0 -> behind
|
||||
{:ok, %{behind: behind}} when is_binary(behind) -> parse_positive_count(behind)
|
||||
_other -> 0
|
||||
end
|
||||
else
|
||||
0
|
||||
end
|
||||
rescue
|
||||
error in [DBConnection.OwnershipError, Exqlite.Error] ->
|
||||
if match?(%Exqlite.Error{}, error) and
|
||||
not String.contains?(Exception.message(error), "no such table") do
|
||||
reraise error, __STACKTRACE__
|
||||
count =
|
||||
if has_git do
|
||||
case provider.(project_id, []) do
|
||||
{:ok, %{behind: behind}} when is_integer(behind) and behind > 0 -> behind
|
||||
{:ok, %{behind: behind}} when is_binary(behind) -> parse_positive_count(behind)
|
||||
_other -> 0
|
||||
end
|
||||
else
|
||||
0
|
||||
end
|
||||
|
||||
0
|
||||
{:ok, count}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -303,7 +289,7 @@ defmodule BDS.Desktop.ShellData do
|
||||
|
||||
defp maybe_add_panel_tab(tabs, _route, _tab), do: tabs
|
||||
|
||||
defp default_project_snapshot do
|
||||
def default_project_snapshot do
|
||||
%{
|
||||
active_project_id: "default",
|
||||
projects: [
|
||||
|
||||
@@ -633,11 +633,14 @@ defmodule BDS.Desktop.ShellLive do
|
||||
active_view_id = Atom.to_string(workbench.active_view)
|
||||
|
||||
sidebar_data =
|
||||
ShellData.sidebar_view(
|
||||
project_id,
|
||||
active_view_id,
|
||||
ShellSidebarState.current_filters(socket, active_view_id)
|
||||
)
|
||||
case ShellData.sidebar_view(
|
||||
project_id,
|
||||
active_view_id,
|
||||
ShellSidebarState.current_filters(socket, active_view_id)
|
||||
) do
|
||||
{:ok, data} -> data
|
||||
{:error, :not_ready} -> BDS.UI.Sidebar.view(nil, active_view_id, %{})
|
||||
end
|
||||
|
||||
sidebar_data = ShellSidebarState.merge_ui_state(socket, active_view_id, sidebar_data)
|
||||
|
||||
@@ -647,17 +650,35 @@ defmodule BDS.Desktop.ShellLive do
|
||||
end
|
||||
|
||||
defp refresh_content(socket, workbench) do
|
||||
projects = ShellData.project_snapshot()
|
||||
dashboard = ShellData.dashboard(projects.active_project_id)
|
||||
git_badge_count = ShellData.git_badge_count(projects.active_project_id)
|
||||
projects =
|
||||
case ShellData.project_snapshot() do
|
||||
{:ok, data} -> data
|
||||
{:error, :not_ready} -> ShellData.default_project_snapshot()
|
||||
end
|
||||
|
||||
dashboard =
|
||||
case ShellData.dashboard(projects.active_project_id) do
|
||||
{:ok, data} -> data
|
||||
{:error, :not_ready} -> BDS.UI.Dashboard.empty_snapshot()
|
||||
end
|
||||
|
||||
git_badge_count =
|
||||
case ShellData.git_badge_count(projects.active_project_id) do
|
||||
{:ok, count} -> count
|
||||
{:error, :not_ready} -> 0
|
||||
end
|
||||
|
||||
active_view_id = Atom.to_string(workbench.active_view)
|
||||
|
||||
sidebar_data =
|
||||
ShellData.sidebar_view(
|
||||
projects.active_project_id,
|
||||
active_view_id,
|
||||
ShellSidebarState.current_filters(socket, active_view_id)
|
||||
)
|
||||
case ShellData.sidebar_view(
|
||||
projects.active_project_id,
|
||||
active_view_id,
|
||||
ShellSidebarState.current_filters(socket, active_view_id)
|
||||
) do
|
||||
{:ok, data} -> data
|
||||
{:error, :not_ready} -> BDS.UI.Sidebar.view(nil, active_view_id, %{})
|
||||
end
|
||||
|
||||
sidebar_data = ShellSidebarState.merge_ui_state(socket, active_view_id, sidebar_data)
|
||||
|
||||
|
||||
@@ -2,4 +2,22 @@ defmodule BDS.Repo do
|
||||
use Ecto.Repo,
|
||||
otp_app: :bds,
|
||||
adapter: Ecto.Adapters.SQLite3
|
||||
|
||||
@doc """
|
||||
Returns true if the database is connected and core tables exist.
|
||||
Used to guard data access during startup before migrations have run.
|
||||
"""
|
||||
def ready? do
|
||||
case Ecto.Adapters.SQL.query(
|
||||
__MODULE__,
|
||||
"SELECT 1 FROM sqlite_master WHERE type = ?1 AND name = ?2 LIMIT 1",
|
||||
["table", "projects"]
|
||||
) do
|
||||
{:ok, %{num_rows: 1}} -> true
|
||||
{:ok, _} -> false
|
||||
{:error, _} -> false
|
||||
end
|
||||
rescue
|
||||
_ -> false
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user