Initial Dever 0.0.1
This commit is contained in:
commit
81233d098c
1479 files changed
+163782
No files matched your search
@@ -0,0 +1,54 @@
|
||||
// 测试 pack 的固定目标源码选择器;产品只运行签名 pack 提供的对应工具。
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go/build"
|
||||
"io/fs"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if err := selectPackage(); err != nil { fmt.Fprintln(os.Stderr, err); os.Exit(1) }
|
||||
}
|
||||
|
||||
func selectPackage() error {
|
||||
if len(os.Args) != 4 { return fmt.Errorf("expected OS architecture directory") }
|
||||
context := build.Default
|
||||
context.GOOS, context.GOARCH = os.Args[1], os.Args[2]
|
||||
context.GOROOT, context.GOPATH = "", ""
|
||||
context.CgoEnabled = true
|
||||
directory := os.Args[3]
|
||||
selected, err := context.ImportDir(directory, 0)
|
||||
if err != nil { return err }
|
||||
if len(selected.CgoFiles)+len(selected.CFiles)+len(selected.CXXFiles)+len(selected.SFiles)+len(selected.SysoFiles) != 0 {
|
||||
return fmt.Errorf("cgo/assembly/native objects are unsupported")
|
||||
}
|
||||
embed := map[string][]string{}
|
||||
for _, pattern := range selected.EmbedPatterns {
|
||||
glob := strings.TrimPrefix(pattern, "all:")
|
||||
if filepath.IsAbs(glob) || strings.Contains(glob, "..") { return fmt.Errorf("invalid embed pattern") }
|
||||
matches, err := filepath.Glob(filepath.Join(directory, glob))
|
||||
if err != nil || len(matches) == 0 { return fmt.Errorf("unmatched embed pattern") }
|
||||
for _, match := range matches {
|
||||
err = filepath.WalkDir(match, func(path string, entry fs.DirEntry, failure error) error {
|
||||
if failure != nil { return failure }
|
||||
if entry.Type()&os.ModeSymlink != 0 { return fmt.Errorf("embed link") }
|
||||
if entry.IsDir() { return nil }
|
||||
relative, err := filepath.Rel(directory, path)
|
||||
if err != nil { return err }
|
||||
embed[pattern] = append(embed[pattern], filepath.ToSlash(relative))
|
||||
return nil
|
||||
})
|
||||
if err != nil { return err }
|
||||
}
|
||||
sort.Strings(embed[pattern])
|
||||
}
|
||||
imports := selected.Imports
|
||||
if imports == nil { imports = []string{} }
|
||||
return json.NewEncoder(os.Stdout).Encode(map[string]any{"name":selected.Name,"files":selected.GoFiles,"imports":imports,"embed":embed})
|
||||
}
|
||||
Reference in new issue
Block a user