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);