代码拉取完成,页面将自动刷新
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path/filepath"
"sourcegraph.com/sourcegraph/srclib"
"sourcegraph.com/sourcegraph/srclib-docker/df"
"sourcegraph.com/sourcegraph/srclib/unit"
)
const DockerfileUnitType = "Dockerfile"
func init() {
_, err := parser.AddCommand("scan",
"scan for Dockerfiles",
"Scan the directory tree rooted at the current directory for Dockerfiles.",
&scanCmd,
)
if err != nil {
log.Fatal(err)
}
}
type ScanCmd struct {
Repo string `long:"repo" description:"repository URI" value-name:"URI"`
Subdir string `long:"subdir" description:"subdirectory in repository" value-name:"DIR"`
}
var scanCmd ScanCmd
func ignoreWalkError(err error) bool {
return os.IsPermission(err) || os.IsNotExist(err)
}
func (c *ScanCmd) Execute(args []string) error {
// We don't need any config yet, but read it anyway so that we
// don't silently allow people to send us bad JSON.
var config interface{}
if err := json.NewDecoder(os.Stdin).Decode(&config); err != nil && err != io.EOF {
return err
}
if err := os.Stdin.Close(); err != nil {
return err
}
var dockerfiles []string
root := "."
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil && !ignoreWalkError(err) {
return err
}
if info.Mode().IsDir() {
// Don't traverse into VCS dirs.
if isVCSDir[info.Name()] {
return filepath.SkipDir
}
// Don't traverse into git submodules.
if path != root {
fs, err := ioutil.ReadDir(path)
if err != nil && !ignoreWalkError(err) {
return err
}
for _, f := range fs {
if isVCSDir[f.Name()] {
return filepath.SkipDir
}
}
}
}
// Collect Dockerfiles.
if info.Mode().IsRegular() && info.Name() == "Dockerfile" {
dockerfiles = append(dockerfiles, path)
}
return nil
})
if err != nil {
return err
}
if GlobalOpt.Verbose && len(dockerfiles) > 0 {
log.Printf("Found %d Dockerfiles: %v", len(dockerfiles), dockerfiles)
}
units := make([]*unit.SourceUnit, len(dockerfiles))
for i, dfpath := range dockerfiles {
data, err := ioutil.ReadFile(dfpath)
if err != nil {
return err
}
// Parse Dockerfile.
var baseImages []interface{}
d, err := df.Decode(bytes.NewReader(data))
if err == nil {
if d.From != "" {
baseImages = append(baseImages, d.From)
}
} else {
log.Printf("Error parsing Dockerfile %q: %s. Adding without dependencies.", dfpath, err)
}
units[i] = &unit.SourceUnit{
Name: filepath.Dir(dfpath),
Type: DockerfileUnitType,
Dir: filepath.Dir(dfpath),
Files: []string{dfpath},
Data: string(data),
Dependencies: baseImages,
Ops: map[string]*srclib.ToolRef{"depresolve": nil, "graph": nil},
}
}
b, err := json.MarshalIndent(units, "", " ")
if err != nil {
return err
}
if _, err := os.Stdout.Write(b); err != nil {
return err
}
fmt.Println()
return nil
}
var isVCSDir = map[string]bool{".git": true, ".hg": true}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。