/
report_type_versions.go
104 lines (87 loc) · 3.09 KB
/
report_type_versions.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT license.
*/
package pipeline
import (
"context"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/pkg/errors"
kerrors "k8s.io/apimachinery/pkg/util/errors"
"github.com/Azure/azure-service-operator/v2/tools/generator/internal/astmodel"
"github.com/Azure/azure-service-operator/v2/tools/generator/internal/config"
"github.com/Azure/azure-service-operator/v2/tools/generator/internal/reporting"
)
// ReportOnTypesAndVersionsStageID is the unique identifier of this stage
const ReportOnTypesAndVersionsStageID = "reportTypesAndVersions"
// ReportOnTypesAndVersions creates a pipeline stage that generates a report for each group showing a matrix of all
// types and versions
func ReportOnTypesAndVersions(configuration *config.Configuration) *Stage {
return NewLegacyStage(
ReportOnTypesAndVersionsStageID,
"Generate reports on types and versions in each package",
func(ctx context.Context, definitions astmodel.TypeDefinitionSet) (astmodel.TypeDefinitionSet, error) {
report := NewPackagesMatrixReport()
report.Summarize(definitions)
err := report.WriteTo(configuration.FullTypesOutputPath())
return definitions, err
})
}
type PackagesMatrixReport struct {
// A separate table for each package
tables map[string]*reporting.SparseTable
}
func NewPackagesMatrixReport() *PackagesMatrixReport {
return &PackagesMatrixReport{
tables: make(map[string]*reporting.SparseTable),
}
}
func (report *PackagesMatrixReport) Summarize(definitions astmodel.TypeDefinitionSet) {
for _, t := range definitions {
typeName := t.Name().Name()
packageName := report.ServiceName(t.Name().InternalPackageReference())
packageVersion := t.Name().PackageReference().PackageName()
table, ok := report.tables[packageName]
if !ok {
table = reporting.NewSparseTable(fmt.Sprintf("Type Definitions in package %q", packageName))
report.tables[packageName] = table
}
table.SetCell(typeName, packageVersion, packageVersion)
}
}
func (report *PackagesMatrixReport) WriteTo(outputPath string) error {
var errs []error
for pkg, table := range report.tables {
err := report.WriteTableTo(table, pkg, outputPath)
if err != nil {
errs = append(errs, err)
}
}
return kerrors.NewAggregate(errs)
}
func (report *PackagesMatrixReport) ServiceName(ref astmodel.InternalPackageReference) string {
grp, _ := ref.GroupVersion()
return grp
}
func (report *PackagesMatrixReport) WriteTableTo(table *reporting.SparseTable, pkg string, outputPath string) error {
table.SortColumns(func(left string, right string) bool {
return left < right
})
table.SortRows(func(top string, bottom string) bool {
return top < bottom
})
var buffer strings.Builder
table.WriteTo(&buffer)
outputFolder := filepath.Join(outputPath, pkg)
if _, err := os.Stat(outputFolder); os.IsNotExist(err) {
err = os.MkdirAll(outputFolder, 0o700)
if err != nil {
return errors.Wrapf(err, "Unable to create directory %q", outputFolder)
}
}
destination := filepath.Join(outputFolder, "versions_matrix.md")
return os.WriteFile(destination, []byte(buffer.String()), 0o600)
}