Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package fastfetch for openSUSE:Factory 
checked in at 2024-04-16 20:05:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/fastfetch (Old)
 and      /work/SRC/openSUSE:Factory/.fastfetch.new.26366 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "fastfetch"

Tue Apr 16 20:05:27 2024 rev:24 rq:1167996 version:2.9.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/fastfetch/fastfetch.changes      2024-04-09 
16:52:55.596683457 +0200
+++ /work/SRC/openSUSE:Factory/.fastfetch.new.26366/fastfetch.changes   
2024-04-16 20:11:39.749691609 +0200
@@ -1,0 +2,18 @@
+Tue Apr 16 10:04:27 UTC 2024 - Gordon Leung <piratec...@protonmail.com>
+
+- update to 2.9.2:
+  Changes:
+    * To make use of the newly introduced `yyjson` flag 
`YYJSON_WRITE_NEWLINE_AT_END`, fastfetch now requires `yyjson` 0.9.0 or later
+  Features:
+    * Always add a final new-line when generating JSON output
+    * Detect partition create time, which can be used as OS installation time 
(Disk)
+    * Print time string when generating JSON result instead of UNIX epoch time 
number, which is more human-readable
+  Bugfixes:
+    * Fix a memory leak
+    * Fix parsing of option `--packages-disabled` (Packages)
+    * Don't use command `time` as a shell (Shell)
+  Logos:
+    * Add openSUSE MicroOS
+    * Fix color of AOSC OS
+
+-------------------------------------------------------------------

Old:
----
  fastfetch-2.9.1.tar.gz

New:
----
  fastfetch-2.9.2.tar.gz

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

Other differences:
------------------
++++++ fastfetch.spec ++++++
--- /var/tmp/diff_new_pack.VWM6Cf/_old  2024-04-16 20:11:40.373714541 +0200
+++ /var/tmp/diff_new_pack.VWM6Cf/_new  2024-04-16 20:11:40.373714541 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           fastfetch
-Version:        2.9.1
+Version:        2.9.2
 Release:        0
 Summary:        Neofetch-like tool written mostly in C
 License:        MIT

++++++ fastfetch-2.9.1.tar.gz -> fastfetch-2.9.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/.github/ISSUE_TEMPLATE/bug_report.md 
new/fastfetch-2.9.2/.github/ISSUE_TEMPLATE/bug_report.md
--- old/fastfetch-2.9.1/.github/ISSUE_TEMPLATE/bug_report.md    2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/.github/ISSUE_TEMPLATE/bug_report.md    2024-04-16 
04:45:39.000000000 +0200
@@ -13,6 +13,7 @@
 
 * What happened:
 * What should happen:
+* Fastfetch version used: <!-- please use the latest version, if possible -->
 * Did it work in an older version: <!-- if yes, which version -->
 * Where did you get the binary: <!-- Github Release / Github Actions / 
