mirror of
https://github.com/docker/compose.git
synced 2026-10-10 14:04:19 +00:00
Move compose v2 implementation under pkg/compose with dependencies
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
This commit is contained in:
parent
e2ea24ceb7
commit
49e7f2d45d
93 changed files with 261 additions and 331 deletions
84
pkg/utils/scan_suggest.go
Normal file
84
pkg/utils/scan_suggest.go
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
Copyright 2020 Docker Compose CLI 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 utils
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
pluginmanager "github.com/docker/cli/cli-plugins/manager"
|
||||
"github.com/docker/cli/cli/command"
|
||||
cliConfig "github.com/docker/cli/cli/config"
|
||||
)
|
||||
|
||||
// DisplayScanSuggestMsg displlay a message suggesting users can scan new image
|
||||
func DisplayScanSuggestMsg() {
|
||||
if os.Getenv("DOCKER_SCAN_SUGGEST") == "false" {
|
||||
return
|
||||
}
|
||||
if !scanAvailable() {
|
||||
return
|
||||
}
|
||||
if scanAlreadyInvoked() {
|
||||
return
|
||||
}
|
||||
fmt.Fprintf(os.Stderr, "\nUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them\n")
|
||||
}
|
||||
|
||||
func scanAlreadyInvoked() bool {
|
||||
filename := filepath.Join(cliConfig.Dir(), "scan", "config.json")
|
||||
f, err := os.Stat(filename)
|
||||
if os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
if f.IsDir() { // should never happen, do not bother user with suggestion if something goes wrong
|
||||
return true
|
||||
}
|
||||
type scanOptin struct {
|
||||
Optin bool `json:"optin"`
|
||||
}
|
||||
data, err := ioutil.ReadFile(filename)
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
scanConfig := scanOptin{}
|
||||
err = json.Unmarshal(data, &scanConfig)
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
return scanConfig.Optin
|
||||
}
|
||||
|
||||
func scanAvailable() bool {
|
||||
cli, err := command.NewDockerCli()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
plugins, err := pluginmanager.ListPlugins(cli, nil)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
for _, plugin := range plugins {
|
||||
if plugin.Name == "scan" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
27
pkg/utils/stringutils.go
Normal file
27
pkg/utils/stringutils.go
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Copyright 2020 Docker Compose CLI 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 utils
|
||||
|
||||
// StringContains check if an array contains a specific value
|
||||
func StringContains(array []string, needle string) bool {
|
||||
for _, val := range array {
|
||||
if val == needle {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
62
pkg/utils/writer.go
Normal file
62
pkg/utils/writer.go
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
Copyright 2020 Docker Compose CLI 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 utils
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
)
|
||||
|
||||
// GetWriter creates a io.Writer that will actually split by line and format by LogConsumer
|
||||
func GetWriter(consumer func(string)) io.WriteCloser {
|
||||
return &splitWriter{
|
||||
buffer: bytes.Buffer{},
|
||||
consumer: consumer,
|
||||
}
|
||||
}
|
||||
|
||||
type splitWriter struct {
|
||||
buffer bytes.Buffer
|
||||
consumer func(string)
|
||||
}
|
||||
|
||||
// Write implements io.Writer. joins all input, splits on the separator and yields each chunk
|
||||
func (s *splitWriter) Write(b []byte) (int, error) {
|
||||
n, err := s.buffer.Write(b)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
for {
|
||||
b = s.buffer.Bytes()
|
||||
index := bytes.Index(b, []byte{'\n'})
|
||||
if index < 0 {
|
||||
break
|
||||
}
|
||||
line := s.buffer.Next(index + 1)
|
||||
s.consumer(string(line[:len(line)-1]))
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (s *splitWriter) Close() error {
|
||||
b := s.buffer.Bytes()
|
||||
if len(b) == 0 {
|
||||
return nil
|
||||
}
|
||||
s.consumer(string(b))
|
||||
return nil
|
||||
}
|
||||
39
pkg/utils/writer_test.go
Normal file
39
pkg/utils/writer_test.go
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
Copyright 2020 Docker Compose CLI 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 utils
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"gotest.tools/v3/assert"
|
||||
)
|
||||
|
||||
func TestSplitWriter(t *testing.T) {
|
||||
var lines []string
|
||||
w := GetWriter(func(line string) {
|
||||
lines = append(lines, line)
|
||||
})
|
||||
w.Write([]byte("h")) //nolint: errcheck
|
||||
w.Write([]byte("e")) //nolint: errcheck
|
||||
w.Write([]byte("l")) //nolint: errcheck
|
||||
w.Write([]byte("l")) //nolint: errcheck
|
||||
w.Write([]byte("o")) //nolint: errcheck
|
||||
w.Write([]byte("\n")) //nolint: errcheck
|
||||
w.Write([]byte("world!\n")) //nolint: errcheck
|
||||
assert.DeepEqual(t, lines, []string{"hello", "world!"})
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue