Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions cmd/clone.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"log"
"net/url"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"
Expand Down Expand Up @@ -787,8 +788,15 @@ func getCloneableInventory(allRepos []scm.Repo) (int, int, int, int, int) {
}

func isGitRepository(path string) bool {
stat, err := os.Stat(filepath.Join(path, ".git"))
return err == nil && stat.IsDir()
// For standard clones, look for a .git subdirectory.
if stat, err := os.Stat(filepath.Join(path, ".git")); err == nil && stat.IsDir() {
return true
}

// For bare/mirror clones, use Git itself to check that exact path.
cmd := exec.Command("git", "--git-dir="+path, "rev-parse", "--is-bare-repository")
output, err := cmd.Output()
return err == nil && strings.TrimSpace(string(output)) == "true"
}

func getRelativePathRepositories(root string) ([]string, error) {
Expand Down
58 changes: 36 additions & 22 deletions cmd/clone_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"errors"
"log"
"os"
"os/exec"
"path/filepath"
"reflect"
"strings"
Expand All @@ -14,6 +15,22 @@ import (
"github.com/spf13/cobra"
)

func setUpGitRepository(t *testing.T, path string, bare bool) {
t.Helper()
if err := os.MkdirAll(path, 0o755); err != nil {
t.Fatalf("Failed to create a directory under %s: %v", path, err)
}
arguments := []string{"init"}
if bare {
arguments = append(arguments, "--bare")
}
gitCommand := exec.Command("git", arguments...)
gitCommand.Dir = path
if output, err := gitCommand.CombinedOutput(); err != nil {
t.Fatalf("Failed to set up a Git repository in %s: %v\n%s", path, err, output)
}
}

func TestShouldLowerRegularString(t *testing.T) {

upperName := "RepoName"
Expand Down Expand Up @@ -614,10 +631,7 @@ func TestRelativePathRepositories(t *testing.T) {

outputDirAbsolutePath = testing

repository := filepath.Join(testing, "repository", ".git")
if err := os.MkdirAll(repository, 0o755); err != nil {
t.Fatalf("Failed to create directory: %v", err)
}
setUpGitRepository(t, filepath.Join(testing, "repository"), false)

files, err := getRelativePathRepositories(testing)
if err != nil {
Expand Down Expand Up @@ -666,12 +680,9 @@ func TestRelativePathRepositoriesWithGitSubmodule(t *testing.T) {

outputDirAbsolutePath = testing

repository := filepath.Join(testing, "repository", ".git")
submodule := filepath.Join(testing, "repository", "submodule", ".git")
setUpGitRepository(t, filepath.Join(testing, "repository"), false)

if err := os.MkdirAll(repository, 0o755); err != nil {
t.Fatalf("Failed to create directory: %v", err)
}
submodule := filepath.Join(testing, "repository", "submodule", ".git")
if err := os.MkdirAll(filepath.Dir(submodule), 0o755); err != nil {
t.Fatalf("Failed to create directory: %v", err)
}
Expand Down Expand Up @@ -702,10 +713,7 @@ func TestRelativePathRepositoriesDeeplyNested(t *testing.T) {

outputDirAbsolutePath = testing

repository := filepath.Join(testing, "deeply", "nested", "repository", ".git")
if err := os.MkdirAll(repository, 0o755); err != nil {
t.Fatalf("Failed to create repository: %v", err)
}
setUpGitRepository(t, filepath.Join(testing, "deeply", "nested", "repository"), false)

files, err := getRelativePathRepositories(testing)
if err != nil {
Expand All @@ -725,7 +733,7 @@ func TestRelativePathRepositoriesDeeplyNested(t *testing.T) {
func TestPruneRepos(t *testing.T) {
_ = os.Setenv("GHORG_PRUNE_NO_CONFIRM", "true")

cloneTargets := []scm.Repo{{Path: "/repository"}}
cloneTargets := []scm.Repo{{Path: "/repository"}, {Path: "/repository-bare"}}

testing, err := os.MkdirTemp("", "testing")
if err != nil {
Expand All @@ -735,25 +743,31 @@ func TestPruneRepos(t *testing.T) {

outputDirAbsolutePath = testing

repository := filepath.Join(testing, "repository", ".git")
if err := os.MkdirAll(repository, 0o755); err != nil {
t.Fatalf("Failed to create repository: %v", err)
}
repository := filepath.Join(testing, "repository")
setUpGitRepository(t, repository, false)
repositoryBare := filepath.Join(testing, "repository-bare")
setUpGitRepository(t, repositoryBare, true)

prunable := filepath.Join(testing, "prunnable", ".git")
if err := os.MkdirAll(prunable, 0o755); err != nil {
t.Fatalf("Failed to create directory: %v", err)
}
prunable := filepath.Join(testing, "prunnable")
setUpGitRepository(t, prunable, false)
prunableBare := filepath.Join(testing, "prunnable-bare")
setUpGitRepository(t, prunableBare, true)

pruneRepos(cloneTargets)

if _, err := os.Stat(repository); os.IsNotExist(err) {
t.Errorf("Expected '%s' to exist, but it was deleted", repository)
}
if _, err := os.Stat(repositoryBare); os.IsNotExist(err) {
t.Errorf("Expected '%s' to exist, but it was deleted", repositoryBare)
}

if _, err := os.Stat(prunable); !os.IsNotExist(err) {
t.Errorf("Expected '%s' to be deleted, but it exists", prunable)
}
if _, err := os.Stat(prunableBare); !os.IsNotExist(err) {
t.Errorf("Expected '%s' to be deleted, but it exists", prunableBare)
}
}

func TestSliceContainsNamedRepoWithPathSeparators(t *testing.T) {
Expand Down
Loading