diff --git a/backup.go b/backup.go index f1c7007..2b0893e 100644 --- a/backup.go +++ b/backup.go @@ -33,6 +33,11 @@ func checkGitAvailability() error { func backUp(backupDir string, repo *Repository, bare bool, wg *sync.WaitGroup) ([]byte, error) { defer wg.Done() + if repo.Private && ignorePrivate != nil && *ignorePrivate { + log.Printf("Skipping %s as it is a private repo.\n", repo.Name) + return nil, nil + } + repoDir := getRepoDir(backupDir, repo, bare) _, err := appFS.Stat(repoDir) @@ -74,11 +79,6 @@ func cloneNewRepo(repoDir string, repo *Repository, bare bool) ([]byte, error) { log.Printf("Cloning %s\n", repo.Name) log.Printf("%#v\n", repo) - if repo.Private && ignorePrivate != nil && *ignorePrivate { - log.Printf("Skipping %s as it is a private repo.\n", repo.Name) - return nil, nil - } - cloneURL := repo.CloneURL if useHTTPSClone != nil && *useHTTPSClone { // Add username and token to the clone URL diff --git a/backup_test.go b/backup_test.go index 6ee639b..8049467 100644 --- a/backup_test.go +++ b/backup_test.go @@ -20,6 +20,14 @@ func fakePullCommand(command string, args ...string) (cmd *exec.Cmd) { return cmd } +func fakeFailingPullCommand(command string, args ...string) *exec.Cmd { + cs := []string{"-test.run=TestHelperFailingPullProcess", "--", command} + cs = append(cs, args...) + cmd := exec.Command(os.Args[0], cs...) + cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"} + return cmd +} + func fakeCloneCommand(command string, args ...string) (cmd *exec.Cmd) { cs := []string{"-test.run=TestHelperCloneProcess", "--", command} cs = append(cs, args...) @@ -69,6 +77,39 @@ func TestBackup(t *testing.T) { } } +func TestBackupSkipsExistingPrivateRepoWhenIgnorePrivate(t *testing.T) { + oldFS, oldIgnorePrivate, oldExecCommand := appFS, ignorePrivate, execCommand + t.Cleanup(func() { + appFS, ignorePrivate, execCommand = oldFS, oldIgnorePrivate, oldExecCommand + }) + + appFS = afero.NewMemMapFs() + ignorePrivateValue := true + ignorePrivate = &ignorePrivateValue + execCommand = fakeFailingPullCommand + + backupDir := "/synthetic-backups" + repo := Repository{Name: "private-repo", Namespace: "synthetic-owner", Private: true} + if err := appFS.MkdirAll(getRepoDir(backupDir, &repo, false), 0771); err != nil { + t.Fatal(err) + } + + var wg sync.WaitGroup + wg.Add(1) + if output, err := backUp(backupDir, &repo, false, &wg); err != nil { + t.Fatalf("private repository should be skipped without updating it; output=%q err=%v", output, err) + } + wg.Wait() +} + +func TestHelperFailingPullProcess(t *testing.T) { + if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" { + return + } + fmt.Fprint(os.Stdout, "synthetic pull failure") + os.Exit(1) +} + func TestBareBackup(t *testing.T) { var wg sync.WaitGroup repo := Repository{Name: "testrepo", CloneURL: "git://foo.com/foo"}