@@ -5,86 +5,98 @@ import (
55 "fmt"
66 "log"
77 "os"
8- "path/filepath"
98 "strings"
109
11- "github.com/grafana/replace-generator/types "
12- "gopkg.in/yaml.v3 "
10+ "github.com/grafana/replace-generator/internal/files "
11+ "github.com/grafana/replace-generator/internal/types "
1312)
1413
1514func main () {
16- scriptDir , err := os .Getwd ()
17- if err != nil {
18- log .Fatalf ("Failed to get working directory: %v" , err )
19- }
20-
21- projectRoot , err := filepath .Abs (filepath .Join (scriptDir , ".." , ".." ))
22- if err != nil {
23- log .Fatalf ("Failed to resolve project root: %v" , err )
24- }
15+ fileHelper := files .GetFileHelper ()
2516
26- replacesPath := filepath .Join (projectRoot , "dependency-replacements.yaml" )
27- var projectReplaces types.ProjectReplaces
28- data , err := os .ReadFile (replacesPath )
17+ projectReplaces , err := fileHelper .LoadProjectReplaces ()
2918 if err != nil {
30- log .Fatalf ("Failed to read dependency-replacements.yaml: %v" , err )
31- }
32-
33- if err := yaml .Unmarshal (data , & projectReplaces ); err != nil {
34- log .Fatalf ("Failed to parse dependency-replacements.yaml: %v" , err )
19+ log .Fatalf ("Failed to load project replaces: %v" , err )
3520 }
3621
3722 for _ , module := range projectReplaces .Modules {
38- if err := applyReplacesToModule (scriptDir , projectRoot , module ); err != nil {
23+ if err := applyReplacesToModule (fileHelper , module ); err != nil {
3924 log .Fatalf ("Failed to apply replaces to module %q: %v" , module .Name , err )
4025 }
26+ log .Printf ("Updated %s" , module .Path )
4127 }
4228}
4329
44- func applyReplacesToModule (scriptDir string , projectRoot string , module types.Module ) error {
45- targetPath := filepath .Join (projectRoot , module .Path )
46-
47- replacesPath := filepath .Join (scriptDir , module .OutputFile )
30+ func applyReplacesToModule (dirs * files.FileHelper , module types.Module ) error {
31+ targetPath := dirs .ModuleTargetPath (module .Path )
32+ replacesPath := dirs .ModuleOutputPath (module .OutputFile )
4833
4934 replacesContent , err := os .ReadFile (replacesPath )
5035 if err != nil {
5136 return fmt .Errorf ("read replaces file %s: %w" , replacesPath , err )
5237 }
5338
54- content , err := os .ReadFile (targetPath )
39+ targetContent , err := os .ReadFile (targetPath )
5540 if err != nil {
5641 return fmt .Errorf ("read target file %s: %w" , targetPath , err )
5742 }
5843
59- var startMarker , endMarker string
60- switch module .FileType {
61- case "mod" :
62- // Go mod files use // comments
63- startMarker = "// BEGIN GENERATED REPLACES - DO NOT EDIT"
64- endMarker = "// END GENERATED REPLACES"
65- default :
66- return fmt .Errorf ("unknown file_type %q for module %q (expected 'mod')" , module .FileType , module .Name )
44+ startMarker , endMarker , err := getMarkers (module .FileType )
45+ if err != nil {
46+ return fmt .Errorf ("get markers for file type %q: %w" , module .FileType , err )
6747 }
6848
69- contentStr := string (content )
70- hasMarkers := hasMarkers (contentStr , startMarker , endMarker )
49+ newContent := prepareContent (string (targetContent ), string (replacesContent ), startMarker , endMarker )
50+
51+ if err := os .WriteFile (targetPath , []byte (newContent ), 0o644 ); err != nil {
52+ return fmt .Errorf ("write target file %s: %w" , targetPath , err )
53+ }
54+
55+ return nil
56+ }
57+
58+ func prepareContent (targetContent , replacesContent , startMarker , endMarker string ) string {
59+ markers := hasMarkers (targetContent , startMarker , endMarker )
7160
7261 var newContent string
73- if hasMarkers {
74- newContent = removeBetweenMarkers (contentStr , startMarker , endMarker )
62+ if markers {
63+ newContent = removeBetweenMarkers (targetContent , startMarker , endMarker )
7564 } else {
76- // No markers found, use original content
77- newContent = contentStr
65+ newContent = targetContent
7866 }
7967
80- newContent = strings .TrimRight (newContent , "\n " ) + "\n " + string (replacesContent )
68+ return strings .TrimRight (newContent , "\n " ) + "\n " + replacesContent
69+ }
8170
82- if err := os .WriteFile (targetPath , []byte (newContent ), 0o644 ); err != nil {
83- return fmt .Errorf ("write target file %s: %w" , targetPath , err )
71+ func getMarkers (fileType string ) (startMarker , endMarker string , err error ) {
72+ switch fileType {
73+ case "mod" :
74+ // Go mod files use // comments
75+ return "// BEGIN GENERATED REPLACES - DO NOT EDIT" , "// END GENERATED REPLACES" , nil
76+ default :
77+ return "" , "" , fmt .Errorf ("unknown file_type %q" , fileType )
8478 }
79+ }
8580
86- log .Printf ("✅ Updated %s" , targetPath )
87- return nil
81+ func hasMarkers (content , startMarker , endMarker string ) bool {
82+ startMarkerTrimmed := strings .TrimSpace (startMarker )
83+ endMarkerTrimmed := strings .TrimSpace (endMarker )
84+
85+ hasStart := false
86+ hasEnd := false
87+
88+ scanner := bufio .NewScanner (strings .NewReader (content ))
89+ for scanner .Scan () {
90+ trimmedLine := strings .TrimSpace (scanner .Text ())
91+ if strings .HasPrefix (trimmedLine , startMarkerTrimmed ) {
92+ hasStart = true
93+ }
94+ if trimmedLine == endMarkerTrimmed {
95+ hasEnd = true
96+ }
97+ }
98+
99+ return hasStart && hasEnd
88100}
89101
90102func removeBetweenMarkers (content , startMarker , endMarker string ) string {
@@ -115,30 +127,5 @@ func removeBetweenMarkers(content, startMarker, endMarker string) string {
115127 }
116128 }
117129
118- if err := scanner .Err (); err != nil {
119- log .Printf ("Warning: error scanning content: %v" , err )
120- }
121-
122130 return result .String ()
123131}
124-
125- func hasMarkers (content , startMarker , endMarker string ) bool {
126- startMarkerTrimmed := strings .TrimSpace (startMarker )
127- endMarkerTrimmed := strings .TrimSpace (endMarker )
128-
129- hasStart := false
130- hasEnd := false
131-
132- scanner := bufio .NewScanner (strings .NewReader (content ))
133- for scanner .Scan () {
134- trimmedLine := strings .TrimSpace (scanner .Text ())
135- if strings .HasPrefix (trimmedLine , startMarkerTrimmed ) {
136- hasStart = true
137- }
138- if trimmedLine == endMarkerTrimmed {
139- hasEnd = true
140- }
141- }
142-
143- return hasStart && hasEnd
144- }
0 commit comments