44
55new_engine <- function (config ) {
66 stopifnot(is_config(config ))
7- structure(
7+ eng <- structure(
88 list2env(
99 list (
1010 runner = NULL ,
@@ -17,11 +17,19 @@ new_engine <- function(config) {
1717 config $ socket_port
1818 ),
1919 autostart = FALSE
20- )
20+ ),
21+ logpath = tempfile(),
22+ logpos = 0L
2123 )
2224 ),
2325 class = c(" hotwater_engine" , " environment" )
2426 )
27+
28+ reg.finalizer(eng , function (e ) {
29+ try(unlink(e $ logpath ), silent = TRUE )
30+ }, onexit = TRUE )
31+
32+ eng
2533}
2634
2735run_engine <- function (engine ) {
@@ -30,7 +38,10 @@ run_engine <- function(engine) {
3038 teardown_engine(engine )
3139 buildup_engine(engine )
3240 }
33- on.exit({ teardown_engine(engine ) }) # nolint: brace_linter.
41+ on.exit({
42+ teardown_engine(engine )
43+ try(unlink(engine $ logpath ), silent = TRUE )
44+ }) # nolint: brace_linter.
3445
3546 cli_welcome()
3647 buildup_engine(engine )
@@ -45,6 +56,7 @@ run_engine <- function(engine) {
4556
4657 repeat {
4758 Sys.sleep(0.05 ) # todo, allow this to be configured at some point
59+ drain_runner_log(engine )
4860 current_state <- watch_directory(
4961 engine ,
5062 current_state ,
@@ -62,6 +74,11 @@ buildup_engine <- function(engine) {
6274 stopifnot(is_engine(engine ))
6375
6476 cli_server_start_progress(engine )
77+
78+ # just in case the logfile was deleted
79+ cat(" " , file = engine $ logpath )
80+ engine $ logpos <- 0L
81+
6582 res <- new_runner(engine )
6683
6784 if (engine $ publisher $ listener [[1L ]][[" state" ]] != " started" ) {
@@ -76,6 +93,7 @@ buildup_engine <- function(engine) {
7693 }
7794
7895 cli_watching_directory(engine )
96+ drain_runner_log(engine )
7997}
8098
8199teardown_engine <- function (engine ) {
@@ -93,4 +111,53 @@ teardown_engine <- function(engine) {
93111
94112is_engine <- function (x ) {
95113 inherits(x , " hotwater_engine" )
114+ }
115+
116+ drain_runner_log <- function (engine ) {
117+ logpath <- engine $ logpath
118+ logpos <- engine $ logpos
119+
120+ if (! file.exists(logpath )) {
121+ return ()
122+ }
123+
124+ size <- file.info(logpath )$ size
125+ if (is.na(size )) {
126+ return ()
127+ }
128+
129+ if (size < logpos ) {
130+ engine $ logpos <- 0L
131+ logpos <- 0L
132+ }
133+
134+ if (size < = logpos ) {
135+ return ()
136+ }
137+
138+ con <- file(logpath , open = " rb" )
139+ on.exit(close(con ), add = TRUE )
140+
141+ seek(con , where = logpos , origin = " start" )
142+ data <- readChar(con , nchars = size - logpos , useBytes = TRUE )
143+
144+ engine $ logpos <- size
145+
146+ if (nzchar(data )) {
147+ data <- gsub(
148+ " === HOTWATER_ERROR_BEGIN ===\\ s*([\\ s\\ S]*?)\\ s*=== HOTWATER_ERROR_END ===" ,
149+ cli :: col_red(" \\ 1" ),
150+ data ,
151+ perl = TRUE
152+ )
153+
154+ data <- gsub(
155+ " === HOTWATER_WARNING_BEGIN ===\\ s*([\\ s\\ S]*?)\\ s*=== HOTWATER_WARNING_END ===" ,
156+ cli :: col_yellow(" \\ 1" ),
157+ data ,
158+ perl = TRUE
159+ )
160+
161+ nanonext :: write_stdout(data )
162+ }
96163}
0 commit comments