aboutsummaryrefslogtreecommitdiff
path: root/tools/replace.nom
blob: c55793a4bb82d5947be7e05203a441f7f7c3b598 (plain)
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
#!/usr/bin/env nomsu -V4.8.8.6
#
    Tool to find and replace one tree with another.
        nomsu tools/replace.nom [-i] tree_to_replace replacement file1 file2 directory1 ...
    If "-i" is the first argument, replacements will be performed in-place. Otherwise, the
    upgraded code will be printed.

use "lib/os.nom"

%args = (command line args)
%inplace = (no)
if (%args.1 is "-i"):
    %inplace = (yes)
    %args::remove index 1

if ((size of %args) < 3):
    say "Usage: nomsu tools/replace.nom [-i] tree_to_replace replacement files..."
    lua> "os.exit(1)"

%pattern = (parse (%args::remove index 1))
%replacement = (parse (%args::remove index 1))
for %path in %args:
    for file %filename in %path:
        unless (any [%filename::matches "%.nom$", %filename == "-", %filename == "stdin"]):
            do next %filename
        %tree = (parse (read file %filename) from %filename)
        %tree2 = (%tree with %pattern ~> %replacement)
        if (%tree2 == %tree):
            say "No changes in \%filename"
            do next %filename
        
        %text = "\
            ..#!/usr/bin/env nomsu -V\(%tree.version or (Nomsu version))
            \(%tree2 as nomsu)"
        
        if:
            %inplace:
                say "Replaced in \%filename"
                write %text to file %filename
            
            else: say %text