annotate benchmark/benchmark_utils.jl @ 1313:708dbfd5edb9 tooling/benchmarks

Make hg_at_revision() return the result of f
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 27 Apr 2023 08:48:28 +0200
parents f7621dd600e4
children 0551fd71682f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
1 import PkgBenchmark
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
2 import Markdown
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
3 import Mustache
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
4 import Dates
1172
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6 import Sbplib
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
8 const sbplib_root = splitpath(pathof(Sbplib))[1:end-2] |> joinpath
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
9 const results_dir = mkpath(joinpath(sbplib_root, "benchmark/results"))
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
10 const template_path = joinpath(sbplib_root, "benchmark/result.tmpl")
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
11
1184
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
12 """
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
13 main(args...; kwargs...)
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
14
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
15 Calls `run_benchmark(args...; kwargs...)` and writes the results as an HTML file in `benchmark/results`.
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
16 See [`run_benchmark`](@ref) for possible arguments.
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
17 """
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
18 function main(args...; kwargs...)
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
19 r = run_benchmark(args...; kwargs...)
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
20 file_path = write_result_html(r)
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
21 open_in_default_browser(file_path)
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
22 end
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
23
1180
37f29a3a78dc Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1179
diff changeset
24
1184
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
25 """
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
26 run_benchmark()
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
27
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
28 Runs the benchmark suite for the current working directory and returns a `PkgBenchmark.BenchmarkResult`
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
29 """
1197
5e20c0815e07 Pass kwargs from main() and run_benchmarks() to benchmarkpkg()
Jonatan Werpers <jonatan@werpers.com>
parents: 1192
diff changeset
30 function run_benchmark(;kwargs...)
5e20c0815e07 Pass kwargs from main() and run_benchmarks() to benchmarkpkg()
Jonatan Werpers <jonatan@werpers.com>
parents: 1192
diff changeset
31 r = PkgBenchmark.benchmarkpkg(Sbplib; kwargs...)
1176
27ee001df3e5 Make run_benchmark include hg info
Jonatan Werpers <jonatan@werpers.com>
parents: 1175
diff changeset
32
1181
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
33 rev = hg_id()
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
34
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
35 return add_rev_info(r, rev)
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
36 end
1176
27ee001df3e5 Make run_benchmark include hg info
Jonatan Werpers <jonatan@werpers.com>
parents: 1175
diff changeset
37
1184
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
38 """
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
39 run_benchmark(rev)
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
40
1305
7894d29ea8fa Improve docs for run_benchmark(rev)
Jonatan Werpers <jonatan@werpers.com>
parents: 1303
diff changeset
41 Updates the repository to the given revison and runs the benchmark suite. When
7894d29ea8fa Improve docs for run_benchmark(rev)
Jonatan Werpers <jonatan@werpers.com>
parents: 1303
diff changeset
42 done, reverts the repository to the original state. `rev` can be any
7894d29ea8fa Improve docs for run_benchmark(rev)
Jonatan Werpers <jonatan@werpers.com>
parents: 1303
diff changeset
43 identifier compatible with `hg update`.
1185
6fc0adcd5b97 Add info about supported rev identifiers
Jonatan Werpers <jonatan@werpers.com>
parents: 1184
diff changeset
44
1184
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
45 Returns a `PkgBenchmark.BenchmarkResult`
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
46 """
1197
5e20c0815e07 Pass kwargs from main() and run_benchmarks() to benchmarkpkg()
Jonatan Werpers <jonatan@werpers.com>
parents: 1192
diff changeset
47 function run_benchmark(rev; kwargs...)
1181
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
48 rev_before = hg_rev()
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
49 hg_update(rev)
1197
5e20c0815e07 Pass kwargs from main() and run_benchmarks() to benchmarkpkg()
Jonatan Werpers <jonatan@werpers.com>
parents: 1192
diff changeset
50 r = run_benchmark(;kwargs...)
1181
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
51 hg_update(rev_before)
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
52
1187
2ece37edb467 Fix return value in run_benchmark(rev)
Jonatan Werpers <jonatan@werpers.com>
parents: 1186
diff changeset
53 return r
1181
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
54 end
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
55
1184
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
56 """
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
57 run_benchmark(target, baseline, f=minimum; judgekwargs=Dict())
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
58
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
59 Runs the benchmark at revisions `target` and `baseline` and compares them using `PkgBenchmark.judge`.
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
60 `f` is the function used to compare. `judgekwargs` are keyword arguments passed to `judge`.
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
61
1185
6fc0adcd5b97 Add info about supported rev identifiers
Jonatan Werpers <jonatan@werpers.com>
parents: 1184
diff changeset
62 `target` and `baseline` can be any identifier compatible with `hg update`.
6fc0adcd5b97 Add info about supported rev identifiers
Jonatan Werpers <jonatan@werpers.com>
parents: 1184
diff changeset
63
1184
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
64 Returns a `PkgBenchmark.BenchmarkJudgement`
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
65 """
1197
5e20c0815e07 Pass kwargs from main() and run_benchmarks() to benchmarkpkg()
Jonatan Werpers <jonatan@werpers.com>
parents: 1192
diff changeset
66 function run_benchmark(target, baseline, f=minimum; judgekwargs=Dict(), kwargs...)
1188
d2e73d7b417d Fix bug in runbenchmark(t,b)
Jonatan Werpers <jonatan@werpers.com>
parents: 1187
diff changeset
67 rev_before = hg_rev()
d2e73d7b417d Fix bug in runbenchmark(t,b)
Jonatan Werpers <jonatan@werpers.com>
parents: 1187
diff changeset
68 hg_update(target)
1197
5e20c0815e07 Pass kwargs from main() and run_benchmarks() to benchmarkpkg()
Jonatan Werpers <jonatan@werpers.com>
parents: 1192
diff changeset
69 t = run_benchmark(;kwargs...)
1188
d2e73d7b417d Fix bug in runbenchmark(t,b)
Jonatan Werpers <jonatan@werpers.com>
parents: 1187
diff changeset
70 hg_update(baseline)
1197
5e20c0815e07 Pass kwargs from main() and run_benchmarks() to benchmarkpkg()
Jonatan Werpers <jonatan@werpers.com>
parents: 1192
diff changeset
71 b = run_benchmark(;kwargs...)
1188
d2e73d7b417d Fix bug in runbenchmark(t,b)
Jonatan Werpers <jonatan@werpers.com>
parents: 1187
diff changeset
72 hg_update(rev_before)
1184
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
73
1188
d2e73d7b417d Fix bug in runbenchmark(t,b)
Jonatan Werpers <jonatan@werpers.com>
parents: 1187
diff changeset
74 return PkgBenchmark.judge(t,b,f; judgekwargs...)
1184
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
75 end
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
76
c06d8eb8b0f0 Add docstrings, comparing version of run_benchmark, and allow main to call any version of run_benchmark
Jonatan Werpers <jonatan@werpers.com>
parents: 1183
diff changeset
77
1181
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
78 function add_rev_info(benchmarkresult, rev)
1176
27ee001df3e5 Make run_benchmark include hg info
Jonatan Werpers <jonatan@werpers.com>
parents: 1175
diff changeset
79 return PkgBenchmark.BenchmarkResults(
1183
aefe4b551901 Fix add_rev_info
Jonatan Werpers <jonatan@werpers.com>
parents: 1181
diff changeset
80 benchmarkresult.name,
1181
f49bac53e72b Factor out function for adding mercurial rev info
Jonatan Werpers <jonatan@werpers.com>
parents: 1180
diff changeset
81 rev,
1183
aefe4b551901 Fix add_rev_info
Jonatan Werpers <jonatan@werpers.com>
parents: 1181
diff changeset
82 benchmarkresult.benchmarkgroup,
aefe4b551901 Fix add_rev_info
Jonatan Werpers <jonatan@werpers.com>
parents: 1181
diff changeset
83 benchmarkresult.date,
aefe4b551901 Fix add_rev_info
Jonatan Werpers <jonatan@werpers.com>
parents: 1181
diff changeset
84 benchmarkresult.julia_commit,
aefe4b551901 Fix add_rev_info
Jonatan Werpers <jonatan@werpers.com>
parents: 1181
diff changeset
85 benchmarkresult.vinfo,
aefe4b551901 Fix add_rev_info
Jonatan Werpers <jonatan@werpers.com>
parents: 1181
diff changeset
86 benchmarkresult.benchmarkconfig,
1176
27ee001df3e5 Make run_benchmark include hg info
Jonatan Werpers <jonatan@werpers.com>
parents: 1175
diff changeset
87 )
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
88 end
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
89
1190
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
90
1177
68445e87fa93 Use benchmark time field instead of now()
Jonatan Werpers <jonatan@werpers.com>
parents: 1176
diff changeset
91 function write_result_html(io, r)
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
92 iobuffer = IOBuffer()
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
93 PkgBenchmark.export_markdown(iobuffer, r)
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
94
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
95 parsed_md = Markdown.parse(String(take!(iobuffer)))
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
96 content = Markdown.html(parsed_md)
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
97
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
98 template = Mustache.load(template_path)
1177
68445e87fa93 Use benchmark time field instead of now()
Jonatan Werpers <jonatan@werpers.com>
parents: 1176
diff changeset
99
68445e87fa93 Use benchmark time field instead of now()
Jonatan Werpers <jonatan@werpers.com>
parents: 1176
diff changeset
100 dt = Dates.format(PkgBenchmark.date(r), "yyyy-mm-dd HH:MM:SS")
68445e87fa93 Use benchmark time field instead of now()
Jonatan Werpers <jonatan@werpers.com>
parents: 1176
diff changeset
101 Mustache.render(io, template, Dict("title"=>dt, "content"=>content))
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
102 end
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
103
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
104 function write_result_html(r)
1179
d6038ceba882 Better file names för results
Jonatan Werpers <jonatan@werpers.com>
parents: 1178
diff changeset
105 dt = Dates.format(PkgBenchmark.date(r), "yyyy-mm-dd HHMMSS")
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
106 file_path = joinpath(results_dir, dt*".html")
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
107
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
108 open(file_path, "w") do io
1177
68445e87fa93 Use benchmark time field instead of now()
Jonatan Werpers <jonatan@werpers.com>
parents: 1176
diff changeset
109 write_result_html(io, r)
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
110 end
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
111
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
112 return file_path
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
113 end
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
114
1190
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
115
1189
525015283843 Add the date function to BenchmarkJudment
Jonatan Werpers <jonatan@werpers.com>
parents: 1188
diff changeset
116 PkgBenchmark.date(j::PkgBenchmark.BenchmarkJudgement) = PkgBenchmark.date(PkgBenchmark.target_result(j))
525015283843 Add the date function to BenchmarkJudment
Jonatan Werpers <jonatan@werpers.com>
parents: 1188
diff changeset
117
1190
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
118
1175
a0ab801b62c2 Add some hg functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1174
diff changeset
119 function hg_id()
a0ab801b62c2 Add some hg functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1174
diff changeset
120 cmd = Cmd(`hg id`, dir=sbplib_root)
a0ab801b62c2 Add some hg functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1174
diff changeset
121 return readchomp(addenv(cmd, "HGPLAIN"=>""))
a0ab801b62c2 Add some hg functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1174
diff changeset
122 end
a0ab801b62c2 Add some hg functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1174
diff changeset
123
1178
5c34dfc73b37 Add function for getting the hg rev id
Jonatan Werpers <jonatan@werpers.com>
parents: 1177
diff changeset
124 function hg_rev()
5c34dfc73b37 Add function for getting the hg rev id
Jonatan Werpers <jonatan@werpers.com>
parents: 1177
diff changeset
125 cmd = Cmd(`hg id -i`, dir=sbplib_root)
5c34dfc73b37 Add function for getting the hg rev id
Jonatan Werpers <jonatan@werpers.com>
parents: 1177
diff changeset
126 return readchomp(addenv(cmd, "HGPLAIN"=>""))
5c34dfc73b37 Add function for getting the hg rev id
Jonatan Werpers <jonatan@werpers.com>
parents: 1177
diff changeset
127 end
5c34dfc73b37 Add function for getting the hg rev id
Jonatan Werpers <jonatan@werpers.com>
parents: 1177
diff changeset
128
1175
a0ab801b62c2 Add some hg functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1174
diff changeset
129 function hg_update(rev)
1186
ca26f0e7683e Make hg_update() more flexible
Jonatan Werpers <jonatan@werpers.com>
parents: 1185
diff changeset
130 cmd = Cmd(`hg update --check -r $rev`, dir=sbplib_root)
1175
a0ab801b62c2 Add some hg functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1174
diff changeset
131 run(addenv(cmd, "HGPLAIN"=>""))
1308
a8e76daaf2ae Better return for hg_update()
Jonatan Werpers <jonatan@werpers.com>
parents: 1307
diff changeset
132
a8e76daaf2ae Better return for hg_update()
Jonatan Werpers <jonatan@werpers.com>
parents: 1307
diff changeset
133 return nothing
1175
a0ab801b62c2 Add some hg functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1174
diff changeset
134 end
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
135
1307
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
136 """
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
137 hg_commit(msg; secret=false)
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
138
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
139 Make a hg commit with the provided message. If `secret` is true the commit is
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
140 in the secret phase stopping it from being pushed.
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
141 """
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
142 function hg_commit(msg; secret=false)
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
143 if secret
1309
7fc84c2f9e1d Fix flag issue in hg_commit
Jonatan Werpers <jonatan@werpers.com>
parents: 1308
diff changeset
144 cmd = Cmd(`hg commit --verbose --secret --message $msg`, dir=sbplib_root)
1307
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
145 else
1309
7fc84c2f9e1d Fix flag issue in hg_commit
Jonatan Werpers <jonatan@werpers.com>
parents: 1308
diff changeset
146 cmd = Cmd(`hg commit --verbose --message $msg`, dir=sbplib_root)
1307
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
147 end
27afd53511d4 Add flag to make commit secret in hg_commit()
Jonatan Werpers <jonatan@werpers.com>
parents: 1306
diff changeset
148
1303
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
149 out = readchomp(addenv(cmd, "HGPLAIN"=>""))
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
150
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
151 return only(match(r"committed changeset \d+:([0-9a-z]+)", out))
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
152 end
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
153
1310
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
154 """
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
155 hg_strip(rev; keep=false)
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
156
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
157 Strips the given commit from the repo. If `keep` is true, the changes of the
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
158 commit are kept in the working directory.
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
159 """
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
160 function hg_strip(rev; keep=false)
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
161 if keep
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
162 cmd = Cmd(`hg --config extensions.strip= strip --keep -r $rev`, dir=sbplib_root)
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
163 else
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
164 cmd = Cmd(`hg --config extensions.strip= strip -r $rev`, dir=sbplib_root)
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
165 end
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
166
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
167 run(addenv(cmd, "HGPLAIN"=>""))
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
168
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
169 return nothing
8754d0f06ce4 Add hg_strip()
Jonatan Werpers <jonatan@werpers.com>
parents: 1309
diff changeset
170 end
1311
5eb1d0ae0ac1 Add docs for hg_is_dirty
Jonatan Werpers <jonatan@werpers.com>
parents: 1310
diff changeset
171
5eb1d0ae0ac1 Add docs for hg_is_dirty
Jonatan Werpers <jonatan@werpers.com>
parents: 1310
diff changeset
172 """
5eb1d0ae0ac1 Add docs for hg_is_dirty
Jonatan Werpers <jonatan@werpers.com>
parents: 1310
diff changeset
173 hg_is_dirty()
5eb1d0ae0ac1 Add docs for hg_is_dirty
Jonatan Werpers <jonatan@werpers.com>
parents: 1310
diff changeset
174
5eb1d0ae0ac1 Add docs for hg_is_dirty
Jonatan Werpers <jonatan@werpers.com>
parents: 1310
diff changeset
175 Return true if the repositopry has uncommited changes.
5eb1d0ae0ac1 Add docs for hg_is_dirty
Jonatan Werpers <jonatan@werpers.com>
parents: 1310
diff changeset
176 """
1303
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
177 function hg_is_dirty()
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
178 cmd = Cmd(`hg identify --id`, dir=sbplib_root)
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
179 out = readchomp(addenv(cmd, "HGPLAIN"=>""))
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
180
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
181 return endswith(out, "+")
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
182 end
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
183
1312
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
184 """
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
185 hg_at_revision(f, rev)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
186
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
187 Update the repository to the given revision and run the function `f`. After
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
188 `f` is run the working directory is restored. If there are uncommited changes
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
189 a temporary commit will be used to save the state of the working directory.
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
190 """
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
191 function hg_at_revision(f, rev)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
192 if hg_is_dirty()
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
193 hg_with_temporary_commit() do
1313
708dbfd5edb9 Make hg_at_revision() return the result of f
Jonatan Werpers <jonatan@werpers.com>
parents: 1312
diff changeset
194 return _hg_at_revision(f, rev)
1312
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
195 end
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
196 else
1313
708dbfd5edb9 Make hg_at_revision() return the result of f
Jonatan Werpers <jonatan@werpers.com>
parents: 1312
diff changeset
197 return _hg_at_revision(f, rev)
1312
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
198 end
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
199 end
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
200
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
201 function _hg_at_revision(f, rev)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
202 @assert !hg_is_dirty()
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
203
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
204 origin_rev = hg_rev()
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
205
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
206 hg_update(rev)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
207 try
1313
708dbfd5edb9 Make hg_at_revision() return the result of f
Jonatan Werpers <jonatan@werpers.com>
parents: 1312
diff changeset
208 return f()
1312
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
209 finally
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
210 hg_update(origin_rev)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
211 end
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
212 end
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
213
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
214 """
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
215 hg_with_temporary_commit(f)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
216
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
217 Run the function `f` after making a temporary commit with the current working
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
218 directory. After `f` has finished the working directory is restored to its
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
219 original state and the temporary commit stripped.
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
220 """
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
221 function hg_with_temporary_commit(f)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
222 @assert hg_is_dirty()
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
223
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
224 origin_rev = hg_commit("[Automatic commit by julia]",secret=true)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
225
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
226 try
1313
708dbfd5edb9 Make hg_at_revision() return the result of f
Jonatan Werpers <jonatan@werpers.com>
parents: 1312
diff changeset
227 return f()
1312
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
228 finally
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
229 hg_update(origin_rev)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
230 hg_strip(origin_rev; keep=true)
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
231 end
f7621dd600e4 Add hg_at_revision()
Jonatan Werpers <jonatan@werpers.com>
parents: 1311
diff changeset
232 end
1303
2d34290fdc58 Add functions for hg commit and checking if the repo is clean
Jonatan Werpers <jonatan@werpers.com>
parents: 1302
diff changeset
233
1190
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
234
1172
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
235 # From Pluto.jl/src/webserver/WebServer.jl (2023-01-24)
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
236 function open_in_default_browser(url::AbstractString)::Bool
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
237 try
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
238 if Sys.isapple()
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
239 Base.run(`open $url`)
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
240 true
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
241 elseif Sys.iswindows() || detectwsl()
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
242 Base.run(`powershell.exe Start "'$url'"`)
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
243 true
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
244 elseif Sys.islinux()
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
245 Base.run(`xdg-open $url`)
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
246 true
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
247 else
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
248 false
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
249 end
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
250 catch ex
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
251 false
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
252 end
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
253 end
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
254
1190
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
255
1174
50c31500eb97 Clean up run_and_view
Jonatan Werpers <jonatan@werpers.com>
parents: 1172
diff changeset
256 main
1172
34446df5733f Add run_and_view script
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
257
1190
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
258 # TODO: Better logging of what is happening
1191
12b525cd3da6 More todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1190
diff changeset
259 # TODO: Improve the workflow? How?
1190
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
260
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
261 # TODO: Clean up the HTML output?
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
262 # TODO: Make the codeblocks in the table look nicer
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
263 # TODO: Change width of tables and code blocks so everything is visible
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
264 # TODO: Fix the commit id, it chops off all the important info
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
265 # TODO: Make title less verbose
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
266 # TBD: Do we have to replace export_markdown? Could use a template instead.
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
267
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
268
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
269 # TBD: How to compare against current working directory? Possible to create a temporary commit?
1302
68dd0c9f5cac Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 1197
diff changeset
270 # Make a secret temporary commit
68dd0c9f5cac Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 1197
diff changeset
271 # run benchmarkresult
68dd0c9f5cac Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 1197
diff changeset
272 # uncommit the temporary commit
68dd0c9f5cac Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 1197
diff changeset
273 # verbose flag on commit will print the revision id of the new commit.
1190
1aca445216b8 Clean up todos
Jonatan Werpers <jonatan@werpers.com>
parents: 1189
diff changeset
274 # TBD: What parts are PkgBenchmark contributing? Can it be stripped out?
1306
c14370f7c731 Add note about how to hande command exit
Jonatan Werpers <jonatan@werpers.com>
parents: 1305
diff changeset
275
c14370f7c731 Add note about how to hande command exit
Jonatan Werpers <jonatan@werpers.com>
parents: 1305
diff changeset
276
c14370f7c731 Add note about how to hande command exit
Jonatan Werpers <jonatan@werpers.com>
parents: 1305
diff changeset
277 ## Catching the exit code and errors from a command can be done with code similar to
c14370f7c731 Add note about how to hande command exit
Jonatan Werpers <jonatan@werpers.com>
parents: 1305
diff changeset
278 # proc = open(cmd)
c14370f7c731 Add note about how to hande command exit
Jonatan Werpers <jonatan@werpers.com>
parents: 1305
diff changeset
279 # if success(proc)
c14370f7c731 Add note about how to hande command exit
Jonatan Werpers <jonatan@werpers.com>
parents: 1305
diff changeset
280
c14370f7c731 Add note about how to hande command exit
Jonatan Werpers <jonatan@werpers.com>
parents: 1305
diff changeset
281 # else
c14370f7c731 Add note about how to hande command exit
Jonatan Werpers <jonatan@werpers.com>
parents: 1305
diff changeset
282
c14370f7c731 Add note about how to hande command exit
Jonatan Werpers <jonatan@werpers.com>
parents: 1305
diff changeset
283 # end