Installed with a package manager (What package manager) / Built from source 
yourself -->
 * Does this issue still occurs in [the latest dev 
build](https://github.com/fastfetch-cli/fastfetch/actions/)?
@@ -41,18 +42,19 @@
 //paste here
 ```
 
-## If fastfatch crashed
+## If fastfatch crashed or freezed
 
 Paste the stacktrace here. You may get it with:
 
-```
-$ gdb -q -ex 'set confirm off' -ex run -ex 'bt full' -ex quit --args 
/path/to/fastfetch
+```shell
+# You may need Ctrl+C to stop the process if it freezes
+gdb -q -ex 'set confirm off' -ex run -ex 'bt full' -ex quit --args 
/path/to/fastfetch
 ```
 
 If you are able to identify which module crashed, the strace can be helpful too
 
-```
-$ strace /path/to/fastfetch --multithreading false --structure {MODULE} --pipe
+```shell
+strace /path/to/fastfetch --multithreading false -s {MODULE} --pipe
 ```
 
 If you cannot do the instructions above, please upload the core dump file:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastfetch-2.9.1/.github/ISSUE_TEMPLATE/feature_request.md 
new/fastfetch-2.9.2/.github/ISSUE_TEMPLATE/feature_request.md
--- old/fastfetch-2.9.1/.github/ISSUE_TEMPLATE/feature_request.md       
2024-04-07 14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/.github/ISSUE_TEMPLATE/feature_request.md       
2024-04-16 04:45:39.000000000 +0200
@@ -7,10 +7,28 @@
 
 ---
 
-<!-- Before requesting a new feature, please try `fastfetch -c all.jsonc` to 
see if it has been supported -->
+## Before requesting a new feature
 
-# Current state:
+* A lot of features are not enabled by default. Please try `fastfetch 
--list-modules` and `fastfetch -c all.jsonc` to see if it has been supported
+* Fastfetch supports `Command` module, which can be used to grab output from a 
custom shell script. Please check if it fits your needs
 
-# Wanted state:
+```jsonc
+// ~/.config/fastfetch/fastfetch.jsonc
+{
+    "modules": [
+        {
+            "type": "command",
+            "text": "/path/to/your/script",
+            "key": "Feature Title"
+        }
+    ]
+}
+```
 
-# Why the change is sensible:
+## Wanted features:
+
+<!-- Your features here -->
+
+## Motivation:
+
+<!-- Your motivation here -->
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastfetch-2.9.1/.github/ISSUE_TEMPLATE/logo_request.md 
new/fastfetch-2.9.2/.github/ISSUE_TEMPLATE/logo_request.md
--- old/fastfetch-2.9.1/.github/ISSUE_TEMPLATE/logo_request.md  2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/.github/ISSUE_TEMPLATE/logo_request.md  2024-04-16 
04:45:39.000000000 +0200
@@ -7,6 +7,8 @@
 
 ---
 
+Tip: A logo can be displayed by fastfetch without getting into fastfetch's 
official repo. For highly customized logo for personal use, it's recommended to 
keep it locally. Please refer to 
https://github.com/fastfetch-cli/fastfetch/wiki/Migrate-Neofetch-Logo-To-Fastfetch
+
 # OS
 ```
 Paste content of /etc/os-release here. If this file doesn't exist, describe a 
way to identify the distro.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/CHANGELOG.md 
new/fastfetch-2.9.2/CHANGELOG.md
--- old/fastfetch-2.9.1/CHANGELOG.md    2024-04-07 14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/CHANGELOG.md    2024-04-16 04:45:39.000000000 +0200
@@ -1,3 +1,23 @@
+# 2.9.2
+
+Changes:
+* To make use of the newly introduced `yyjson` flag 
`YYJSON_WRITE_NEWLINE_AT_END`, fastfetch now requires `yyjson` 0.9.0 or later
+
+Features:
+* Always add a final new-line when generating JSON output
+* Detect partition create time, which can be used as OS installation time 
(Disk)
+* Print time string when generating JSON result instead of UNIX epoch time 
number, which is more human-readable
+
+Bugfixes:
+* Fix a memory leak
+* Better portable mode detection of Windows Terminal (TerminalFont, Windows)
+* Fix parsing of option `--packages-disabled` (Packages)
+* Don't use command `time` as a shell (Shell)
+
+Logos:
+* Add openSUSE MicroOS
+* Fix color of AOSC OS
+
 # 2.9.1
 
 Features:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/CMakeLists.txt 
new/fastfetch-2.9.2/CMakeLists.txt
--- old/fastfetch-2.9.1/CMakeLists.txt  2024-04-07 14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/CMakeLists.txt  2024-04-16 04:45:39.000000000 +0200
@@ -1,7 +1,7 @@
 cmake_minimum_required(VERSION 3.12.0) # target_link_libraries with OBJECT 
libs & project homepage url
 
 project(fastfetch
-    VERSION 2.9.1
+    VERSION 2.9.2
     LANGUAGES C
     DESCRIPTION "Fast neofetch-like system information tool"
     HOMEPAGE_URL "https://github.com/fastfetch-cli/fastfetch";
@@ -699,6 +699,9 @@
 if(NOT HAVE_WCWIDTH)
     list(APPEND LIBFASTFETCH_SRC src/3rdparty/mk_wcwidch/wcwidth.c)
 endif()
+if(LINUX)
+    check_function_exists(statx HAVE_STATX)
+endif()
 
 if(ENABLE_SYSTEM_YYJSON)
     find_package(yyjson)
@@ -762,6 +765,10 @@
     target_compile_definitions(libfastfetch PUBLIC _DARWIN_C_SOURCE)
 endif()
 
+if(HAVE_STATX)
+    target_compile_definitions(libfastfetch PRIVATE FF_HAVE_STATX)
+endif()
+
 if(HAVE_WCWIDTH)
     target_compile_definitions(libfastfetch PRIVATE FF_HAVE_WCWIDTH)
 endif()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/CODE_OF_CONDUCT.md 
new/fastfetch-2.9.2/CODE_OF_CONDUCT.md
--- old/fastfetch-2.9.1/CODE_OF_CONDUCT.md      1970-01-01 01:00:00.000000000 
+0100
+++ new/fastfetch-2.9.2/CODE_OF_CONDUCT.md      2024-04-16 04:45:39.000000000 
+0200
@@ -0,0 +1,133 @@
+
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual
+identity and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+  and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the overall
+  community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or advances 
of
+  any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email address,
+  without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for 
moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official email address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+[INSERT CONTACT METHOD].
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series of
+actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or permanent
+ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within the
+community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.1, available at
+[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
+
+Community Impact Guidelines were inspired by
+[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
+[https://www.contributor-covenant.org/translations][translations].
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/doc/json_schema.json 
new/fastfetch-2.9.2/doc/json_schema.json
--- old/fastfetch-2.9.1/doc/json_schema.json    2024-04-07 14:49:37.000000000 
+0200
+++ new/fastfetch-2.9.2/doc/json_schema.json    2024-04-16 04:45:39.000000000 
+0200
@@ -730,7 +730,6 @@
                     },
                     {
                         "type": "object",
-                        "additionalProperties": false,
                         "description": "Run module with custom configurations",
                         "required": [
                             "type"
@@ -1577,9 +1576,35 @@
                                         "description": "List installed package 
managers and count of installed packages"
                                     },
                                     "disabled": {
-                                        "description": "A colon separated list 
of package managers to be disabled when detecting",
-                                        "type": "string",
-                                        "default": "winget"
+                                        "description": "List of package 
managers to be disabled when detecting",
+                                        "type": "array",
+                                        "items": {
+                                            "type": "string",
+                                            "enum": [
+                                                "am",
+                                                "apk",
+                                                "brew",
+                                                "choco",
+                                                "dpkg",
+                                                "emerge",
+                                                "eopkg",
+                                                "flatpak",
+                                                "macports",
+                                                "nix",
+                                                "opkg",
+                                                "pacman",
+                                                "paludis",
+                                                "pkg",
+                                                "pkgtool",
+                                                "rpm",
+                                                "scoop",
+                                                "snap",
+                                                "winget",
+                                                "xbps"
+                                            ],
+                                            "uniqueItems": true
+                                        },
+                                        "default": ["winget"]
                                     },
                                     "key": {
                                         "$ref": "#/$defs/key"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/presets/examples/10.jsonc 
new/fastfetch-2.9.2/presets/examples/10.jsonc
--- old/fastfetch-2.9.1/presets/examples/10.jsonc       2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/presets/examples/10.jsonc       2024-04-16 
04:45:39.000000000 +0200
@@ -84,17 +84,17 @@
         },
         {
             "type": "host",
-            "key": "ï ¤ PC",
+            "key": "󰌢 PC",
             "keyColor": "green"
         },
         {
             "type": "cpu",
-            "key": "│ ├",
+            "key": "│ ├󰻠",
             "keyColor": "green"
         },
         {
             "type": "gpu",
-            "key": "│ ├﬙",
+            "key": "│ ├󰍛",
             "keyColor": "green"
         },
         {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/presets/examples/12.jsonc 
new/fastfetch-2.9.2/presets/examples/12.jsonc
--- old/fastfetch-2.9.1/presets/examples/12.jsonc       2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/presets/examples/12.jsonc       2024-04-16 
04:45:39.000000000 +0200
@@ -23,7 +23,7 @@
             "type": "os"
         },
         {
-            "key": "    ï ¤ Machine      ",
+            "key": "    󰌢 Machine      ",
             "keyColor": "green",
             "type": "host"
         },
@@ -64,12 +64,12 @@
             "type": "terminal"
         },
         {
-            "key": "     CPU          ",
+            "key": "    ó°»  CPU          ",
             "keyColor": "yellow",
             "type": "cpu"
         },
         {
-            "key": "    ﬙ GPU          ",
+            "key": "    󰍛 GPU          ",
             "keyColor": "blue",
             "type": "gpu"
         },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/presets/examples/2.jsonc 
new/fastfetch-2.9.2/presets/examples/2.jsonc
--- old/fastfetch-2.9.1/presets/examples/2.jsonc        2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/presets/examples/2.jsonc        2024-04-16 
04:45:39.000000000 +0200
@@ -19,15 +19,15 @@
         },
         {
             "type": "host",
-            "key": "  ï ¤"
+            "key": "  󰌢"
         },
         {
             "type": "cpu",
-            "key": "  "
+            "key": "  ó°» "
         },
         {
             "type": "gpu",
-            "key": "  ﬙"
+            "key": "  󰍛"
         },
         {
             "type": "disk",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/presets/examples/5.jsonc 
new/fastfetch-2.9.2/presets/examples/5.jsonc
--- old/fastfetch-2.9.1/presets/examples/5.jsonc        2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/presets/examples/5.jsonc        2024-04-16 
04:45:39.000000000 +0200
@@ -14,8 +14,7 @@
         },
         {
             "type": "icons",
-            "key": "I",
-            "format": "{5}"
+            "key": "I"
         },
         {
             "type": "font",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/presets/examples/6.jsonc 
new/fastfetch-2.9.2/presets/examples/6.jsonc
--- old/fastfetch-2.9.1/presets/examples/6.jsonc        2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/presets/examples/6.jsonc        2024-04-16 
04:45:39.000000000 +0200
@@ -15,17 +15,17 @@
     "modules": [
         {
             "type": "host",
-            "key": "╭─",
+            "key": "╭─󰌢",
             "keyColor": "green"
         },
         {
             "type": "cpu",
-            "key": "├─",
+            "key": "├─󰻠",
             "keyColor": "green"
         },
         {
             "type": "gpu",
-            "key": "├─﬙",
+            "key": "├─󰍛",
             "keyColor": "green"
         },
         {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/presets/examples/7.jsonc 
new/fastfetch-2.9.2/presets/examples/7.jsonc
--- old/fastfetch-2.9.1/presets/examples/7.jsonc        2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/presets/examples/7.jsonc        2024-04-16 
04:45:39.000000000 +0200
@@ -77,17 +77,17 @@
         "break",
         {
             "type": "host",
-            "key": "ï ¤ PC",
+            "key": "󰌢 PC",
             "keyColor": "green"
         },
         {
             "type": "cpu",
-            "key": "├",
+            "key": "├󰻠",
             "keyColor": "green"
         },
         {
             "type": "gpu",
-            "key": "├﬙",
+            "key": "├󰍛",
             "keyColor": "green"
         },
         {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/presets/examples/8.jsonc 
new/fastfetch-2.9.2/presets/examples/8.jsonc
--- old/fastfetch-2.9.1/presets/examples/8.jsonc        2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/presets/examples/8.jsonc        2024-04-16 
04:45:39.000000000 +0200
@@ -33,7 +33,7 @@
         },
         {
             "type": "memory",
-            "key": ""
+            "key": "ó°» "
         },
         {
             "type": "packages",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/presets/paleofetch.jsonc 
new/fastfetch-2.9.2/presets/paleofetch.jsonc
--- old/fastfetch-2.9.1/presets/paleofetch.jsonc        2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/presets/paleofetch.jsonc        2024-04-16 
04:45:39.000000000 +0200
@@ -12,7 +12,7 @@
         "uptime",
         {
             "type": "battery",
-            "format": "{/4}{-}{/}{4}%{?5} [{5}]{?}"
+            "format": "{/4}{-}{/}{4}{?5} [{5}]{?}"
         },
         "break",
         "packages",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/3rdparty/yyjson/repo.json 
new/fastfetch-2.9.2/src/3rdparty/yyjson/repo.json
--- old/fastfetch-2.9.1/src/3rdparty/yyjson/repo.json   2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/3rdparty/yyjson/repo.json   2024-04-16 
04:45:39.000000000 +0200
@@ -1,6 +1,6 @@
 {
     "home": "https://github.com/ibireme/yyjson";,
     "license": "MIT ( embed in source )",
-    "version": "0.8.0",
+    "version": "0.9.0",
     "author": "ibireme"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/3rdparty/yyjson/yyjson.c 
new/fastfetch-2.9.2/src/3rdparty/yyjson/yyjson.c
--- old/fastfetch-2.9.1/src/3rdparty/yyjson/yyjson.c    2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/3rdparty/yyjson/yyjson.c    2024-04-16 
04:45:39.000000000 +0200
@@ -1407,6 +1407,7 @@
 void yyjson_mut_doc_free(yyjson_mut_doc *doc) {
     if (doc) {
         yyjson_alc alc = doc->alc;
+        memset(&doc->alc, 0, sizeof(alc));
         unsafe_yyjson_str_pool_release(&doc->str_pool, &alc);
         unsafe_yyjson_val_pool_release(&doc->val_pool, &alc);
         alc.free(alc.ctx, doc);
@@ -8309,13 +8310,15 @@
     bool cpy = (enc_table == enc_table_cpy);
     bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
     bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
+    bool newline = has_write_flag(NEWLINE_AT_END) != 0;
+    const usize end_len = 2; /* '\n' and '\0' */
     
     switch (unsafe_yyjson_get_type(val)) {
         case YYJSON_TYPE_RAW:
             str_len = unsafe_yyjson_get_len(val);
             str_ptr = (const u8 *)unsafe_yyjson_get_str(val);
             check_str_len(str_len);
-            incr_len(str_len + 1);
+            incr_len(str_len + end_len);
             cur = write_raw(cur, str_ptr, str_len);
             break;
             
@@ -8323,7 +8326,7 @@
             str_len = unsafe_yyjson_get_len(val);
             str_ptr = (const u8 *)unsafe_yyjson_get_str(val);
             check_str_len(str_len);
-            incr_len(str_len * 6 + 4);
+            incr_len(str_len * 6 + 2 + end_len);
             if (likely(cpy) && unsafe_yyjson_get_subtype(val)) {
                 cur = write_string_noesc(cur, str_ptr, str_len);
             } else {
@@ -8333,7 +8336,7 @@
             break;
             
         case YYJSON_TYPE_NUM:
-            incr_len(32);
+            incr_len(32 + end_len);
             cur = write_number(cur, val, flg);
             if (unlikely(!cur)) goto fail_num;
             break;
@@ -8349,13 +8352,13 @@
             break;
             
         case YYJSON_TYPE_ARR:
-            incr_len(4);
+            incr_len(2 + end_len);
             byte_copy_2(cur, "[]");
             cur += 2;
             break;
             
         case YYJSON_TYPE_OBJ:
-            incr_len(4);
+            incr_len(2 + end_len);
             byte_copy_2(cur, "{}");
             cur += 2;
             break;
@@ -8364,6 +8367,7 @@
             goto fail_type;
     }
     
+    if (newline) *cur++ = '\n';
     *cur = '\0';
     *dat_len = (usize)(cur - hdr);
     memset(err, 0, sizeof(yyjson_write_err));
@@ -8436,6 +8440,7 @@
     bool cpy = (enc_table == enc_table_cpy);
     bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
     bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
+    bool newline = has_write_flag(NEWLINE_AT_END) != 0;
     
     alc_len = root->uni.ofs / sizeof(yyjson_val);
     alc_len = alc_len * YYJSON_WRITER_ESTIMATED_MINIFY_RATIO + 64;
@@ -8542,6 +8547,11 @@
     }
     
 doc_end:
+    if (newline) {
+        incr_len(2);
+        *(cur - 1) = '\n';
+        cur++;
+    }
     *--cur = '\0';
     *dat_len = (usize)(cur - hdr);
     memset(err, 0, sizeof(yyjson_write_err));
@@ -8615,6 +8625,7 @@
     bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
     bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
     usize spaces = has_write_flag(PRETTY_TWO_SPACES) ? 2 : 4;
+    bool newline = has_write_flag(NEWLINE_AT_END) != 0;
     
     alc_len = root->uni.ofs / sizeof(yyjson_val);
     alc_len = alc_len * YYJSON_WRITER_ESTIMATED_PRETTY_RATIO + 64;
@@ -8745,6 +8756,10 @@
     }
     
 doc_end:
+    if (newline) {
+        incr_len(2);
+        *cur++ = '\n';
+    }
     *cur = '\0';
     *dat_len = (usize)(cur - hdr);
     memset(err, 0, sizeof(yyjson_write_err));
@@ -8977,6 +8992,7 @@
     bool cpy = (enc_table == enc_table_cpy);
     bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
     bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
+    bool newline = has_write_flag(NEWLINE_AT_END) != 0;
     
     alc_len = estimated_val_num * YYJSON_WRITER_ESTIMATED_MINIFY_RATIO + 64;
     alc_len = size_align_up(alc_len, sizeof(yyjson_mut_write_ctx));
@@ -9087,6 +9103,11 @@
     }
     
 doc_end:
+    if (newline) {
+        incr_len(2);
+        *(cur - 1) = '\n';
+        cur++;
+    }
     *--cur = '\0';
     *dat_len = (usize)(cur - hdr);
     err->code = YYJSON_WRITE_SUCCESS;
@@ -9162,6 +9183,7 @@
     bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
     bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
     usize spaces = has_write_flag(PRETTY_TWO_SPACES) ? 2 : 4;
+    bool newline = has_write_flag(NEWLINE_AT_END) != 0;
     
     alc_len = estimated_val_num * YYJSON_WRITER_ESTIMATED_PRETTY_RATIO + 64;
     alc_len = size_align_up(alc_len, sizeof(yyjson_mut_write_ctx));
@@ -9296,6 +9318,10 @@
     }
     
 doc_end:
+    if (newline) {
+        incr_len(2);
+        *cur++ = '\n';
+    }
     *cur = '\0';
     *dat_len = (usize)(cur - hdr);
     err->code = YYJSON_WRITE_SUCCESS;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/3rdparty/yyjson/yyjson.h 
new/fastfetch-2.9.2/src/3rdparty/yyjson/yyjson.h
--- old/fastfetch-2.9.1/src/3rdparty/yyjson/yyjson.h    2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/3rdparty/yyjson/yyjson.h    2024-04-16 
04:45:39.000000000 +0200
@@ -527,16 +527,16 @@
 #define YYJSON_VERSION_MAJOR  0
 
 /** The minor version of yyjson. */
-#define YYJSON_VERSION_MINOR  8
+#define YYJSON_VERSION_MINOR  9
 
 /** The patch version of yyjson. */
 #define YYJSON_VERSION_PATCH  0
 
 /** The version of yyjson in hex: `(major << 16) | (minor << 8) | (patch)`. */
-#define YYJSON_VERSION_HEX    0x000800
+#define YYJSON_VERSION_HEX    0x000900
 
 /** The version string of yyjson. */
-#define YYJSON_VERSION_STRING "0.8.0"
+#define YYJSON_VERSION_STRING "0.9.0"
 
 /** The version of yyjson in hex, same as `YYJSON_VERSION_HEX`. */
 yyjson_api uint32_t yyjson_version(void);
@@ -738,7 +738,7 @@
     - Report error if double number is infinity.
     - Report error if string contains invalid UTF-8 character or BOM.
     - Report error on trailing commas, comments, inf and nan literals. */
-static const yyjson_read_flag YYJSON_READ_NOFLAG                = 0 << 0;
+static const yyjson_read_flag YYJSON_READ_NOFLAG                = 0;
 
 /** Read the input data in-situ.
     This option allows the reader to modify and use input data to store string
@@ -1067,7 +1067,7 @@
     - Report error on inf or nan number.
     - Report error on invalid UTF-8 string.
     - Do not escape unicode or slash. */
-static const yyjson_write_flag YYJSON_WRITE_NOFLAG                  = 0 << 0;
+static const yyjson_write_flag YYJSON_WRITE_NOFLAG                  = 0;
 
 /** Write JSON pretty with 4 space indent. */
 static const yyjson_write_flag YYJSON_WRITE_PRETTY                  = 1 << 0;
@@ -1096,6 +1096,10 @@
     This flag will override `YYJSON_WRITE_PRETTY` flag. */
 static const yyjson_write_flag YYJSON_WRITE_PRETTY_TWO_SPACES       = 1 << 6;
 
+/** Adds a newline character `\n` at the end of the JSON.
+    This can be helpful for text editors or NDJSON. */
+static const yyjson_write_flag YYJSON_WRITE_NEWLINE_AT_END          = 1 << 7;
+
 
 
 /** Result code for JSON writer */
@@ -3695,7 +3699,7 @@
     The `len` should be the length of the `val`, in bytes.
     This function allows duplicated key in one object.
     
-    @warning The key/value strings are not copied, you should keep these 
strings
+    @warning The key strings are not copied, you should keep these strings
         unmodified for the lifetime of this JSON document. */
 yyjson_api_inline bool yyjson_mut_obj_add_strncpy(yyjson_mut_doc *doc,
                                                   yyjson_mut_val *obj,
@@ -4829,6 +4833,7 @@
 yyjson_api_inline void yyjson_doc_free(yyjson_doc *doc) {
     if (doc) {
         yyjson_alc alc = doc->alc;
+        memset(&doc->alc, 0, sizeof(alc));
         if (doc->str_pool) alc.free(alc.ctx, doc->str_pool);
         alc.free(alc.ctx, doc);
     }
@@ -5668,6 +5673,7 @@
     if (yyjson_likely(doc)) {
         yyjson_mut_val *val = unsafe_yyjson_mut_val(doc, 1);
         if (yyjson_likely(val)) {
+            _val = !!_val;
             val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)_val << 3);
             return val;
         }
@@ -5920,7 +5926,8 @@
 yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_bool(
     yyjson_mut_doc *doc, const bool *vals, size_t count) {
     yyjson_mut_arr_with_func({
-        val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)vals[i] << 3);
+        bool _val = !!vals[i];
+        val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)_val << 3);
     });
 }
 
@@ -6872,6 +6879,7 @@
                                                const char *_key,
                                                bool _val) {
     yyjson_mut_obj_add_func({
+        _val = !!_val;
         val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)(_val) << 3);
     });
 }
@@ -7730,33 +7738,39 @@
 }
 
 /**
- Set provided `value` if the JSON Pointer (RFC 6901) exists and is type uint.
- Returns true if value at `ptr` exists and is the correct type, otherwise 
false.
+ Set provided `value` if the JSON Pointer (RFC 6901) exists and is an integer
+ that fits in `uint64_t`. Returns true if successful, otherwise false.
  */
 yyjson_api_inline bool yyjson_ptr_get_uint(
     yyjson_val *root, const char *ptr, uint64_t *value) {
     yyjson_val *val = yyjson_ptr_get(root, ptr);
-    if (value && yyjson_is_uint(val)) {
-        *value = unsafe_yyjson_get_uint(val);
-        return true;
-    } else {
-        return false;
+    if (value && val) {
+        uint64_t ret = val->uni.u64;
+        if (unsafe_yyjson_is_uint(val) ||
+            (unsafe_yyjson_is_sint(val) && !(ret >> 63))) {
+            *value = ret;
+            return true;
+        }
     }
+    return false;
 }
 
 /**
- Set provided `value` if the JSON Pointer (RFC 6901) exists and is type sint.
- Returns true if value at `ptr` exists and is the correct type, otherwise 
false.
+ Set provided `value` if the JSON Pointer (RFC 6901) exists and is an integer
+ that fits in `int64_t`. Returns true if successful, otherwise false.
  */
 yyjson_api_inline bool yyjson_ptr_get_sint(
     yyjson_val *root, const char *ptr, int64_t *value) {
     yyjson_val *val = yyjson_ptr_get(root, ptr);
-    if (value && yyjson_is_sint(val)) {
-        *value = unsafe_yyjson_get_sint(val);
-        return true;
-    } else {
-        return false;
+    if (value && val) {
+        int64_t ret = val->uni.i64;
+        if (unsafe_yyjson_is_sint(val) ||
+            (unsafe_yyjson_is_uint(val) && ret >= 0)) {
+            *value = ret;
+            return true;
+        }
     }
+    return false;
 }
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/common/time.h 
new/fastfetch-2.9.2/src/common/time.h
--- old/fastfetch-2.9.1/src/common/time.h       2024-04-07 14:49:37.000000000 
+0200
+++ new/fastfetch-2.9.2/src/common/time.h       2024-04-16 04:45:39.000000000 
+0200
@@ -1,12 +1,12 @@
 #pragma once
 
 #include <stdint.h>
+#include <time.h>
+#include <stdio.h>
 #ifdef _WIN32
     #include <synchapi.h>
     #include <profileapi.h>
     #include <sysinfoapi.h>
-#else
-    #include <time.h>
 #endif
 
 static inline uint64_t ffTimeGetTick() //In msec
@@ -45,3 +45,37 @@
         nanosleep(&(struct timespec){ msec / 1000, (long) (msec % 1000) * 
1000000 }, NULL);
     #endif
 }
+
+#ifdef _WIN32
+    #pragma GCC diagnostic push
+    #pragma GCC diagnostic ignored "-Wformat"
+#endif
+
+// Not thread-safe
+static inline const char* ffTimeToFullStr(uint64_t msec)
+{
+    if (msec == 0) return "";
+    time_t tsec = (time_t) (msec / 1000);
+    const struct tm* tm = localtime(&tsec);
+
+    static char buf[32];
+    strftime(buf, __builtin_strlen("0000-00-00T00:00:00") + 1, "%FT%T", tm);
+    snprintf(buf + __builtin_strlen("0000-00-00T00:00:00"), 
__builtin_strlen(".000") + 1, ".%03u", (unsigned) (msec % 1000));
+    strftime(buf + __builtin_strlen("0000-00-00T00:00:00.000"), 
__builtin_strlen("+0000") + 1, "%z", tm);
+    return buf;
+}
+
+// Not thread-safe
+static inline const char* ffTimeToShortStr(uint64_t msec)
+{
+    if (msec == 0) return "";
+    time_t tsec = (time_t) (msec / 1000);
+
+    static char buf[32];
+    strftime(buf, sizeof(buf), "%F %T", localtime(&tsec));
+    return buf;
+}
+
+#ifdef _WIN32
+    #pragma GCC diagnostic pop
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/detection/disk/disk.h 
new/fastfetch-2.9.2/src/detection/disk/disk.h
--- old/fastfetch-2.9.1/src/detection/disk/disk.h       2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/detection/disk/disk.h       2024-04-16 
04:45:39.000000000 +0200
@@ -17,6 +17,8 @@
 
     uint32_t filesUsed;
     uint32_t filesTotal;
+
+    uint64_t createTime;
 } FFDisk;
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/detection/disk/disk_bsd.c 
new/fastfetch-2.9.2/src/detection/disk/disk_bsd.c
--- old/fastfetch-2.9.1/src/detection/disk/disk_bsd.c   2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/detection/disk/disk_bsd.c   2024-04-16 
04:45:39.000000000 +0200
@@ -3,6 +3,7 @@
 #include "util/stringUtils.h"
 
 #include <sys/mount.h>
