Skip to content
This repository was archived by the owner on Aug 17, 2020. It is now read-only.

Commit ae8ecb7

Browse files
authored
- Adds go-git package to remove dependency from git binaries. (#193)
- Ensure the source root is a valid folder.
1 parent 6be8558 commit ae8ecb7

File tree

5 files changed

+103
-21
lines changed

5 files changed

+103
-21
lines changed

agent/ci.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ func getCIMetadata() map[string]interface{} {
2525
os.Getenv("TRAVIS_REPO_SLUG"),
2626
)
2727
ciMetadata[tags.Commit] = os.Getenv("TRAVIS_COMMIT")
28-
ciMetadata[tags.SourceRoot] = os.Getenv("TRAVIS_BUILD_DIR")
28+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("TRAVIS_BUILD_DIR")
2929
} else if _, set := os.LookupEnv("CIRCLECI"); set {
3030
ciMetadata[tags.CI] = true
3131
ciMetadata[tags.CIProvider] = "CircleCI"
3232
ciMetadata[tags.CIBuildNumber] = os.Getenv("CIRCLE_BUILD_NUM")
3333
ciMetadata[tags.CIBuildUrl] = os.Getenv("CIRCLE_BUILD_URL")
3434
ciMetadata[tags.Repository] = os.Getenv("CIRCLE_REPOSITORY_URL")
3535
ciMetadata[tags.Commit] = os.Getenv("CIRCLE_SHA1")
36-
ciMetadata[tags.SourceRoot] = os.Getenv("CIRCLE_WORKING_DIRECTORY")
36+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("CIRCLE_WORKING_DIRECTORY")
3737
} else if _, set := os.LookupEnv("JENKINS_URL"); set {
3838
ciMetadata[tags.CI] = true
3939
ciMetadata[tags.CIProvider] = "Jenkins"
@@ -42,15 +42,15 @@ func getCIMetadata() map[string]interface{} {
4242
ciMetadata[tags.CIBuildUrl] = os.Getenv("BUILD_URL")
4343
ciMetadata[tags.Repository] = os.Getenv("GIT_URL")
4444
ciMetadata[tags.Commit] = os.Getenv("GIT_COMMIT")
45-
ciMetadata[tags.SourceRoot] = os.Getenv("WORKSPACE")
45+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("WORKSPACE")
4646
} else if _, set := os.LookupEnv("GITLAB_CI"); set {
4747
ciMetadata[tags.CI] = true
4848
ciMetadata[tags.CIProvider] = "gitLab"
4949
ciMetadata[tags.CIBuildId] = os.Getenv("CI_JOB_ID")
5050
ciMetadata[tags.CIBuildUrl] = os.Getenv("CI_JOB_URL")
5151
ciMetadata[tags.Repository] = os.Getenv("CI_REPOSITORY_URL")
5252
ciMetadata[tags.Commit] = os.Getenv("CI_COMMIT_SHA")
53-
ciMetadata[tags.SourceRoot] = os.Getenv("CI_PROJECT_DIR")
53+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("CI_PROJECT_DIR")
5454
} else if _, set := os.LookupEnv("APPVEYOR"); set {
5555
buildId := os.Getenv("APPVEYOR_BUILD_ID")
5656
ciMetadata[tags.CI] = true
@@ -64,7 +64,7 @@ func getCIMetadata() map[string]interface{} {
6464
)
6565
ciMetadata[tags.Repository] = os.Getenv("APPVEYOR_REPO_NAME")
6666
ciMetadata[tags.Commit] = os.Getenv("APPVEYOR_REPO_COMMIT")
67-
ciMetadata[tags.SourceRoot] = os.Getenv("APPVEYOR_BUILD_FOLDER")
67+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("APPVEYOR_BUILD_FOLDER")
6868
} else if _, set := os.LookupEnv("TF_BUILD"); set {
6969
buildId := os.Getenv("Build.BuildId")
7070
ciMetadata[tags.CI] = true
@@ -79,14 +79,14 @@ func getCIMetadata() map[string]interface{} {
7979
)
8080
ciMetadata[tags.Repository] = os.Getenv("Build.Repository.Uri")
8181
ciMetadata[tags.Commit] = os.Getenv("Build.SourceVersion")
82-
ciMetadata[tags.SourceRoot] = os.Getenv("Build.SourcesDirectory")
82+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("Build.SourcesDirectory")
8383
} else if sha, set := os.LookupEnv("BITBUCKET_COMMIT"); set {
8484
ciMetadata[tags.CI] = true
8585
ciMetadata[tags.CIProvider] = "Bitbucket Pipelines"
8686
ciMetadata[tags.CIBuildNumber] = os.Getenv("BITBUCKET_BUILD_NUMBER")
8787
ciMetadata[tags.Repository] = os.Getenv("BITBUCKET_GIT_SSH_ORIGIN")
8888
ciMetadata[tags.Commit] = sha
89-
ciMetadata[tags.SourceRoot] = os.Getenv("BITBUCKET_CLONE_DIR")
89+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("BITBUCKET_CLONE_DIR")
9090
} else if sha, set := os.LookupEnv("GITHUB_SHA"); set {
9191
repo := os.Getenv("GITHUB_REPOSITORY")
9292
ciMetadata[tags.CI] = true
@@ -101,7 +101,7 @@ func getCIMetadata() map[string]interface{} {
101101
repo,
102102
)
103103
ciMetadata[tags.Commit] = sha
104-
ciMetadata[tags.SourceRoot] = os.Getenv("GITHUB_WORKSPACE")
104+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("GITHUB_WORKSPACE")
105105
ciMetadata[tags.CIBuildId] = os.Getenv("GITHUB_RUN_ID")
106106
ciMetadata[tags.CIBuildNumber] = os.Getenv("GITHUB_RUN_NUMBER")
107107
} else if _, set := os.LookupEnv("TEAMCITY_VERSION"); set {
@@ -110,7 +110,7 @@ func getCIMetadata() map[string]interface{} {
110110
ciMetadata[tags.CIProvider] = "TeamCity"
111111
ciMetadata[tags.Repository] = os.Getenv("BUILD_VCS_URL")
112112
ciMetadata[tags.Commit] = os.Getenv("BUILD_VCS_NUMBER")
113-
ciMetadata[tags.SourceRoot] = os.Getenv("BUILD_CHECKOUTDIR")
113+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("BUILD_CHECKOUTDIR")
114114
ciMetadata[tags.CIBuildId] = buildId
115115
ciMetadata[tags.CIBuildNumber] = os.Getenv("BUILD_NUMBER")
116116
ciMetadata[tags.CIBuildUrl] = fmt.Sprintf(
@@ -126,7 +126,7 @@ func getCIMetadata() map[string]interface{} {
126126
ciMetadata[tags.CIBuildUrl] = os.Getenv("BUILDKITE_BUILD_URL")
127127
ciMetadata[tags.Repository] = os.Getenv("BUILDKITE_REPO")
128128
ciMetadata[tags.Commit] = os.Getenv("BUILDKITE_COMMIT")
129-
ciMetadata[tags.SourceRoot] = os.Getenv("BUILDKITE_BUILD_CHECKOUT_PATH")
129+
ciMetadata[tags.SourceRoot] = getSourceRootFromEnv("BUILDKITE_BUILD_CHECKOUT_PATH")
130130
}
131131

132132
return ciMetadata

agent/git.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package agent
22

33
import (
44
"bufio"
5+
"os"
56
"os/exec"
67
"strconv"
78
"strings"
89

910
"github.com/google/uuid"
11+
"gopkg.in/src-d/go-git.v4"
1012

1113
"go.undefinedlabs.com/scopeagent/env"
1214
"go.undefinedlabs.com/scopeagent/tags"
@@ -37,20 +39,29 @@ type DiffFileItem struct {
3739
func getGitData() *GitData {
3840
var repository, commit, sourceRoot, branch string
3941

40-
if repoBytes, err := exec.Command("git", "remote", "get-url", "origin").Output(); err == nil {
41-
repository = strings.TrimSuffix(string(repoBytes), "\n")
42+
wd, err := os.Getwd()
43+
if err != nil {
44+
return nil
45+
}
46+
repo, err := git.PlainOpenWithOptions(wd, &git.PlainOpenOptions{DetectDotGit: true})
47+
if err != nil {
48+
return nil
4249
}
4350

44-
if commitBytes, err := exec.Command("git", "rev-parse", "HEAD").Output(); err == nil {
45-
commit = strings.TrimSuffix(string(commitBytes), "\n")
51+
if remote, err := repo.Remote("origin"); err == nil {
52+
urls := remote.Config().URLs
53+
if len(urls) > 0 {
54+
repository = urls[0]
55+
}
4656
}
4757

48-
if sourceRootBytes, err := exec.Command("git", "rev-parse", "--show-toplevel").Output(); err == nil {
49-
sourceRoot = strings.TrimSuffix(string(sourceRootBytes), "\n")
58+
if head, err := repo.Head(); err == nil {
59+
commit = head.Hash().String()
60+
branch = head.Name().Short()
5061
}
5162

52-
if branchBytes, err := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD").Output(); err == nil {
53-
branch = strings.TrimSuffix(string(branchBytes), "\n")
63+
if tree, err := repo.Worktree(); err == nil {
64+
sourceRoot = tree.Filesystem.Root()
5465
}
5566

5667
return &GitData{
@@ -63,6 +74,7 @@ func getGitData() *GitData {
6374

6475
func getGitDiff() *GitDiff {
6576
var diff string
77+
// Git diff with numstat is not supported by "gopkg.in/src-d/go-git.v4"
6678
if diffBytes, err := exec.Command("git", "diff", "--numstat").Output(); err == nil {
6779
diff = string(diffBytes)
6880
} else {
@@ -135,7 +147,10 @@ func getGitInfoFromEnv() map[string]interface{} {
135147
gitInfo[tags.Commit] = commit
136148
}
137149
if sourceRoot, set := env.ScopeSourceRoot.Tuple(); set && sourceRoot != "" {
138-
gitInfo[tags.SourceRoot] = sourceRoot
150+
// We check if is a valid and existing folder
151+
if fInfo, err := os.Stat(sourceRoot); err == nil && fInfo.IsDir() {
152+
gitInfo[tags.SourceRoot] = sourceRoot
153+
}
139154
}
140155
if branch, set := env.ScopeBranch.Tuple(); set && branch != "" {
141156
gitInfo[tags.Branch] = branch

agent/util.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package agent
22

3+
import "os"
4+
35
func addToMapIfEmpty(dest map[string]interface{}, source map[string]interface{}) {
46
if source == nil {
57
return
@@ -16,3 +18,13 @@ func addElementToMapIfEmpty(source map[string]interface{}, key string, value int
1618
source[key] = value
1719
}
1820
}
21+
22+
func getSourceRootFromEnv(key string) string {
23+
if value, ok := os.LookupEnv(key); ok {
24+
// We check if is a valid and existing folder
25+
if fInfo, err := os.Stat(value); err == nil && fInfo.IsDir() {
26+
return value
27+
}
28+
}
29+
return ""
30+
}

go.mod

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@ require (
1212
github.com/mitchellh/go-homedir v1.1.0
1313
github.com/opentracing/basictracer-go v1.0.0
1414
github.com/opentracing/opentracing-go v1.1.0
15+
github.com/sergi/go-diff v1.1.0 // indirect
1516
github.com/stretchr/testify v1.5.1
1617
github.com/undefinedlabs/go-mpatch v0.0.0-20200122175732-0044123dbb98
1718
github.com/vmihailenco/msgpack v4.0.4+incompatible
18-
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa
19-
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 // indirect
19+
golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 // indirect
20+
golang.org/x/net v0.0.0-20200301022130-244492dfa37a
21+
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 // indirect
2022
google.golang.org/appengine v1.6.5 // indirect
2123
google.golang.org/grpc v1.27.1
2224
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
25+
gopkg.in/src-d/go-git.v4 v4.13.1
2326
gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637
2427
)

0 commit comments

Comments
 (0)