Skip to content

Commit 8e6ff84

Browse files
committed
Add CI workflow and improve file handling
Introduces GitHub Actions CI workflow and golangci-lint configuration. Refactors file and writer closing in parser.go to use explicit error handling. Updates convert.go to use switch for file extension checks. Removes unnecessary random seed in utils.go.
1 parent 7d2a59c commit 8e6ff84

5 files changed

Lines changed: 90 additions & 9 deletions

File tree

.github/workflows/ci.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Go CI
2+
3+
on:
4+
push:
5+
branches: [ main, develop ]
6+
pull_request:
7+
branches: [ main, develop ]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v5
14+
15+
- name: Set up Go
16+
uses: actions/setup-go@v6
17+
with:
18+
go-version: stable
19+
20+
- name: Install dependencies
21+
run: go mod download
22+
23+
- name: Run tests
24+
run: go test -v ./...
25+
26+
- name: Build
27+
run: go build -v ./...
28+
29+
- name: Run linter
30+
uses: golangci/golangci-lint-action@v8
31+
with:
32+
version: v2.1

.golangci.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
version: "2"
2+
3+
linters:
4+
enable:
5+
- errcheck
6+
- govet
7+
- ineffassign
8+
- staticcheck
9+
- unused
10+
- misspell
11+
- gocyclo
12+
- unconvert
13+
- dupl
14+
15+
issues:
16+
max-issues-per-linter: 50
17+
max-same-issues: 3
18+
new: false
19+
fix: false
20+
uniq-by-line: true
21+
whole-files: false
22+
23+
run:
24+
timeout: 5m
25+
tests: true
26+

internal/commands/convert.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,17 +150,18 @@ func NewFromCmd() *cobra.Command {
150150
ext := strings.ToLower(filepath.Ext(inputFile))
151151
envMap := make(map[string]string)
152152

153-
if ext == ".json" {
153+
switch ext {
154+
case ".json":
154155
if err := json.Unmarshal([]byte(data), &envMap); err != nil {
155156
fmt.Printf("Error parsing JSON: %v\n", err)
156157
os.Exit(1)
157158
}
158-
} else if ext == ".yaml" || ext == ".yml" {
159+
case ".yaml", ".yml":
159160
if err := yaml.Unmarshal([]byte(data), &envMap); err != nil {
160161
fmt.Printf("Error parsing YAML: %v\n", err)
161162
os.Exit(1)
162163
}
163-
} else {
164+
default:
164165
fmt.Printf("Error: Unsupported file format '%s'. Must be .json, .yaml, or .yml\n", ext)
165166
os.Exit(1)
166167
}

internal/parser/parser.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ func ParseEnvFile(filename string) ([]EnvVar, error) {
2121
if err != nil {
2222
return nil, fmt.Errorf("failed to open file: %w", err)
2323
}
24-
defer file.Close()
24+
defer func(file *os.File) {
25+
err := file.Close()
26+
if err != nil {
27+
return
28+
}
29+
}(file)
2530

2631
var envVars []EnvVar
2732
scanner := bufio.NewScanner(file)
@@ -69,16 +74,34 @@ func WriteEnvFile(filename string, envVars []EnvVar) error {
6974
if err != nil {
7075
return fmt.Errorf("failed to create file: %w", err)
7176
}
72-
defer file.Close()
77+
defer func(file *os.File) {
78+
err := file.Close()
79+
if err != nil {
80+
return
81+
}
82+
}(file)
7383

7484
writer := bufio.NewWriter(file)
75-
defer writer.Flush()
85+
defer func(writer *bufio.Writer) {
86+
err := writer.Flush()
87+
if err != nil {
88+
return
89+
}
90+
}(writer)
7691

7792
for _, envVar := range envVars {
7893
if envVar.Comment != "" {
79-
fmt.Fprintln(writer, envVar.Comment)
94+
_, err := fmt.Fprintln(writer, envVar.Comment)
95+
96+
if err != nil {
97+
return err
98+
}
99+
}
100+
101+
_, err := fmt.Fprintf(writer, "%s=%s\n", envVar.Key, envVar.Value)
102+
if err != nil {
103+
return err
80104
}
81-
fmt.Fprintf(writer, "%s=%s\n", envVar.Key, envVar.Value)
82105
}
83106

84107
return nil

internal/utils/utils.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ func ConfirmWithPin(message string) (bool, error) {
3030

3131
// generatePin generates a random 6-digit PIN
3232
func generatePin() string {
33-
rand.Seed(time.Now().UnixNano())
3433
return fmt.Sprintf("%06d", rand.Intn(1000000))
3534
}
3635

0 commit comments

Comments
 (0)