-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfile_utils.go
More file actions
135 lines (119 loc) · 3.43 KB
/
file_utils.go
File metadata and controls
135 lines (119 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
sitter "github.com/smacker/go-tree-sitter"
"github.com/smacker/go-tree-sitter/golang"
"github.com/smacker/go-tree-sitter/java"
"github.com/smacker/go-tree-sitter/javascript"
"github.com/smacker/go-tree-sitter/python"
"github.com/smacker/go-tree-sitter/typescript/typescript"
)
// ReadFile reads the content of a file
func ReadFile(filePath string) ([]byte, error) {
return os.ReadFile(filePath)
}
// GetLanguageForFile determines the Tree-sitter language for a file
func GetLanguageForFile(filePath string) (*sitter.Language, error) {
// For test files with .txt extension, check the filename pattern
if strings.HasSuffix(filePath, ".txt") {
filename := filepath.Base(filePath)
if strings.Contains(filename, "_") {
// Extract language from filename pattern like "java_basic_class.java.txt"
parts := strings.Split(filename, "_")
if len(parts) > 0 {
lang := parts[0]
switch lang {
case "java":
return java.GetLanguage(), nil
case "go":
return golang.GetLanguage(), nil
case "js", "javascript":
return javascript.GetLanguage(), nil
case "ts", "typescript":
return typescript.GetLanguage(), nil
case "py", "python":
return python.GetLanguage(), nil
}
}
}
// Also check for patterns like "something.java.txt"
if strings.Contains(filename, ".java.txt") {
return java.GetLanguage(), nil
}
if strings.Contains(filename, ".go.txt") {
return golang.GetLanguage(), nil
}
if strings.Contains(filename, ".js.txt") || strings.Contains(filename, ".jsx.txt") {
return javascript.GetLanguage(), nil
}
if strings.Contains(filename, ".ts.txt") || strings.Contains(filename, ".tsx.txt") {
return typescript.GetLanguage(), nil
}
if strings.Contains(filename, ".py.txt") {
return python.GetLanguage(), nil
}
}
ext := strings.ToLower(filepath.Ext(filePath))
switch ext {
case ".go":
return golang.GetLanguage(), nil
case ".js", ".jsx":
return javascript.GetLanguage(), nil
case ".ts", ".tsx":
return typescript.GetLanguage(), nil
case ".py":
return python.GetLanguage(), nil
case ".java":
return java.GetLanguage(), nil
default:
return nil, fmt.Errorf("unsupported file type: %s", filePath)
}
}
// FindFiles finds files matching a glob pattern
func FindFiles(pattern string) ([]string, error) {
// If pattern contains **, use filepath.Walk for recursive matching
if strings.Contains(pattern, "**") {
var files []string
// Split pattern at **
parts := strings.Split(pattern, "**")
if len(parts) != 2 {
return nil, fmt.Errorf("invalid pattern with **: %s", pattern)
}
baseDir := parts[0]
if baseDir == "" {
baseDir = "."
} else {
// Remove trailing slash
baseDir = strings.TrimSuffix(baseDir, "/")
}
// Get the file pattern after **
filePattern := parts[1]
filePattern = strings.TrimPrefix(filePattern, "/")
err := filepath.Walk(baseDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return nil // Skip errors
}
if !info.IsDir() {
// Check if the filename matches the pattern
matched, _ := filepath.Match(filePattern, filepath.Base(path))
if matched {
files = append(files, path)
}
}
return nil
})
if err != nil {
return nil, err
}
return files, nil
}
// For patterns without **, use standard glob
matches, err := filepath.Glob(pattern)
if err != nil {
return nil, err
}
return matches, nil
}