Skip to content

Commit a8dc92e

Browse files
authored
Merge pull request #189 from vmarkovtsev/master
enry-based vendor filtering
2 parents c564b0f + 4999eeb commit a8dc92e

File tree

4 files changed

+64
-30
lines changed

4 files changed

+64
-30
lines changed

internal/core/pipeline.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,15 @@ func (pipeline *Pipeline) Initialize(facts map[string]interface{}) error {
681681
// There is always a "nil" record with CommonAnalysisResult.
682682
func (pipeline *Pipeline) Run(commits []*object.Commit) (map[LeafPipelineItem]interface{}, error) {
683683
startRunTime := time.Now()
684+
cleanReturn := false
685+
defer func() {
686+
if !cleanReturn {
687+
remotes, _ := pipeline.repository.Remotes()
688+
if len(remotes) > 0 {
689+
log.Printf("Failed to run the pipeline on %s", remotes[0].Config().URLs)
690+
}
691+
}
692+
}()
684693
onProgress := pipeline.OnProgress
685694
if onProgress == nil {
686695
onProgress = func(int, int) {}
@@ -838,6 +847,7 @@ func (pipeline *Pipeline) Run(commits []*object.Commit) (map[LeafPipelineItem]in
838847
RunTime: time.Since(startRunTime),
839848
RunTimePerItem: runTimePerItem,
840849
}
850+
cleanReturn = true
841851
return result, nil
842852
}
843853

internal/plumbing/tree_diff.go

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
// TreeDiff is a PipelineItem.
2323
type TreeDiff struct {
2424
core.NoopMerger
25-
SkipDirs []string
25+
SkipFiles []string
2626
NameFilter *regexp.Regexp
2727
Languages map[string]bool
2828

@@ -58,8 +58,8 @@ const (
5858
var defaultBlacklistedPrefixes = []string{
5959
"vendor/",
6060
"vendors/",
61-
"node_modules/",
6261
"package-lock.json",
62+
"Gopkg.lock",
6363
}
6464

6565
// Name of this PipelineItem. Uniquely identifies the type, used for mapping keys, etc.
@@ -85,11 +85,12 @@ func (treediff *TreeDiff) Requires() []string {
8585
// ListConfigurationOptions returns the list of changeable public properties of this PipelineItem.
8686
func (treediff *TreeDiff) ListConfigurationOptions() []core.ConfigurationOption {
8787
options := [...]core.ConfigurationOption{{
88-
Name: ConfigTreeDiffEnableBlacklist,
89-
Description: "Skip blacklisted directories.",
90-
Flag: "skip-blacklist",
91-
Type: core.BoolConfigurationOption,
92-
Default: false}, {
88+
Name: ConfigTreeDiffEnableBlacklist,
89+
Description: "Skip blacklisted directories and vendored files (according to " +
90+
"src-d/enry.IsVendor).",
91+
Flag: "skip-blacklist",
92+
Type: core.BoolConfigurationOption,
93+
Default: false}, {
9394

9495
Name: ConfigTreeDiffBlacklistedPrefixes,
9596
Description: "List of blacklisted path prefixes (e.g. directories or specific files). " +
@@ -120,7 +121,7 @@ func (treediff *TreeDiff) ListConfigurationOptions() []core.ConfigurationOption
120121
// Configure sets the properties previously published by ListConfigurationOptions().
121122
func (treediff *TreeDiff) Configure(facts map[string]interface{}) error {
122123
if val, exists := facts[ConfigTreeDiffEnableBlacklist].(bool); exists && val {
123-
treediff.SkipDirs = facts[ConfigTreeDiffBlacklistedPrefixes].([]string)
124+
treediff.SkipFiles = facts[ConfigTreeDiffBlacklistedPrefixes].([]string)
124125
}
125126
if val, exists := facts[ConfigTreeDiffLanguages].([]string); exists {
126127
treediff.Languages = map[string]bool{}
@@ -170,14 +171,14 @@ func (treediff *TreeDiff) Consume(deps map[string]interface{}) (map[string]inter
170171
if err != nil {
171172
return nil, err
172173
}
173-
var diff object.Changes
174+
var diffs object.Changes
174175
if treediff.previousTree != nil {
175-
diff, err = object.DiffTree(treediff.previousTree, tree)
176+
diffs, err = object.DiffTree(treediff.previousTree, tree)
176177
if err != nil {
177178
return nil, err
178179
}
179180
} else {
180-
diff = []*object.Change{}
181+
diffs = []*object.Change{}
181182
err = func() error {
182183
fileIter := tree.Files()
183184
defer fileIter.Close()
@@ -196,7 +197,7 @@ func (treediff *TreeDiff) Consume(deps map[string]interface{}) (map[string]inter
196197
if !pass {
197198
continue
198199
}
199-
diff = append(diff, &object.Change{
200+
diffs = append(diffs, &object.Change{
200201
To: object.ChangeEntry{Name: file.Name, Tree: tree, TreeEntry: object.TreeEntry{
201202
Name: file.Name, Mode: file.Mode, Hash: file.Hash}}})
202203
}
@@ -208,12 +209,19 @@ func (treediff *TreeDiff) Consume(deps map[string]interface{}) (map[string]inter
208209
}
209210
treediff.previousTree = tree
210211
treediff.previousCommit = commit.Hash
212+
diffs = treediff.filterDiffs(diffs)
213+
return map[string]interface{}{DependencyTreeChanges: diffs}, nil
214+
}
211215

216+
func (treediff *TreeDiff) filterDiffs(diffs object.Changes) object.Changes {
212217
// filter without allocation
213-
filteredDiff := make([]*object.Change, 0, len(diff))
218+
filteredDiffs := make(object.Changes, 0, len(diffs))
214219
OUTER:
215-
for _, change := range diff {
216-
for _, dir := range treediff.SkipDirs {
220+
for _, change := range diffs {
221+
if len(treediff.SkipFiles) > 0 && (enry.IsVendor(change.To.Name) || enry.IsVendor(change.From.Name)) {
222+
continue
223+
}
224+
for _, dir := range treediff.SkipFiles {
217225
if strings.HasPrefix(change.To.Name, dir) || strings.HasPrefix(change.From.Name, dir) {
218226
continue OUTER
219227
}
@@ -223,7 +231,7 @@ OUTER:
223231
matchedFrom := treediff.NameFilter.MatchString(change.From.Name)
224232

225233
if !matchedTo && !matchedFrom {
226-
continue OUTER
234+
continue
227235
}
228236
}
229237
var changeEntry object.ChangeEntry
@@ -232,15 +240,12 @@ OUTER:
232240
} else {
233241
changeEntry = change.To
234242
}
235-
pass, _ := treediff.checkLanguage(changeEntry.Name, changeEntry.TreeEntry.Hash)
236-
if !pass {
243+
if pass, _ := treediff.checkLanguage(changeEntry.Name, changeEntry.TreeEntry.Hash); !pass {
237244
continue
238245
}
239-
filteredDiff = append(filteredDiff, change)
246+
filteredDiffs = append(filteredDiffs, change)
240247
}
241-
242-
diff = filteredDiff
243-
return map[string]interface{}{DependencyTreeChanges: diff}, nil
248+
return filteredDiffs
244249
}
245250

246251
// Fork clones this PipelineItem.

internal/plumbing/tree_diff_test.go

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,16 @@ func TestTreeDiffConfigure(t *testing.T) {
3838
}
3939
assert.Nil(t, td.Configure(facts))
4040
assert.Equal(t, td.Languages, map[string]bool{"go": true})
41-
assert.Equal(t, td.SkipDirs, []string{"vendor"})
41+
assert.Equal(t, td.SkipFiles, []string{"vendor"})
4242
assert.Equal(t, td.NameFilter.String(), "_.*")
4343
delete(facts, ConfigTreeDiffLanguages)
4444
td.Languages = nil
4545
assert.Nil(t, td.Configure(facts))
4646
assert.Equal(t, td.Languages, map[string]bool{"all": true})
47-
td.SkipDirs = []string{"test"}
47+
td.SkipFiles = []string{"test"}
4848
delete(facts, ConfigTreeDiffEnableBlacklist)
4949
assert.Nil(t, td.Configure(facts))
50-
assert.Equal(t, td.SkipDirs, []string{"test"})
50+
assert.Equal(t, td.SkipFiles, []string{"test"})
5151
}
5252

5353
func TestTreeDiffRegistration(t *testing.T) {
@@ -135,7 +135,7 @@ func TestTreeDiffBadCommit(t *testing.T) {
135135
}
136136

137137
func TestTreeDiffConsumeSkip(t *testing.T) {
138-
// consume without skiping
138+
// consume without skipping
139139
td := fixtureTreeDiff()
140140
assert.Contains(t, td.Languages, allLanguages)
141141
commit, _ := test.Repository.CommitObject(plumbing.NewHash(
@@ -166,7 +166,7 @@ func TestTreeDiffConsumeSkip(t *testing.T) {
166166
}
167167

168168
func TestTreeDiffConsumeOnlyFilesThatMatchFilter(t *testing.T) {
169-
// consume without skiping
169+
// consume without skipping
170170
td := fixtureTreeDiff()
171171
assert.Contains(t, td.Languages, allLanguages)
172172
commit, _ := test.Repository.CommitObject(plumbing.NewHash(
@@ -238,12 +238,12 @@ func TestTreeDiffConsumeLanguageFilter(t *testing.T) {
238238

239239
func TestTreeDiffFork(t *testing.T) {
240240
td1 := fixtureTreeDiff()
241-
td1.SkipDirs = append(td1.SkipDirs, "skip")
241+
td1.SkipFiles = append(td1.SkipFiles, "skip")
242242
clones := td1.Fork(1)
243243
assert.Len(t, clones, 1)
244244
td2 := clones[0].(*TreeDiff)
245245
assert.False(t, td1 == td2)
246-
assert.Equal(t, td1.SkipDirs, td2.SkipDirs)
246+
assert.Equal(t, td1.SkipFiles, td2.SkipFiles)
247247
assert.Equal(t, td1.previousTree, td2.previousTree)
248248
td1.Merge([]core.PipelineItem{td2})
249249
}
@@ -256,3 +256,23 @@ func TestTreeDiffCheckLanguage(t *testing.T) {
256256
assert.Nil(t, err)
257257
assert.True(t, lang)
258258
}
259+
260+
func TestTreeDiffConsumeEnryFilter(t *testing.T) {
261+
diffs := object.Changes{&object.Change{
262+
From: object.ChangeEntry{Name: ""},
263+
To: object.ChangeEntry{Name: "vendor/test.go"},
264+
}, &object.Change{
265+
From: object.ChangeEntry{Name: "vendor/test.go"},
266+
To: object.ChangeEntry{Name: ""},
267+
}}
268+
td := fixtureTreeDiff()
269+
270+
newDiffs := td.filterDiffs(diffs)
271+
assert.Len(t, newDiffs, 2)
272+
td.Configure(map[string]interface{}{
273+
ConfigTreeDiffEnableBlacklist: true,
274+
ConfigTreeDiffBlacklistedPrefixes: []string{"whatever"},
275+
})
276+
newDiffs = td.filterDiffs(diffs)
277+
assert.Len(t, newDiffs, 0)
278+
}

leaves/burndown.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1132,7 +1132,6 @@ func (analyser *BurndownAnalysis) handleInsertion(
11321132
name := change.To.Name
11331133
file, exists := analyser.files[name]
11341134
if exists {
1135-
log.Println("\n", analyser, "error")
11361135
return fmt.Errorf("file %s already exists", name)
11371136
}
11381137
var hash plumbing.Hash

0 commit comments

Comments
 (0)