From f903e55cd2d07d6fb9156f7bd39db434a3342860 Mon Sep 17 00:00:00 2001
From: Serge Bazanski <q3k@q3k.org>
Date: Thu, 10 Aug 2023 19:25:49 +0200
Subject: [PATCH] main: automatically update python files

---
 main/fs.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 53 insertions(+), 8 deletions(-)

diff --git a/main/fs.c b/main/fs.c
index 98c0ad064b..c5ba063d3d 100644
--- a/main/fs.c
+++ b/main/fs.c
@@ -6,18 +6,33 @@
 #include "st3m_mode.h"
 #include "st3m_sys_data.h"
 #include "st3m_tar.h"
+#include "st3m_version.h"
 
 #include "esp_system.h"
 #include "esp_vfs.h"
 #include "esp_vfs_fat.h"
 
 static const char *TAG = "st3m-fs";
-
+static bool _updating = false;
 static const char *sysflag = "/flash/sys/.sys-installed";
 
 static void _extract_callback(const char *path) {
     char msg[256];
-    snprintf(msg, 256, "Installing %s...", path);
+    // Strip /flash/sys/ from displayed paths...
+    const char *prefix = "/flash/sys/";
+    if (strstr(path, prefix) == path) {
+        path += strlen(prefix);
+    }
+    if (_updating) {
+        snprintf(msg, 256, "Updating %s", path);
+    } else {
+        snprintf(msg, 256, "Installing %s", path);
+    }
+
+    size_t limit = 30;
+    if (strlen(msg) > limit) {
+        strlcpy(msg + limit, "...", 256 - limit);
+    }
     st3m_mode_set(st3m_mode_kind_starting, msg);
 }
 
@@ -37,10 +52,16 @@ static void _extract_sys_data(void) {
 
     FILE *f = fopen(sysflag, "w");
     assert(f != NULL);
-    fprintf(f, "remove me to reinstall /sys on next startup");
+    fprintf(f, "%s", st3m_version);
     fclose(f);
 }
 
+typedef enum {
+    sys_state_absent = 0,
+    sys_state_diff_version = 1,
+    sys_state_correct = 2,
+} sys_state_t;
+
 void flow3r_fs_init(void) {
     st3m_fs_init();
 
@@ -50,16 +71,40 @@ void flow3r_fs_init(void) {
         return;
     }
 
-    bool have_mpy = false;
+    sys_state_t state = sys_state_absent;
+    char local_version[128];
     struct stat st;
-    if (stat(sysflag, &st) == 0) {
-        have_mpy = S_ISREG(st.st_mode);
+    if (stat(sysflag, &st) == 0 && S_ISREG(st.st_mode)) {
+        state = sys_state_diff_version;
+        FILE *f = fopen(sysflag, "r");
+        size_t len = fread(local_version, 1, sizeof(local_version) - 1, f);
+        fclose(f);
+        local_version[len] = 0;
+        if (strcmp(st3m_version, local_version) == 0) {
+            state = sys_state_correct;
+        }
     }
 
-    if (!have_mpy) {
+    if (state == sys_state_absent) {
         st3m_mode_set(st3m_mode_kind_starting, "Installing /flash/sys...");
-        ESP_LOGI(TAG, "No %s on flash, preparing sys directory...", sysflag);
+        _updating = false;
+        ESP_LOGI(
+            TAG,
+            "Installing /sys/flash... (st3m version: %s, local version: none)",
+            st3m_version);
+        _extract_sys_data();
+        st3m_mode_set(st3m_mode_kind_starting,
+                      "Installed, continuing startup...");
+    }
+    if (state == sys_state_diff_version) {
+        st3m_mode_set(st3m_mode_kind_starting, "Updating /flash/sys...");
+        _updating = true;
+        ESP_LOGI(TAG,
+                 "Updating /sys/flash... (st3m version: %s, local version: %s)",
+                 st3m_version, local_version);
         _extract_sys_data();
+        st3m_mode_set(st3m_mode_kind_starting,
+                      "Updated, continuing startup...");
     }
 
     esp_err_t ret = st3m_fs_sd_mount();
-- 
GitLab