Skip to content

Commit 92c493d

Browse files
committed
Refactor #1
1 parent cf7d61b commit 92c493d

File tree

12 files changed

+377
-300
lines changed

12 files changed

+377
-300
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
# TODO
3+
4+
* Refactor code so that it is as simple and concise as possible.
5+
* Think about what would happen if we added a different module type
6+
* Add some basic tests? Not sure what to test there
7+
* Add a github action that checks if the output of replace generation changes anything in the go.mod file
8+
* Could we also add a pre-commit hook for that?
9+
* Fill out this readme

tools/sync-module-dependencies/cleanup.go

Lines changed: 0 additions & 37 deletions
This file was deleted.

tools/sync-module-dependencies/generate-replaces.go

Lines changed: 0 additions & 117 deletions
This file was deleted.
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package main
22

3-
//go:generate go run ./generate-replaces.go
4-
//go:generate go run ./apply-replaces.go
5-
//go:generate go run ./tidy-modules.go
6-
//go:generate go run ./cleanup.go
3+
//go:generate go run ./internal/generate-replaces.go
4+
//go:generate go run ./internal/apply-replaces.go
5+
//go:generate go run ./internal/tidy-modules.go
6+
//go:generate go run ./internal/cleanup.go

tools/sync-module-dependencies/apply-replaces.go renamed to tools/sync-module-dependencies/internal/apply-replaces.go

Lines changed: 57 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1514
func 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

90102
func 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-
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
"path/filepath"
8+
"strings"
9+
10+
"github.com/grafana/replace-generator/internal/files"
11+
)
12+
13+
func main() {
14+
fileHelper := files.GetFileHelper()
15+
16+
if err := cleanupOutputFiles(fileHelper.ScriptDir); err != nil {
17+
log.Fatalf("Failed to cleanup output files: %v", err)
18+
}
19+
}
20+
21+
// The previous steps in the generation pipeline output some temporary .txt files, cleanupOutputFiles removes these files
22+
func cleanupOutputFiles(scriptDir string) error {
23+
entries, err := os.ReadDir(scriptDir)
24+
if err != nil {
25+
return fmt.Errorf("read directory: %w", err)
26+
}
27+
28+
for _, entry := range entries {
29+
if entry.IsDir() {
30+
continue
31+
}
32+
33+
name := entry.Name()
34+
if !strings.HasSuffix(strings.ToLower(name), ".txt") {
35+
continue
36+
}
37+
38+
filePath := filepath.Join(scriptDir, name)
39+
if err := os.Remove(filePath); err != nil {
40+
log.Printf("Failed to remove %s: %v", name, err)
41+
continue
42+
}
43+
}
44+
45+
return nil
46+
}

0 commit comments

Comments
 (0)