+#include <sys/stat.h>
 
 #ifdef __FreeBSD__
 #include <libgeom.h>
@@ -130,6 +131,10 @@
 
         if(fs->f_flags & MNT_RDONLY)
             disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
+
+        struct stat st;
+        if(stat(fs->f_mntonname, &st) == 0)
+            disk->createTime = (uint64_t)((st.st_birthtimespec.tv_sec * 1000) 
+ (st.st_birthtimespec.tv_nsec / 1000000));
     }
 
     return NULL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/detection/disk/disk_linux.c 
new/fastfetch-2.9.2/src/detection/disk/disk_linux.c
--- old/fastfetch-2.9.1/src/detection/disk/disk_linux.c 2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/detection/disk/disk_linux.c 2024-04-16 
04:45:39.000000000 +0200
@@ -6,9 +6,9 @@
 #include <limits.h>
 #include <ctype.h>
 #include <dirent.h>
+#include <mntent.h>
 #include <sys/stat.h>
 #include <sys/statvfs.h>
-#include <mntent.h>
 #include <sys/mount.h>
 
 #ifdef __USE_LARGEFILE64
@@ -241,6 +241,13 @@
 
     if(fs.f_flag & ST_RDONLY)
         disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
+
+    disk->createTime = 0;
+    #ifdef FF_HAVE_STATX
+    struct statx stx;
+    if (statx(0, disk->mountpoint.chars, 0, STATX_BTIME, &stx) == 0 && 
(stx.stx_mask & STATX_BTIME))
+        disk->createTime = (uint64_t)((stx.stx_btime.tv_sec * 1000) + 
(stx.stx_btime.tv_nsec / 1000000));
+    #endif
 }
 
 const char* ffDetectDisksImpl(FFlist* disks)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/detection/disk/disk_windows.c 
