internal/core/startup/releases.go (90 lines of code) (raw):
/*
* Copyright 2021-2024 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* This file contains the code for sending the report to Qodana Cloud.
* The publisher is a part of Qodana linters.
* This will be refactored/removed after the proper endpoint is implemented.
*/
package startup
import (
"encoding/json"
"io"
"os"
"path/filepath"
"github.com/JetBrains/qodana-cli/internal/platform/msg"
"github.com/JetBrains/qodana-cli/internal/platform/product"
"github.com/JetBrains/qodana-cli/internal/platform/utils"
)
func getProductFeed() string {
if feed := os.Getenv("QD_PRODUCT_INTERNAL_FEED"); feed != "" {
return feed
}
return "https://raw.githubusercontent.com/JetBrains/qodana-docker/main/feed/releases.json"
}
func getInternalAuth() string {
if auth := os.Getenv("QD_PRODUCT_INTERNAL_AUTH"); auth != "" {
return auth
}
return ""
}
type Product struct {
Code string
Releases []ReleaseInfo
}
type ReleaseInfo struct {
Date string
Type string
Downloads *map[string]ReleaseDownloadInfo
Version *string
MajorVersion *string
Build *string
PrintableReleaseType *string
}
type ReleaseDownloadInfo struct {
Link string `json:"Link"`
Size uint64 `json:"Size,omitempty"`
ChecksumLink string `json:"ChecksumLink"`
}
func GetProductByCode(code string) (*Product, error) {
tempDir, err := os.MkdirTemp("", "productByCode")
if err != nil {
msg.ErrorMessage("Cannot create temp dir", err)
return nil, err
}
defer func(path string) {
err := os.RemoveAll(path)
if err != nil {
msg.ErrorMessage("Cannot clean up temp dir", err)
}
}(tempDir) // clean up
path := filepath.Join(tempDir, "productInfo.json")
if err := utils.DownloadFile(path, getProductFeed(), "", nil); err != nil {
return nil, err
}
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
msg.ErrorMessage("Cannot read downloaded file", err)
}
}(file)
byteValue, _ := io.ReadAll(file)
var products []Product
if err := json.Unmarshal(byteValue, &products); err != nil {
return nil, err
}
for _, prod := range products {
if prod.Code == code {
return &prod, nil
}
}
return nil, nil
}
func SelectLatestCompatibleRelease(prod *Product, reqType string) *ReleaseInfo {
var latestRelease *ReleaseInfo
latestDate := ""
for i := 0; i < len(prod.Releases); i++ {
release := &prod.Releases[i]
if *release.MajorVersion == product.ReleaseVersion && release.Type == reqType && (latestRelease == nil || release.Date > latestDate) {
latestRelease = release
latestDate = release.Date
}
}
return latestRelease
}