9 Commits

6 changed files with 8 additions and 196 deletions
-5
View File
@@ -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
View File
@@ -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) {
+1 -27
View File
@@ -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
View File
@@ -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 {
-58
View File
@@ -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",
+7 -21
View File
@@ -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