Skip to content

Commit d4d8db0

Browse files
fix: preserve files untracked by Git on plugin update (#1995)
Co-authored-by: Trevor Brown <[email protected]>
1 parent 45047a6 commit d4d8db0

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

internal/git/git.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,10 @@ func (r Repo) Update(ref string) (string, string, string, error) {
115115
// If on a branch checkout the latest version of it from the remote
116116
branch := head.Name()
117117
ref = branch.String()
118-
checkoutOptions = git.CheckoutOptions{Branch: branch, Force: true}
118+
checkoutOptions = git.CheckoutOptions{Branch: branch, Keep: true}
119119
} else {
120120
// Checkout ref if provided
121-
checkoutOptions = git.CheckoutOptions{Hash: plumbing.NewHash(ref), Force: true}
121+
checkoutOptions = git.CheckoutOptions{Hash: plumbing.NewHash(ref), Keep: true}
122122
}
123123

124124
fetchOptions := git.FetchOptions{RemoteName: DefaultRemoteName, Force: true, RefSpecs: []config.RefSpec{

internal/git/git_test.go

+34
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,40 @@ func TestRepoUpdate(t *testing.T) {
153153
assert.Equal(t, latestHash, currentHash)
154154
})
155155

156+
t.Run("updates repo while leaving untracked files in place", func(t *testing.T) {
157+
latestHash, err := getCurrentCommit(directory)
158+
assert.Nil(t, err)
159+
160+
_, err = checkoutPreviousCommit(directory)
161+
assert.Nil(t, err)
162+
163+
untrackedDir := filepath.Join(directory, "untracked")
164+
err = os.Mkdir(untrackedDir, 0o777)
165+
assert.Nil(t, err)
166+
167+
expectedContent := []byte("dummy_content")
168+
err = os.WriteFile(filepath.Join(untrackedDir, "file_one"), expectedContent, 0o777)
169+
assert.Nil(t, err)
170+
err = os.WriteFile(filepath.Join(untrackedDir, "file_two"), expectedContent, 0o777)
171+
assert.Nil(t, err)
172+
173+
updatedToRef, _, _, err := repo.Update("")
174+
assert.Nil(t, err)
175+
assert.Equal(t, "refs/heads/master", updatedToRef)
176+
177+
currentHash, err := getCurrentCommit(directory)
178+
assert.Nil(t, err)
179+
assert.Equal(t, latestHash, currentHash)
180+
181+
content, err := os.ReadFile(filepath.Join(untrackedDir, "file_one"))
182+
assert.Nil(t, err)
183+
assert.Equal(t, expectedContent, content)
184+
185+
content, err = os.ReadFile(filepath.Join(untrackedDir, "file_two"))
186+
assert.Nil(t, err)
187+
assert.Equal(t, expectedContent, content)
188+
})
189+
156190
t.Run("Returns error when specified ref does not exist", func(t *testing.T) {
157191
ref := "non-existent"
158192
updatedToRef, _, _, err := repo.Update(ref)

0 commit comments

Comments
 (0)