Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ public class VSCodeInstance

public string AppData { get; set; } = string.Empty;

public string SharedStorageDbPath { get; set; } = string.Empty;

public ImageSource WorkspaceIcon() => WorkspaceIconBitMap;

public ImageSource RemoteIcon() => RemoteIconBitMap;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ namespace Community.PowerToys.Run.Plugin.VSCodeWorkspaces.VSCodeHelper
public static class VSCodeInstances
{
private static readonly string _userAppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
private static readonly string _userProfilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

public static List<VSCodeInstance> Instances { get; set; } = new List<VSCodeInstance>();

Expand Down Expand Up @@ -129,6 +130,7 @@ public static void LoadVSCodeInstances()

var portableData = Path.Join(iconPath, "data");
instance.AppData = Directory.Exists(portableData) ? Path.Join(portableData, "user-data") : Path.Combine(_userAppDataPath, version);
instance.SharedStorageDbPath = GetSharedStorageDbPath(version, iconPath, Directory.Exists(portableData));
var vsCodeIconPath = Path.Join(iconPath, $"{version}.exe");
if (!File.Exists(vsCodeIconPath))
{
Expand Down Expand Up @@ -157,5 +159,30 @@ public static void LoadVSCodeInstances()
Instances.Add(instance);
}
}

private static string GetSharedStorageDbPath(string version, string iconPath, bool isPortable)
{
if (isPortable)
{
return Path.Join(iconPath, "data-shared", "sharedStorage", "state.vscdb");
}

var sharedStorageDirectory = version switch
{
"Code" => ".vscode-shared",
"Code - Insiders" => ".vscode-insiders-shared",
"Code - Exploration" => ".vscode-exploration-shared",
"VSCodium" => ".vscodium-shared",
"VSCodium - Insiders" => ".vscodium-insiders-shared",
_ => string.Empty,
};

if (string.IsNullOrEmpty(sharedStorageDirectory))
{
return string.Empty;
}

return Path.Combine(_userProfilePath, sharedStorageDirectory, "sharedStorage", "state.vscdb");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,24 +97,45 @@ public List<VSCodeWorkspace> Workspaces

// User/globalStorage/state.vscdb - history.recentlyOpenedPathsList - vscode v1.64 or later
var vscode_storage_db = Path.Combine(vscodeInstance.AppData, "User/globalStorage/state.vscdb");
var vscode_shared_storage_db = vscodeInstance.SharedStorageDbPath;

if (File.Exists(vscode_storage))
{
var storageResults = GetWorkspacesInJson(vscodeInstance, vscode_storage);
results.AddRange(storageResults);
}

if (File.Exists(vscode_storage_db))
var storageDbPaths = new[] { vscode_storage_db, vscode_shared_storage_db }
.Where(filePath => !string.IsNullOrEmpty(filePath))
.Distinct(StringComparer.OrdinalIgnoreCase);

foreach (var storageDbPath in storageDbPaths)
{
var storageDbResults = GetWorkspacesInVscdb(vscodeInstance, vscode_storage_db);
results.AddRange(storageDbResults);
if (File.Exists(storageDbPath))
{
var storageDbResults = GetWorkspacesInVscdb(vscodeInstance, storageDbPath);
results.AddRange(storageDbResults);
}
}
}

return results;
return results
.Where(workspace => workspace != null)
.GroupBy(GetWorkspaceKey, StringComparer.OrdinalIgnoreCase)
.Select(workspaceGroup => workspaceGroup.First())
.ToList();
}
}

private static string GetWorkspaceKey(VSCodeWorkspace workspace)
{
return string.Join(
"|",
workspace.VSCodeInstance?.ExecutablePath ?? string.Empty,
workspace.WorkspaceType,
workspace.Path ?? string.Empty);
}

private List<VSCodeWorkspace> GetWorkspacesInJson(VSCodeInstance vscodeInstance, string filePath)
{
var storageFileResults = new List<VSCodeWorkspace>();
Expand Down