@@ -50,25 +50,35 @@ func (repo *Repository) readTreeToIndex(id ObjectID, indexFilename ...string) er
50
50
}
51
51
52
52
// 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
+
54
70
tmpDir , err = os .MkdirTemp ("" , "index" )
55
71
if err != nil {
56
- return filename , tmpDir , cancel , err
72
+ return "" , "" , nil , err
57
73
}
58
74
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 )
67
78
if err != nil {
68
- defer cancel ()
69
- return "" , "" , func () {}, err
79
+ return "" , "" , cancel , err
70
80
}
71
- return filename , tmpDir , cancel , err
81
+ return tmpIndexFilename , tmpDir , cancel , err
72
82
}
73
83
74
84
// EmptyIndex empties the index
0 commit comments