internal/tooling/scripts/download-resource.go (82 lines of code) (raw):

//go:build ignore // usage: go run scripts/download-resource.go [--force] <path> // download-resource.go reads a config called "resources.json" in the working directory and downloads a file specified // by <path> from the url specified in the config. When creating or updating entries, use --force to rewrite the hash // sum automatically. package main import ( "encoding/hex" "encoding/json" "flag" "log" "os" "strings" "github.com/JetBrains/qodana-cli/internal/platform/utils" ) type Resource struct { Url string `json:"url"` Version string `json:"version"` Sha256 string `json:"sha256"` } func main() { forcePtr := flag.Bool("force", false, "Force download and update hash-sum to match new value.") flag.Parse() force := *forcePtr path := flag.Arg(0) if path == "" { log.Fatalf("Expected path as first argument") } if len(flag.Args()) > 1 { log.Fatalf("Unrecognized arguments: %v", flag.Args()[1:]) } resourcesData, err := os.ReadFile("resources.json") if err != nil { log.Fatalf("Error while reading \"resources.json\": %s", err) } var resources map[string]Resource err = json.Unmarshal(resourcesData, &resources) if err != nil { log.Fatalf("Error while parsing json in \"resources.json\": %s", err) } resource, resourceExists := resources[path] if !resourceExists { log.Fatalf("Could not find an entry with key \"%s\" in \"resources.json\"", path) } resolvedUrl := strings.ReplaceAll(resource.Url, "$version", resource.Version) _, err = os.Stat(path) if err == nil && !force { // If a file is already downloaded, check its hash sum and exit early actualSha256Bytes, err := utils.GetFileSha256(path) if err != nil { log.Fatalf("Error while calculating SHA-256: %s", err) } actualSha256 := hex.EncodeToString(actualSha256Bytes[:]) if actualSha256 == resource.Sha256 { os.Exit(0) } } err = utils.DownloadFile(path, resolvedUrl, "", nil) if err != nil { log.Fatalf("Error while downloading %s: %s", resolvedUrl, err) } actualSha256Bytes, err := utils.GetFileSha256(path) if err != nil { log.Fatalf("Error while calculating SHA-256: %s", err) } actualSha256 := hex.EncodeToString(actualSha256Bytes[:]) if !force { if actualSha256 != resource.Sha256 { log.Fatalf( "Failed to verify SHA-256 hash sum for %s:\n"+ " expected: %s\n"+ " actual: %s", resolvedUrl, resource.Sha256, actualSha256, ) } } else { resource.Sha256 = actualSha256 resources[path] = resource resourcesData, err = json.MarshalIndent(resources, "", " ") if err != nil { log.Fatalf("Error while serializing data for \"resources.json\": %s", err) } err = os.WriteFile("resources.json", resourcesData, 0644) if err != nil { log.Fatalf("Error while writing \"resources.json\": %s", err) } } }