File: worker.go

package info (click to toggle)
golang-github-azure-azure-sdk-for-go 68.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 556,256 kB
  • sloc: javascript: 196; sh: 96; makefile: 7
file content (130 lines) | stat: -rw-r--r-- 3,907 bytes parent folder | download | duplicates (3)
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.

package release

import (
	"fmt"
	"log"
	"os"
	"path/filepath"
	"time"

	"github.com/Azure/azure-sdk-for-go/eng/tools/generator/autorest"
	"github.com/Azure/azure-sdk-for-go/eng/tools/generator/autorest/model"
	"github.com/Azure/azure-sdk-for-go/eng/tools/generator/config"
	"github.com/Azure/azure-sdk-for-go/eng/tools/generator/repo"
	"github.com/Azure/azure-sdk-for-go/eng/tools/internal/exports"
)

type generateContext struct {
	sdkRepo            repo.SDKRepository
	specRepo           repo.SpecRepository
	readme             string
	specLastCommitHash string

	defaultOptions    model.Options
	additionalOptions []model.Option

	repoContent map[string]exports.Content

	skipProfiles bool
}

func (ctx generateContext) SDKRoot() string {
	return ctx.sdkRepo.Root()
}

func (ctx generateContext) SpecRoot() string {
	return ctx.specRepo.Root()
}

func (ctx generateContext) RepoContent() map[string]exports.Content {
	return ctx.repoContent
}

func (ctx *generateContext) generate(tag string, infoList []config.ReleaseRequestInfo) (*GenerateResult, error) {
	metadataOutputRoot := filepath.Join(os.TempDir(), fmt.Sprintf("release-metadata-%v", time.Now().Unix()))
	defer os.RemoveAll(metadataOutputRoot)

	var options model.Options
	// determine whether this is a new package or not
	if m, ok := repo.ContainsPackage(ctx.SDKRoot(), ctx.readme, tag); ok {
		log.Printf("Task (readme %s / tag %s) is an existing package, using the options in the metadata...", ctx.readme, tag)
		options = ctx.defaultOptions.(model.Options).MergeOptions(autorest.GetAdditionalOptions(m).Arguments()...)
	} else {
		log.Printf("Task (readme %s / tag %s) is a new package, appending the additional options to the default options...", ctx.readme, tag)
		options = ctx.defaultOptions.(model.Options).MergeOptions(ctx.additionalOptions...)
	}

	log.Printf("Generating %s from %v...", tag, infoList)
	// iterate over the tags in one request
	// Generate code
	input := autorest.GenerateInput{
		Readme: ctx.readme,
		Tag:    tag,
		//SDKRoot:    ctx.SDKRoot(),
		CommitHash: ctx.specLastCommitHash,
		Options:    options,
	}
	r, err := autorest.GeneratePackage(ctx, input, autorest.GenerateOptions{
		MetadataOutputRoot: metadataOutputRoot,
		Stderr:             os.Stderr,
		Stdout:             os.Stderr, // we redirect all the output of autorest to stderr, so that the stdout will only contain the proper output
	})
	if err != nil {
		return nil, fmt.Errorf("cannot generate readme '%s', tag '%s': %+v", ctx.readme, tag, err)
	}

	// regenerate the profiles
	if err := ctx.regenerateProfiles(); err != nil {
		return nil, err
	}

	// commit the content
	if err := ctx.commit(tag); err != nil {
		return nil, err
	}

	// get last commit
	ref, err := ctx.sdkRepo.Head()
	if err != nil {
		return nil, err
	}

	return &GenerateResult{
		Package:    r.Package,
		Readme:     ctx.readme,
		Tag:        tag,
		CommitHash: ref.Hash().String(),
		Info:       infoList,
	}, nil
}

func (ctx *generateContext) regenerateProfiles() error {
	if ctx.skipProfiles {
		return nil
	}
	return autorest.RegenerateProfiles(ctx.SDKRoot())
}

func (ctx *generateContext) commit(tag string) error {
	if err := ctx.sdkRepo.Add("profiles"); err != nil {
		return fmt.Errorf("failed to add 'profiles': %+v", err)
	}

	if err := ctx.sdkRepo.Add("services"); err != nil {
		return fmt.Errorf("failed to add 'services': %+v", err)
	}

	message := fmt.Sprintf("Generated from %s tag %s (commit hash: %s)", ctx.readme, tag, ctx.specLastCommitHash)
	if err := ctx.sdkRepo.Commit(message); err != nil {
		if repo.IsNothingToCommit(err) {
			log.Printf("There is nothing to commit. Message: %s", message)
			return nil
		}
		return fmt.Errorf("failed to commit changes: %+v", err)
	}

	return nil
}