MCPcopy Create free account
hub / github.com/riverqueue/river / parseAndUpdateGoModFile

Function parseAndUpdateGoModFile

rivershared/cmd/update-mod-version/main.go:99–149  ·  view source on GitHub ↗
(filename, packagePrefix, version string)

Source from the content-addressed store, hash-verified

97}
98
99func 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}

Callers 2

runFunction · 0.70

Calls 1

ErrorfMethod · 0.65

Tested by 1

Used in the wild real call sites across dependent graphs

searching dependent graphs…