@@ -17,7 +17,7 @@ import (
17
17
18
18
const (
19
19
Author = "webdevops.io"
20
- Version = "0.5.0 "
20
+ Version = "0.5.1 "
21
21
)
22
22
23
23
type changeset struct {
@@ -48,8 +48,8 @@ var opts struct {
48
48
ModeIsReplaceLine bool
49
49
ModeIsLineInFile bool
50
50
ModeIsTemplate bool
51
- Search []string `short:"s" long:"search" required:"true" description:"search term"`
52
- Replace []string `short:"r" long:"replace" required:"true" description:"replacement term" `
51
+ Search []string `short:"s" long:"search" description:"search term"`
52
+ Replace []string `short:"r" long:"replace" description:"replacement term" `
53
53
CaseInsensitive bool `short:"i" long:"case-insensitive" description:"ignore case of pattern to match upper and lowercase characters"`
54
54
Stdin bool ` long:"stdin" description:"process stdin as input"`
55
55
Once bool ` long:"once" description:"replace search term only one in a file"`
@@ -244,6 +244,15 @@ func logError(err error) {
244
244
fmt .Fprintln (os .Stderr , "Error: %s\n " , err )
245
245
}
246
246
247
+
248
+ // Log error object as message
249
+ func logFatalErrorAndExit (err error , exitCode int ) {
250
+ fmt .Fprintln (os .Stderr , "Error: %s\n " , err )
251
+ fmt .Fprintln (os .Stderr , "" )
252
+ argparser .WriteHelp (os .Stdout )
253
+ os .Exit (exitCode )
254
+ }
255
+
247
256
// Build search term
248
257
// Compiles regexp if regexp is used
249
258
func buildSearchTerm (term string ) (* regexp.Regexp ) {
@@ -338,7 +347,7 @@ func searchFilesInPath(path string, callback func(os.FileInfo, string)) {
338
347
// --path
339
348
// --mode=...
340
349
// --once-without-match
341
- func handleSpecialCliOptions (argparser * flags. Parser , args []string ) ([]string ) {
350
+ func handleSpecialCliOptions (args []string ) ([]string ) {
342
351
// --version
343
352
if (opts .ShowVersion ) {
344
353
fmt .Printf ("goreplace version %s\n " , Version )
@@ -434,11 +443,12 @@ func parseContentAsTemplate(templateContent string, changesets []changeset) byte
434
443
435
444
tmpl , err := template .New ("template" ).Parse (templateContent )
436
445
if err != nil {
437
- logError (err )
446
+ logFatalErrorAndExit (err , 1 )
438
447
}
448
+ tmpl .Option ("missingkey=zero" )
439
449
err = tmpl .Execute (& content , & data )
440
450
if err != nil {
441
- logError (err )
451
+ logFatalErrorAndExit (err , 1 )
442
452
}
443
453
444
454
return content
@@ -458,7 +468,7 @@ func actionProcessStdinTemplate(changesets []changeset) (int) {
458
468
return 0
459
469
}
460
470
461
- func actionProcessFiles (changesets []changeset , args []string , argparser * flags. Parser ) (int ) {
471
+ func actionProcessFiles (changesets []changeset , args []string ) (int ) {
462
472
// check if there is at least one file to process
463
473
if (len (args ) == 0 ) {
464
474
if (opts .IgnoreEmpty ) {
@@ -467,11 +477,7 @@ func actionProcessFiles(changesets []changeset, args []string, argparser *flags.
467
477
os .Exit (0 )
468
478
} else {
469
479
// no files found, print error and exit with error code
470
- err := errors .New ("No files specified" )
471
- logError (err )
472
- fmt .Fprintln (os .Stderr , "" )
473
- argparser .WriteHelp (os .Stdout )
474
- return 1
480
+ logFatalErrorAndExit (errors .New ("No files specified" ), 1 )
475
481
}
476
482
}
477
483
@@ -533,17 +539,20 @@ func actionProcessFiles(changesets []changeset, args []string, argparser *flags.
533
539
return 0
534
540
}
535
541
536
- func buildChangesets (argparser * flags. Parser ) ([]changeset ){
542
+ func buildChangesets () ([]changeset ){
537
543
var changesets []changeset
538
544
545
+ if ! opts .ModeIsTemplate {
546
+ if len (opts .Search ) == 0 || len (opts .Replace ) == 0 {
547
+ // error: unequal numbers of search and replace options
548
+ logFatalErrorAndExit (errors .New ("Missing either --search or --replace for this mode" ), 1 )
549
+ }
550
+ }
551
+
539
552
// check if search and replace options have equal lenght (equal number of options)
540
553
if len (opts .Search ) != len (opts .Replace ) {
541
554
// error: unequal numbers of search and replace options
542
- err := errors .New ("Unequal numbers of search or replace options" )
543
- logError (err )
544
- fmt .Fprintln (os .Stderr , "" )
545
- argparser .WriteHelp (os .Stdout )
546
- os .Exit (1 )
555
+ logFatalErrorAndExit (errors .New ("Unequal numbers of search or replace options" ), 1 )
547
556
}
548
557
549
558
// build changesets
@@ -558,21 +567,19 @@ func buildChangesets(argparser *flags.Parser) ([]changeset){
558
567
return changesets
559
568
}
560
569
570
+ var argparser * flags.Parser
561
571
func main () {
562
- var argparser = flags .NewParser (& opts , flags .PassDoubleDash )
572
+ argparser = flags .NewParser (& opts , flags .PassDoubleDash )
563
573
args , err := argparser .Parse ()
564
574
565
- args = handleSpecialCliOptions (argparser , args )
575
+ args = handleSpecialCliOptions (args )
566
576
567
577
// check if there is an parse error
568
578
if err != nil {
569
- logError (err )
570
- fmt .Fprintln (os .Stderr , "" )
571
- argparser .WriteHelp (os .Stdout )
572
- os .Exit (1 )
579
+ logFatalErrorAndExit (err , 1 )
573
580
}
574
581
575
- changesets := buildChangesets (argparser )
582
+ changesets := buildChangesets ()
576
583
577
584
exitMode := 0
578
585
if opts .Stdin {
@@ -585,7 +592,7 @@ func main() {
585
592
}
586
593
} else {
587
594
// use and process files (see args)
588
- exitMode = actionProcessFiles (changesets , args , argparser )
595
+ exitMode = actionProcessFiles (changesets , args )
589
596
}
590
597
591
598
os .Exit (exitMode )
0 commit comments