The Wayback Machine - https://web.archive.org/web/20220125090553/https://github.com/arduino/arduino-cli/commit/e31a717ebc34fff80892dbbe25a9d4581906e13a
Skip to content
Permalink
Browse files
Expand i18n coverage to all relevant strings (#1370)
* Bring Go code formatting into compliance

* Expand i18n coverage to all relevant strings

This provides internationalization of the strings of the Arduino CLI code base. It will now be possible to completely
translate the primary Arduino CLI user interface.

We decided that the log messages would be excluded from the internationalization scope for now. The reason is that the
addition of these strings would significantly increase the workload on the community translators, while generally being
of less visibility and/or importance to the users. Even though on an individual basis there are surely specific log
messages of higher importance than specific non-log strings that were internationalized, the log/non-log dichotomy
provided an objective criterion for determining which strings were in scope for this initial effort. Perhaps we will
expand the i18n coverage at some time in the future after there has been good progress on the initial translation effort.

Some techniques were employed to facilitate translation:

- Code references were moved out of strings in cases where a translator might mistake them for prose and translate them.
- Indices were added to printf verbs when multiple were present in a string. This allows the translator to easily insert
  them at the appropriate location in the sentence structure without being required to understand the Go printf syntax
  and without being restricted to their relative order in the English language source string.

Co-authored-by: Silvano Cerza <[email protected]>
  • Loading branch information
per1234 and silvanocerza committed Aug 5, 2021
1 parent 92a4c3a commit e31a717ebc34fff80892dbbe25a9d4581906e13a
Showing with 4,376 additions and 1,026 deletions.
  1. +3 −3 arduino/builder/compilation_database.go
  2. +15 −11 arduino/builder/sketch.go
  3. +4 −4 arduino/cores/board.go
  4. +3 −0 arduino/cores/cores.go
  5. +3 −3 arduino/cores/fqbn.go
  6. +4 −1 arduino/cores/packageindex/index.go
  7. +7 −7 arduino/cores/packagemanager/download.go
  8. +10 −10 arduino/cores/packagemanager/install_uninstall.go
  9. +26 −26 arduino/cores/packagemanager/loader.go
  10. +18 −16 arduino/cores/packagemanager/package_manager.go
  11. +11 −11 arduino/cores/status.go
  12. +19 −16 arduino/discovery/discovery.go
  13. +5 −2 arduino/libraries/libraries.go
  14. +2 −2 arduino/libraries/libraries_layout.go
  15. +2 −2 arduino/libraries/libraries_location.go
  16. +5 −2 arduino/libraries/librariesindex/json.go
  17. +16 −16 arduino/libraries/librariesmanager/install.go
  18. +8 −5 arduino/libraries/librariesmanager/librariesmanager.go
  19. +4 −1 arduino/libraries/librariesresolver/cpp.go
  20. +3 −3 arduino/libraries/loader.go
  21. +4 −1 arduino/monitors/serial.go
  22. +19 −16 arduino/resources/checksums.go
  23. +4 −4 arduino/resources/helpers.go
  24. +12 −12 arduino/resources/install.go
  25. +6 −3 arduino/security/signatures.go
  26. +8 −4 arduino/serialutils/serialutils.go
  27. +13 −10 arduino/sketch/sketch.go
  28. +7 −6 cli/board/attach.go
  29. +4 −4 cli/board/board.go
  30. +4 −4 cli/board/details.go
  31. +13 −13 cli/board/list.go
  32. +9 −9 cli/board/listall.go
  33. +9 −9 cli/board/search.go
  34. +11 −9 cli/burnbootloader/burnbootloader.go
  35. +6 −3 cli/cache/cache.go
  36. +3 −3 cli/cache/clean.go
  37. +14 −14 cli/cli.go
  38. +35 −32 cli/compile/compile.go
  39. +6 −4 cli/completion/completion.go
  40. +4 −4 cli/config/add.go
  41. +4 −1 cli/config/config.go
  42. +4 −4 cli/config/delete.go
  43. +3 −3 cli/config/dump.go
  44. +14 −13 cli/config/init.go
  45. +4 −4 cli/config/remove.go
  46. +5 −5 cli/config/set.go
  47. +1 −1 cli/config/validate.go
  48. +5 −2 cli/core/core.go
  49. +8 −7 cli/core/download.go
  50. +11 −10 cli/core/install.go
  51. +7 −7 cli/core/list.go
  52. +11 −11 cli/core/search.go
  53. +7 −6 cli/core/uninstall.go
  54. +5 −5 cli/core/update_index.go
  55. +12 −11 cli/core/upgrade.go
  56. +11 −8 cli/daemon/daemon.go
  57. +22 −20 cli/debug/debug.go
  58. +4 −1 cli/feedback/feedback.go
  59. +9 −5 cli/generatedocs/generatedocs.go
  60. +6 −6 cli/globals/args.go
  61. +2 −0 cli/globals/globals.go
  62. +5 −2 cli/instance/instance.go
  63. +2 −2 cli/lib/args.go
  64. +10 −10 cli/lib/check_deps.go
  65. +8 −7 cli/lib/download.go
  66. +7 −7 cli/lib/examples.go
  67. +15 −15 cli/lib/install.go
  68. +5 −2 cli/lib/lib.go
  69. +15 −13 cli/lib/list.go
  70. +23 −23 cli/lib/search.go
  71. +6 −5 cli/lib/uninstall.go
  72. +5 −5 cli/lib/update_index.go
  73. +4 −6 cli/lib/upgrade.go
  74. +9 −6 cli/outdated/outdated.go
  75. +8 −4 cli/output/rpc_progress.go
  76. +7 −6 cli/sketch/archive.go
  77. +6 −6 cli/sketch/new.go
  78. +5 −2 cli/sketch/sketch.go
  79. +13 −10 cli/update/update.go
  80. +6 −3 cli/upgrade/upgrade.go
  81. +17 −14 cli/upload/upload.go
  82. +5 −2 cli/version/version.go
  83. +11 −8 commands/board/attach.go
  84. +3 −3 commands/board/details.go
  85. +11 −11 commands/board/list.go
  86. +1 −1 commands/board/listall.go
  87. +1 −1 commands/board/search.go
  88. +4 −4 commands/bundled_tools.go
  89. +3 −0 commands/bundled_tools_ctags.go
  90. +8 −8 commands/bundled_tools_serial_discovery.go
  91. +18 −15 commands/compile/compile.go
  92. +8 −5 commands/core/download.go
  93. +16 −16 commands/core/install.go
  94. +2 −2 commands/core/list.go
  95. +1 −1 commands/core/search.go
  96. +8 −8 commands/core/uninstall.go
  97. +6 −6 commands/core/upgrade.go
  98. +4 −1 commands/daemon/daemon.go
  99. +1 −1 commands/daemon/debug.go
  100. +2 −2 commands/daemon/monitor.go
  101. +1 −1 commands/daemon/settings.go
  102. +7 −4 commands/debug/debug.go
  103. +9 −9 commands/debug/debug_info.go
  104. +65 −65 commands/instances.go
  105. +5 −2 commands/lib/download.go
  106. +12 −12 commands/lib/install.go
  107. +5 −5 commands/lib/list.go
  108. +3 −3 commands/lib/resolve_deps.go
  109. +1 −1 commands/lib/search.go
  110. +2 −2 commands/lib/uninstall.go
  111. +1 −1 commands/lib/upgrade.go
  112. +2 −2 commands/lib/utils.go
  113. +9 −6 commands/sketch/archive.go
  114. +3 −3 commands/upload/programmers_list.go
  115. +40 −37 commands/upload/upload.go
  116. +10 −7 configuration/configuration.go
  117. +4 −0 executils/executils.go
  118. +2 −2 executils/output.go
  119. +1 −1 executils/process.go
  120. +4 −0 httpclient/httpclient.go
  121. +1 −2 httpclient/httpclient_config.go
  122. +3,241 −69 i18n/data/en.po
  123. +7 −7 i18n/rice-box.go
  124. +7 −5 inventory/inventory.go
  125. +9 −6 legacy/builder/builder.go
  126. +17 −14 legacy/builder/builder_utils/utils.go
  127. +57 −47 legacy/builder/constants/constants.go
  128. +1 −1 legacy/builder/container_find_includes.go
  129. +1 −1 legacy/builder/container_setup.go
  130. +1 −1 legacy/builder/ctags_runner.go
  131. +6 −3 legacy/builder/phases/core_builder.go
  132. +7 −7 legacy/builder/phases/libraries_builder.go
  133. +1 −1 legacy/builder/phases/linker.go
  134. +9 −8 legacy/builder/phases/sizer.go
  135. +1 −1 legacy/builder/preprocess_sketch.go
  136. +1 −1 legacy/builder/recipe_runner.go
  137. +2 −2 legacy/builder/resolve_library.go
  138. +1 −1 legacy/builder/target_board_resolver.go
  139. +1 −1 legacy/builder/types/context.go
  140. +3 −0 legacy/builder/types/types.go
  141. +5 −2 legacy/builder/utils/utils.go
  142. +4 −4 legacy/builder/wipeout_build_path_if_build_options_changed.go
  143. +4 −1 version/version.go
@@ -60,10 +60,10 @@ func LoadCompilationDatabase(file *paths.Path) (*CompilationDatabase, error) {
// see https://clang.llvm.org/docs/JSONCompilationDatabase.html
func (db *CompilationDatabase) SaveToFile() {
if jsonContents, err := json.MarshalIndent(db.Contents, "", " "); err != nil {
fmt.Printf("Error serializing compilation database: %s", err)
fmt.Printf(tr("Error serializing compilation database: %s"), err)
return
} else if err := db.File.WriteFile(jsonContents); err != nil {
fmt.Printf("Error writing compilation database: %s", err)
fmt.Printf(tr("Error writing compilation database: %s"), err)
}
}

@@ -75,7 +75,7 @@ func dirForCommand(command *exec.Cmd) string {
}
dir, err := os.Getwd()
if err != nil {
fmt.Printf("Error getting current directory for compilation database: %s", err)
fmt.Printf(tr("Error getting current directory for compilation database: %s"), err)
return ""
}
return dir
@@ -22,12 +22,16 @@ import (
"strings"

"github.com/arduino/arduino-cli/arduino/sketch"
"github.com/arduino/arduino-cli/i18n"
"github.com/arduino/go-paths-helper"

"github.com/pkg/errors"
)

var includesArduinoH = regexp.MustCompile(`(?m)^\s*#\s*include\s*[<\"]Arduino\.h[>\"]`)
var (
includesArduinoH = regexp.MustCompile(`(?m)^\s*#\s*include\s*[<\"]Arduino\.h[>\"]`)
tr = i18n.Tr
)

// QuoteCppString returns the given string as a quoted string for use with the C
// preprocessor. This adds double quotes around it and escapes any
@@ -42,13 +46,13 @@ func QuoteCppString(str string) string {
func SketchSaveItemCpp(path *paths.Path, contents []byte, destPath *paths.Path) error {
sketchName := path.Base()
if err := destPath.MkdirAll(); err != nil {
return errors.Wrap(err, "unable to create a folder to save the sketch")
return errors.Wrap(err, tr("unable to create a folder to save the sketch"))
}

destFile := destPath.Join(fmt.Sprintf("%s.cpp", sketchName))

if err := destFile.WriteFile(contents); err != nil {
return errors.Wrap(err, "unable to save the sketch on disk")
return errors.Wrap(err, tr("unable to save the sketch on disk"))
}

return nil
@@ -62,14 +66,14 @@ func SketchMergeSources(sk *sketch.Sketch, overrides map[string]string) (int, st
getSource := func(f *paths.Path) (string, error) {
path, err := sk.FullPath.RelTo(f)
if err != nil {
return "", errors.Wrap(err, "unable to compute relative path to the sketch for the item")
return "", errors.Wrap(err, tr("unable to compute relative path to the sketch for the item"))
}
if override, ok := overrides[path.String()]; ok {
return override, nil
}
data, err := f.ReadFile()
if err != nil {
return "", fmt.Errorf("reading file %s: %s", f, err)
return "", fmt.Errorf(tr("reading file %[1]s: %[2]s"), f, err)
}
return string(data), nil
}
@@ -104,19 +108,19 @@ func SketchMergeSources(sk *sketch.Sketch, overrides map[string]string) (int, st
// specified destination directory.
func SketchCopyAdditionalFiles(sketch *sketch.Sketch, destPath *paths.Path, overrides map[string]string) error {
if err := destPath.MkdirAll(); err != nil {
return errors.Wrap(err, "unable to create a folder to save the sketch files")
return errors.Wrap(err, tr("unable to create a folder to save the sketch files"))
}

for _, file := range sketch.AdditionalFiles {
relpath, err := sketch.FullPath.RelTo(file)
if err != nil {
return errors.Wrap(err, "unable to compute relative path to the sketch for the item")
return errors.Wrap(err, tr("unable to compute relative path to the sketch for the item"))
}

targetPath := destPath.JoinPath(relpath)
// create the directory containing the target
if err = targetPath.Parent().MkdirAll(); err != nil {
return errors.Wrap(err, "unable to create the folder containing the item")
return errors.Wrap(err, tr("unable to create the folder containing the item"))
}

var sourceBytes []byte
@@ -127,7 +131,7 @@ func SketchCopyAdditionalFiles(sketch *sketch.Sketch, destPath *paths.Path, over
// read the source file
s, err := file.ReadFile()
if err != nil {
return errors.Wrap(err, "unable to read contents of the source item")
return errors.Wrap(err, tr("unable to read contents of the source item"))
}
sourceBytes = s
}
@@ -137,7 +141,7 @@ func SketchCopyAdditionalFiles(sketch *sketch.Sketch, destPath *paths.Path, over

err = writeIfDifferent(sourceBytes, targetPath)
if err != nil {
return errors.Wrap(err, "unable to write to destination file")
return errors.Wrap(err, tr("unable to write to destination file"))
}
}

@@ -154,7 +158,7 @@ func writeIfDifferent(source []byte, destPath *paths.Path) error {
// Read the destination file if it exists
existingBytes, err := destPath.ReadFile()
if err != nil {
return errors.Wrap(err, "unable to read contents of the destination item")
return errors.Wrap(err, tr("unable to read contents of the destination item"))
}

// Overwrite if contents are different
@@ -106,7 +106,7 @@ func (b *Board) GetBuildProperties(userConfigs *properties.Map) (*properties.Map
if haveUserValue {
userConfigs.Remove(option)
if !optionMenu.ContainsKey(userValue) {
return nil, fmt.Errorf("invalid value '%s' for option '%s'", userValue, option)
return nil, fmt.Errorf(tr("invalid value '%[1]s' for option '%[2]s'"), userValue, option)
}
} else {
// apply default
@@ -120,9 +120,9 @@ func (b *Board) GetBuildProperties(userConfigs *properties.Map) (*properties.Map
// Check for residual invalid options...
for _, invalidOption := range userConfigs.Keys() {
if invalidOption == "" {
return nil, fmt.Errorf("invalid empty option found")
return nil, fmt.Errorf(tr("invalid empty option found"))
}
return nil, fmt.Errorf("invalid option '%s'", invalidOption)
return nil, fmt.Errorf(tr("invalid option '%s'"), invalidOption)
}

return buildProperties, nil
@@ -136,7 +136,7 @@ func (b *Board) GetBuildProperties(userConfigs *properties.Map) (*properties.Map
func (b *Board) GeneratePropertiesForConfiguration(config string) (*properties.Map, error) {
fqbn, err := ParseFQBN(b.String() + ":" + config)
if err != nil {
return nil, fmt.Errorf("parsing fqbn: %s", err)
return nil, fmt.Errorf(tr("parsing fqbn: %s"), err)
}
return b.GetBuildProperties(fqbn.Configs)
}
@@ -22,6 +22,7 @@ import (
"strings"

"github.com/arduino/arduino-cli/arduino/resources"
"github.com/arduino/arduino-cli/i18n"
paths "github.com/arduino/go-paths-helper"
properties "github.com/arduino/go-properties-orderedmap"
semver "go.bug.st/relaxed-semver"
@@ -75,6 +76,8 @@ type BoardManifestID struct {
USB string `json:"-"`
}

var tr = i18n.Tr

// HasUsbID returns true if the BoardManifes contains the specified USB id as
// identification for this board. usbID should be in the format "0000:0000"
func (bm *BoardManifest) HasUsbID(vid, pid string) bool {
@@ -45,18 +45,18 @@ func ParseFQBN(fqbnIn string) (*FQBN, error) {
Configs: properties.NewMap(),
}
if fqbn.BoardID == "" {
return nil, fmt.Errorf("invalid fqbn: empty board identifier")
return nil, fmt.Errorf(tr("invalid fqbn: empty board identifier"))
}
if len(fqbnParts) > 3 {
for _, pair := range strings.Split(fqbnParts[3], ",") {
parts := strings.SplitN(pair, "=", 2)
if len(parts) != 2 {
return nil, fmt.Errorf("invalid fqbn config: %s", pair)
return nil, fmt.Errorf(tr("invalid fqbn config: %s"), pair)
}
k := strings.TrimSpace(parts[0])
v := strings.TrimSpace(parts[1])
if k == "" {
return nil, fmt.Errorf("invalid fqbn config: %s", pair)
return nil, fmt.Errorf(tr("invalid fqbn config: %s"), pair)
}
fqbn.Configs.Set(k, v)
}
@@ -22,6 +22,7 @@ import (
"github.com/arduino/arduino-cli/arduino/cores"
"github.com/arduino/arduino-cli/arduino/resources"
"github.com/arduino/arduino-cli/arduino/security"
"github.com/arduino/arduino-cli/i18n"
"github.com/arduino/go-paths-helper"
"github.com/sirupsen/logrus"
semver "go.bug.st/relaxed-semver"
@@ -107,6 +108,8 @@ type indexHelp struct {
Online string `json:"online,omitempty"`
}

var tr = i18n.Tr

// MergeIntoPackages converts the Index data into a cores.Packages and merge them
// with the existing contents of the cores.Packages passed as parameter.
func (index Index) MergeIntoPackages(outPackages cores.Packages) {
@@ -233,7 +236,7 @@ func (inPlatformRelease indexPlatformRelease) extractPlatformIn(outPackage *core

size, err := inPlatformRelease.Size.Int64()
if err != nil {
return fmt.Errorf("invalid platform archive size: %s", err)
return fmt.Errorf(tr("invalid platform archive size: %s"), err)
}
outPlatformRelease := outPlatform.GetOrCreateRelease(inPlatformRelease.Version)
outPlatformRelease.IsTrusted = trusted
@@ -70,37 +70,37 @@ func (pm *PackageManager) FindPlatformRelease(ref *PlatformReference) *cores.Pla
func (pm *PackageManager) FindPlatformReleaseDependencies(item *PlatformReference) (*cores.PlatformRelease, []*cores.ToolRelease, error) {
targetPackage, exists := pm.Packages[item.Package]
if !exists {
return nil, nil, fmt.Errorf("package %s not found", item.Package)
return nil, nil, fmt.Errorf(tr("package %s not found"), item.Package)
}
platform, exists := targetPackage.Platforms[item.PlatformArchitecture]
if !exists {
return nil, nil, fmt.Errorf("platform %s not found in package %s", item.PlatformArchitecture, targetPackage.String())
return nil, nil, fmt.Errorf(tr("platform %[1]s not found in package %[2]s"), item.PlatformArchitecture, targetPackage.String())
}

var release *cores.PlatformRelease
if item.PlatformVersion != nil {
release = platform.FindReleaseWithVersion(item.PlatformVersion)
if release == nil {
return nil, nil, fmt.Errorf("required version %s not found for platform %s", item.PlatformVersion, platform.String())
return nil, nil, fmt.Errorf(tr("required version %[1]s not found for platform %[2]s"), item.PlatformVersion, platform.String())
}
} else {
release = platform.GetLatestRelease()
if release == nil {
return nil, nil, fmt.Errorf("platform %s has no available releases", platform.String())
return nil, nil, fmt.Errorf(tr("platform %s has no available releases"), platform.String())
}
}

// replaces "latest" with latest version too
toolDeps, err := pm.Packages.GetPlatformReleaseToolDependencies(release)
if err != nil {
return nil, nil, fmt.Errorf("getting tool dependencies for platform %s: %s", release.String(), err)
return nil, nil, fmt.Errorf(tr("getting tool dependencies for platform %[1]s: %[2]s"), release.String(), err)
}

// discovery dependencies differ from normal tool since we always want to use the latest \
// available version for the platform package
discoveryDependencies, err := pm.Packages.GetPlatformReleaseDiscoveryDependencies(release)
if err != nil {
return nil, nil, fmt.Errorf("getting discovery dependencies for platform %s: %s", release.String(), err)
return nil, nil, fmt.Errorf(tr("getting discovery dependencies for platform %[1]s: %[2]s"), release.String(), err)
}

return release, append(toolDeps, discoveryDependencies...), nil
@@ -111,7 +111,7 @@ func (pm *PackageManager) FindPlatformReleaseDependencies(item *PlatformReferenc
func (pm *PackageManager) DownloadToolRelease(tool *cores.ToolRelease, config *downloader.Config) (*downloader.Downloader, error) {
resource := tool.GetCompatibleFlavour()
if resource == nil {
return nil, fmt.Errorf("tool not available for your OS")
return nil, fmt.Errorf(tr("tool not available for your OS"))
}
return resource.Download(pm.DownloadDir, config)
}
@@ -34,15 +34,15 @@ func (pm *PackageManager) InstallPlatform(platformRelease *cores.PlatformRelease
platformRelease.Platform.Architecture,
platformRelease.Version.String())
if err := platformRelease.Resource.Install(pm.DownloadDir, pm.TempDir, destDir); err != nil {
return errors.Errorf("installing platform %s: %s", platformRelease, err)
return errors.Errorf(tr("installing platform %[1]s: %[2]s"), platformRelease, err)
}
if d, err := destDir.Abs(); err == nil {
platformRelease.InstallDir = d
} else {
return err
}
if err := pm.cacheInstalledJSON(platformRelease); err != nil {
return errors.Errorf("creating installed.json in %s: %s", platformRelease.InstallDir, err)
return errors.Errorf(tr("creating installed.json in %[1]s: %[2]s"), platformRelease.InstallDir, err)
}
return nil
}
@@ -62,7 +62,7 @@ func (pm *PackageManager) cacheInstalledJSON(platformRelease *cores.PlatformRele
// specified platformRelease.
func (pm *PackageManager) RunPostInstallScript(platformRelease *cores.PlatformRelease) error {
if !platformRelease.IsInstalled() {
return errors.New("platform not installed")
return errors.New(tr("platform not installed"))
}
postInstallFilename := "post_install.sh"
if runtime.GOOS == "windows" {
@@ -105,16 +105,16 @@ func (pm *PackageManager) IsManagedPlatformRelease(platformRelease *cores.Platfo
// UninstallPlatform remove a PlatformRelease.
func (pm *PackageManager) UninstallPlatform(platformRelease *cores.PlatformRelease) error {
if platformRelease.InstallDir == nil {
return fmt.Errorf("platform not installed")
return fmt.Errorf(tr("platform not installed"))
}

// Safety measure
if !pm.IsManagedPlatformRelease(platformRelease) {
return fmt.Errorf("%s is not managed by package manager", platformRelease)
return fmt.Errorf(tr("%s is not managed by package manager"), platformRelease)
}

if err := platformRelease.InstallDir.RemoveAll(); err != nil {
return fmt.Errorf("removing platform files: %s", err)
return fmt.Errorf(tr("removing platform files: %s"), err)
}
platformRelease.InstallDir = nil
return nil
@@ -124,7 +124,7 @@ func (pm *PackageManager) UninstallPlatform(platformRelease *cores.PlatformRelea
func (pm *PackageManager) InstallTool(toolRelease *cores.ToolRelease) error {
toolResource := toolRelease.GetCompatibleFlavour()
if toolResource == nil {
return fmt.Errorf("no compatible version of %s tools found for the current os", toolRelease.Tool.Name)
return fmt.Errorf(tr("no compatible version of %s tools found for the current os"), toolRelease.Tool.Name)
}
destDir := pm.PackagesDir.Join(
toolRelease.Tool.Package.Name,
@@ -157,16 +157,16 @@ func (pm *PackageManager) IsManagedToolRelease(toolRelease *cores.ToolRelease) b
// UninstallTool remove a ToolRelease.
func (pm *PackageManager) UninstallTool(toolRelease *cores.ToolRelease) error {
if toolRelease.InstallDir == nil {
return fmt.Errorf("tool not installed")
return fmt.Errorf(tr("tool not installed"))
}

// Safety measure
if !pm.IsManagedToolRelease(toolRelease) {
return fmt.Errorf("tool %s is not managed by package manager", toolRelease)
return fmt.Errorf(tr("tool %s is not managed by package manager"), toolRelease)
}

if err := toolRelease.InstallDir.RemoveAll(); err != nil {
return fmt.Errorf("removing tool files: %s", err)
return fmt.Errorf(tr("removing tool files: %s"), err)
}
toolRelease.InstallDir = nil
return nil

0 comments on commit e31a717

Please sign in to comment.