Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package emacs for openSUSE:Factory checked in at 2026-04-26 21:10:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/emacs (Old) and /work/SRC/openSUSE:Factory/.emacs.new.11940 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "emacs" Sun Apr 26 21:10:53 2026 rev:218 rq:1349130 version:30.2 Changes: -------- --- /work/SRC/openSUSE:Factory/emacs/emacs.changes 2026-04-21 12:43:01.165937190 +0200 +++ /work/SRC/openSUSE:Factory/.emacs.new.11940/emacs.changes 2026-04-26 21:11:59.111067467 +0200 @@ -1,0 +2,22 @@ +Fri Apr 24 12:46:33 UTC 2026 - Dr. Werner Fink <[email protected]> + +- Modify patch emacs-30.2-tree-sitter-0.26.8.patch + * Let find the tree-sitter code find the libraries below + %{_libdir}/tree-sitter/ without using LD_LIBRARY_PATH + +------------------------------------------------------------------- +Thu Apr 23 08:46:16 UTC 2026 - Dr. Werner Fink <[email protected]> + +- Add patch emacs-30.2-boo1262611.patch + * Fix CVE-2026-6861: Memory corruption vulnerability when + processing SVG CSS (boo#1262611) + +------------------------------------------------------------------- +Tue Apr 21 08:02:23 UTC 2026 - Dr. Werner Fink <[email protected]> + +- Let treesit test find its ruby shared library +- Modify patch emacs-30.2-tree-sitter-0.26.8.patch + * Add commit to reflect new syntax ot tree-sitter like :equal + changed to :eq? + +------------------------------------------------------------------- New: ---- emacs-30.2-boo1262611.patch ----------(New B)---------- New: - Add patch emacs-30.2-boo1262611.patch * Fix CVE-2026-6861: Memory corruption vulnerability when ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ emacs.spec ++++++ --- /var/tmp/diff_new_pack.2qu5yF/_old 2026-04-26 21:12:00.495124056 +0200 +++ /var/tmp/diff_new_pack.2qu5yF/_new 2026-04-26 21:12:00.499124219 +0200 @@ -258,6 +258,7 @@ Patch56: 0016-Change-native-comp-async-report-warnings-errors-to-s.patch Patch57: emacs-30.2-fix-zoom.patch Patch58: emacs-30.2-tree-sitter-0.26.8.patch +Patch59: emacs-30.2-boo1262611.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build %{expand: %%global include_info %(test -s /usr/share/info/info.info* && echo 0 || echo 1)} @@ -437,6 +438,7 @@ %patch -P56 -p1 %patch -P57 -p1 %patch -P58 -p1 +%patch -P59 -p1 %patch -P1 -p0 -b .xauth %if %{with memmmap} %patch -P2 -p0 -b .glibc @@ -540,6 +542,7 @@ " %endif CFLAGS="${RPM_OPT_FLAGS} -D_GNU_SOURCE -DGDK_DISABLE_DEPRECATION_WARNINGS -DGLIB_DISABLE_DEPRECATION_WARNINGS" + CFLAGS="${CFLAGS} -DTREESIT_SYSTEM_GRAMMAR_DIR='\"%{_libdir}/tree-sitter/\"'" LDFLAGS= cflags -pipe CFLAGS cflags -Wno-pointer-sign CFLAGS @@ -1085,6 +1088,7 @@ echo No checks within chroot environment exit 0 fi +# This is treesit test to make it find its ruby lib # This is patch emacs-30.2-fix-zoom.patch ZOOM_IMAGE_TESTS=broken export ZOOM_IMAGE_TESTS ++++++ emacs-30.2-boo1262611.patch ++++++ >From 8f535370b9efbc91673b20c6987a5cae4f6dc562 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii <[email protected]> Date: Sat, 18 Apr 2026 10:35:05 +0300 Subject: [PATCH] * src/image.c (svg_load_image): Fix off-by-one mistake (bug#80851). --- src/image.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/image.c b/src/image.c index b5b7de3351f..d98c63f06c6 100644 --- a/src/image.c +++ b/src/image.c @@ -12052,7 +12052,7 @@ svg_load_image (struct frame *f, struct image *img, char *contents, { css = xmalloc (SBYTES (lcss) + 1); strncpy (css, SSDATA (lcss), SBYTES (lcss)); - *(css + SBYTES (lcss) + 1) = 0; + *(css + SBYTES (lcss)) = 0; } #endif -- 2.51.0 ++++++ emacs-30.2-tree-sitter-0.26.8.patch ++++++ --- /var/tmp/diff_new_pack.2qu5yF/_old 2026-04-26 21:12:00.751134523 +0200 +++ /var/tmp/diff_new_pack.2qu5yF/_new 2026-04-26 21:12:00.767135177 +0200 @@ -19,7 +19,7 @@ index 0ba6c733d64..8c586109b2d 100644 --- a/src/treesit.c +++ b/src/treesit.c -@@ -22,6 +22,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ +@@ -22,6 +22,7 @@ along with GNU Emacs. If not, see <http #include <config.h> #include "lisp.h" #include "buffer.h" @@ -27,7 +27,7 @@ #include "treesit.h" -@@ -541,6 +542,15 @@ treesit_debug_print_parser_list (char *msg, Lisp_Object parser) +@@ -538,6 +539,15 @@ treesit_debug_print_parser_list (char *m /*** Loading language library */ @@ -43,7 +43,7 @@ /* Translate a symbol treesit-<lang> to a C name treesit_<lang>. */ static void treesit_symbol_to_c_name (char *symbol_name) -@@ -625,7 +635,7 @@ treesit_load_language_push_for_each_suffix (Lisp_Object lib_base_name, +@@ -637,7 +647,7 @@ treesit_load_language_push_for_each_suff If error occurs, return NULL and fill SIGNAL_SYMBOL and SIGNAL_DATA with values suitable for xsignal. */ @@ -52,7 +52,7 @@ treesit_load_language (Lisp_Object language_symbol, Lisp_Object *signal_symbol, Lisp_Object *signal_data) { -@@ -676,6 +686,7 @@ treesit_load_language (Lisp_Object language_symbol, +@@ -688,6 +698,7 @@ treesit_load_language (Lisp_Object langu dynlib_handle_ptr handle; const char *error; Lisp_Object error_list = Qnil; @@ -60,7 +60,7 @@ tail = path_candidates; error = NULL; -@@ -700,7 +711,7 @@ treesit_load_language (Lisp_Object language_symbol, +@@ -712,7 +723,7 @@ treesit_load_language (Lisp_Object langu mismatch. */ *signal_symbol = Qtreesit_load_language_error; *signal_data = Fcons (Qnot_found, Fnreverse (error_list)); @@ -69,7 +69,7 @@ } /* Load TSLanguage. */ -@@ -722,7 +733,7 @@ treesit_load_language (Lisp_Object language_symbol, +@@ -734,7 +745,7 @@ treesit_load_language (Lisp_Object langu { *signal_symbol = Qtreesit_load_language_error; *signal_data = list2 (Qsymbol_error, build_string (error)); @@ -78,7 +78,7 @@ } TSLanguage *lang = (*langfn) (); -@@ -735,9 +746,14 @@ treesit_load_language (Lisp_Object language_symbol, +@@ -747,9 +758,14 @@ treesit_load_language (Lisp_Object langu *signal_symbol = Qtreesit_load_language_error; *signal_data = list2 (Qversion_mismatch, make_fixnum (ts_language_version (lang))); @@ -95,7 +95,7 @@ } DEFUN ("treesit-language-available-p", Ftreesit_language_available_p, -@@ -754,7 +770,9 @@ If DETAIL is non-nil, return (t . nil) when LANGUAGE is available, +@@ -766,7 +782,9 @@ If DETAIL is non-nil, return (t . nil) w treesit_initialize (); Lisp_Object signal_symbol = Qnil; Lisp_Object signal_data = Qnil; @@ -106,7 +106,7 @@ { if (NILP (detail)) return Qnil; -@@ -800,9 +818,9 @@ Return nil if a grammar library for LANGUAGE is not available. */) +@@ -812,9 +830,9 @@ Return nil if a grammar library for LANG { Lisp_Object signal_symbol = Qnil; Lisp_Object signal_data = Qnil; @@ -119,7 +119,7 @@ if (ts_language == NULL) return Qnil; uint32_t version = ts_language_version (ts_language); -@@ -810,6 +828,30 @@ Return nil if a grammar library for LANGUAGE is not available. */) +@@ -822,6 +840,30 @@ Return nil if a grammar library for LANG } } @@ -150,7 +150,7 @@ /*** Parsing functions */ -@@ -1401,8 +1443,9 @@ treesit_ensure_query_compiled (Lisp_Object query, Lisp_Object *signal_symbol, +@@ -1449,8 +1491,9 @@ treesit_ensure_query_compiled (Lisp_Obje Lisp_Object language = XTS_COMPILED_QUERY (query)->language; /* This is the main reason why we compile query lazily: to avoid loading languages early. */ @@ -162,7 +162,7 @@ if (treesit_lang == NULL) return NULL; -@@ -1573,8 +1616,9 @@ an indirect buffer. */) +@@ -1604,8 +1647,9 @@ an indirect buffer. */) Lisp_Object signal_symbol = Qnil; Lisp_Object signal_data = Qnil; TSParser *parser = ts_parser_new (); @@ -174,7 +174,7 @@ if (lang == NULL) xsignal (signal_symbol, signal_data); /* We check language version when loading a language, so this should -@@ -4369,6 +4413,7 @@ applies to LANGUAGE-A will be redirected to LANGUAGE-B instead. */); +@@ -4352,6 +4396,7 @@ the symbol of that THING. For example, defsubr (&Streesit_language_available_p); defsubr (&Streesit_library_abi_version); defsubr (&Streesit_language_abi_version); @@ -206,7 +206,7 @@ index a353bc942d3..68de843ce4d 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el -@@ -4297,7 +4297,7 @@ instead of emitting a warning." +@@ -3059,7 +3059,7 @@ instead of emitting a warning." (pcase-let ((`(,available . ,err) (treesit-language-available-p lang t))) (when (not available) @@ -219,7 +219,7 @@ index 3a19e0cb282..de74e41c89a 100644 --- a/src/treesit.c +++ b/src/treesit.c -@@ -757,6 +757,7 @@ treesit_load_language (Lisp_Object language_symbol, +@@ -704,6 +704,7 @@ treesit_load_language (Lisp_Object language_symbol, error = NULL; handle = NULL; @@ -227,7 +227,7 @@ FOR_EACH_TAIL (tail) { char *library_name = SSDATA (XCAR (tail)); -@@ -764,7 +765,10 @@ treesit_load_language (Lisp_Object language_symbol, +@@ -711,7 +712,10 @@ treesit_load_language (Lisp_Object language_symbol, handle = dynlib_open (library_name); error = dynlib_error (); if (error == NULL) @@ -239,7 +239,7 @@ else error_list = Fcons (build_string (error), error_list); } -@@ -808,9 +812,15 @@ treesit_load_language (Lisp_Object language_symbol, +@@ -755,9 +759,15 @@ treesit_load_language (Lisp_Object language_symbol, ts_parser_delete (parser); if (!success) { @@ -257,7 +257,7 @@ return loaded_lang; } -@@ -5091,7 +5101,7 @@ syms_of_treesit (void) +@@ -4241,7 +4251,7 @@ syms_of_treesit (void) DEFSYM (Qnot_found, "not-found"); DEFSYM (Qsymbol_error, "symbol-error"); @@ -340,7 +340,7 @@ #define ts_node_child fn_ts_node_child #define ts_node_child_by_field_name fn_ts_node_child_by_field_name #define ts_node_child_count fn_ts_node_child_count -@@ -711,6 +727,22 @@ treesit_load_language_push_for_each_suffix (Lisp_Object lib_base_name, +@@ -642,6 +658,22 @@ treesit_load_language_push_for_each_suffix (Lisp_Object lib_base_name, } } @@ -363,7 +363,7 @@ /* Load the dynamic library of LANGUAGE_SYMBOL and return the pointer to the language definition. -@@ -832,7 +864,7 @@ treesit_load_language (Lisp_Object language_symbol, +@@ -763,7 +795,7 @@ treesit_load_language (Lisp_Object language_symbol, build_string ("%s's ABI version is %d, but supported versions are %d-%d"); Lisp_Object formatted_msg = CALLN (Fformat_message, fmt, loaded_lib, @@ -372,7 +372,7 @@ make_fixnum (TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION), make_fixnum (TREE_SITTER_LANGUAGE_VERSION)); *signal_symbol = Qtreesit_load_language_error; -@@ -914,7 +946,7 @@ Return nil if a grammar library for LANGUAGE is not available. */) +@@ -845,7 +877,7 @@ Return nil if a grammar library for LANGUAGE is not available. */) TSLanguage *ts_language = lang.lang; if (ts_language == NULL) return Qnil; @@ -384,4 +384,334 @@ -- 2.51.0 +From b01435306a36e4e75671fbe7bacea351f89947d5 Mon Sep 17 00:00:00 2001 +From: Yuan Fu <[email protected]> +Date: Sun, 2 Nov 2025 16:16:50 -0800 +Subject: [PATCH] Change tree-sitter query predicate names (bug#79687) + +Latest tree-sitter library throws a syntax error if the +predicate names in a query don't end with question mark. So we +made the following change: + +:equal changed to :eq? +:match changed to :match? +:pred changed to :pred? + +Old names are transparently converted to new names when +expanding patterns. + +:match predicate can now take the regexp and the node in any +order: it'll figure out which is which automatically. This way +it works with current Emacs convention (regexp first), as well +as tree-sitter's match convention (regexp second). + +* doc/lispref/parsing.texi (Pattern Matching): Update manuel to +use new predicate names. +* src/treesit.c: +(Ftreesit_pattern_expand): +(Ftreesit_query_expand): +(treesit_predicate_match): +(treesit_eval_predicates): +(syms_of_treesit): Use new predicate names. +* test/src/treesit-tests.el (treesit-query-api): Update test. +--- + doc/lispref/parsing.texi | 34 ++++++++++------- + src/treesit.c | 90 ++++++++++++++++++++++++---------------------- + test/src/treesit-tests.el | 6 +-- + 3 files changed, 71 insertions(+), 59 deletions(-) + +--- a/doc/lispref/parsing.texi ++++ b/doc/lispref/parsing.texi 2026-04-21 11:28:33.986819462 +0000 +@@ -1375,7 +1375,7 @@ example, with the following pattern: + @group + ( + (array :anchor (_) @@first (_) @@last :anchor) +- (:equal @@first @@last) ++ (:eq? @@first @@last) + ) + @end group + @end example +@@ -1384,24 +1384,32 @@ example, with the following pattern: + tree-sitter only matches arrays where the first element is equal to + the last element. To attach a predicate to a pattern, we need to + group them together. Currently there are three predicates: +-@code{:equal}, @code{:match}, and @code{:pred}. ++@code{:eq?}, @code{:match?}, and @code{:pred?}. + +-@deffn Predicate :equal arg1 arg2 ++@deffn Predicate :eq? arg1 arg2 + Matches if @var{arg1} is equal to @var{arg2}. Arguments can be either + strings or capture names. Capture names represent the text that the +-captured node spans in the buffer. ++captured node spans in the buffer. Note that this is more like ++@code{equal} in Elisp, but @code{eq?} is the convention used by ++tree-sitter. Previously we supported the @code{:equal} predicate but ++it's now considered deprecated. + @end deffn + +-@deffn Predicate :match regexp capture-name ++@deffn Predicate :match? capture-name regexp + Matches if the text that @var{capture-name}'s node spans in the buffer + matches regular expression @var{regexp}, given as a string literal. +-Matching is case-sensitive. ++Matching is case-sensitive. The ordering of the arguments doesn't ++matter. Previously we supported the @code{:match} predicate but it's ++now considered deprecated. + @end deffn + +-@deffn Predicate :pred fn &rest nodes ++@deffn Predicate :pred? fn &rest nodes + Matches if function @var{fn} returns non-@code{nil} when passed each + node in @var{nodes} as arguments. The function runs with the current +-buffer set to the buffer of node being queried. ++buffer set to the buffer of node being queried. Be very careful when ++using this predicate, since it can be expensive when used in a tight ++loop. Previously we supported the @code{:pred} predicate but it's now ++considered deprecated. + @end deffn + + Note that a predicate can only refer to capture names that appear in +@@ -1456,9 +1464,9 @@ Anchor @code{:anchor} is written as @sam + @item + @samp{:+} is written as @samp{+}. + @item +-@code{:equal}, @code{:match} and @code{:pred} are written as +-@code{#equal}, @code{#match} and @code{#pred}, respectively. +-In general, predicates change their @samp{:} to @samp{#}. ++@code{:eq?}, @code{:match?} and @code{:pred?} are written as ++@code{#eq?}, @code{#match?} and @code{#pred?}, respectively. In ++general, predicates change the @samp{:} to @samp{#}. + @end itemize + + For example, +@@ -1467,7 +1475,7 @@ For example, + @group + '(( + (compound_expression :anchor (_) @@first (_) :* @@rest) +- (:match "love" @@first) ++ (:match? "love" @@first) + )) + @end group + @end example +@@ -1479,7 +1487,7 @@ is written in string form as + @group + "( + (compound_expression . (_) @@first (_)* @@rest) +- (#match \"love\" @@first) ++ (#match? \"love\" @@first) + )" + @end group + @end example +--- a/src/treesit.c ++++ b/src/treesit.c 2026-04-21 11:21:26.262613893 +0000 +@@ -432,17 +432,17 @@ static Lisp_Object Vtreesit_str_dot; + static Lisp_Object Vtreesit_str_question_mark; + static Lisp_Object Vtreesit_str_star; + static Lisp_Object Vtreesit_str_plus; +-static Lisp_Object Vtreesit_str_pound_equal; +-static Lisp_Object Vtreesit_str_pound_match; +-static Lisp_Object Vtreesit_str_pound_pred; ++static Lisp_Object Vtreesit_str_pound_eq_question_mark; ++static Lisp_Object Vtreesit_str_pound_match_question_mark; ++static Lisp_Object Vtreesit_str_pound_pred_question_mark; + static Lisp_Object Vtreesit_str_open_bracket; + static Lisp_Object Vtreesit_str_close_bracket; + static Lisp_Object Vtreesit_str_open_paren; + static Lisp_Object Vtreesit_str_close_paren; + static Lisp_Object Vtreesit_str_space; +-static Lisp_Object Vtreesit_str_equal; +-static Lisp_Object Vtreesit_str_match; +-static Lisp_Object Vtreesit_str_pred; ++static Lisp_Object Vtreesit_str_eq_question_mark; ++static Lisp_Object Vtreesit_str_match_question_mark; ++static Lisp_Object Vtreesit_str_pred_question_mark; + static Lisp_Object Vtreesit_str_empty; + + /* This is the limit on recursion levels for some tree-sitter +@@ -2690,12 +2690,12 @@ See Info node `(elisp)Pattern Matching' + return Vtreesit_str_star; + if (BASE_EQ (pattern, QCplus)) + return Vtreesit_str_plus; +- if (BASE_EQ (pattern, QCequal)) +- return Vtreesit_str_pound_equal; +- if (BASE_EQ (pattern, QCmatch)) +- return Vtreesit_str_pound_match; +- if (BASE_EQ (pattern, QCpred)) +- return Vtreesit_str_pound_pred; ++ if (BASE_EQ (pattern, QCequal) || BASE_EQ (pattern, QCeq_q)) ++ return Vtreesit_str_pound_eq_question_mark; ++ if (BASE_EQ (pattern, QCmatch) || BASE_EQ (pattern, QCmatch_q)) ++ return Vtreesit_str_pound_match_question_mark; ++ if (BASE_EQ (pattern, QCpred) || BASE_EQ (pattern, QCpred_q)) ++ return Vtreesit_str_pound_pred_question_mark; + Lisp_Object opening_delimeter + = VECTORP (pattern) + ? Vtreesit_str_open_bracket : Vtreesit_str_open_paren; +@@ -2726,7 +2726,9 @@ A PATTERN in QUERY can be + :* + :+ + :equal ++ :eq? + :match ++ :match? + (TYPE PATTERN...) + [PATTERN...] + FIELD-NAME: +@@ -2889,7 +2891,7 @@ treesit_predicate_equal (Lisp_Object arg + return !NILP (Fstring_equal (text1, text2)); + } + +-/* Handles predicate (#match "regexp" @node). Return true if "regexp" ++/* Handles predicate (#match? "regexp" @node). Return true if "regexp" + matches the text spanned by @node; return false otherwise. + Matching is case-sensitive. If everything goes fine, don't touch + SIGNAL_DATA; if error occurs, set it to a suitable signal data. */ +@@ -2899,26 +2901,25 @@ treesit_predicate_match (Lisp_Object arg + { + if (list_length (args) != 2) + { +- *signal_data = list2 (build_string ("Predicate `match' requires two " ++ *signal_data = list2 (build_string ("Predicate `match?' requires two " + "arguments but got"), + Flength (args)); + return false; + } +- Lisp_Object regexp = XCAR (args); +- Lisp_Object capture_name = XCAR (XCDR (args)); ++ Lisp_Object arg1 = XCAR (args); ++ Lisp_Object arg2 = XCAR (XCDR (args)); ++ Lisp_Object regexp = SYMBOLP (arg2) ? arg1 : arg2; ++ Lisp_Object capture_name = SYMBOLP (arg2) ? arg2 : arg1; ++ ++ if (!STRINGP (regexp) || !SYMBOLP (capture_name)) ++ { ++ *signal_data = list2 (build_string ("Predicate `match?' takes a regexp " ++ "and a node capture (order doesn't " ++ "matter), but got"), ++ Flength (args)); ++ return false; ++ } + +- /* It's probably common to get the argument order backwards. Catch +- this mistake early and show helpful explanation, because Emacs +- loves you. (We put the regexp first because that's what +- string-match does.) */ +- if (!STRINGP (regexp)) +- xsignal1 (Qtreesit_query_error, +- build_string ("The first argument to `match' should " +- "be a regexp string, not a capture name")); +- if (!SYMBOLP (capture_name)) +- xsignal1 (Qtreesit_query_error, +- build_string ("The second argument to `match' should " +- "be a capture name, not a string")); + + Lisp_Object node = Qnil; + if (!treesit_predicate_capture_name_to_node (capture_name, captures, &node, +@@ -3002,11 +3003,11 @@ treesit_eval_predicates (struct capture_ + Lisp_Object predicate = XCAR (tail); + Lisp_Object fn = XCAR (predicate); + Lisp_Object args = XCDR (predicate); +- if (!NILP (Fstring_equal (fn, Vtreesit_str_equal))) ++ if (!NILP (Fstring_equal (fn, Vtreesit_str_eq_question_mark))) + pass &= treesit_predicate_equal (args, captures, signal_data); +- else if (!NILP (Fstring_equal (fn, Vtreesit_str_match))) ++ else if (!NILP (Fstring_equal (fn, Vtreesit_str_match_question_mark))) + pass &= treesit_predicate_match (args, captures, signal_data); +- else if (!NILP (Fstring_equal (fn, Vtreesit_str_pred))) ++ else if (!NILP (Fstring_equal (fn, Vtreesit_str_pred_question_mark))) + pass &= treesit_predicate_pred (args, captures, signal_data); + else + { +@@ -4278,8 +4279,11 @@ syms_of_treesit (void) + DEFSYM (QCstar, ":*"); + DEFSYM (QCplus, ":+"); + DEFSYM (QCequal, ":equal"); ++ DEFSYM (QCeq_q, ":eq?"); + DEFSYM (QCmatch, ":match"); ++ DEFSYM (QCmatch_q, ":match?"); + DEFSYM (QCpred, ":pred"); ++ DEFSYM (QCpred_q, ":pred?"); + + DEFSYM (Qnot_found, "not-found"); + DEFSYM (Qsymbol_error, "symbol-error"); +@@ -4410,12 +4414,12 @@ the symbol of that THING. For example, + Vtreesit_str_star = build_pure_c_string ("*"); + staticpro (&Vtreesit_str_plus); + Vtreesit_str_plus = build_pure_c_string ("+"); +- staticpro (&Vtreesit_str_pound_equal); +- Vtreesit_str_pound_equal = build_pure_c_string ("#equal"); +- staticpro (&Vtreesit_str_pound_match); +- Vtreesit_str_pound_match = build_pure_c_string ("#match"); +- staticpro (&Vtreesit_str_pound_pred); +- Vtreesit_str_pound_pred = build_pure_c_string ("#pred"); ++ staticpro (&Vtreesit_str_pound_eq_question_mark); ++ Vtreesit_str_pound_eq_question_mark = build_string ("#eq?"); ++ staticpro (&Vtreesit_str_pound_match_question_mark); ++ Vtreesit_str_pound_match_question_mark = build_string ("#match?"); ++ staticpro (&Vtreesit_str_pound_pred_question_mark); ++ Vtreesit_str_pound_pred_question_mark = build_string ("#pred?"); + staticpro (&Vtreesit_str_open_bracket); + Vtreesit_str_open_bracket = build_pure_c_string ("["); + staticpro (&Vtreesit_str_close_bracket); +@@ -4426,12 +4430,12 @@ the symbol of that THING. For example, + Vtreesit_str_close_paren = build_pure_c_string (")"); + staticpro (&Vtreesit_str_space); + Vtreesit_str_space = build_pure_c_string (" "); +- staticpro (&Vtreesit_str_equal); +- Vtreesit_str_equal = build_pure_c_string ("equal"); +- staticpro (&Vtreesit_str_match); +- Vtreesit_str_match = build_pure_c_string ("match"); +- staticpro (&Vtreesit_str_pred); +- Vtreesit_str_pred = build_pure_c_string ("pred"); ++ staticpro (&Vtreesit_str_eq_question_mark); ++ Vtreesit_str_eq_question_mark = build_string ("eq?"); ++ staticpro (&Vtreesit_str_match_question_mark); ++ Vtreesit_str_match_question_mark = build_string ("match?"); ++ staticpro (&Vtreesit_str_pred_question_mark); ++ Vtreesit_str_pred_question_mark = build_string ("pred?"); + staticpro (&Vtreesit_str_empty); + Vtreesit_str_empty = build_pure_c_string (""); + +--- a/test/src/treesit-tests.el ++++ b/test/src/treesit-tests.el 2026-04-21 11:28:33.986819462 +0000 +@@ -434,10 +434,10 @@ BODY is the test body." + ;; String query. + '("(string) @string + (pair key: (_) @keyword) +-((_) @bob (#match \"\\\\`B.b\\\\'\" @bob)) ++((_) @bob (#match? \"\\\\`B.b\\\\'\" @bob)) + (number) @number +-((number) @n3 (#equal \"3\" @n3)) +-((number) @n3p (#pred treesit--ert-pred-last-sibling @n3p))" ++((number) @n3 (#eq? \"3\" @n3)) ++((number) @n3p (#pred? treesit--ert-pred-last-sibling @n3p))" + ;; Sexp query. + ((string) @string + (pair key: (_) @keyword) +From: [email protected] +Date: Fri, 24 Apr 2026 13:13:32 +0200 +Subject: [FIX] Let treesit find libraries below %{_libdir}/tree-sitter/ + +--- + src/treesit.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- emacs-30.2/src/treesit.c ++++ emacs-30.2/src/treesit.c 2026-04-24 12:06:16.936246505 +0000 +@@ -712,6 +712,15 @@ treesit_load_language (Lisp_Object langu + = Fexpand_file_name (concat2 (build_string ("tree-sitter/"), lib_base_name), + Fsymbol_value (Quser_emacs_directory)); + treesit_load_language_push_for_each_suffix (lib_name, &path_candidates); ++ ++ /* --- START SUSE SYSTEM TREE-SITTER LOAD PATH --- */ ++#ifdef TREESIT_SYSTEM_GRAMMAR_DIR ++ Lisp_Object sys_prefix = concat2 (build_string (TREESIT_SYSTEM_GRAMMAR_DIR), ++ lib_base_name); ++ treesit_load_language_push_for_each_suffix (sys_prefix, &path_candidates); ++#endif ++ /* --- END SUSE SYSTEM TREE-SITTER LOAD PATH --- */ ++ + /* Then push paths from treesit-extra-load-path. */ + Lisp_Object tail; +
