From f2a99db4455ba9bbe969bb077519d0c138abc24c Mon Sep 17 00:00:00 2001 From: Melvin Murvie Date: Thu, 7 Nov 2024 16:13:02 +0800 Subject: [PATCH 1/2] Fixed bingo get fails on Windows --- get.go | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/get.go b/get.go index fe0e893..08f35bb 100644 --- a/get.go +++ b/get.go @@ -200,7 +200,9 @@ func get(ctx context.Context, logger *log.Logger, c getConfig, rawTarget string) if err != nil { return errors.Wrapf(err, "found unparsable mod file %v. Uninstall it first via get %v@none or fix it manually.", e, name) } - defer errcapture.Do(&err, mf.Close, "close") + if err := mf.Close(); err != nil { + return errors.Wrapf(err, "unable to close mod file %v", e) + } if mf.DirectPackage() == nil { return errors.Wrapf(err, "failed to rename tool %v to %v name; found empty mod file %v; Use full path to install tool again", name, c.rename, e) @@ -260,7 +262,9 @@ func get(ctx context.Context, logger *log.Logger, c getConfig, rawTarget string) if err != nil { return errors.Wrapf(err, "found unparsable mod file %v. Uninstall it first via get %v@none or fix it manually.", e, name) } - defer errcapture.Do(&err, mf.Close, "close") + if err := mf.Close(); err != nil { + return errors.Wrapf(err, "unable to close mod file %v", e) + } if mf.DirectPackage() != nil { if target.Path() != "" && target.Path() != mf.DirectPackage().Path() { @@ -629,7 +633,14 @@ func getPackage(ctx context.Context, logger *log.Logger, c installPackageConfig, if err != nil { return errors.Wrap(err, "create tmp mod file") } - defer errcapture.Do(&err, tmpModFile.Close, "close") + + var closed bool + defer func() { + // This defer func is only to handle below set directive method failures since they still need to keep the file open. + if !closed { + errcapture.Do(&err, tmpModFile.Close, "close") + } + }() if !tmpModFile.IsDirectivesAutoFetchDisabled() && !fetchedDirectives.isEmpty() { if err := tmpModFile.SetReplaceDirectives(fetchedDirectives.replace...); err != nil { @@ -652,6 +663,12 @@ func getPackage(ctx context.Context, logger *log.Logger, c installPackageConfig, return err } + // We have close it once here so the defer func does not need to close it again. + closed = true + if err := tmpModFile.Close(); err != nil { + return err + } + if err := install(ctx, logger, c.runner, c.modDir, name, c.link, tmpModFile); err != nil { return errors.Wrap(err, "install") } From d4d44c011d36702bbcee6cb0ed88aa8c49a716ad Mon Sep 17 00:00:00 2001 From: Melvin Murvie Date: Sat, 25 Jan 2025 10:29:16 +0700 Subject: [PATCH 2/2] Fixed modfile to be not used after closed --- get.go | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/get.go b/get.go index 08f35bb..11aa22e 100644 --- a/get.go +++ b/get.go @@ -200,14 +200,17 @@ func get(ctx context.Context, logger *log.Logger, c getConfig, rawTarget string) if err != nil { return errors.Wrapf(err, "found unparsable mod file %v. Uninstall it first via get %v@none or fix it manually.", e, name) } + + dpkg := mf.DirectPackage() + if err := mf.Close(); err != nil { return errors.Wrapf(err, "unable to close mod file %v", e) } - if mf.DirectPackage() == nil { + if dpkg == nil { return errors.Wrapf(err, "failed to rename tool %v to %v name; found empty mod file %v; Use full path to install tool again", name, c.rename, e) } - targets = append(targets, *mf.DirectPackage()) + targets = append(targets, *dpkg) } for i, t := range targets { @@ -262,26 +265,29 @@ func get(ctx context.Context, logger *log.Logger, c getConfig, rawTarget string) if err != nil { return errors.Wrapf(err, "found unparsable mod file %v. Uninstall it first via get %v@none or fix it manually.", e, name) } + + dpkg := mf.DirectPackage() + if err := mf.Close(); err != nil { return errors.Wrapf(err, "unable to close mod file %v", e) } - if mf.DirectPackage() != nil { - if target.Path() != "" && target.Path() != mf.DirectPackage().Path() { + if dpkg != nil { + if target.Path() != "" && target.Path() != dpkg.Path() { if pathWasSpecified { return errors.Newf("found mod file %v that has different package path %q than given %q"+ - "Uninstall existing tool using `%v@none` or use `-n` flag to choose different name", e, mf.DirectPackage().Path(), target.Path(), targetName) + "Uninstall existing tool using `%v@none` or use `-n` flag to choose different name", e, dpkg.Path(), target.Path(), targetName) } return errors.Newf("found array mod file %v that has different package path %q than previous in array %q. Manual edit?"+ - "Uninstall existing tool using `%v@none` or use `-n` flag to choose different name", e, mf.DirectPackage().Path(), target.Path(), targetName) + "Uninstall existing tool using `%v@none` or use `-n` flag to choose different name", e, dpkg.Path(), target.Path(), targetName) } - target.Module.Path = mf.DirectPackage().Module.Path + target.Module.Path = dpkg.Module.Path if target.Module.Version == "" { // If no version is requested, use the existing version. - target.Module.Version = mf.DirectPackage().Module.Version + target.Module.Version = dpkg.Module.Version } - target.RelPath = mf.DirectPackage().RelPath + target.RelPath = dpkg.RelPath // Save for future versions without potentially existing files. pkgPath = target.Path() @@ -663,21 +669,23 @@ func getPackage(ctx context.Context, logger *log.Logger, c installPackageConfig, return err } + if err := install(ctx, logger, c.runner, c.modDir, name, c.link, tmpModFile); err != nil { + return errors.Wrap(err, "install") + } + + tmpModFileFilepath := tmpModFile.Filepath() + // We have close it once here so the defer func does not need to close it again. closed = true if err := tmpModFile.Close(); err != nil { return err } - if err := install(ctx, logger, c.runner, c.modDir, name, c.link, tmpModFile); err != nil { - return errors.Wrap(err, "install") - } - // We were working on tmp file, do atomic rename. - if err := os.Rename(tmpModFile.Filepath(), outModFile); err != nil { + if err := os.Rename(tmpModFileFilepath, outModFile); err != nil { return errors.Wrap(err, "rename mod file") } - if err := os.Rename(bingo.SumFilePath(tmpModFile.Filepath()), outSumFile); err != nil { + if err := os.Rename(bingo.SumFilePath(tmpModFileFilepath), outSumFile); err != nil { return errors.Wrap(err, "rename sum file") } return nil