new/fastfetch-2.9.2/src/detection/disk/disk_windows.c
--- old/fastfetch-2.9.1/src/detection/disk/disk_windows.c       2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/detection/disk/disk_windows.c       2024-04-16 
04:45:39.000000000 +0200
@@ -71,6 +71,12 @@
                 disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
         }
 
+        WIN32_FILE_ATTRIBUTE_DATA data;
+        if(GetFileAttributesExW(mountpoint, GetFileExInfoStandard, &data) && 
data.ftCreationTime.dwHighDateTime > 0)
+            disk->createTime = (*(uint64_t*) &data.ftCreationTime - 
116444736000000000ull) / 10000ull;
+        else
+            disk->createTime = 0;
+
         ffStrbufInitWS(&disk->mountpoint, mountpoint);
         if (mountpoint[2] == L'\\' && mountpoint[3] == L'\0')
         {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastfetch-2.9.1/src/detection/terminalfont/terminalfont.c 
new/fastfetch-2.9.2/src/detection/terminalfont/terminalfont.c
--- old/fastfetch-2.9.1/src/detection/terminalfont/terminalfont.c       
2024-04-07 14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/detection/terminalfont/terminalfont.c       
2024-04-16 04:45:39.000000000 +0200
@@ -160,7 +160,7 @@
     #include <shlobj.h>
 #endif
 
-static void detectFromWindowsTeriminal(const FFstrbuf* terminalExe, 
FFTerminalFontResult* terminalFont)
+static void detectFromWindowsTerminal(const FFstrbuf* terminalExe, 
FFTerminalFontResult* terminalFont)
 {
     
//https://learn.microsoft.com/en-us/windows/terminal/install#settings-json-file
     FF_STRBUF_AUTO_DESTROY json = ffStrbufCreate();
@@ -174,7 +174,7 @@
         char* pathEnd = jsonPath + strlen(jsonPath);
         strncpy(pathEnd, ".portable", sizeof(jsonPath) - (size_t) (pathEnd - 
jsonPath) - 1);
 
-        if(ffPathExists(jsonPath, FF_PATHTYPE_FILE))
+        if(ffPathExists(jsonPath, FF_PATHTYPE_ANY))
         {
             strncpy(pathEnd, "settings\\settings.json", sizeof(jsonPath) - 
(size_t) (pathEnd - jsonPath) - 1);
             if(!ffAppendFileBuffer(jsonPath, &json))
@@ -432,7 +432,7 @@
     //Used by both Linux (WSL) and Windows
     else if(ffStrbufIgnCaseEqualS(&terminal->processName, "Windows Terminal") 
||
         ffStrbufIgnCaseEqualS(&terminal->processName, "WindowsTerminal.exe"))
-        detectFromWindowsTeriminal(&terminal->exe, terminalFont);
+        detectFromWindowsTerminal(&terminal->exe, terminalFont);
     #endif
 
     else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastfetch-2.9.1/src/detection/terminalshell/terminalshell_linux.c 
new/fastfetch-2.9.2/src/detection/terminalshell/terminalshell_linux.c
--- old/fastfetch-2.9.1/src/detection/terminalshell/terminalshell_linux.c       
2024-04-07 14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/detection/terminalshell/terminalshell_linux.c       
2024-04-16 04:45:39.000000000 +0200
@@ -231,6 +231,7 @@
             ffStrEquals(name, "ltrace")              ||
             ffStrEquals(name, "perf")                ||
             ffStrEquals(name, "guake-wrapped")       ||
+            ffStrEquals(name, "time")                ||
             ffStrContainsIgnCase(name, "debug")      ||
             ffStrContainsIgnCase(name, "not-found")  ||
             ffStrEndsWith(name, ".sh")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fastfetch-2.9.1/src/detection/terminalshell/terminalshell_windows.c 
new/fastfetch-2.9.2/src/detection/terminalshell/terminalshell_windows.c
--- old/fastfetch-2.9.1/src/detection/terminalshell/terminalshell_windows.c     
2024-04-07 14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/detection/terminalshell/terminalshell_windows.c     
2024-04-16 04:45:39.000000000 +0200
@@ -98,16 +98,14 @@
         if(
             ffStrbufIgnCaseEqualS(&result->prettyName, "sudo")          ||
             ffStrbufIgnCaseEqualS(&result->prettyName, "su")            ||
-            ffStrbufIgnCaseEqualS(&result->prettyName, "doas")          ||
-            ffStrbufIgnCaseEqualS(&result->prettyName, "strace")        ||
             ffStrbufIgnCaseEqualS(&result->prettyName, "sshd")          ||
             ffStrbufIgnCaseEqualS(&result->prettyName, "gdb")           ||
             ffStrbufIgnCaseEqualS(&result->prettyName, "lldb")          ||
-            ffStrbufIgnCaseEqualS(&result->prettyName, "guake-wrapped") ||
             ffStrbufIgnCaseEqualS(&result->prettyName, "python")        || // 
python on windows generates shim executables
             ffStrbufIgnCaseEqualS(&result->prettyName, "fastfetch")     || // 
scoop warps the real binaries with a "shim" exe
             ffStrbufIgnCaseEqualS(&result->prettyName, "flashfetch")    ||
             ffStrbufContainIgnCaseS(&result->prettyName, "debug")       ||
+            ffStrbufContainIgnCaseS(&result->prettyName, "time")        ||
             ffStrbufStartsWithIgnCaseS(&result->prettyName, "ConEmu") // 
https://github.com/fastfetch-cli/fastfetch/issues/488#issuecomment-1619982014
         ) {
             ffStrbufClear(&result->processName);
@@ -260,6 +258,7 @@
                     if(ffPathExists(result->exe.chars, FF_PATHTYPE_FILE))
                     {
                         result->exeName = result->exe.chars + 
ffStrbufLastIndexC(&result->exe, '\\') + 1;
+                        ffStrbufSet(&result->exePath, &result->exe);
                     }
                     else
                     {
@@ -294,7 +293,7 @@
 
     while (pid != 0 && getProcessInfo(pid, &ppid, &result->processName, 
&result->exe, &result->exeName, &result->exePath, &hasGui))
     {
-        if(!hasGui)
+        if(!hasGui || ffStrbufIgnCaseEqualS(&result->processName, "far.exe")) 
// Far includes GUI objects...
         {
             //We are in nested shell
             ffStrbufClear(&result->processName);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/fastfetch.c 
new/fastfetch-2.9.2/src/fastfetch.c
--- old/fastfetch-2.9.1/src/fastfetch.c 2024-04-07 14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/fastfetch.c 2024-04-16 04:45:39.000000000 +0200
@@ -819,10 +819,7 @@
         ffPrintCommandOption(data, instance.state.resultDoc);
 
     if (instance.state.resultDoc)
-    {
-        yyjson_mut_write_fp(stdout, instance.state.resultDoc, 
YYJSON_WRITE_INF_AND_NAN_AS_NULL | YYJSON_WRITE_PRETTY_TWO_SPACES, NULL, NULL);
-        putchar('\n');
-    }
+        yyjson_mut_write_fp(stdout, instance.state.resultDoc, 
YYJSON_WRITE_INF_AND_NAN_AS_NULL | YYJSON_WRITE_PRETTY_TWO_SPACES | 
YYJSON_WRITE_NEWLINE_AT_END, NULL, NULL);
     else
         ffFinish();
 }
@@ -841,11 +838,11 @@
     ffMigrateCommandOptionToJsonc(data, doc);
 
     if (ffStrbufEqualS(filename, "-"))
-        yyjson_mut_write_fp(stdout, doc, YYJSON_WRITE_INF_AND_NAN_AS_NULL | 
YYJSON_WRITE_PRETTY_TWO_SPACES, NULL, NULL);
+        yyjson_mut_write_fp(stdout, doc, YYJSON_WRITE_INF_AND_NAN_AS_NULL | 
YYJSON_WRITE_PRETTY_TWO_SPACES | YYJSON_WRITE_NEWLINE_AT_END, NULL, NULL);
     else
     {
         size_t len;
-        FF_AUTO_FREE const char* str = yyjson_mut_write(doc, 
YYJSON_WRITE_INF_AND_NAN_AS_NULL | YYJSON_WRITE_PRETTY_TWO_SPACES, &len);
+        FF_AUTO_FREE const char* str = yyjson_mut_write(doc, 
YYJSON_WRITE_INF_AND_NAN_AS_NULL | YYJSON_WRITE_PRETTY_TWO_SPACES | 
YYJSON_WRITE_NEWLINE_AT_END, &len);
         if (!str)
         {
             printf("Error: failed to generate config file\n");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/logo/ascii/lainos.txt 
new/fastfetch-2.9.2/src/logo/ascii/lainos.txt
--- old/fastfetch-2.9.1/src/logo/ascii/lainos.txt       2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/logo/ascii/lainos.txt       2024-04-16 
04:45:39.000000000 +0200
@@ -1,8 +1,8 @@
-${c2}                    /==\\
-                    \\==/
+${c2}                    /==\
+                    \==/
 ${c1}               · · · · · · ·
             · · · · · · · · · ·
-          · · · ${c2}.-======-.${c1}· · · ·
+           · · · ${c2}.-======-.${c1}· · · ·
 ${c2}        .::.${c1} ·${c2}.-============-.${c1}· ${c2}.::.
      .:==:${c1}· ${c2}.:===:'${c1}. ·· .${c2}':===:.${c1} ·${c2}:==:.
   .:===:${c1} · ${c2}:===.${c1} ·  ${c3}.--.${c1}  · ${c2}.===:${c1} · 
${c2}:===:.
@@ -12,8 +12,8 @@
   ':===:${c1} · ${c2}:===.${c1} ·  ${c3}'--'${c1}  · ${c2}.===:${c1} · 
${c2}:===:'
      ':==:${c1}· ${c2}':===:.${c1}' ·· '${c2}.:===:'${c1} ·${c2}:==:'
         '::'${c1} · ${c2}'===-.  .-==='${c1} · ${c2}'::'
-  ${c2}/==\\${c1}     · · · ${c2}:===  ===:${c1} · · ·     ${c2}/==\\
-  \\==/${c1}      · · ·${c2}:===${c1} ·${c2}===:${c1}· · ·      
${c2}\\==/${c2}
+  ${c2}/==\${c1}     · · · ${c2}:===  ===:${c1} · · ·     ${c2}/==\
+  \==/${c1}      · · ·${c2}:===${c1} ·${c2}===:${c1}· · ·      
${c2}\==/${c2}
          .-.   ${c1}· ${c2}:===${c1}· ${c2}===:${c1} ·${c2}   ${c2}.-.
          .===.   .===  ===.   .===.
            .========    ========.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/logo/ascii/opensuse_microos.txt 
new/fastfetch-2.9.2/src/logo/ascii/opensuse_microos.txt
--- old/fastfetch-2.9.1/src/logo/ascii/opensuse_microos.txt     1970-01-01 
01:00:00.000000000 +0100
+++ new/fastfetch-2.9.2/src/logo/ascii/opensuse_microos.txt     2024-04-16 
04:45:39.000000000 +0200
@@ -0,0 +1,10 @@
+             ⣀⣠⣴⣶⣶⣿⣿⣿⣿⣶⣶⣦⣄⣀
+          ⢀⣴⣾⣿⠿⠛⠉⠉    ⠉⠉⠛⠿⣿⣷⣦⡀
+         ⣴⣿⡿⠋              ⠙⢿⣿⣦
+        ⣾⣿⡟     ⣠⣴⣶⣿⣿⣶⣦⣄     ⢻⣿⣷
+⣠⣤⣤⣤⣤⣤⣤⣼⣿⣿     ⣼⣿⡟⠉  ⠉⢻⣿⣧     
⣿⣿⣧⣤⣤⣤⣤⣤⣤⣄
+⠙⠛⠛⠛⠛⠛⠛⢻⣿⣿     ⢻⣿⣧⡀  ⢀⣼⣿⡟     ⣿⣿⡟â 
›â ›â ›â ›â ›â ›â ‹
+        ⢿⣿⣇     ⠙⠿⣿⣿⣿⣿⠿⠋     ⣸⣿⡿
+        ⠈⢻⣿⣧⣀              ⣀⣾⣿⡟⠁
+          ⠙⠻⣿⣷⣦⣄⣀      ⣀⣠⣴⣾⣿⠟⠋
+             ⠉⠛⠿⢿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠉
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/logo/builtin.c 
new/fastfetch-2.9.2/src/logo/builtin.c
--- old/fastfetch-2.9.1/src/logo/builtin.c      2024-04-07 14:49:37.000000000 
+0200
+++ new/fastfetch-2.9.2/src/logo/builtin.c      2024-04-16 04:45:39.000000000 
+0200
@@ -224,7 +224,7 @@
         .colors = {
             FF_COLOR_FG_BLUE,
             FF_COLOR_FG_BLACK,
-            FF_COLOR_FG_GREEN,
+            FF_COLOR_FG_RED,
             FF_COLOR_FG_YELLOW,
         },
     },
@@ -2932,6 +2932,14 @@
         .colorKeys = FF_COLOR_FG_GREEN,
         .colorTitle = FF_COLOR_FG_GREEN,
     },
+    // openSuseMicroOS
+    {
+        .names = {"opensuse-microos", "opensuse_microos"},
+        .lines = FASTFETCH_DATATEXT_LOGO_OPENSUSE_MICROOS,
+        .colors = {
+            FF_COLOR_FG_GREEN,
+        },
+    },
     // OpenSuseLeap
     {
         .names = {"opensuse_leap", "open_suse_leap", "opensuse-leap", 
"open-suse-leap", "suse_leap", "suse-leap", "opensuseleap"},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/modules/disk/disk.c 
new/fastfetch-2.9.2/src/modules/disk/disk.c
--- old/fastfetch-2.9.1/src/modules/disk/disk.c 2024-04-07 14:49:37.000000000 
+0200
+++ new/fastfetch-2.9.2/src/modules/disk/disk.c 2024-04-16 04:45:39.000000000 
+0200
@@ -2,11 +2,12 @@
 #include "common/jsonconfig.h"
 #include "common/parsing.h"
 #include "common/percent.h"
+#include "common/time.h"
 #include "detection/disk/disk.h"
 #include "modules/disk/disk.h"
 #include "util/stringUtils.h"
 
-#define FF_DISK_NUM_FORMAT_ARGS 11
+#define FF_DISK_NUM_FORMAT_ARGS 12
 #pragma GCC diagnostic ignored "-Wsign-conversion"
 
 static void printDisk(FFDiskOptions* options, const FFDisk* disk)
@@ -112,6 +113,7 @@
         bool isExternal = !!(disk->type & FF_DISK_VOLUME_TYPE_EXTERNAL_BIT);
         bool isHidden = !!(disk->type & FF_DISK_VOLUME_TYPE_HIDDEN_BIT);
         bool isReadOnly = !!(disk->type & FF_DISK_VOLUME_TYPE_READONLY_BIT);
+
         FF_PRINT_FORMAT_CHECKED(key.chars, 0, &options->moduleArgs, 
FF_PRINT_TYPE_NO_CUSTOM_KEY, FF_DISK_NUM_FORMAT_ARGS, ((FFformatarg[]) {
             {FF_FORMAT_ARG_TYPE_STRBUF, &usedPretty},
             {FF_FORMAT_ARG_TYPE_STRBUF, &totalPretty},
@@ -124,6 +126,7 @@
             {FF_FORMAT_ARG_TYPE_STRBUF, &disk->filesystem},
             {FF_FORMAT_ARG_TYPE_STRBUF, &disk->name},
             {FF_FORMAT_ARG_TYPE_BOOL, &isReadOnly},
+            {FF_FORMAT_ARG_TYPE_STRING, ffTimeToShortStr(disk->createTime)},
         }));
     }
 }
@@ -448,6 +451,12 @@
             yyjson_mut_arr_add_str(doc, typeArr, "Hidden");
         if(item->type & FF_DISK_VOLUME_TYPE_READONLY_BIT)
             yyjson_mut_arr_add_str(doc, typeArr, "Read-only");
+
+        const char* pstr = ffTimeToFullStr(item->createTime);
+        if (*pstr)
+            yyjson_mut_obj_add_strcpy(doc, obj, "createTime", pstr);
+        else
+            yyjson_mut_obj_add_null(doc, obj, "createTime");
     }
 
     FF_LIST_FOR_EACH(FFDisk, item, disks)
@@ -473,6 +482,7 @@
         "Filesystem",
         "Label / name",
         "True if read-only",
+        "Create time in local timezone",
     }));
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/modules/packages/packages.c 
new/fastfetch-2.9.2/src/modules/packages/packages.c
--- old/fastfetch-2.9.1/src/modules/packages/packages.c 2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/modules/packages/packages.c 2024-04-16 
04:45:39.000000000 +0200
@@ -123,33 +123,63 @@
                 *end = '\0';
 
             #define FF_TEST_PACKAGE_NAME(name) else if 
(ffStrEqualsIgnCase(start, #name)) { options->disabled |= FF_PACKAGES_FLAG_ ## 
name ## _BIT; }
-            if (false);
-            FF_TEST_PACKAGE_NAME(APK)
-            FF_TEST_PACKAGE_NAME(BREW)
-            FF_TEST_PACKAGE_NAME(CHOCO)
-            FF_TEST_PACKAGE_NAME(DPKG)
-            FF_TEST_PACKAGE_NAME(EMERGE)
-            FF_TEST_PACKAGE_NAME(EOPKG)
-            FF_TEST_PACKAGE_NAME(FLATPAK)
-            FF_TEST_PACKAGE_NAME(NIX)
-            FF_TEST_PACKAGE_NAME(OPKG)
-            FF_TEST_PACKAGE_NAME(PACMAN)
-            FF_TEST_PACKAGE_NAME(PALUDIS)
-            FF_TEST_PACKAGE_NAME(PKG)
-            FF_TEST_PACKAGE_NAME(PKGTOOL)
-            FF_TEST_PACKAGE_NAME(MACPORTS)
-            FF_TEST_PACKAGE_NAME(RPM)
-            FF_TEST_PACKAGE_NAME(SCOOP)
-            FF_TEST_PACKAGE_NAME(SNAP)
-            FF_TEST_PACKAGE_NAME(WINGET)
-            FF_TEST_PACKAGE_NAME(XBPS)
-            FF_TEST_PACKAGE_NAME(AM)
+            switch (toupper(start[0]))
+            {
+                case 'A': if (false);
+                    FF_TEST_PACKAGE_NAME(APK)
+                    FF_TEST_PACKAGE_NAME(AM)
+                    break;
+                case 'B': if (false);
+                    FF_TEST_PACKAGE_NAME(BREW)
+                    break;
+                case 'C': if (false);
+                    FF_TEST_PACKAGE_NAME(CHOCO)
+                    break;
+                case 'D': if (false);
+                    FF_TEST_PACKAGE_NAME(DPKG)
+                    break;
+                case 'E': if (false);
+                    FF_TEST_PACKAGE_NAME(EMERGE)
+                    FF_TEST_PACKAGE_NAME(EOPKG)
+                    break;
+                case 'F': if (false);
+                    FF_TEST_PACKAGE_NAME(FLATPAK)
+                    break;
+                case 'M': if (false);
+                    FF_TEST_PACKAGE_NAME(MACPORTS)
+                    break;
+                case 'N': if (false);
+                    FF_TEST_PACKAGE_NAME(NIX)
+                    break;
+                case 'O': if (false);
+                    FF_TEST_PACKAGE_NAME(OPKG)
+                    break;
+                case 'P': if (false);
+                    FF_TEST_PACKAGE_NAME(PACMAN)
+                    FF_TEST_PACKAGE_NAME(PKG)
+                    FF_TEST_PACKAGE_NAME(PKGTOOL)
+                    FF_TEST_PACKAGE_NAME(PALUDIS)
+                    break;
+                case 'R': if (false);
+                    FF_TEST_PACKAGE_NAME(RPM)
+                    break;
+                case 'S': if (false);
+                    FF_TEST_PACKAGE_NAME(SCOOP)
+                    FF_TEST_PACKAGE_NAME(SNAP)
+                    break;
+                case 'W': if (false);
+                    FF_TEST_PACKAGE_NAME(WINGET)
+                    break;
+                case 'X': if (false);
+                    FF_TEST_PACKAGE_NAME(XBPS)
+                    break;
+            }
             #undef FF_TEST_PACKAGE_NAME
 
             if (end)
             {
                 start = end + 1;
-                end = strchr(end, ':');
+                end = strchr(start, ':');
             }
             else
                 break;
@@ -193,29 +223,60 @@
                     const char* flag = yyjson_get_str(flagObj);
 
                     #define FF_TEST_PACKAGE_NAME(name) else if 
(ffStrEqualsIgnCase(flag, #name)) { options->disabled |= FF_PACKAGES_FLAG_ ## 
name ## _BIT; }
-                    if (false);
-                    FF_TEST_PACKAGE_NAME(APK)
-                    FF_TEST_PACKAGE_NAME(BREW)
-                    FF_TEST_PACKAGE_NAME(CHOCO)
-                    FF_TEST_PACKAGE_NAME(DPKG)
-                    FF_TEST_PACKAGE_NAME(EMERGE)
-                    FF_TEST_PACKAGE_NAME(EOPKG)
-                    FF_TEST_PACKAGE_NAME(FLATPAK)
-                    FF_TEST_PACKAGE_NAME(NIX)
-                    FF_TEST_PACKAGE_NAME(OPKG)
-                    FF_TEST_PACKAGE_NAME(PACMAN)
-                    FF_TEST_PACKAGE_NAME(PALUDIS)
-                    FF_TEST_PACKAGE_NAME(PKG)
-                    FF_TEST_PACKAGE_NAME(PKGTOOL)
-                    FF_TEST_PACKAGE_NAME(MACPORTS)
-                    FF_TEST_PACKAGE_NAME(RPM)
-                    FF_TEST_PACKAGE_NAME(SCOOP)
-                    FF_TEST_PACKAGE_NAME(SNAP)
-                    FF_TEST_PACKAGE_NAME(WINGET)
-                    FF_TEST_PACKAGE_NAME(XBPS)
-                    FF_TEST_PACKAGE_NAME(AM)
+                    switch (toupper(flag[0]))
+                    {
+                        case 'A': if (false);
+                            FF_TEST_PACKAGE_NAME(APK)
+                            FF_TEST_PACKAGE_NAME(AM)
+                            break;
+                        case 'B': if (false);
+                            FF_TEST_PACKAGE_NAME(BREW)
+                            break;
+                        case 'C': if (false);
+                            FF_TEST_PACKAGE_NAME(CHOCO)
+                            break;
+                        case 'D': if (false);
+                            FF_TEST_PACKAGE_NAME(DPKG)
+                            break;
+                        case 'E': if (false);
+                            FF_TEST_PACKAGE_NAME(EMERGE)
+                            FF_TEST_PACKAGE_NAME(EOPKG)
+                            break;
+                        case 'F': if (false);
+                            FF_TEST_PACKAGE_NAME(FLATPAK)
+                            break;
+                        case 'M': if (false);
+                            FF_TEST_PACKAGE_NAME(MACPORTS)
+                            break;
+                        case 'N': if (false);
+                            FF_TEST_PACKAGE_NAME(NIX)
+                            break;
+                        case 'O': if (false);
+                            FF_TEST_PACKAGE_NAME(OPKG)
+                            break;
+                        case 'P': if (false);
+                            FF_TEST_PACKAGE_NAME(PACMAN)
+                            FF_TEST_PACKAGE_NAME(PKG)
+                            FF_TEST_PACKAGE_NAME(PKGTOOL)
+                            FF_TEST_PACKAGE_NAME(PALUDIS)
+                            break;
+                        case 'R': if (false);
+                            FF_TEST_PACKAGE_NAME(RPM)
+                            break;
+                        case 'S': if (false);
+                            FF_TEST_PACKAGE_NAME(SCOOP)
+                            FF_TEST_PACKAGE_NAME(SNAP)
+                            break;
+                        case 'W': if (false);
+                            FF_TEST_PACKAGE_NAME(WINGET)
+                            break;
+                        case 'X': if (false);
+                            FF_TEST_PACKAGE_NAME(XBPS)
+                            break;
+                    }
                     #undef FF_TEST_PACKAGE_NAME
                 }
+                continue;
             }
         }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/modules/uptime/uptime.c 
new/fastfetch-2.9.2/src/modules/uptime/uptime.c
--- old/fastfetch-2.9.1/src/modules/uptime/uptime.c     2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/modules/uptime/uptime.c     2024-04-16 
04:45:39.000000000 +0200
@@ -1,10 +1,11 @@
 #include "common/printing.h"
 #include "common/jsonconfig.h"
+#include "common/time.h"
 #include "detection/uptime/uptime.h"
 #include "modules/uptime/uptime.h"
 #include "util/stringUtils.h"
 
-#define FF_UPTIME_NUM_FORMAT_ARGS 7
+#define FF_UPTIME_NUM_FORMAT_ARGS 6
 
 void ffPrintUptime(FFUptimeOptions* options)
 {
@@ -83,8 +84,7 @@
             {FF_FORMAT_ARG_TYPE_UINT, &minutes},
             {FF_FORMAT_ARG_TYPE_UINT, &seconds},
             {FF_FORMAT_ARG_TYPE_UINT, &milliseconds},
-            {FF_FORMAT_ARG_TYPE_UINT64, &result.uptime},
-            {FF_FORMAT_ARG_TYPE_UINT64, &result.bootTime},
+            {FF_FORMAT_ARG_TYPE_STRING, ffTimeToShortStr(result.uptime)},
         }));
     }
 }
