Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package growlight for openSUSE:Factory 
checked in at 2025-11-06 18:13:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/growlight (Old)
 and      /work/SRC/openSUSE:Factory/.growlight.new.1980 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "growlight"

Thu Nov  6 18:13:17 2025 rev:17 rq:1315768 version:1.2.40

Changes:
--------
--- /work/SRC/openSUSE:Factory/growlight/growlight.changes      2022-12-19 
14:08:03.622600986 +0100
+++ /work/SRC/openSUSE:Factory/.growlight.new.1980/growlight.changes    
2025-11-06 18:14:56.107805978 +0100
@@ -1,0 +2,14 @@
+Wed Nov  5 10:49:18 UTC 2025 - Martin Hauke <[email protected]>
+
+- Update to version 1.2.40
+  * When given -v, growlight-readline now enables ncdirect logging.
+  * We now search for, and link against, libnotcurses-core instead
+    of libnotcurses.
+
+-------------------------------------------------------------------
+Thu Oct 30 19:48:48 UTC 2025 - Martin Hauke <[email protected]>
+
+- Update to version 1.2.39
+  * Upstream does not provide a changelog
+
+-------------------------------------------------------------------

Old:
----
  growlight-1.2.38.tar.gz

New:
----
  growlight-1.2.40.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ growlight.spec ++++++
--- /var/tmp/diff_new_pack.1rhcvt/_old  2025-11-06 18:14:57.299856269 +0100
+++ /var/tmp/diff_new_pack.1rhcvt/_new  2025-11-06 18:14:57.303856438 +0100
@@ -1,8 +1,8 @@
 #
 # spec file for package growlight
 #
-# Copyright (c) 2022 SUSE LLC
-# Copyright (c) 2020-2021, Martin Hauke <[email protected]>
+# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2020-2025, Martin Hauke <[email protected]>
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -23,7 +23,7 @@
 %bcond_without  pandoc
 %endif
 Name:           growlight
-Version:        1.2.38
+Version:        1.2.40
 Release:        0
 Summary:        Disk manipulation and system setup tool
 License:        GPL-3.0-or-later

++++++ growlight-1.2.38.tar.gz -> growlight-1.2.40.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/.drone.yml 
new/growlight-1.2.40/.drone.yml
--- old/growlight-1.2.38/.drone.yml     2021-12-04 21:03:38.000000000 +0100
+++ new/growlight-1.2.40/.drone.yml     2025-11-05 09:32:12.000000000 +0100
@@ -5,11 +5,12 @@
 
 steps:
 - name: debian-build
-  image: dankamongmen/unstable_builder:2021-11-14a
+  image: dankamongmen/unstable_builder:2022-01-29a
   commands:
     - export LANG=en_US.UTF-8
+    - export TERM=xterm
     - mkdir build
     - cd build
     - cmake -DUSE_LIBZFS=off ..
     - make
-    - make test
+    - ctest -v --output-on-failure
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/.github/workflows/ubuntu_test.yml 
new/growlight-1.2.40/.github/workflows/ubuntu_test.yml
--- old/growlight-1.2.38/.github/workflows/ubuntu_test.yml      1970-01-01 
01:00:00.000000000 +0100
+++ new/growlight-1.2.40/.github/workflows/ubuntu_test.yml      2025-11-05 
09:32:12.000000000 +0100
@@ -0,0 +1,62 @@
+---
+name: Ubuntu
+
+on:
+  pull_request:
+  push:
+    branches:
+      - master
+
+jobs:
+  tests:
+    env:
+      COLORTERM: truecolor
+      NPROC: 2
+      TERM: xterm
+    name: 🐧 build, test, & install
+    runs-on: ubuntu-latest
+
+    steps:
+
+      - name: Install tools and libraries via APT
+        run: |
+          sudo apt update
+          sudo apt install -y \
+            build-essential \
+            cmake \
+            nettle-dev \
+            libatasmart-dev \
+            libnotcurses-dev \
+            libcap-dev \
+            libcryptsetup-dev \
+            libblkid-dev \
+            libdevmapper-dev \
+            nettle-dev \
+            libudev-dev \
+            libpci-dev \
+            libpciaccess-dev \
+            doctest-dev \
+            pandoc
+
+      - uses: actions/checkout@v2
+
+      - name: cmake
+        run: |
+          mkdir build && cd build
+          cmake .. \
+            -DCMAKE_BUILD_TYPE=Release -DUSE_LIBZFS=off
+
+      - name: make
+        run: |
+          cd build
+          make -j${NPROC}
+
+      - name: ctest
+        run: |
+          cd build
+          ctest --output-on-failure
+
+      - name: make install
+        run: |
+          cd build
+          sudo make install
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/CMakeLists.txt 
new/growlight-1.2.40/CMakeLists.txt
--- old/growlight-1.2.38/CMakeLists.txt 2021-12-04 21:03:38.000000000 +0100
+++ new/growlight-1.2.40/CMakeLists.txt 2025-11-05 09:32:12.000000000 +0100
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 3.14)
-project(growlight VERSION 1.2.38
+project(growlight VERSION 1.2.40
   DESCRIPTION "Block device and filesystem manager"
   HOMEPAGE_URL "https://nick-black.com/dankwiki/index.php/Growlight";
   LANGUAGES C CXX)
@@ -34,8 +34,8 @@
 find_package(PkgConfig REQUIRED)
 find_package(Threads)
 set_package_properties(Threads PROPERTIES TYPE REQUIRED)
-find_package(Notcurses 3.0.0 CONFIG)
-set_package_properties(Notcurses PROPERTIES TYPE REQUIRED)
+find_package(NotcursesCore 3.0.5 CONFIG)
+set_package_properties(NotcursesCore PROPERTIES TYPE REQUIRED)
 pkg_check_modules(LIBATASMART REQUIRED libatasmart>=0.19)
 pkg_check_modules(LIBBLKID REQUIRED blkid>=2.20.1)
 pkg_check_modules(LIBCAP REQUIRED libcap>=2.24)
@@ -173,6 +173,11 @@
 )
 endif()
 
