(filename, packagePrefix, version string)
| 97 | } |
| 98 | |
| 99 | func parseAndUpdateGoModFile(filename, packagePrefix, version string) (bool, error) { |
| 100 | fileData, err := os.ReadFile(filename) |
| 101 | if err != nil { |
| 102 | return false, fmt.Errorf("error reading file %q: %w", filename, err) |
| 103 | } |
| 104 | |
| 105 | modFile, err := modfile.Parse(filename, fileData, nil) |
| 106 | if err != nil { |
| 107 | return false, fmt.Errorf("error parsing file %q: %w", filename, err) |
| 108 | } |
| 109 | |
| 110 | var anyChanges bool |
| 111 | |
| 112 | fmt.Printf("%s\n", filename) |
| 113 | |
| 114 | for _, require := range modFile.Require { |
| 115 | if !strings.HasPrefix(require.Mod.Path, packagePrefix) { |
| 116 | continue |
| 117 | } |
| 118 | |
| 119 | if require.Mod.Version == version { |
| 120 | continue |
| 121 | } |
| 122 | |
| 123 | anyChanges = true |
| 124 | requirePath := require.Mod.Path |
| 125 | |
| 126 | // Not obvious from the name, but AddRequire replaces an existing |
| 127 | // require statement if it exists, preserving any comments on it. |
| 128 | if err := modFile.AddRequire(requirePath, version); err != nil { |
| 129 | return false, fmt.Errorf("error adding require %q: %w", require.Mod.Path, err) |
| 130 | } |
| 131 | |
| 132 | fmt.Printf(" set version to %s for %s\n", version, requirePath) |
| 133 | } |
| 134 | |
| 135 | if anyChanges { |
| 136 | updatedFileData, err := modFile.Format() |
| 137 | if err != nil { |
| 138 | return false, fmt.Errorf("error formatting file %q after update: %w", filename, err) |
| 139 | } |
| 140 | |
| 141 | if err := os.WriteFile(filename, updatedFileData, 0o600); err != nil { //nolint:gosec // validated by localPath |
| 142 | return false, fmt.Errorf("error writing file %q after update: %w", filename, err) |
| 143 | } |
| 144 | } else { |
| 145 | fmt.Printf(" no changes\n") |
| 146 | } |
| 147 | |
| 148 | return anyChanges, nil |
| 149 | } |
searching dependent graphs…