@@ -137,7 +137,7 @@
 
     yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result");
     yyjson_mut_obj_add_uint(doc, obj, "uptime", result.uptime);
-    yyjson_mut_obj_add_uint(doc, obj, "bootTime", result.bootTime);
+    yyjson_mut_obj_add_strcpy(doc, obj, "bootTime", 
ffTimeToFullStr(result.bootTime));
 }
 
 void ffPrintUptimeHelpFormat(void)
@@ -148,8 +148,7 @@
         "Minutes",
         "Seconds",
         "Milliseconds",
-        "Uptime in unix timestamp (ms)",
-        "Boot time in unix timestamp (ms)",
+        "Boot time in local timezone",
     }));
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/modules/users/users.c 
new/fastfetch-2.9.2/src/modules/users/users.c
--- old/fastfetch-2.9.1/src/modules/users/users.c       2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/modules/users/users.c       2024-04-16 
04:45:39.000000000 +0200
@@ -1,11 +1,10 @@
 #include "common/printing.h"
 #include "common/jsonconfig.h"
+#include "common/time.h"
 #include "detection/users/users.h"
 #include "modules/users/users.h"
 #include "util/stringUtils.h"
 
-#include <time.h>
-
 #pragma GCC diagnostic ignored "-Wformat" // warning: unknown conversion type 