+add_test(
+  NAME blockdev-verbose
+  COMMAND sh -c "echo 'blockdev -v' | ./growlight-readline -v --notroot"
+)
+
 # Pandoc documentation (man pages)
 if(USE_PANDOC)
   file(GLOB MANSOURCE8 CONFIGURE_DEPENDS doc/man/man8/*.md)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/README.md 
new/growlight-1.2.40/README.md
--- old/growlight-1.2.38/README.md      2021-12-04 21:03:38.000000000 +0100
+++ new/growlight-1.2.40/README.md      2025-11-05 09:32:12.000000000 +0100
@@ -22,7 +22,7 @@
  - libcryptsetup 2.1.5+
  - libdevmapper 1.02.74+
  - libnettle 3.5.1+
- - libnotcurses 3.0.0+
+ - libnotcurses 3.0.5+
  - libpci 3.1.9+
  - libpciaccess 0.13.1+
  - libudev 175+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/growlight-1.2.38/doc/man/man8/growlight-readline.8.md 
new/growlight-1.2.40/doc/man/man8/growlight-readline.8.md
--- old/growlight-1.2.38/doc/man/man8/growlight-readline.8.md   2021-12-04 
21:03:38.000000000 +0100
+++ new/growlight-1.2.40/doc/man/man8/growlight-readline.8.md   2025-11-05 
09:32:12.000000000 +0100
@@ -1,6 +1,6 @@
 % growlight-readline(8)
 % nick black <[email protected]>
-% v1.2.38
+% v1.2.40
 
 # NAME
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/doc/man/man8/growlight.8.md 
new/growlight-1.2.40/doc/man/man8/growlight.8.md
--- old/growlight-1.2.38/doc/man/man8/growlight.8.md    2021-12-04 
21:03:38.000000000 +0100
+++ new/growlight-1.2.40/doc/man/man8/growlight.8.md    2025-11-05 
09:32:12.000000000 +0100
@@ -1,6 +1,6 @@
 % growlight(8)
 % nick black <[email protected]>
-% v1.2.38
+% v1.2.40
 
 # NAME
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/src/gpt.c 
new/growlight-1.2.40/src/gpt.c
--- old/growlight-1.2.38/src/gpt.c      2021-12-04 21:03:38.000000000 +0100
+++ new/growlight-1.2.40/src/gpt.c      2025-11-05 09:32:12.000000000 +0100
@@ -18,7 +18,8 @@
 #define LBA_SIZE 512u
 #define MBR_SIZE (LBA_SIZE - MBR_OFFSET)
 
-static const unsigned char GPT_PROTECTIVE_MBR[LBA_SIZE - MBR_OFFSET] =
+static const unsigned char __attribute__ ((nonstring))
+GPT_PROTECTIVE_MBR[LBA_SIZE - MBR_OFFSET] =
  "\x00\x00\x00\x00\x00\x00"  // 6 bytes of zeros
  "\x80"                      // bootable (violation of GPT spec, but some
                              //  BIOS/MBR *and* UEFI won't boot otherwise)
@@ -32,7 +33,8 @@
  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  "\x55\xaa";                 // MBR signature
 
-static const unsigned char gpt_signature[8] =
+static const unsigned char __attribute__ ((nonstring))
+gpt_signature[8] =
  "\x45\x46\x49\x20\x50\x41\x52\x54";
 
 uint32_t host_to_le32(uint32_t x){
@@ -338,7 +340,6 @@
 const_map_gpt(const device *d, size_t *mapsize, int *fd, size_t lbasize){
   const int pgsize = getpagesize();
   const unsigned gptlbas = 1 + (MINIMUM_GPT_ENTRIES * sizeof(struct gpt_entry) 
/ lbasize);
-  uint64_t off;
   void *map;
 
   if(pgsize < 0){
@@ -351,7 +352,7 @@
   }
   // The first copy goes into LBA 1. Calculate offset into map due to
   // lbasize possibly (probably) not equalling the page size.
-  if((off = lbasize % pgsize) == 0){
+  if(lbasize % pgsize == 0){
     *mapsize = 0;
   }else{
     *mapsize = lbasize;
@@ -380,7 +381,6 @@
 map_gpt(device *d, size_t *mapsize, int *fd, size_t lbasize){
   const int pgsize = getpagesize();
   const unsigned gptlbas = 1 + (MINIMUM_GPT_ENTRIES * sizeof(struct gpt_entry) 
/ lbasize);
-  uint64_t off;
   void *map;
 
   if(pgsize < 0){
@@ -397,7 +397,7 @@
   }
   // The first copy goes into LBA 1. Calculate offset into map due to
   // lbasize possibly (probably) not equalling the page size.
-  if((off = lbasize % pgsize) == 0){
+  if(lbasize % pgsize == 0){
     *mapsize = 0;
   }else{
     *mapsize = lbasize;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/src/growlight.c 
new/growlight-1.2.40/src/growlight.c
--- old/growlight-1.2.38/src/growlight.c        2021-12-04 21:03:38.000000000 
+0100
+++ new/growlight-1.2.40/src/growlight.c        2025-11-05 09:32:12.000000000 
+0100
@@ -325,8 +325,8 @@
       data = 0;
       if( (pcicap = pci_find_cap(pcidev, PCI_CAP_ID_EXP, PCI_CAP_NORMAL)) ){
         data = pci_read_word(pcidev, pcicap->addr + PCI_EXP_LNKSTA);
-      }else if( (pcicap = pci_find_cap(pcidev, PCI_CAP_ID_MSI, 
PCI_CAP_NORMAL)) ){
-        // FIXME?
+      //}else if( (pcicap = pci_find_cap(pcidev, PCI_CAP_ID_MSI, 
PCI_CAP_NORMAL)) ){
+      // FIXME?
       }
       if(data){
         c->pcie.gen = data & PCI_EXP_LNKSTA_SPEED;
@@ -1441,7 +1441,6 @@
       verbf("Watching %s on fd %d\n", dfp, *wd);
     }
   }
-  r = 0;
   if((dir = opendir(dfp)) == NULL){
     diag("Couldn't open %s (%s)\n", dfp, strerror(errno));
     if(fd >= 0){ inotify_rm_watch(fd, *wd); }
@@ -1501,14 +1500,14 @@
 
 static void
 version(const char *name){
-  diag("%s version %s\n", basename(name), VERSION);
+  diag("%s version %s\n", name, VERSION);
 }
 
 static void
 usage(const char *name, int disphelp){
   diag("usage: %s [ -h|--help ] [ -v|--verbose ] [ -V|--version ]\n"
     "\t[ -t|--target=path ] [ --notroot ] [ -i|--import ]%s\n",
-    basename(name), disphelp ? " [ --disphelp ]" : "");
+    name, disphelp ? " [ --disphelp ]" : "");
 }
 
 static int
@@ -1618,11 +1617,10 @@
           assert(events[r].events == EPOLLIN);
           while((s = read(em->ifd, buf, buflen)) > 0){
             const struct inotify_event *in;
-            unsigned idx = 0;
 
-            if(s - idx >= (ptrdiff_t)sizeof(*in)){
-              in = (struct inotify_event *)(buf + idx);
-              idx += sizeof(*in);
+            // FIXME can there only be one event per read buffer?
+            if(s >= (ptrdiff_t)sizeof(*in)){
+              in = (struct inotify_event *)(buf);
 
               if(in->len == 0){
                 diag("Nil-file event on unknown watch desc %d\n", in->wd);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/src/mounts.c 
new/growlight-1.2.40/src/mounts.c
--- old/growlight-1.2.38/src/mounts.c   2021-12-04 21:03:38.000000000 +0100
+++ new/growlight-1.2.40/src/mounts.c   2025-11-05 09:32:12.000000000 +0100
@@ -145,8 +145,93 @@
   return -1;
 }
 
+static int
+handle_mount(const glightui *gui, const char* mnt, const char* dev, const 
char* ops, char** fs){
+  struct statvfs vfs;
+  device *d;
+
+  if(statvfs(mnt, &vfs)){
+    int skip = 0;
+
+    // We might have mounted a new target atop or above an
+    // already existing one,  in which case we'll need
+    // possibly recreate the directory structure on the
+    // newly-mounted filesystem.
+    if(growlight_target){
+      if(strncmp(mnt, growlight_target, strlen(growlight_target)) == 0){
+        if(make_parent_directories(mnt) == 0){
+          skip = 1;
+        } // FIXME else remount? otherwise writes
+        // go to new filesystem rather than old...?
+      }
+    }
+    if(!skip){
+      diag("Couldn't stat fs %s (%s?)\n", mnt, strerror(errno));
+      return 0;
+    }
+  }
+  if(*dev != '/'){ // have to get zfs's etc
+    if(fstype_virt_p(*fs)){
+      return 0;
+    }
+    if((d = lookup_device(dev)) == NULL){
+      verbf("virtfs %s at %s\n", *fs, mnt);
+      return 0;
+    }
+  }else{
+    const char *rp = dev;
+    struct stat st;
+    if(lstat(rp, &st) == 0){
+      if(S_ISLNK(st.st_mode)){
+        char buf[PATH_MAX + 1];
+        int r;
+        if((r = readlink(dev, buf, sizeof(buf))) < 0){
+          diag("Couldn't deref %s (%s?)\n", dev, strerror(errno));
+          return 0;
+        }
+        if((size_t)r >= sizeof(buf)){
+          diag("Name too long for %s (%d?)\n", dev, r);
+          return 0;
+        }
+        buf[r] = '\0';
+        rp = buf;
+      }
+    }
+    if((d = lookup_device(rp)) == NULL){
+      return 0;
+    }
+  }
+  if(d->mnttype && strcmp(d->mnttype, *fs)){
+    diag("Already had mounttype for %s: %s (got %s)\n",
+        d->name, d->mnttype, *fs);
+    free(d->mnttype);
+    d->mnttype = NULL;
+    free_stringlist(&d->mntops);
+    free_stringlist(&d->mnt);
+    d->mnttype = *fs;
+    *fs = NULL;
+  }
+  fs = NULL;
+  if(add_string(&d->mnt, mnt)){
+    return -1;
+  }
+  if(add_string(&d->mntops, ops)){
+    return -1;
+  }
+  d->mntsize = (uintmax_t)vfs.f_bsize * vfs.f_blocks;
+  if(d->layout == LAYOUT_PARTITION){
+    d = d->partdev.parent;
+  }
+  d->uistate = gui->block_event(d, d->uistate);
+  if(growlight_target){
+    if(strcmp(mnt, growlight_target) == 0){
+      mount_target();
+    }
+  }
+  return 0;
+}
+
 int parse_mounts(const glightui *gui, const char *fn){
-  char *mnt, *dev, *ops, *fs;
   off_t len, idx;
   char *map;
   int fd;
@@ -155,111 +240,25 @@
     return -1;
   }
   idx = 0;
-  dev = mnt = fs = ops = NULL;
+  int ret = 0;
   while(idx < len){
-    char buf[PATH_MAX + 1];
-    struct statvfs vfs;
-    struct stat st;
-    device *d;
-    char *rp;
+    char *mnt, *dev, *ops, *fs;
     int r;
 
-    free(dev); free(mnt); free(fs); free(ops);
-    dev = mnt = fs = ops = NULL; // don't goto double-free()
+    dev = mnt = fs = ops = NULL;
     if((r = parse_mount(map + idx, len - idx, &dev, &mnt, &fs, &ops)) < 0){
-      goto err;
+      ret = -1;
+      break;
     }
     idx += r;
-    if(statvfs(mnt, &vfs)){
-      int skip = 0;
-
-      // We might have mounted a new target atop or above an
-      // already existing one,  in which case we'll need
-      // possibly recreate the directory structure on the
-      // newly-mounted filesystem.
-      if(growlight_target){
-        if(strncmp(mnt, growlight_target, strlen(growlight_target)) == 0){
-          if(make_parent_directories(mnt) == 0){
-            skip = 1;
-          } // FIXME else remount? otherwise writes
-          // go to new filesystem rather than old...?
-        }
-      }
-      if(!skip){
-        diag("Couldn't stat fs %s (%s?)\n", mnt, strerror(errno));
-        continue;
-      }
-    }
-    if(*dev != '/'){ // have to get zfs's etc
-      if(fstype_virt_p(fs)){
-        continue;
-      }
-      if((d = lookup_device(dev)) == NULL){
-        verbf("virtfs %s at %s\n", fs, mnt);
-        continue;
-      }
-    }else{
-      rp = dev;
-      if(lstat(rp, &st) == 0){
-        if(S_ISLNK(st.st_mode)){
-          if((r = readlink(dev, buf, sizeof(buf))) < 0){
-            diag("Couldn't deref %s (%s?)\n", dev, strerror(errno));
-            continue;
-          }
-          if((size_t)r >= sizeof(buf)){
-            diag("Name too long for %s (%d?)\n", dev, r);
-            continue;
-          }
-          buf[r] = '\0';
-          rp = buf;
-        }
-      }
-      if((d = lookup_device(rp)) == NULL){
-        continue;
-      }
-    }
-    free(dev);
-    dev = NULL;
-    if(d->mnttype && strcmp(d->mnttype, fs)){
-      diag("Already had mounttype for %s: %s (got %s)\n",
-          d->name, d->mnttype, fs);
-      free(d->mnttype);
-      d->mnttype = NULL;
-      free_stringlist(&d->mntops);
-      free_stringlist(&d->mnt);
-      d->mnttype = fs;
-    }else{
-      free(fs);
-    }
-    fs = NULL;
-    if(add_string(&d->mnt, mnt)){
-      goto err;
-    }
-    if(add_string(&d->mntops, ops)){
-      goto err;
-    }
-    d->mntsize = (uintmax_t)vfs.f_bsize * vfs.f_blocks;
-    if(d->layout == LAYOUT_PARTITION){
-      d = d->partdev.parent;
-    }
-    d->uistate = gui->block_event(d, d->uistate);
-    if(growlight_target){
-      if(strcmp(mnt, growlight_target) == 0){
-        mount_target();
-      }
+    if(handle_mount(gui, mnt, dev, ops, &fs)){
+      ret = -1; // don't exit out of loop
     }
+    free(dev); free(mnt); free(fs); free(ops);
   }
-  free(dev); free(mnt); free(fs); free(ops);
-  dev = mnt = fs = ops = NULL;
   munmap_virt(map, len);
   close(fd);
-  return 0;
-
-err:
-  diag("Error parsing %s\n", fn);
-  munmap_virt(map, len);
-  close(fd);
-  return -1;
+  return ret;
 }
 
 int mmount(device *d, const char *targ, unsigned mntops, const void *data){
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/src/notcurses/notcurses.c 
new/growlight-1.2.40/src/notcurses/notcurses.c
--- old/growlight-1.2.38/src/notcurses/notcurses.c      2021-12-04 
21:03:38.000000000 +0100
+++ new/growlight-1.2.40/src/notcurses/notcurses.c      2025-11-05 
09:32:12.000000000 +0100
@@ -780,7 +780,7 @@
 // is managed here; only the rows needed for display ought be provided.
 static int
 new_display_panel(struct ncplane* nc, struct panel_state* ps,
-                  int rows, int cols, const char* hstr,
+                  int rows, unsigned cols, const char* hstr,
                   const char* bstr, int borderpair){
   unsigned ybelow, yabove;
   unsigned x, y;
@@ -1685,7 +1685,6 @@
   for(unsigned z = 1 ; z < maxz ; ++z){
     unsigned op = ((z - 1) + fs->scrolloff) % fs->opcount;
 
-    assert(op >= 0);
     assert(op < fs->opcount);
     ncplane_off_styles(fsw, NCSTYLE_BOLD);
     compat_set_fg(fsw, FORMBORDER_COLOR);
@@ -1738,7 +1737,6 @@
   for(unsigned z = 1 ; z < maxz ; ++z){
     unsigned op = ((z - 1) + fs->scrolloff) % fs->opcount;
 
-    assert(op >= 0);
     assert(op < fs->opcount);
     ncplane_off_styles(fs->p, NCSTYLE_BOLD);
     compat_set_fg(fs->p, FORMBORDER_COLOR);
@@ -1782,7 +1780,6 @@
   for(unsigned z = 1 ; z < rows - 3 ; ++z){
     unsigned op = ((z - 1) + fs->scrolloff) % fs->opcount;
 
-    assert(op >= 0);
     assert(op < fs->opcount);
     compat_set_fg(fs->p, FORMTEXT_COLOR);
     cmvwprintw(fs->p, z + 1, START_COL * 2, "%-*.*s ",
@@ -1811,7 +1808,7 @@
   ncplane_dim_yx(n, NULL, &cols);
   --cols;
   tot = 0;
-  for(y = 0 ; (unsigned)y < sizeof(linepre) / sizeof(*linepre) ; ++y){
+  for(y = 0 ; y < sizeof(linepre) / sizeof(*linepre) ; ++y){
     while(isspace(text[tot])){
       ++tot;
     }
@@ -1861,9 +1858,9 @@
   compat_set_fg(ps->n, FORMBORDER_COLOR);
   bevel_all(ps->n);
   compat_set_fg(ps->n, FORMTEXT_COLOR);
-  do{
+  while(y--){
     ncplane_printf_yx(ps->n, y + 1, 1, "%.*s", linelen[y], text + linepre[y]);
-  }while(y--);
+  }
   screen_update();
   return ps;
 }
@@ -2143,7 +2140,7 @@
 void raise_str_form(const char* str, void (*fxn)(const char*),
                     const char* def, const char* text){
   struct form_state* fs;
-  int cols;
+  unsigned cols;
   unsigned x, y;
 
   assert(str && fxn);
@@ -2272,7 +2269,7 @@
       if(zz >= *selections){
         typeof(*selarray) tmp;
 
-        if((tmp = realloc(*selarray, sizeof(*selarray) * (*selections + 1))) 
== NULL){
+        if((tmp = realloc(*selarray, sizeof(**selarray) * (*selections + 1))) 
== NULL){
           free(fo[zz].option);
           free(fo[zz].desc);
           goto err;
@@ -2532,7 +2529,7 @@
       return;
     }
     raise_form("select a filesystem type", fs_callback, ops_fs,
-        opcount, defidx, FSTYPE_TEXT);
+               opcount, defidx, FSTYPE_TEXT);
     return;
   }
   fs_do(name);
@@ -2581,6 +2578,7 @@
     return NULL;
   }
   *count = 0;
+  *defidx = 0;
   for(pt = ptypes ; pt->name ; ++pt){
     const size_t KEYSIZE = 5; // 4 hex digit code
     char *key, *desc;
@@ -2713,6 +2711,7 @@
   if(mbsrtowcs(wstr, &n, wcs + 1, &ps) != wcs){
     locked_diag("Error converting multibyte '%s'", name);
     cleanup_new_partition();
+    free(wstr);
     return;
   }
   sps = show_splash(L"Creating partition...");
@@ -2854,7 +2853,8 @@
   }
   if(psects == NULL){ // go back to partition type
     struct form_option *ops_ptype;
-    int opcount, defidx;
+    int opcount;
+    int defidx;
 
     if((ops_ptype = ptype_table(b->d, &opcount, pending_ptype, &defidx)) == 
NULL){
       if(opcount == 0){
@@ -4289,7 +4289,7 @@
       if(zz >= *selections){
         typeof(*selarray) tmp;
 
-        if((tmp = realloc(*selarray, sizeof(*selarray) * (*selections + 1))) 
== NULL){
+        if((tmp = realloc(*selarray, sizeof(**selarray) * (*selections + 1))) 
== NULL){
           free(fo[zz].option);
           free(fo[zz].desc);
           goto err;
@@ -4399,7 +4399,7 @@
     if(flags & ul){
       typeof(*selarray) tmp;
 
-      if((tmp = realloc(*selarray, sizeof(*selarray) * (*selections + 1))) == 
NULL){
+      if((tmp = realloc(*selarray, sizeof(**selarray) * (*selections + 1))) == 
NULL){
         // FIXME backfree
         return -1;
       }
@@ -5713,7 +5713,7 @@
 // b->zone->p: partition
 static void
 update_blockobj(blockobj* b, device* d){
-  zobj *z, *lastz, *firstchoice;
+  zobj *z, *lastz, *firstchoice, *tmpz;
   uintmax_t sector;
   int zonesel = -1; // -1 for no choice (b->zone == NULL on entry)
   int zones;
@@ -5737,38 +5737,43 @@
     sector = d->size / d->logsec + 1;
   }else{
     if( (sector = first_usable_sector(d)) ){
-      if((z = create_zobj(z, zones, zones, sector - 1, NULL, REP_METADATA)) == 
NULL){
+      if((tmpz = create_zobj(z, zones, zones, sector - 1, NULL, REP_METADATA)) 
== NULL){
         goto err;
       }
+      z = tmpz;
       ++zones;
     }
   }
   for(p = d->parts ; p ; p = p->next){
     if(sector != p->partdev.fsector){
-      if((z = create_zobj(z, zones, sector, p->partdev.fsector - 1, NULL, 
REP_EMPTY)) == NULL){
+      if((tmpz = create_zobj(z, zones, sector, p->partdev.fsector - 1, NULL, 
REP_EMPTY)) == NULL){
         goto err;
       }
+      z = tmpz;
       ++zones;
     }
-    if((z = create_zobj(z, zones, p->partdev.fsector, p->partdev.lsector, p, 
L'\0')) == NULL){
+    if((tmpz = create_zobj(z, zones, p->partdev.fsector, p->partdev.lsector, 
p, L'\0')) == NULL){
       goto err;
     }
+    z = tmpz;
     ++zones;
     sector = p->partdev.lsector + 1;
   }
   if(d->logsec && d->size){
     if(sector < d->size / d->logsec){
       if(sector < last_usable_sector(d) + 1){
-        if((z = create_zobj(z, zones, sector, last_usable_sector(d), NULL, 
REP_EMPTY)) == NULL){
+        if((tmpz = create_zobj(z, zones, sector, last_usable_sector(d), NULL, 
REP_EMPTY)) == NULL){
           goto err;
         }
+        z = tmpz;
         ++zones;
         sector = last_usable_sector(d);
       }
       if(sector < d->size / d->logsec){
-        if((z = create_zobj(z, zones, sector, d->size / d->logsec - 1, NULL, 
REP_METADATA)) == NULL){
+        if((tmpz = create_zobj(z, zones, sector, d->size / d->logsec - 1, 
NULL, REP_METADATA)) == NULL){
           goto err;
         }
+        z = tmpz;
         ++zones;
         sector = d->size / d->logsec;
       }
@@ -5967,7 +5972,7 @@
   cols = fs->longop; // FIXME? 40 for input currently
   struct ncplane* stdn = notcurses_stdplane(NC);
   ncplane_dim_yx(stdn, &y, &x);
-  assert(x >= cols + 3);
+  assert(x >= (unsigned)cols + 3);
   assert(y >= 3);
   // It could be more than this due to line breaking, so add a fudge
   // factor of 2...FIXME
@@ -6017,6 +6022,7 @@
   raise_info_form("Press any key to continue...", buf);
   unlock_notcurses_growlight();
   va_end(v);
+  free(buf);
 }
 
 static struct ncmenu*
@@ -6055,17 +6061,17 @@
   struct ncmenu_section sections[] = {
     { .name = "Growlight", .items = glight_items,
       .itemcount = sizeof(glight_items) / sizeof(*glight_items),
-      .shortcut = { .id = 'g', .alt = true, }, },
+      .shortcut = { .id = 'g', .modifiers = NCKEY_MOD_ALT, }, },
     { .name = "Blockdevs", .items = block_items,
       .itemcount = sizeof(block_items) / sizeof(*block_items),
-      .shortcut = { .id = 'b', .alt = true, }, },
+      .shortcut = { .id = 'b', .modifiers = NCKEY_MOD_ALT, }, },
     { .name = "Partitions", .items = part_items,
       .itemcount = sizeof(part_items) / sizeof(*part_items),
-      .shortcut = { .id = 'p', .alt = true, }, },
+      .shortcut = { .id = 'p', .modifiers = NCKEY_MOD_ALT, }, },
     { .name = NULL, .items = NULL, .itemcount = 0, },
     { .name = "Info", .items = help_items,
       .itemcount = sizeof(help_items) / sizeof(*help_items),
-      .shortcut = { .id = 'i', .alt = true, }, },
+      .shortcut = { .id = 'i', .modifiers = NCKEY_MOD_ALT, }, },
   };
   struct ncmenu_options mopts = {
     .sections = sections,
@@ -6104,7 +6110,6 @@
   pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
   notcurses_options opts = { };
   opts.flags = NCOPTION_INHIBIT_SETLOCALE;
-  // opts.loglevel = NCLOGLEVEL_TRACE;
   if((NC = notcurses_core_init(&opts, stdout)) == NULL){
     return EXIT_FAILURE;
   }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/src/ptypes.c 
new/growlight-1.2.40/src/ptypes.c
--- old/growlight-1.2.38/src/ptypes.c   2021-12-04 21:03:38.000000000 +0100
+++ new/growlight-1.2.40/src/ptypes.c   2025-11-05 09:32:12.000000000 +0100
@@ -68,6 +68,11 @@
                .gpt_guid = 
"\x39\x33\xA6\x8D\x07\x00\xC0\x60\xC4\x36\x08\x3A\xC8\x23\x09\x08",
                .mbr_code = 0,
        }, {
+               .code = 0x8400,
+         .name = "Intel Rapid Start Technology",
+               .gpt_guid = 
"\xD3\xBF\xE2\xDE\x3D\xAF\x11\xDF\xBA\x40\xE3\xA5\x56\xD8\x95\x93",
+               .mbr_code = 0x84,
+       }, {
                .code = 0x8e00,
                .name = "Linux Logical Volume Manager",
                .gpt_guid = 
"\x79\xD3\xD6\xE6\x07\xF5\xC2\x44\xA2\x3C\x23\x8F\x2A\x3D\xF9\x28",
@@ -376,17 +381,17 @@
 
 // Pass in the common code, get the scheme-specific identifier filled in.
 // Returns 0 for a valid code, or -1 if there's no ident for the scheme.
-int get_gpt_guid(unsigned code,void *guid){
+int get_gpt_guid(unsigned code, void *guid){
        const ptype *pt;
 
        for(pt = ptypes ; pt->name ; ++pt){
                if(pt->code == code){
                        static const uint8_t zguid[GUIDSIZE] = {0};
 
-                       if(memcmp(pt->gpt_guid,zguid,sizeof(zguid)) == 0){
+                       if(memcmp(pt->gpt_guid, zguid, sizeof(zguid)) == 0){
                                return -1;
                        }
-                       memcpy(guid,pt->gpt_guid,GUIDSIZE);
+                       memcpy(guid, pt->gpt_guid, GUIDSIZE);
                        return 0;
                }
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/src/ptypes.h 
new/growlight-1.2.40/src/ptypes.h
--- old/growlight-1.2.38/src/ptypes.h   2021-12-04 21:03:38.000000000 +0100
+++ new/growlight-1.2.40/src/ptypes.h   2025-11-05 09:32:12.000000000 +0100
@@ -16,7 +16,8 @@
 typedef struct ptype {
        uint16_t code;                  // [fg]disk/parted code (2 bytes)
        const char *name;               // Human-readable name
-       uint8_t gpt_guid[GUIDSIZE];     // GPT Type GUID (16 bytes) or 0s
+       // GPT Type GUID (16 bytes) or 0s
+       uint8_t gpt_guid[GUIDSIZE] __attribute__ ((nonstring));
        uint8_t mbr_code;               // MBR code (1 byte) or 0
        unsigned aggregable;            // Can it go into an aggregate?
 } ptype;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/src/readline/readline.c 
new/growlight-1.2.40/src/readline/readline.c
--- old/growlight-1.2.38/src/readline/readline.c        2021-12-04 
21:03:38.000000000 +0100
+++ new/growlight-1.2.40/src/readline/readline.c        2025-11-05 
09:32:12.000000000 +0100
@@ -2170,8 +2170,11 @@
   if(growlight_init(argc, argv, &ui, NULL)){
     return EXIT_FAILURE;
   }
-  const uint64_t flags = NCDIRECT_OPTION_INHIBIT_SETLOCALE;
-  if((ncd = ncdirect_init(NULL, NULL, flags)) == NULL){
+  uint64_t flags = NCDIRECT_OPTION_INHIBIT_SETLOCALE;
+  if(verbose){
+    flags |= NCDIRECT_OPTION_VERBOSE;
+  }
+  if((ncd = ncdirect_core_init(NULL, NULL, flags)) == NULL){
     fprintf(stderr, "Couldn't set up notcurses\n");
     growlight_stop(EXIT_FAILURE);
     return EXIT_FAILURE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/src/target.c 
new/growlight-1.2.40/src/target.c
--- old/growlight-1.2.38/src/target.c   2021-12-04 21:03:38.000000000 +0100
+++ new/growlight-1.2.40/src/target.c   2025-11-05 09:32:12.000000000 +0100
@@ -153,13 +153,13 @@
        }
        if((fstab = dump_targets()) == NULL){
                diag("Couldn't write targets to %s/etc/fstab (%s?)\n", 
growlight_target, strerror(errno));
-               close(fd);
+               fclose(fp);
                return -1;
        }
        if((r = fprintf(fp, "%s", fstab)) < 0 || (size_t)r < strlen(fstab)){
                diag("Couldn't write data to %s/etc/fstab (%s?)\n", 
growlight_target, strerror(errno));
                free(fstab);
-               close(fd);
+               fclose(fp);
                return -1;
        }
        free(fstab);
@@ -181,13 +181,13 @@
        }
        if((ftargs = dump_controller_modules()) == NULL){
                diag("Couldn't write targets to %s/etc/initramfs-tools/modules 
(%s?)\n", growlight_target, strerror(errno));
-               close(fd);
+               fclose(fp);
                return -1;
        }
        if((r = fprintf(fp, "%s", ftargs)) < 0 || (size_t)r < strlen(ftargs)){
                diag("Couldn't write data to %s/etc/initramfs-tools/modules 
(%s?)\n", growlight_target, strerror(errno));
                free(ftargs);
-               close(fd);
+               fclose(fp);
                return -1;
        }
        free(ftargs);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/tools/debrelease 
new/growlight-1.2.40/tools/debrelease
--- old/growlight-1.2.38/tools/debrelease       2021-12-04 21:03:38.000000000 
+0100
+++ new/growlight-1.2.40/tools/debrelease       2025-11-05 09:32:12.000000000 
+0100
@@ -8,6 +8,7 @@
 
 VERSION="$1"
 
+rm debian/files
 dch -v $VERSION-1
 dch -r
 uscan --force --repack --compression xz
@@ -16,7 +17,7 @@
 git push --tags
 dpkg-buildpackage --build=source
 cd ..
-sudo pbuilder build *dsc
+xterm -e sudo pbuilder build growlight*dsc
 cd -
 git push
 rm debian/files
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/growlight-1.2.38/tools/release 
new/growlight-1.2.40/tools/release
--- old/growlight-1.2.38/tools/release  2021-12-04 21:03:38.000000000 +0100
+++ new/growlight-1.2.40/tools/release  2025-11-05 09:32:12.000000000 +0100
@@ -17,7 +17,6 @@
   sed -i -e "s/% v$OLDVERSION/% v$VERSION/" "$i"
 done
 
-
 BUILDDIR="build-$VERSION"
 mkdir "$BUILDDIR"
 cd "$BUILDDIR"
@@ -41,5 +40,7 @@
 echo "The bastards are trying to immanentize the Eschaton"
 
 # requires token in ~/.netrc
-github-release dankamongmen/growlight create v$VERSION --name "v$VERSION" 
--publish $TARBALL.asc
-rm $TARBALL.asc
+tar czvf growlight-doc-$VERSION.tar.gz *.8
+gh release create v$VERSION --title "$VERSION" $TARBALL.asc 
"growlight-doc-$VERSION.tar.gz"
+rm $TARBALL.asc "growlight-doc-$VERSION.tar.gz"
+cd -

Reply via email to