code_review: PR #1103

Since we only use `$GIT_COMMON_DIR` in filesystem watcher, it is unnecessary to store this value in `Repository`, and we can query the `$GIT_COMMON_DIR` only when it looks like a worktree

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo 2025-03-17 16:17:20 +08:00
parent cea8a90680
commit b4ab4afd3a
No known key found for this signature in database
4 changed files with 16 additions and 17 deletions

View file

@ -3,8 +3,7 @@
public interface IRepository public interface IRepository
{ {
string FullPath { get; set; } string FullPath { get; set; }
string GitDir { get; set; } string GitDirForWatcher { get; }
string GitCommonDir { get; set; }
void RefreshBranches(); void RefreshBranches();
void RefreshWorktrees(); void RefreshWorktrees();

View file

@ -23,11 +23,8 @@ namespace SourceGit.Models
_wcWatcher.Deleted += OnWorkingCopyChanged; _wcWatcher.Deleted += OnWorkingCopyChanged;
_wcWatcher.EnableRaisingEvents = true; _wcWatcher.EnableRaisingEvents = true;
// If this repository is a worktree repository, just watch the main repository's gitdir.
var repoWatchDir = _repo.GitCommonDir.Replace("\\", "/");
_repoWatcher = new FileSystemWatcher(); _repoWatcher = new FileSystemWatcher();
_repoWatcher.Path = repoWatchDir; _repoWatcher.Path = _repo.GitDirForWatcher;
_repoWatcher.Filter = "*"; _repoWatcher.Filter = "*";
_repoWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.DirectoryName | NotifyFilters.FileName; _repoWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.DirectoryName | NotifyFilters.FileName;
_repoWatcher.IncludeSubdirectories = true; _repoWatcher.IncludeSubdirectories = true;

View file

@ -282,7 +282,6 @@ namespace SourceGit.ViewModels
var isBare = new Commands.IsBareRepository(node.Id).Result(); var isBare = new Commands.IsBareRepository(node.Id).Result();
var gitDir = node.Id; var gitDir = node.Id;
var gitCommonDir = gitDir;
if (!isBare) if (!isBare)
{ {
gitDir = new Commands.QueryGitDir(node.Id).Result(); gitDir = new Commands.QueryGitDir(node.Id).Result();
@ -292,12 +291,9 @@ namespace SourceGit.ViewModels
App.RaiseException(ctx, "Given path is not a valid git repository!"); App.RaiseException(ctx, "Given path is not a valid git repository!");
return; return;
} }
gitCommonDir = new Commands.QueryGitCommonDir(node.Id).Result();
if (string.IsNullOrEmpty(gitCommonDir))
gitCommonDir = gitDir;
} }
var repo = new Repository(isBare, node.Id, gitDir, gitCommonDir); var repo = new Repository(isBare, node.Id, gitDir);
repo.Open(); repo.Open();
if (page == null) if (page == null)

View file

@ -45,10 +45,19 @@ namespace SourceGit.ViewModels
set => SetProperty(ref _gitDir, value); set => SetProperty(ref _gitDir, value);
} }
public string GitCommonDir public string GitDirForWatcher
{ {
get => _gitCommonDir; get
set => SetProperty(ref _gitCommonDir, value); {
// Only try to get `$GIT_COMMON_DIR` if this repository looks like a worktree.
if (_gitDir.Replace("\\", "/").IndexOf(".git/worktrees/", StringComparison.Ordinal) > 0)
{
var commonDir = new Commands.QueryGitCommonDir(_fullpath).Result();
return string.IsNullOrEmpty(commonDir) ? _gitDir : commonDir;
}
return _gitDir;
}
} }
public Models.RepositorySettings Settings public Models.RepositorySettings Settings
@ -435,12 +444,11 @@ namespace SourceGit.ViewModels
set; set;
} = 0; } = 0;
public Repository(bool isBare, string path, string gitDir, string gitCommonDir) public Repository(bool isBare, string path, string gitDir)
{ {
IsBare = isBare; IsBare = isBare;
FullPath = path; FullPath = path;
GitDir = gitDir; GitDir = gitDir;
GitCommonDir = gitCommonDir;
} }
public void Open() public void Open()
@ -2444,7 +2452,6 @@ namespace SourceGit.ViewModels
private string _fullpath = string.Empty; private string _fullpath = string.Empty;
private string _gitDir = string.Empty; private string _gitDir = string.Empty;
private string _gitCommonDir = string.Empty;
private Models.RepositorySettings _settings = null; private Models.RepositorySettings _settings = null;
private Models.FilterMode _historiesFilterMode = Models.FilterMode.None; private Models.FilterMode _historiesFilterMode = Models.FilterMode.None;
private bool _hasAllowedSignersFile = false; private bool _hasAllowedSignersFile = false;