Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit a500ff2

Browse files
committed
Fix a problem with the git installation process
The installation state was getting passed into ExtractPortableGit too early - that method needs to have the result of the download tasks
1 parent 39d7f45 commit a500ff2

File tree

3 files changed

+60
-53
lines changed

3 files changed

+60
-53
lines changed

src/GitHub.Api/Installer/GitInstaller.cs

Lines changed: 53 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,13 @@ public GitInstaller(IEnvironment environment, IProcessManager processManager,
3030
public ITask<GitInstallationState> SetupGitIfNeeded()
3131
{
3232
//Logger.Trace("SetupGitIfNeeded");
33-
33+
GitInstallationState installationState = new GitInstallationState();
3434
installationTask = new FuncTask<GitInstallationState, GitInstallationState>(cancellationToken, (success, path) => path)
3535
{ Name = "Git Installation - Complete" };
3636
installationTask.OnStart += thisTask => thisTask.UpdateProgress(0, 100);
3737
installationTask.OnEnd += (thisTask, result, success, exception) => thisTask.UpdateProgress(100, 100);
3838

3939
ITask<GitInstallationState> startTask = null;
40-
GitInstallationState installationState = new GitInstallationState();
4140
if (!environment.IsWindows)
4241
{
4342
var findTask = new FindExecTask("git", cancellationToken)
@@ -72,37 +71,47 @@ public ITask<GitInstallationState> SetupGitIfNeeded()
7271
{
7372
startTask = new FuncTask<GitInstallationState>(cancellationToken, () =>
7473
{
75-
installationState = VerifyGitInstallation();
76-
if (!installationState.GitIsValid && !installationState.GitLfsIsValid)
77-
installationState = GrabZipFromResources(installationState);
78-
else
79-
Logger.Trace("SetupGitIfNeeded: Skipped");
80-
return installationState;
74+
return VerifyPortableGitInstallation();
8175
})
8276
{ Name = "Git Installation - Extract" };
8377
}
8478

79+
startTask = startTask.Then(new FuncTask<GitInstallationState, GitInstallationState>(cancellationToken, (success, installState) =>
80+
{
81+
if (installState.GitIsValid && installState.GitLfsIsValid)
82+
{
83+
return installState;
84+
}
85+
86+
installState = VerifyZipFiles(installState);
87+
installState = GrabZipFromResourcesIfNeeded(installState);
88+
return installState;
89+
})
90+
{ Name = "Git Installation - Validate" }
91+
);
92+
8593
startTask.OnEnd += (thisTask, installState, success, exception) =>
8694
{
87-
if (!installState.GitIsValid && !installState.GitLfsIsValid)
95+
if (installState.GitIsValid && installState.GitLfsIsValid)
8896
{
89-
if (!installState.GitZipExists || !installState.GitLfsZipExists)
90-
thisTask = thisTask.Then(CreateDownloadTask(installState));
91-
thisTask = thisTask.Then(ExtractPortableGit(installState));
97+
Logger.Trace("Skipping git installation");
98+
thisTask.Then(installationTask);
99+
return;
92100
}
93-
thisTask = thisTask.Then(installationTask);
101+
102+
var downloadZipTask = DownloadZipsIfNeeded(installState);
103+
downloadZipTask.OnEnd += ExtractPortableGit;
104+
thisTask.Then(downloadZipTask);
94105
};
95106

96107
return startTask;
97108
}
98109

99-
private GitInstallationState VerifyGitInstallation()
110+
private GitInstallationState VerifyPortableGitInstallation()
100111
{
101112
var state = new GitInstallationState();
102113
var gitExists = installDetails.GitExecutablePath.IsInitialized && installDetails.GitExecutablePath.FileExists();
103114
var gitLfsExists = installDetails.GitLfsExecutablePath.IsInitialized && installDetails.GitLfsExecutablePath.FileExists();
104-
state.GitZipExists = installDetails.GitZipPath.FileExists();
105-
state.GitLfsZipExists = installDetails.GitLfsZipPath.FileExists();
106115

107116
if (gitExists)
108117
{
@@ -144,26 +153,44 @@ private GitInstallationState VerifyGitInstallation()
144153
return state;
145154
}
146155

147-
private GitInstallationState GrabZipFromResources(GitInstallationState state)
156+
private GitInstallationState VerifyZipFiles(GitInstallationState state)
157+
{
158+
var md5 = AssemblyResources.ToFile(ResourceType.Platform, "git.zip.md5", installDetails.ZipPath, environment);
159+
if (!md5.FileExists() || (installDetails.GitZipPath.FileExists() && !Utils.VerifyFileIntegrity(installDetails.GitZipPath, md5)))
160+
{
161+
installDetails.GitZipPath.DeleteIfExists();
162+
}
163+
state.GitZipExists = installDetails.GitZipPath.FileExists();
164+
165+
md5 = AssemblyResources.ToFile(ResourceType.Platform, "git-lfs.zip.md5", installDetails.ZipPath, environment);
166+
// check whether the git-lfs zip file exists and is valid
167+
if (!md5.FileExists() || (installDetails.GitLfsZipPath.FileExists() && !Utils.VerifyFileIntegrity(installDetails.GitLfsZipPath, md5)))
168+
{
169+
installDetails.GitLfsZipPath.DeleteIfExists();
170+
}
171+
state.GitLfsZipExists = installDetails.GitLfsZipPath.FileExists();
172+
installationTask.UpdateProgress(20, 100);
173+
return state;
174+
}
175+
176+
private GitInstallationState GrabZipFromResourcesIfNeeded(GitInstallationState state)
148177
{
149178
if (!state.GitZipExists)
150179
{
151180
AssemblyResources.ToFile(ResourceType.Platform, "git.zip", installDetails.ZipPath, environment);
152-
AssemblyResources.ToFile(ResourceType.Platform, "git.zip.md5", installDetails.ZipPath, environment);
153181
}
154182
state.GitZipExists = installDetails.GitZipPath.FileExists();
155183

156184
if (!state.GitLfsZipExists)
157185
{
158186
AssemblyResources.ToFile(ResourceType.Platform, "git-lfs.zip", installDetails.ZipPath, environment);
159-
AssemblyResources.ToFile(ResourceType.Platform, "git-lfs.zip.md5", installDetails.ZipPath, environment);
160187
}
161188
state.GitLfsZipExists = installDetails.GitLfsZipPath.FileExists();
162-
installationTask.UpdateProgress(20, 100);
189+
installationTask.UpdateProgress(30, 100);
163190
return state;
164191
}
165192

166-
private ITask<GitInstallationState> CreateDownloadTask(GitInstallationState state)
193+
private ITask<GitInstallationState> DownloadZipsIfNeeded(GitInstallationState state)
167194
{
168195
var downloader = new Downloader();
169196
downloader.Catch(e => true);
@@ -180,7 +207,8 @@ private ITask<GitInstallationState> CreateDownloadTask(GitInstallationState stat
180207
});
181208
}
182209

183-
private FuncTask<GitInstallationState> ExtractPortableGit(GitInstallationState state)
210+
private void ExtractPortableGit(ITask<GitInstallationState> thisTask,
211+
GitInstallationState state, bool s, Exception exception)
184212
{
185213
ITask<NPath> task = null;
186214
var tempZipExtractPath = NPath.CreateTempDirectory("git_zip_extract_zip_paths");
@@ -252,7 +280,9 @@ private FuncTask<GitInstallationState> ExtractPortableGit(GitInstallationState s
252280
endTask = task.Then(endTask);
253281
}
254282

255-
return endTask;
283+
thisTask
284+
.Then(endTask)
285+
.Then(installationTask);
256286
}
257287

258288
public class GitInstallationState

src/GitHub.Api/Managers/Downloader.cs

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ class Downloader : FuncListTask<DownloadData>
2929
private readonly List<PairDownloader> downloaders = new List<PairDownloader>();
3030

3131
public Downloader() : base(TaskManager.Instance.Token, RunDownloaders)
32-
{}
32+
{
33+
Name = "Downloader";
34+
}
3335

3436
public void QueueDownload(UriString url, UriString md5Url, NPath targetDirectory)
3537
{
@@ -124,31 +126,6 @@ public Task<DownloadData> QueueDownload(UriString url, UriString md5Url, NPath t
124126
var md5Exists = destinationMd5.FileExists();
125127
var fileExists = destinationFile.FileExists();
126128

127-
if (fileExists && md5Exists)
128-
{
129-
var verification = new FuncTask<NPath>(cancellationToken, () => destinationFile);
130-
verification.OnStart += _ => DownloadStart?.Invoke(result);
131-
verification.OnEnd += (t, res, success, ex) =>
132-
{
133-
if (!Utils.VerifyFileIntegrity(destinationFile, destinationMd5))
134-
{
135-
destinationMd5.Delete();
136-
destinationFile.Delete();
137-
var fileDownload = DownloadFile(url, targetDirectory, result, verifyDownload);
138-
queuedTasks.Add(fileDownload);
139-
var md5Download = DownloadFile(md5Url, targetDirectory, result, verifyDownload);
140-
queuedTasks.Add(md5Download);
141-
fileDownload.Start();
142-
md5Download.Start();
143-
}
144-
else
145-
{
146-
DownloadComplete(result);
147-
}
148-
};
149-
queuedTasks.Add(verification);
150-
}
151-
152129
if (!md5Exists)
153130
{
154131
var md5Download = DownloadFile(md5Url, targetDirectory, result, verifyDownload);

src/tests/IntegrationTests/Installer/GitInstallerTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ public void GitInstallWindows()
6262
}), Arg.Any<CancellationToken>(), Arg.Any<Func<long, long, bool>>()).Returns(true);
6363
ZipHelper.Instance = zipHelper;
6464
var gitInstaller = new GitInstaller(Environment, ProcessManager, TaskManager, installDetails);
65-
var startTask = gitInstaller.SetupGitIfNeeded();
66-
var endTask = new FuncTask<GitInstaller.GitInstallationState, GitInstaller.GitInstallationState>(TaskManager.Token, (s, state) => state);
67-
startTask.OnEnd += (thisTask, path, success, exception) => thisTask.GetEndOfChain().Then(endTask);
65+
66+
TaskCompletionSource<GitInstaller.GitInstallationState> end = new TaskCompletionSource<GitInstaller.GitInstallationState>();
67+
var startTask = gitInstaller.SetupGitIfNeeded().Finally((_, state) => end.TrySetResult(state));
6868
startTask.Start();
6969
GitInstaller.GitInstallationState result = null;
70-
Assert.DoesNotThrow(async () => result = await endTask.Task);
70+
Assert.DoesNotThrow(async () => result = await end.Task);
7171
result.Should().NotBeNull();
7272

7373
Assert.AreEqual(gitInstallationPath.Combine(installDetails.PackageNameWithVersion), result.GitInstallationPath);

0 commit comments

Comments
 (0)