Skip to content

Commit 1d8035f

Browse files
committed
make sure file is not a symlink, dir, etc
Signed-off-by: reggie-k <regina.voloshin@codefresh.io>
1 parent db50938 commit 1d8035f

File tree

2 files changed

+37
-71
lines changed

2 files changed

+37
-71
lines changed

reposerver/repository/repository.go

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -180,28 +180,33 @@ func (s *Service) cleanupStaleFiles(fullPath string, staleFiles []string, repo *
180180
// for each stale file, if it exists, remove it
181181
for _, staleFile := range staleFiles {
182182
gitFile := filepath.Join(fullPath, ".git", staleFile)
183-
if _, err := os.Stat(gitFile); err == nil {
184-
log.Warnf("Stale file %s present in git repository %s, removing it", staleFile, fullPath)
185-
if err = os.Remove(gitFile); err != nil {
186-
log.Errorf("Failed to remove stale file %s: %v", gitFile, err)
187-
}
188-
if staleFile == "index" {
189-
if err == nil {
190-
wt, _ := repo.Worktree()
191-
headRef, _ := repo.Head()
192-
err = wt.Reset(&gogit.ResetOptions{
193-
Mode: gogit.MixedReset,
194-
Commit: headRef.Hash(),
195-
})
183+
info, err := os.Lstat(gitFile)
184+
if err == nil {
185+
// Only delete if it's a regular file (not a symlink, dir, etc.)
186+
if info.Mode().IsRegular() {
187+
log.Warnf("Stale file %s present in git repository %s, removing it", staleFile, fullPath)
188+
if err = os.Remove(gitFile); err != nil {
189+
log.Errorf("Failed to remove stale file %s: %v", gitFile, err)
196190
}
191+
if staleFile == "index" {
192+
if err == nil {
193+
wt, _ := repo.Worktree()
194+
headRef, _ := repo.Head()
195+
err = wt.Reset(&gogit.ResetOptions{
196+
Mode: gogit.MixedReset,
197+
Commit: headRef.Hash(),
198+
})
199+
}
197200

198-
if err != nil {
199-
log.Errorf("Failed to reset git repo %s: %v", fullPath, err)
201+
if err != nil {
202+
log.Errorf("Failed to reset git repo %s: %v", fullPath, err)
203+
}
200204
}
201205
}
206+
} else {
207+
log.Warnf("Stale file %s in git repository %s is not a regular file, skipping removal", staleFile, fullPath)
202208
}
203209
}
204-
205210
}
206211

207212
// ListRefs List a subset of the refs (currently, branches and tags) of a git repo

reposerver/repository/repository_test.go

Lines changed: 16 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3016,75 +3016,36 @@ func TestInit(t *testing.T) {
30163016
initGitRepo(t, newGitRepoOptions{path: path.Join(dir, "repo2"), remote: "https://github.com/argo-cd/test-repo2", createPath: true, addEmptyCommit: false})
30173017

30183018
repoPath = path.Join(dir, "repo3")
3019-
lockFile1 := path.Join(repoPath, ".git", "index.lock")
3020-
lockFile2 := path.Join(repoPath, ".git", "index")
3021-
lockFile3 := path.Join(repoPath, ".git", "HEAD.lock")
3019+
indexLockFile := path.Join(repoPath, ".git", "index.lock")
3020+
indexFile := path.Join(repoPath, ".git", "index")
3021+
headLockFile := path.Join(repoPath, ".git", "HEAD.lock")
30223022
initGitRepo(t, newGitRepoOptions{path: repoPath, remote: "https://github.com/argo-cd/test-repo3", createPath: true, addEmptyCommit: true})
3023-
require.NoError(t, os.WriteFile(lockFile1, []byte("test"), 0o644))
3024-
require.NoError(t, os.WriteFile(lockFile2, []byte("test"), 0o644))
3025-
require.NoError(t, os.WriteFile(lockFile3, []byte("test"), 0o644))
3023+
require.NoError(t, os.WriteFile(indexLockFile, []byte("test"), 0o644))
3024+
require.NoError(t, os.WriteFile(headLockFile, []byte("test"), 0o644))
30263025

30273026
service = newService(t, ".")
30283027
service.rootDir = dir
30293028

3030-
_, err = os.Stat(lockFile1)
3029+
_, err = os.Stat(indexLockFile)
30313030
require.NoError(t, err)
3032-
_, err = os.Stat(lockFile2)
3031+
_, err = os.Stat(indexFile)
30333032
require.NoError(t, err)
3034-
_, err = os.Stat(lockFile3)
3033+
_, err = os.Stat(headLockFile)
30353034
require.NoError(t, err)
30363035

30373036
require.NoError(t, service.Init())
30383037

3039-
_, err = os.Stat(lockFile1)
3040-
require.Error(t, err, "lock file should be removed after Init()")
3038+
_, err = os.Stat(indexLockFile)
3039+
require.Error(t, err, "index.lock file should be removed after Init()")
30413040
require.ErrorContains(t, err, ".git/index.lock: no such file or directory")
3042-
// _, err = os.Stat(lockFile2)
3043-
// require.Error(t, err, "lock file should be removed after Init()")
3044-
// require.ErrorContains(t, err, ".git/index: no such file or directory")
3045-
// _, err = os.Stat(lockFile3)
3046-
// require.Error(t, err, "lock file should be removed after Init()")
3047-
// require.ErrorContains(t, err, ".git/HEAD.lock: no such file or directory")
3041+
_, err = os.Stat(indexFile)
3042+
//index file should stay after Init(), since it was recreated after repo reset
3043+
require.NoError(t, err)
3044+
_, err = os.Stat(headLockFile)
3045+
require.Error(t, err, "HEAD.lock file should be removed after Init()")
3046+
require.ErrorContains(t, err, ".git/HEAD.lock: no such file or directory")
30483047
}
30493048

3050-
// func TestCleanupStaleFiles(t *testing.T) {
3051-
// // Setup: create a temp directory and some files to be cleaned up
3052-
// tmpDir := t.TempDir()
3053-
// gitDir := filepath.Join(tmpDir, ".git")
3054-
// require.NoError(t, os.MkdirAll(gitDir, 0o755))
3055-
3056-
// staleFile1 := filepath.Join(gitDir, "index.lock")
3057-
// staleFile2 := filepath.Join(gitDir, "index")
3058-
// staleFile3 := filepath.Join(gitDir, "HEAD.lock")
3059-
3060-
// require.NoError(t, os.WriteFile(staleFile1, []byte("foo"), 0o644))
3061-
// require.NoError(t, os.WriteFile(staleFile2, []byte("bar"), 0o644))
3062-
// require.NoError(t, os.WriteFile(staleFile3, []byte("baz"), 0o644))
3063-
3064-
// // Sanity check: files exist
3065-
// _, err := os.Stat(staleFile1)
3066-
// require.NoError(t, err)
3067-
// _, err = os.Stat(staleFile2)
3068-
// require.NoError(t, err)
3069-
// _, err = os.Stat(staleFile3)
3070-
// require.NoError(t, err)
3071-
3072-
// repo, err := gogit.PlainInit(tmpDir, false)
3073-
// require.NoError(t, err)
3074-
3075-
// // Call cleanupStaleFiles
3076-
// service := newService(t, tmpDir)
3077-
// service.cleanupStaleFiles(tmpDir, []string{"index.lock", "index", "HEAD.lock"}, repo)
3078-
3079-
// // Assert: files are removed
3080-
// _, err = os.Stat(staleFile1)
3081-
// assert.True(t, os.IsNotExist(err))
3082-
// _, err = os.Stat(staleFile2)
3083-
// assert.True(t, os.IsNotExist(err))
3084-
// _, err = os.Stat(staleFile3)
3085-
// assert.True(t, os.IsNotExist(err))
3086-
// }
3087-
30883049
// TestCheckoutRevisionCanGetNonstandardRefs shows that we can fetch a revision that points to a non-standard ref. In
30893050
// other words, we haven't regressed and caused this issue again: https://github.com/argoproj/argo-cd/issues/4935
30903051
func TestCheckoutRevisionCanGetNonstandardRefs(t *testing.T) {

0 commit comments

Comments
 (0)