@@ -200,54 +200,64 @@ func (lmi *Installer) InstallZipLib(ctx context.Context, archivePath *paths.Path
200200}
201201
202202// InstallGitLib installs a library hosted on a git repository on the specified path. 
203- func  (lmi  * Installer ) InstallGitLib (argURL  string , overwrite  bool ) error  {
204- 	libraryName ,  gitURL ,  ref ,  err  :=  parseGitArgURL ( argURL )
203+ func  (lmi  * Installer ) InstallGitLib (ctx  context. Context ,  argURL  string , overwrite  bool ) error  {
204+ 	tmpInstallPath ,  err  :=  CloneLibraryGitRepository ( ctx ,  argURL )
205205	if  err  !=  nil  {
206206		return  err 
207207	}
208+ 	defer  tmpInstallPath .RemoveAll ()
209+ 
210+ 	// Install extracted library in the destination directory 
211+ 	if  err  :=  lmi .importLibraryFromDirectory (tmpInstallPath , overwrite ); err  !=  nil  {
212+ 		return  errors .New (i18n .Tr ("moving extracted archive to destination dir: %s" , err ))
213+ 	}
214+ 
215+ 	return  nil 
216+ }
217+ 
218+ // CloneLibraryGitRepository clones a git repository containing a library 
219+ // into a temporary directory and returns the path to the cloned library. 
220+ func  CloneLibraryGitRepository (ctx  context.Context , argURL  string ) (* paths.Path , error ) {
221+ 	libraryName , gitURL , ref , err  :=  parseGitArgURL (argURL )
222+ 	if  err  !=  nil  {
223+ 		return  nil , err 
224+ 	}
208225
209226	// Clone library in a temporary directory 
210227	tmp , err  :=  paths .MkTempDir ("" , "" )
211228	if  err  !=  nil  {
212- 		return  err 
229+ 		return  nil ,  err 
213230	}
214- 	defer  tmp .RemoveAll ()
215231	tmpInstallPath  :=  tmp .Join (libraryName )
216232
217- 	if  _ , err  :=  git .PlainClone ( tmpInstallPath .String (), false , & git.CloneOptions {
233+ 	if  _ , err  :=  git .PlainCloneContext ( ctx ,  tmpInstallPath .String (), false , & git.CloneOptions {
218234		URL :           gitURL ,
219235		ReferenceName : plumbing .ReferenceName (ref ),
220236	}); err  !=  nil  {
221237		if  err .Error () !=  "reference not found"  {
222- 			return  err 
238+ 			return  nil ,  err 
223239		}
224240
225241		// We did not find the requested reference, let's do a PlainClone and use 
226242		// "ResolveRevision" to find and checkout the requested revision 
227- 		if  repo , err  :=  git .PlainClone ( tmpInstallPath .String (), false , & git.CloneOptions {
243+ 		if  repo , err  :=  git .PlainCloneContext ( ctx ,  tmpInstallPath .String (), false , & git.CloneOptions {
228244			URL : gitURL ,
229245		}); err  !=  nil  {
230- 			return  err 
246+ 			return  nil ,  err 
231247		} else  if  h , err  :=  repo .ResolveRevision (plumbing .Revision (ref )); err  !=  nil  {
232- 			return  err 
248+ 			return  nil ,  err 
233249		} else  if  w , err  :=  repo .Worktree (); err  !=  nil  {
234- 			return  err 
250+ 			return  nil ,  err 
235251		} else  if  err  :=  w .Checkout (& git.CheckoutOptions {
236252			Force : true , // workaround for: https://github.com/go-git/go-git/issues/1411 
237253			Hash :  plumbing .NewHash (h .String ())}); err  !=  nil  {
238- 			return  err 
254+ 			return  nil ,  err 
239255		}
240256	}
241257
242258	// We don't want the installed library to be a git repository thus we delete this folder 
243259	tmpInstallPath .Join (".git" ).RemoveAll ()
244- 
245- 	// Install extracted library in the destination directory 
246- 	if  err  :=  lmi .importLibraryFromDirectory (tmpInstallPath , overwrite ); err  !=  nil  {
247- 		return  errors .New (i18n .Tr ("moving extracted archive to destination dir: %s" , err ))
248- 	}
249- 
250- 	return  nil 
260+ 	return  tmpInstallPath , nil 
251261}
252262
253263// parseGitArgURL tries to recover a library name from a git URL. 
0 commit comments