code / nomsu

Lines6.6K Lua5.1K PEG1.3K make117
2 others 83
Markdown60 Bourne Again Shell23
(147 lines)
1 #!/usr/bin/env nomsu -V7.0.0
2 ###
3 This file contains code for defining ways to upgrade code between different versions
4 of Nomsu.
6 use "filesystem"
8 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 $UPGRADES = {}
11 $ACTION_UPGRADES = ({} with fallback $ -> {})
12 external:
13 (upgrade to $version via $upgrade_fn) means:
14 $UPGRADES.$version = $upgrade_fn
16 (upgrade action $stub to $version via $upgrade_fn) means:
17 $ACTION_UPGRADES.$version.$stub = $upgrade_fn
19 (upgrade $tree to $version as $body) parses as
20 upgrade to $version via ($ -> ($, with ($tree -> $body)))
22 (upgrade action $actions to $version as $body) compiles to:
23 if ($actions is "Action" syntax tree):
24 $actions = \[\$actions]
25 $lua = (Lua "")
26 for $action in $actions:
27 $replacements = {}
28 for $i in (1 to #$action):
29 if ($action.$i is "Var" syntax tree):
30 $replacements.($action.$i.1) = "\(\$tree as lua id)[\$i]"
32 define mangler
33 (make tree $t) means:
34 when:
35 ($t is "Var" syntax tree):
36 if $replacements.($t.1):
37 return $replacements.($t.1)
38 ..else:
39 external ($needs_mangle = (yes))
40 return ("
41 SyntaxTree{type=\(quote $t.type), source=\(quote "\($t.source)"), \(quote (mangle $t.1))}
42 ")
44 ($t is syntax tree):
45 $args = []
46 for ($k = $v) in $t:
47 if ((type of $k) == "a Number"):
48 $args, add (make tree $v)
49 ..else:
50 $args, add "\($k)=\(make tree $v)"
52 return "SyntaxTree{\($args, joined with ", ")}"
54 else:
55 return (quote $t)
57 unless ("\$lua" == ""):
58 $lua, add "\n"
60 $retval = (make tree $body)
61 $lua, add
62 Lua ("
63 upgrade_action_1_to_2_via(\(quote $action.stub), \($version as lua expr), function(\
64 ..\(\$tree as lua id))
65 return \$retval
66 end)
67 ")
69 return $lua
72 $tree upgraded from $start_version to $end_version
73 $tree upgraded to $end_version from $start_version
74 ] all mean:
75 unless ($tree is syntax tree): return $tree
76 ($ver as version list) means:
77 if ($ver is "Text"):
78 return (($ as number) for $ in $ver matching "[0-9]+")
79 return $ver
81 (Ver $) means:
82 if ($ is "a List"):
83 if ($.1 is "Text"):
84 return {.lib = $.1, .version = ($, from 2)}
85 return {.version = $}
86 [$lib, $ver] = ($, match "(.*)/([0-9.]+)")
87 if $lib:
88 return {.lib = $lib, .version = ($ver as version list)}
89 return {.version = ($ as version list)}
91 $start = (Ver $start_version)
92 $end = (Ver $end_version)
93 $end.lib or= $start.lib
94 assume $start.lib == $end.lib
95 $seen = {}
96 $versions = {}
97 for ($v = $) in $UPGRADES:
98 $versions.$v = (yes)
100 for ($v = $) in $ACTION_UPGRADES:
101 $versions.$v = (yes)
103 $versions = [:
104 for ($v = $) in $versions:
105 $v2 = (Ver $v)
106 if ($v2.lib == $start.lib):
107 if ($start.version < $v2.version <= $end.version): add $v
110 sort $versions by $ -> ($ as version list)
111 $curr_version = $start_version
112 for $ver in $versions:
113 $tree =
114 SyntaxTree
115 {: for ($k = $v) in $tree: add $k = ($v upgraded from $curr_version to $ver)}
117 if (($tree.type == "Action") and $ACTION_UPGRADES.$ver):
118 $(upgrade 1) = $ACTION_UPGRADES.$ver.($tree, get stub)
119 if $(upgrade 1):
120 $tree = (upgrade $tree)
121 go to (next version)
123 if $UPGRADES.$ver:
124 $tree = ($UPGRADES.$ver $tree $ver)
125 go to (next version)
127 --- (next version) ---
128 $curr_version = $ver
130 if ($tree.version != $end_version):
131 $tree = (SyntaxTree {: for ($k = $v) in $tree: add $k = $v})
132 $tree.version = $end_version
133 if $tree.shebang:
134 unless ($end_version is "Text"):
135 $end_version = ($end_version, joined with ".")
136 $tree.shebang = "#!/usr/bin/env nomsu -V\$end_version\n"
138 return $tree
140 ($tree upgraded from $start_version) means
141 $tree upgraded from $start_version to $(NOMSU VERSION)
143 ($tree upgraded to $end_version) means
144 $tree upgraded from ($tree.version or $(NOMSU VERSION)) to $end_version
146 ($tree upgraded) means
147 $tree upgraded from ($tree.version or $(NOMSU VERSION)) to $(NOMSU VERSION)