From d3b98337353abcae14d81512fdcd5c0e32d1b49f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 28 Oct 2024 11:03:12 -0700 Subject: [PATCH 1/3] Fix clean tmp dir --- modules/git/repo_index.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/git/repo_index.go b/modules/git/repo_index.go index 839057009872e..a2d4352d3856d 100644 --- a/modules/git/repo_index.go +++ b/modules/git/repo_index.go @@ -63,9 +63,16 @@ func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (filename, tmpD log.Error("failed to remove tmp index file: %v", err) } } + + // Defer the cancel function to ensure cleanup in case of an error + defer func() { + if err != nil { + cancel() + } + }() + err = repo.ReadTreeToIndex(treeish, filename) if err != nil { - defer cancel() return "", "", func() {}, err } return filename, tmpDir, cancel, err From 812f8bb8c4fadeae0027c9ea3b1cf481b9cbc9e0 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 28 Oct 2024 19:05:43 -0700 Subject: [PATCH 2/3] Make code more clear --- modules/git/repo_index.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/modules/git/repo_index.go b/modules/git/repo_index.go index a2d4352d3856d..4c6c5a6125520 100644 --- a/modules/git/repo_index.go +++ b/modules/git/repo_index.go @@ -51,16 +51,12 @@ 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) { - tmpDir, err = os.MkdirTemp("", "index") - if err != nil { - return filename, tmpDir, cancel, 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) + if tmpDir == "" { + return + } + if removeErr := util.RemoveAll(tmpDir); removeErr != nil { + log.Error("failed to remove tmp index file: %v", removeErr) } } @@ -71,6 +67,13 @@ func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (filename, tmpD } }() + tmpDir, err = os.MkdirTemp("", "index") + if err != nil { + return filename, tmpDir, cancel, err + } + + filename = filepath.Join(tmpDir, ".tmp-index") + err = repo.ReadTreeToIndex(treeish, filename) if err != nil { return "", "", func() {}, err From 2b730a13cab6e33b86437e5d080f35c22163313b Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 29 Oct 2024 13:02:14 +0800 Subject: [PATCH 3/3] fix cancel --- modules/git/repo_index.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/git/repo_index.go b/modules/git/repo_index.go index 4c6c5a6125520..f45b6e61919f6 100644 --- a/modules/git/repo_index.go +++ b/modules/git/repo_index.go @@ -50,35 +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) { - cancel = func() { - if tmpDir == "" { - return - } - if removeErr := util.RemoveAll(tmpDir); removeErr != nil { - log.Error("failed to remove tmp index file: %v", removeErr) - } - } - - // Defer the cancel function to ensure cleanup in case of an error +func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (tmpIndexFilename, tmpDir string, cancel context.CancelFunc, err error) { defer func() { - if err != nil { + // 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") - - err = repo.ReadTreeToIndex(treeish, filename) + tmpIndexFilename = filepath.Join(tmpDir, ".tmp-index") + cancel = removeDirFn(tmpDir) + err = repo.ReadTreeToIndex(treeish, tmpIndexFilename) if err != nil { - return "", "", func() {}, err + return "", "", cancel, err } - return filename, tmpDir, cancel, err + return tmpIndexFilename, tmpDir, cancel, err } // EmptyIndex empties the index