Skip to content

Commit 2d22217

Browse files
author
Antonio Salinas
authored
fix: Preserving .git dir during repo clone (#468)
* Preserving .git dir during repo clone * Added test case for git preserve
1 parent 5560b37 commit 2d22217

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

internal/providers/sourceproviders/fedorasourceprovider.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,6 @@ func (g *FedoraSourcesProviderImpl) processClonedRepo(
146146
return fmt.Errorf("failed to checkout target commit:\n%w", err)
147147
}
148148

149-
// Delete the .git directory so it's not copied to destination.
150-
if err := g.fs.RemoveAll(filepath.Join(tempDir, ".git")); err != nil {
151-
return fmt.Errorf("failed to remove .git directory from cloned repository at %#q:\n%w",
152-
tempDir, err)
153-
}
154-
155149
// Extract sources from repo (downloads lookaside files into the temp dir)
156150
if err := g.downloader.ExtractSourcesFromRepo(ctx, tempDir, upstreamName, lookasideBaseURI); err != nil {
157151
return fmt.Errorf("failed to extract sources from git repository:\n%w", err)

internal/providers/sourceproviders/fedorasourceprovider_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,49 @@ func TestGetComponentFromGit(t *testing.T) {
280280
assert.True(t, exists)
281281
})
282282

283+
t.Run("git directory is preserved in destination", func(t *testing.T) {
284+
ctrl := gomock.NewController(t)
285+
mockGitProvider := git_test.NewMockGitProvider(ctrl)
286+
mockExtractor := fedorasource_test.NewMockFedoraSourceDownloader(ctrl)
287+
288+
provider, err := sourceproviders.NewFedoraSourcesProviderImpl(
289+
env.FS(), env.DryRunnable, mockGitProvider, mockExtractor, mockDistroResolver(), retry.Disabled(),
290+
)
291+
require.NoError(t, err)
292+
293+
mockComponent := components_testutils.NewMockComponent(ctrl)
294+
mockComponent.EXPECT().GetName().AnyTimes().Return(testPackageName)
295+
mockComponent.EXPECT().GetConfig().AnyTimes().Return(&projectconfig.ComponentConfig{Name: testPackageName})
296+
297+
mockGitProvider.EXPECT().
298+
Clone(gomock.Any(), repoURL, gomock.Any(), gomock.Any()).
299+
DoAndReturn(func(_ context.Context, _, cloneDir string, _ ...git.GitOptions) error {
300+
for path, content := range map[string]string{
301+
cloneDir + "/" + testPackageName + ".spec": "Name: " + testPackageName,
302+
cloneDir + "/.git/HEAD": "ref: refs/heads/main\n",
303+
} {
304+
if err := fileutils.WriteFile(env.FS(), path, []byte(content), fileperms.PublicFile); err != nil {
305+
return err
306+
}
307+
}
308+
309+
return nil
310+
})
311+
312+
mockExtractor.EXPECT().
313+
ExtractSourcesFromRepo(gomock.Any(), gomock.Any(), testPackageName, gomock.Any()).
314+
Return(nil)
315+
316+
gitDestDir := destDir + "/with-git"
317+
err = provider.GetComponent(context.Background(), mockComponent, gitDestDir)
318+
require.NoError(t, err)
319+
320+
// Verify the .git directory was preserved in the destination.
321+
exists, err := fileutils.Exists(env.FS(), gitDestDir+"/.git/HEAD")
322+
require.NoError(t, err)
323+
assert.True(t, exists, ".git/HEAD should exist in destination")
324+
})
325+
283326
t.Run("validation failures", func(t *testing.T) {
284327
ctrl := gomock.NewController(t)
285328
mockGitProvider := git_test.NewMockGitProvider(ctrl)

0 commit comments

Comments
 (0)