@@ -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