forked from misaka00251/go2spec
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ea075869e | |||
| d09e19bd06 | |||
| d19eadb416 | |||
| 5064ced366 | |||
| 73b3c62184 | |||
| 69cb67bf54 | |||
| 44266bb25c | |||
| 2835d81f79 | |||
| 47e4755872 |
@@ -25,11 +25,6 @@ go.work.sum
|
||||
# env file
|
||||
.env
|
||||
|
||||
# Local go2spec validation/output artifacts
|
||||
comparison-runs/
|
||||
go-github-sandrolain-httpcache/
|
||||
go-github-sandrolain-httpcache_*.orig.tar.gz
|
||||
|
||||
# Editor/IDE
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
-36
@@ -6,7 +6,6 @@ import (
|
||||
"html"
|
||||
"path"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -117,41 +116,6 @@ func getLicenseForGopkg(gopkg string) (string, error) {
|
||||
return pkgsiteLicenseExpression(licenses), nil
|
||||
}
|
||||
|
||||
func providesFromPkgsitePackages(gopkg string, info *pkgsiteInfo, packages []pkgsitePackageSummary) []string {
|
||||
seen := map[string]bool{gopkg: true}
|
||||
provides := []string{gopkg}
|
||||
if info == nil || gopkg != info.Module.Path {
|
||||
return provides
|
||||
}
|
||||
|
||||
for _, p := range packages {
|
||||
path := strings.TrimSpace(p.Path)
|
||||
if path == "" || seen[path] || !p.IsRedistributable {
|
||||
continue
|
||||
}
|
||||
seen[path] = true
|
||||
provides = append(provides, path)
|
||||
}
|
||||
sort.Strings(provides)
|
||||
return provides
|
||||
}
|
||||
|
||||
func getProvidesForGopkg(gopkg string) ([]string, error) {
|
||||
info, err := getPkgsiteInfo(context.TODO(), gopkg)
|
||||
if err != nil {
|
||||
return []string{gopkg}, err
|
||||
}
|
||||
if gopkg != info.Module.Path {
|
||||
return []string{gopkg}, nil
|
||||
}
|
||||
|
||||
packages, err := getPkgsiteModulePackages(context.TODO(), info.Module.Path, info.Module.Version)
|
||||
if err != nil {
|
||||
return []string{gopkg}, err
|
||||
}
|
||||
return providesFromPkgsitePackages(gopkg, info, packages), nil
|
||||
}
|
||||
|
||||
// getDescriptionForGopkg gets the package synopsis from pkg.go.dev,
|
||||
// intended for the summary in the RPM spec.
|
||||
func getDescriptionForGopkg(gopkg string) (string, error) {
|
||||
|
||||
@@ -188,18 +188,6 @@ func sourceImportPathForPackage(requestedPath string, info *pkgsiteInfo) string
|
||||
return requestedPath
|
||||
}
|
||||
|
||||
func goImportPathFromArgument(arg string) (string, bool, error) {
|
||||
arg = strings.TrimSpace(arg)
|
||||
if strings.HasPrefix(arg, "go(") || strings.HasSuffix(arg, ")") {
|
||||
m := regexp.MustCompile(`^go\(([^()]+)\)$`).FindStringSubmatch(arg)
|
||||
if m == nil {
|
||||
return "", false, fmt.Errorf("invalid Go RPM capability %q", arg)
|
||||
}
|
||||
return strings.TrimSpace(m[1]), true, nil
|
||||
}
|
||||
return arg, false, nil
|
||||
}
|
||||
|
||||
// gitCloneURLFromRepoURL converts repository URLs returned by pkg.go.dev into
|
||||
// something git clone understands. pkg.go.dev reports golang.org/x/* modules
|
||||
// with a cs.opensource.google browser URL, so rewrite those to go.googlesource.com.
|
||||
@@ -893,10 +881,7 @@ func mainPack(args []string, usage func()) {
|
||||
}
|
||||
|
||||
gitRevision = strings.TrimSpace(gitRevision)
|
||||
gopkg, fromGoCapability, err := goImportPathFromArgument(flagSet.Arg(0))
|
||||
if err != nil {
|
||||
log.Fatalf("Verifying arguments: %v", err)
|
||||
}
|
||||
gopkg := flagSet.Arg(0)
|
||||
|
||||
// Remove URL scheme if present (https://, http://, git://, etc.)
|
||||
gopkg = strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(gopkg, "https://"), "http://"), "git://")
|
||||
@@ -908,17 +893,6 @@ func mainPack(args []string, usage func()) {
|
||||
if err != nil {
|
||||
log.Fatalf("Verifying arguments: %v — did you specify a Go package import path?", err)
|
||||
}
|
||||
if fromGoCapability {
|
||||
modulePath := sourceImportPathForPackage(gopkg, info)
|
||||
if modulePath != "" && modulePath != gopkg {
|
||||
log.Printf("Using module root %q to package requested Go capability go(%s)", modulePath, gopkg)
|
||||
gopkg = modulePath
|
||||
info, err = getPkgsiteInfo(context.TODO(), gopkg)
|
||||
if err != nil {
|
||||
log.Fatalf("Verifying module root %q: %v", gopkg, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
sourceGopkg := sourceImportPathForPackage(gopkg, info)
|
||||
if sourceGopkg != gopkg {
|
||||
log.Printf("Using module root %q as source checkout for specified import path %q", sourceGopkg, gopkg)
|
||||
|
||||
-49
@@ -68,26 +68,6 @@ type pkgsiteCandidate struct {
|
||||
PackagePath string `json:"packagePath"`
|
||||
}
|
||||
|
||||
type pkgsitePackagesResponse struct {
|
||||
ModulePath string `json:"modulePath"`
|
||||
Version string `json:"version"`
|
||||
IsStandardLibrary bool `json:"isStandardLibrary"`
|
||||
Packages pkgsitePackageItems `json:"packages"`
|
||||
}
|
||||
|
||||
type pkgsitePackageItems struct {
|
||||
Items []pkgsitePackageSummary `json:"items"`
|
||||
Total int `json:"total"`
|
||||
NextPageToken string `json:"nextPageToken"`
|
||||
}
|
||||
|
||||
type pkgsitePackageSummary struct {
|
||||
Path string `json:"path"`
|
||||
Name string `json:"name"`
|
||||
Synopsis string `json:"synopsis"`
|
||||
IsRedistributable bool `json:"isRedistributable"`
|
||||
}
|
||||
|
||||
type pkgsiteAPIError struct {
|
||||
Code int `json:"code"`
|
||||
Message string `json:"message"`
|
||||
@@ -235,35 +215,6 @@ func getPkgsiteModule(ctx context.Context, modulePath, version string) (pkgsiteM
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func getPkgsiteModulePackages(ctx context.Context, modulePath, version string) ([]pkgsitePackageSummary, error) {
|
||||
values := url.Values{}
|
||||
values.Set("limit", "1000")
|
||||
if version != "" {
|
||||
values.Set("version", version)
|
||||
}
|
||||
|
||||
var packages []pkgsitePackageSummary
|
||||
seenPaths := make(map[string]bool)
|
||||
var response pkgsitePackagesResponse
|
||||
if err := pkgsiteGetJSON(ctx, "packages", modulePath, values, &response); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, p := range response.Packages.Items {
|
||||
p.Path = strings.TrimSpace(p.Path)
|
||||
if p.Path == "" || seenPaths[p.Path] || !p.IsRedistributable {
|
||||
continue
|
||||
}
|
||||
seenPaths[p.Path] = true
|
||||
packages = append(packages, p)
|
||||
}
|
||||
|
||||
sort.Slice(packages, func(i, j int) bool {
|
||||
return packages[i].Path < packages[j].Path
|
||||
})
|
||||
return packages, nil
|
||||
}
|
||||
|
||||
func getPkgsiteInfo(ctx context.Context, gopkg string) (*pkgsiteInfo, error) {
|
||||
pkgsiteMu.Lock()
|
||||
if info := pkgsiteInfoCache[gopkg]; info != nil {
|
||||
|
||||
@@ -259,28 +259,6 @@ func TestSourceImportPathForPackageUsesModuleRoot(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestGoImportPathFromArgument(t *testing.T) {
|
||||
got, isCapability, err := goImportPathFromArgument("go(k8s.io/api/apps/v1)")
|
||||
if err != nil {
|
||||
t.Fatalf("goImportPathFromArgument() returned error: %v", err)
|
||||
}
|
||||
if got != "k8s.io/api/apps/v1" || !isCapability {
|
||||
t.Fatalf("goImportPathFromArgument() = %q, %v; want k8s.io/api/apps/v1, true", got, isCapability)
|
||||
}
|
||||
|
||||
got, isCapability, err = goImportPathFromArgument("k8s.io/api/apps/v1")
|
||||
if err != nil {
|
||||
t.Fatalf("goImportPathFromArgument() returned error: %v", err)
|
||||
}
|
||||
if got != "k8s.io/api/apps/v1" || isCapability {
|
||||
t.Fatalf("goImportPathFromArgument() = %q, %v; want k8s.io/api/apps/v1, false", got, isCapability)
|
||||
}
|
||||
|
||||
if _, _, err := goImportPathFromArgument("go(k8s.io/api/apps/v1"); err == nil {
|
||||
t.Fatalf("goImportPathFromArgument() succeeded for malformed capability")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSetRepoDependenciesSeparatesRuntimeAndTestOnly(t *testing.T) {
|
||||
u := upstream{}
|
||||
u.setRepoDependencies(
|
||||
@@ -404,42 +382,6 @@ func TestGetPkgsitePackageRetriesAmbiguousPathWithLongestModule(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestProvidesFromPkgsitePackagesForModuleRoot(t *testing.T) {
|
||||
info := &pkgsiteInfo{Module: pkgsiteModule{Path: "k8s.io/api"}}
|
||||
got := strings.Join(providesFromPkgsitePackages("k8s.io/api", info, []pkgsitePackageSummary{
|
||||
{Path: "k8s.io/api/apps/v1", IsRedistributable: true},
|
||||
{Path: "k8s.io/api/apps/v1beta1", IsRedistributable: true},
|
||||
{Path: "k8s.io/api/internal", IsRedistributable: false},
|
||||
}), ",")
|
||||
want := "k8s.io/api,k8s.io/api/apps/v1,k8s.io/api/apps/v1beta1"
|
||||
if got != want {
|
||||
t.Fatalf("providesFromPkgsitePackages() = %q, want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestProvidesFromPkgsitePackagesForSubpackage(t *testing.T) {
|
||||
info := &pkgsiteInfo{Module: pkgsiteModule{Path: "k8s.io/api"}}
|
||||
got := strings.Join(providesFromPkgsitePackages("k8s.io/api/apps/v1", info, []pkgsitePackageSummary{
|
||||
{Path: "k8s.io/api/apps/v1beta1", IsRedistributable: true},
|
||||
}), ",")
|
||||
want := "k8s.io/api/apps/v1"
|
||||
if got != want {
|
||||
t.Fatalf("providesFromPkgsitePackages() = %q, want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestConvertDependenciesToRPMKeepsKubernetesImportPaths(t *testing.T) {
|
||||
got := strings.Join(convertDependenciesToRPM([]string{
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1",
|
||||
"k8s.io/apimachinery/pkg/runtime",
|
||||
"sigs.k8s.io/randfill",
|
||||
}), ",")
|
||||
want := "go(k8s.io/apimachinery/pkg/apis/meta/v1),go(k8s.io/apimachinery/pkg/runtime),go(sigs.k8s.io/randfill)"
|
||||
if got != want {
|
||||
t.Fatalf("convertDependenciesToRPM() = %q, want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSourceURLForSpecUsesCommitIDMacro(t *testing.T) {
|
||||
u := upstream{
|
||||
repoURL: "https://github.com/example/project",
|
||||
|
||||
@@ -99,11 +99,6 @@ func writeSpec(dir, gopkg, openRuyiSrc, openRuyiLib, openRuyiProgram, version st
|
||||
if err != nil {
|
||||
log.Printf("Could not determine license/doc file paths for %q: %v\n", gopkg, err)
|
||||
}
|
||||
provides, err := getProvidesForGopkg(gopkg)
|
||||
if err != nil {
|
||||
log.Printf("Could not determine package provides for %q: %v\n", gopkg, err)
|
||||
provides = []string{gopkg}
|
||||
}
|
||||
upstreamName := filepath.Base(gopkg)
|
||||
if regexp.MustCompile(`^v\d+$`).MatchString(upstreamName) {
|
||||
upstreamName = filepath.Base(filepath.Dir(gopkg))
|
||||
@@ -188,17 +183,17 @@ func writeSpec(dir, gopkg, openRuyiSrc, openRuyiLib, openRuyiProgram, version st
|
||||
// For different package types, write different sections
|
||||
switch pkgType {
|
||||
case typeLibrary:
|
||||
writeRPMLibraryPackage(f, provides, openRuyiLib, longdescription, rpmRuntimeDeps)
|
||||
writeRPMLibraryPackage(f, gopkg, openRuyiLib, longdescription, rpmRuntimeDeps)
|
||||
case typeProgram:
|
||||
log.Printf("Nothing to do for program package.\n")
|
||||
// TODO: what can this be used for? ExclusiveArch %%{go_arches}?
|
||||
// writeRPMProgramPackage(f, gopkg, openRuyiProgram, longdescription)
|
||||
case typeLibraryProgram:
|
||||
writeRPMLibraryPackage(f, provides, openRuyiLib, longdescription, rpmRuntimeDeps)
|
||||
writeRPMLibraryPackage(f, gopkg, openRuyiLib, longdescription, rpmRuntimeDeps)
|
||||
writeRPMProgramSubpackage(f, gopkg, openRuyiProgram, openRuyiSrc, description)
|
||||
case typeProgramLibrary:
|
||||
//writeRPMProgramPackage(f, gopkg, openRuyiProgram, longdescription)
|
||||
writeRPMLibrarySubpackage(f, provides, gopkg, openRuyiLib, openRuyiSrc, longdescription, rpmRuntimeDeps)
|
||||
writeRPMLibrarySubpackage(f, gopkg, openRuyiLib, openRuyiSrc, longdescription, rpmRuntimeDeps)
|
||||
default:
|
||||
log.Fatalf("Invalid pkgType %d in writeRPMSpec(), aborting", pkgType)
|
||||
}
|
||||
@@ -219,11 +214,9 @@ func writeSpec(dir, gopkg, openRuyiSrc, openRuyiLib, openRuyiProgram, version st
|
||||
}
|
||||
|
||||
// For library package
|
||||
func writeRPMLibraryPackage(f *os.File, provides []string, openRuyiLib, longdesc string, deps []string) {
|
||||
func writeRPMLibraryPackage(f *os.File, gopkg, openRuyiLib, longdesc string, deps []string) {
|
||||
fmt.Fprintf(f, "\n")
|
||||
for _, provide := range provides {
|
||||
fmt.Fprintf(f, "Provides: go(%s) = %%{version}\n", provide)
|
||||
}
|
||||
fmt.Fprintf(f, "Provides: go(%s) = %%{version}\n", gopkg)
|
||||
fmt.Fprintf(f, "\n")
|
||||
// 库包的运行时依赖
|
||||
if len(deps) > 0 {
|
||||
@@ -235,13 +228,11 @@ func writeRPMLibraryPackage(f *os.File, provides []string, openRuyiLib, longdesc
|
||||
}
|
||||
|
||||
// For library subpackage
|
||||
func writeRPMLibrarySubpackage(f *os.File, provides []string, gopkg, openRuyiLib, openRuyiSrc, longdesc string, deps []string) {
|
||||
func writeRPMLibrarySubpackage(f *os.File, gopkg, openRuyiLib, openRuyiSrc, longdesc string, deps []string) {
|
||||
fmt.Fprintf(f, "\n")
|
||||
fmt.Fprintf(f, "%%package -n %s\n", openRuyiLib)
|
||||
fmt.Fprintf(f, "Summary: Development files of %s\n", filepath.Base(gopkg))
|
||||
for _, provide := range provides {
|
||||
fmt.Fprintf(f, "Provides: go(%s) = %%{version}\n", provide)
|
||||
}
|
||||
fmt.Fprintf(f, "Provides: go(%s) = %%{version}\n", gopkg)
|
||||
fmt.Fprintf(f, "BuildArch: noarch\n")
|
||||
if len(deps) > 0 {
|
||||
for _, dep := range deps {
|
||||
@@ -338,11 +329,6 @@ func convertDependenciesToRPM(goPkgs []string) []string {
|
||||
topLevelPkgs := make(map[string]bool)
|
||||
|
||||
for _, goPkg := range goPkgs {
|
||||
if strings.HasPrefix(goPkg, "k8s.io/") || strings.HasPrefix(goPkg, "sigs.k8s.io/") {
|
||||
topLevelPkgs[goPkg] = true
|
||||
continue
|
||||
}
|
||||
|
||||
// 提取顶级包:github.com/user/repo/subpkg -> github.com/user/repo
|
||||
parts := strings.Split(goPkg, "/")
|
||||
var topLevel string
|
||||
|
||||
Reference in New Issue
Block a user