character 'F' in format
 
 #define FF_USERS_NUM_FORMAT_ARGS 5
@@ -57,12 +56,7 @@
                     ffStrbufAppendF(&result, "@%s", user->hostName.chars);
 
                 if(user->loginTime)
-                {
-                    char buf[64];
-                    time_t time = (time_t) (user->loginTime / 1000);
-                    strftime(buf, sizeof(buf), "%FT%T%z", localtime(&time));
-                    ffStrbufAppendF(&result, " - login time %s", buf);
-                }
+                    ffStrbufAppendF(&result, " - login time %s", 
ffTimeToShortStr(user->loginTime));
 
                 ffStrbufPutTo(&result, stdout);
             }
@@ -79,7 +73,7 @@
                 {FF_FORMAT_ARG_TYPE_STRBUF, &user->hostName},
                 {FF_FORMAT_ARG_TYPE_STRBUF, &user->sessionName},
                 {FF_FORMAT_ARG_TYPE_STRBUF, &user->clientIp},
-                {FF_FORMAT_ARG_TYPE_UINT64, &user->loginTime},
+                {FF_FORMAT_ARG_TYPE_STRING, ffTimeToShortStr(user->loginTime)},
             }));
         }
     }
@@ -163,7 +157,11 @@
         yyjson_mut_obj_add_strbuf(doc, obj, "hostName", &user->hostName);
         yyjson_mut_obj_add_strbuf(doc, obj, "sessionName", &user->sessionName);
         yyjson_mut_obj_add_strbuf(doc, obj, "clientIp", &user->clientIp);
