@@ -50,25 +50,35 @@ func (repo *Repository) readTreeToIndex(id ObjectID, indexFilename ...string) er
5050}
5151
5252// ReadTreeToTemporaryIndex reads a treeish to a temporary index file 
53- func  (repo  * Repository ) ReadTreeToTemporaryIndex (treeish  string ) (filename , tmpDir  string , cancel  context.CancelFunc , err  error ) {
53+ func  (repo  * Repository ) ReadTreeToTemporaryIndex (treeish  string ) (tmpIndexFilename , tmpDir  string , cancel  context.CancelFunc , err  error ) {
54+ 	defer  func () {
55+ 		// if error happens and there is a cancel function, do clean up 
56+ 		if  err  !=  nil  &&  cancel  !=  nil  {
57+ 			cancel ()
58+ 			cancel  =  nil 
59+ 		}
60+ 	}()
61+ 
62+ 	removeDirFn  :=  func (dir  string ) func () { // it can't use the return value "tmpDir" directly because it is empty when error occurs 
63+ 		return  func () {
64+ 			if  err  :=  util .RemoveAll (dir ); err  !=  nil  {
65+ 				log .Error ("failed to remove tmp index dir: %v" , err )
66+ 			}
67+ 		}
68+ 	}
69+ 
5470	tmpDir , err  =  os .MkdirTemp ("" , "index" )
5571	if  err  !=  nil  {
56- 		return  filename ,  tmpDir ,  cancel , err 
72+ 		return  "" ,  "" ,  nil , err 
5773	}
5874
59- 	filename  =  filepath .Join (tmpDir , ".tmp-index" )
60- 	cancel  =  func () {
61- 		err  :=  util .RemoveAll (tmpDir )
62- 		if  err  !=  nil  {
63- 			log .Error ("failed to remove tmp index file: %v" , err )
64- 		}
65- 	}
66- 	err  =  repo .ReadTreeToIndex (treeish , filename )
75+ 	tmpIndexFilename  =  filepath .Join (tmpDir , ".tmp-index" )
76+ 	cancel  =  removeDirFn (tmpDir )
77+ 	err  =  repo .ReadTreeToIndex (treeish , tmpIndexFilename )
6778	if  err  !=  nil  {
68- 		defer  cancel ()
69- 		return  "" , "" , func () {}, err 
79+ 		return  "" , "" , cancel , err 
7080	}
71- 	return  filename , tmpDir , cancel , err 
81+ 	return  tmpIndexFilename , tmpDir , cancel , err 
7282}
7383
7484// EmptyIndex empties the index 
0 commit comments