@@ -12,9 +12,70 @@ func init() {
1212 Description : "`systemctl enable` without `--now` only enables on next boot. " +
1313 "Use `--now` to enable and immediately start the service." ,
1414 Check : checkZC1265 ,
15+ Fix : fixZC1265 ,
1516 })
1617}
1718
19+ // fixZC1265 inserts ` --now` after the `enable` subcommand in a
20+ // `systemctl enable …` invocation. Same subcommand-level insertion
21+ // pattern as ZC1234's docker-run --rm.
22+ func fixZC1265 (node ast.Node , _ Violation , source []byte ) []FixEdit {
23+ cmd , ok := node .(* ast.SimpleCommand )
24+ if ! ok {
25+ return nil
26+ }
27+ ident , ok := cmd .Name .(* ast.Identifier )
28+ if ! ok || ident .Value != "systemctl" {
29+ return nil
30+ }
31+ var enableArg ast.Expression
32+ for _ , arg := range cmd .Arguments {
33+ if arg .String () == "enable" {
34+ enableArg = arg
35+ break
36+ }
37+ }
38+ if enableArg == nil {
39+ return nil
40+ }
41+ tok := enableArg .TokenLiteralNode ()
42+ off := LineColToByteOffset (source , tok .Line , tok .Column )
43+ if off < 0 || off + len ("enable" ) > len (source ) {
44+ return nil
45+ }
46+ if string (source [off :off + len ("enable" )]) != "enable" {
47+ return nil
48+ }
49+ insertAt := off + len ("enable" )
50+ insLine , insCol := offsetLineColZC1265 (source , insertAt )
51+ if insLine < 0 {
52+ return nil
53+ }
54+ return []FixEdit {{
55+ Line : insLine ,
56+ Column : insCol ,
57+ Length : 0 ,
58+ Replace : " --now" ,
59+ }}
60+ }
61+
62+ func offsetLineColZC1265 (source []byte , offset int ) (int , int ) {
63+ if offset < 0 || offset > len (source ) {
64+ return - 1 , - 1
65+ }
66+ line := 1
67+ col := 1
68+ for i := 0 ; i < offset ; i ++ {
69+ if source [i ] == '\n' {
70+ line ++
71+ col = 1
72+ continue
73+ }
74+ col ++
75+ }
76+ return line , col
77+ }
78+
1879func checkZC1265 (node ast.Node ) []Violation {
1980 cmd , ok := node .(* ast.SimpleCommand )
2081 if ! ok {
0 commit comments