-        yyjson_mut_obj_add_uint(doc, obj, "loginTime", user->loginTime);
+        const char* pstr = ffTimeToFullStr(user->loginTime);
+        if (*pstr)
+            yyjson_mut_obj_add_strcpy(doc, obj, "loginTime", pstr);
+        else
+            yyjson_mut_obj_add_null(doc, obj, "loginTime");
     }
 
 exit:
@@ -183,7 +181,7 @@
         "Host name",
         "Session name",
         "Client IP",
-        "Login Time"
+        "Login Time in local timezone"
     }));
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fastfetch-2.9.1/src/util/platform/FFPlatform.c 
new/fastfetch-2.9.2/src/util/platform/FFPlatform.c
--- old/fastfetch-2.9.1/src/util/platform/FFPlatform.c  2024-04-07 
14:49:37.000000000 +0200
+++ new/fastfetch-2.9.2/src/util/platform/FFPlatform.c  2024-04-16 
04:45:39.000000000 +0200
@@ -52,6 +52,7 @@
     FF_LIST_FOR_EACH(FFstrbuf, dir, platform->dataDirs)
         ffStrbufDestroy(dir);
     ffListDestroy(&platform->dataDirs);
+    ffStrbufDestroy(&platform->exePath);
 
     ffStrbufDestroy(&platform->userName);
     ffStrbufDestroy(&platform->hostName);

Reply via email to