Skip to content

Commit

Permalink
Prefetch FilesEncoding so background threads don't have to indirectly…
Browse files Browse the repository at this point in the history
… call sync version of git command.
  • Loading branch information
jbialobr committed Mar 14, 2019
1 parent c94a757 commit c62d4f9
Showing 1 changed file with 16 additions and 15 deletions.
31 changes: 16 additions & 15 deletions GitCommands/Submodules/SubmoduleStatusProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,8 @@ private void OnStatusUpdated(SubmoduleInfoResult info, CancellationToken token)

private async Task GetRepositorySubmodulesStatusAsync(bool updateStatus, SubmoduleInfoResult result, IGitModule module, CancellationToken cancelToken, string noBranchText)
{
List<Task> tasks = new List<Task>();
await TaskScheduler.Default;

foreach (var submodule in module.GetSubmodulesLocalPaths().OrderBy(submoduleName => submoduleName))
{
cancelToken.ThrowIfCancellationRequested();
Expand All @@ -145,20 +146,17 @@ private async Task GetRepositorySubmodulesStatusAsync(bool updateStatus, Submodu

var smi = new SubmoduleInfo { Text = name, Path = path };
result.OurSubmodules.Add(smi);
tasks.Add(GetSubmoduleStatusAsync(updateStatus, smi, cancelToken));
GetSubmoduleStatus(updateStatus, smi, cancelToken);
}

await Task.WhenAll(tasks);
}

private async Task GetSubmoduleStatusAsync(bool updateStatus, SubmoduleInfo info, CancellationToken cancelToken)
private void GetSubmoduleStatus(bool updateStatus, SubmoduleInfo info, CancellationToken cancelToken)
{
if (!updateStatus)
{
return;
}

await TaskScheduler.Default;
cancelToken.ThrowIfCancellationRequested();

var submodule = new GitModule(info.Path);
Expand All @@ -170,6 +168,9 @@ private async Task GetSubmoduleStatusAsync(bool updateStatus, SubmoduleInfo info
return;
}

// sequential prefetching FilesEncoding in a parent thread
var foo = supermodule.FilesEncoding;

info.Detailed = new AsyncLazy<DetailedSubmoduleInfo>(async () =>
{
cancelToken.ThrowIfCancellationRequested();
Expand Down Expand Up @@ -213,7 +214,7 @@ private async Task GetSuperProjectRepositorySubmodulesStatusAsync(bool updateSta
bool isParentTopProject = module.SuperprojectModule.WorkingDir == topProject.WorkingDir;

// Set result.SuperProject
await SetSuperProjectSubmoduleInfoAsync(updateStatus, result, module, cancelToken, noBranchText, topProject, isParentTopProject);
SetSuperProjectSubmoduleInfo(updateStatus, result, module, cancelToken, noBranchText, topProject, isParentTopProject);

// Set result.TopProject
await SetTopProjectSubmoduleInfoAsync(updateStatus, result, module, cancelToken, noBranchText, topProject, isParentTopProject);
Expand All @@ -222,7 +223,7 @@ private async Task GetSuperProjectRepositorySubmodulesStatusAsync(bool updateSta
await SetSubmoduleDataAsync(updateStatus, result, module, cancelToken, noBranchText, topProject);
}

private async Task SetSuperProjectSubmoduleInfoAsync(bool updateStatus, SubmoduleInfoResult result, GitModule module, CancellationToken cancelToken, string noBranchText, IGitModule topProject, bool isParentTopProject)
private void SetSuperProjectSubmoduleInfo(bool updateStatus, SubmoduleInfoResult result, GitModule module, CancellationToken cancelToken, string noBranchText, IGitModule topProject, bool isParentTopProject)
{
string name;
if (isParentTopProject)
Expand All @@ -239,11 +240,13 @@ private async Task SetSuperProjectSubmoduleInfoAsync(bool updateStatus, Submodul
string path = module.SuperprojectModule.WorkingDir;
name += GetBranchNameSuffix(path, noBranchText);
result.SuperProject = new SubmoduleInfo { Text = name, Path = module.SuperprojectModule.WorkingDir };
await GetSubmoduleStatusAsync(updateStatus, result.SuperProject, cancelToken);
GetSubmoduleStatus(updateStatus, result.SuperProject, cancelToken);
}

private async Task SetTopProjectSubmoduleInfoAsync(bool updateStatus, SubmoduleInfoResult result, GitModule module, CancellationToken cancelToken, string noBranchText, IGitModule topProject, bool isParentTopProject)
{
await TaskScheduler.Default;

if (isParentTopProject)
{
result.TopProject = result.SuperProject;
Expand All @@ -253,20 +256,20 @@ private async Task SetTopProjectSubmoduleInfoAsync(bool updateStatus, SubmoduleI
string path = topProject.WorkingDir;
string name = Path.GetFileName(Path.GetDirectoryName(topProject.WorkingDir)) + GetBranchNameSuffix(path, noBranchText);
result.TopProject = new SubmoduleInfo { Text = name, Path = topProject.WorkingDir };
await GetSubmoduleStatusAsync(updateStatus, result.TopProject, cancelToken);
GetSubmoduleStatus(updateStatus, result.TopProject, cancelToken);
}
}

private async Task SetSubmoduleDataAsync(bool updateStatus, SubmoduleInfoResult result, GitModule module, CancellationToken cancelToken, string noBranchText, IGitModule topProject)
{
await TaskScheduler.Default;

var submodules = topProject.GetSubmodulesLocalPaths().OrderBy(submoduleName => submoduleName).ToArray();
if (submodules.Any())
{
string localPath = module.WorkingDir.Substring(topProject.WorkingDir.Length);
localPath = PathUtil.GetDirectoryName(localPath.ToPosixPath());

List<Task> subTasks = new List<Task>();

foreach (var submodule in submodules)
{
cancelToken.ThrowIfCancellationRequested();
Expand All @@ -282,10 +285,8 @@ private async Task SetSubmoduleDataAsync(bool updateStatus, SubmoduleInfoResult

var smi = new SubmoduleInfo { Text = name, Path = path, Bold = bold };
result.SuperSubmodules.Add(smi);
subTasks.Add(GetSubmoduleStatusAsync(updateStatus, smi, cancelToken));
GetSubmoduleStatus(updateStatus, smi, cancelToken);
}

await Task.WhenAll(subTasks);
}
}

Expand Down

0 comments on commit c62d4f9

Please sign in to comment.