From e6cac245633edd7ec402600fb6cc5ed80f205536 Mon Sep 17 00:00:00 2001 From: Sida Chen Date: Wed, 17 Oct 2018 10:22:42 -0400 Subject: [PATCH] gitutil: Fix git pull on non-git repository directory * Add conditional check: if the git repo directory is newly created, we clone. * Add tests Fixes #641 --- pkg/gitutil/gitutil.go | 2 +- pkg/gitutil/gitutil_test.go | 76 +++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 pkg/gitutil/gitutil_test.go diff --git a/pkg/gitutil/gitutil.go b/pkg/gitutil/gitutil.go index b767db3b24..642011a96e 100644 --- a/pkg/gitutil/gitutil.go +++ b/pkg/gitutil/gitutil.go @@ -73,7 +73,7 @@ func CloneOrPull(remote, repoPath, tempDirPrefix string) (path, head string, err path = repoPath } - if _, pathExists := os.Stat(path); os.IsNotExist(pathExists) { + if _, pathExists := os.Stat(path); repoPath == "" || os.IsNotExist(pathExists) { head, err = clone(remote, path) return } diff --git a/pkg/gitutil/gitutil_test.go b/pkg/gitutil/gitutil_test.go new file mode 100644 index 0000000000..ed3aa17ab5 --- /dev/null +++ b/pkg/gitutil/gitutil_test.go @@ -0,0 +1,76 @@ +// Copyright 2018 clair authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gitutil + +import ( + "io/ioutil" + "os" + "os/exec" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func createTemporaryGitRepo(t *testing.T) string { + // create temporary folder + path, err := ioutil.TempDir(os.TempDir(), "1b750a87bbfc") + require.Nil(t, err) + + // initialize git + cmd := exec.Command("git", "init", path) + out, err := cmd.CombinedOutput() + require.Nil(t, err, "Failed to initialize temporary git repo, output=%s", string(out)) + return path +} + +func createEmptyCommit(t *testing.T, repoPath string) { + cmd := exec.Command("git", "commit", "-m", "\"init\"", "--allow-empty") + cmd.Dir = repoPath + out, err := cmd.CombinedOutput() + require.Nil(t, err, "Failed to submit first empty git commit, output=%s", string(out)) +} + +func getHeadCommitRev(t *testing.T, repoPath string) string { + cmd := exec.Command("git", "rev-parse", "HEAD") + cmd.Dir = repoPath + out, err := cmd.CombinedOutput() + require.Nil(t, err, "Failed to get head revision, output=%s", string(out)) + return strings.TrimSuffix(string(out), "\n") +} + +func TestCloneOrPull(t *testing.T) { + remote := createTemporaryGitRepo(t) + createEmptyCommit(t, remote) + expectedHead := getHeadCommitRev(t, remote) + t.Log(expectedHead) + repoPath := "" + tempDirPrefix := "9c2d4181" + path, head, err := CloneOrPull(remote, repoPath, tempDirPrefix) + require.Nil(t, err) + _, err = os.Stat(path) + require.Nil(t, err, "Expect generated repo to exist") + require.Equal(t, expectedHead, head) + + // create second empty commit to try pull + createEmptyCommit(t, remote) + expectedHead = getHeadCommitRev(t, remote) + t.Log(expectedHead) + path, head, err = CloneOrPull(remote, repoPath, tempDirPrefix) + require.Nil(t, err) + _, err = os.Stat(path) + require.Nil(t, err, "Expect generated repo to exist") + require.Equal(t, expectedHead, head) +}