@@ -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
0 commit comments