]> source.dussan.org Git - gitea.git/commitdiff
Fix clean tmp dir (#32360)
authorLunny Xiao <xiaolunwen@gmail.com>
Tue, 29 Oct 2024 16:27:03 +0000 (09:27 -0700)
committerGitHub <noreply@github.com>
Tue, 29 Oct 2024 16:27:03 +0000 (18:27 +0200)
Try to fix #31792

Credit to @jeroenlaylo
Copied from
https://github.com/go-gitea/gitea/issues/31792#issuecomment-2311920520

---------

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
modules/git/repo_index.go

index 839057009872e1899730133ca5b45b6204908200..f45b6e61919f60fffc00cd049110c4f9f454e0b8 100644 (file)
@@ -50,25 +50,35 @@ func (repo *Repository) readTreeToIndex(id ObjectID, indexFilename ...string) er
 }
 
 // ReadTreeToTemporaryIndex reads a treeish to a temporary index file
-func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (filename, tmpDir string, cancel context.CancelFunc, err error) {
+func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (tmpIndexFilename, tmpDir string, cancel context.CancelFunc, err error) {
+       defer func() {
+               // if error happens and there is a cancel function, do clean up
+               if err != nil && cancel != nil {
+                       cancel()
+                       cancel = nil
+               }
+       }()
+
+       removeDirFn := func(dir string) func() { // it can't use the return value "tmpDir" directly because it is empty when error occurs
+               return func() {
+                       if err := util.RemoveAll(dir); err != nil {
+                               log.Error("failed to remove tmp index dir: %v", err)
+                       }
+               }
+       }
+
        tmpDir, err = os.MkdirTemp("", "index")
        if err != nil {
-               return filename, tmpDir, cancel, err
+               return "", "", nil, err
        }
 
-       filename = filepath.Join(tmpDir, ".tmp-index")
-       cancel = func() {
-               err := util.RemoveAll(tmpDir)
-               if err != nil {
-                       log.Error("failed to remove tmp index file: %v", err)
-               }
-       }
-       err = repo.ReadTreeToIndex(treeish, filename)
+       tmpIndexFilename = filepath.Join(tmpDir, ".tmp-index")
+       cancel = removeDirFn(tmpDir)
+       err = repo.ReadTreeToIndex(treeish, tmpIndexFilename)
        if err != nil {
-               defer cancel()
-               return "", "", func() {}, err
+               return "", "", cancel, err
        }
-       return filename, tmpDir, cancel, err
+       return tmpIndexFilename, tmpDir, cancel, err
 }
 
 // EmptyIndex empties the index