commit:     628aa6e172bda140bb466a32e12508eec70e6766
Author:     Lars Wendler <polynomial-c <AT> gentoo <DOT> org>
AuthorDate: Fri Jul 31 08:31:28 2020 +0000
Commit:     Lars Wendler <polynomial-c <AT> gentoo <DOT> org>
CommitDate: Fri Jul 31 08:38:07 2020 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=628aa6e1

app-editors/nano: Fixed build with USE="minimal" and USE="-spell"

Closes: https://bugs.gentoo.org/734856
Package-Manager: Portage-3.0.1, Repoman-2.3.23
Signed-off-by: Lars Wendler <polynomial-c <AT> gentoo.org>

 .../nano-4.9.3-disable-speller_build_fix.patch     | 342 +++++++++++++++++++++
 .../nano/files/nano-4.9.3-minimal_build_fix.patch  |  46 +++
 app-editors/nano/nano-4.9.3.ebuild                 |   5 +
 3 files changed, 393 insertions(+)

diff --git a/app-editors/nano/files/nano-4.9.3-disable-speller_build_fix.patch 
b/app-editors/nano/files/nano-4.9.3-disable-speller_build_fix.patch
new file mode 100644
index 00000000000..978e24de805
--- /dev/null
+++ b/app-editors/nano/files/nano-4.9.3-disable-speller_build_fix.patch
@@ -0,0 +1,342 @@
+From 4b7f7a30c9ec593d68186b1dfef44d4e2bda735b Mon Sep 17 00:00:00 2001
+From: Benno Schulenberg <[email protected]>
+Date: Mon, 22 Jun 2020 08:39:59 +0200
+Subject: [PATCH] build: fix compilation when configured with
+ --disable-speller
+
+Move two functions that are used by the formatter too
+to between the proper #ifdef.
+
+Problem existed since commit 8089f5ad from a month ago.
+
+Backported to v4.9.3
+Signed-off-by: Lars Wendler <[email protected]>
+---
+ src/text.c | 302 ++++++++++++++++++++++++++---------------------------
+ 1 file changed, 151 insertions(+), 151 deletions(-)
+
+diff --git a/src/text.c b/src/text.c
+index 93ad3704..c7690fd0 100644
+--- a/src/text.c
++++ b/src/text.c
+@@ -2011,8 +2011,159 @@ void construct_argument_list(char ***arguments, char 
*command, char *filename)
+       (*arguments)[count - 2] = filename;
+       (*arguments)[count - 1] = NULL;
+ }
++
++/* Open the specified file, and if that succeeds, remove the text of the 
marked
++ * region or of the entire buffer and read the file contents into its place. 
*/
++bool replace_buffer(const char *filename, undo_type action, const char 
*operation)
++{
++      linestruct *was_cutbuffer = cutbuffer;
++      int descriptor;
++      FILE *stream;
++
++      descriptor = open_file(filename, FALSE, &stream);
++
++      if (descriptor < 0)
++              return FALSE;
++
++      cutbuffer = NULL;
++
++#ifndef NANO_TINY
++      add_undo(COUPLE_BEGIN, operation);
++
++      /* Cut either the marked region or the whole buffer. */
++      add_undo(action, NULL);
++#endif
++      do_snip(FALSE, openfile->mark, openfile->mark == NULL, FALSE);
++#ifndef NANO_TINY
++      update_undo(action);
+ #endif
+ 
++      /* Discard what was cut. */
++      free_lines(cutbuffer);
++      cutbuffer = was_cutbuffer;
++
++      /* Insert the spell-checked file into the cleared area. */
++      read_file(stream, descriptor, filename, TRUE);
++
++#ifndef NANO_TINY
++      add_undo(COUPLE_END, operation);
++#endif
++      return TRUE;
++}
++
++/* Execute the given program, with the given temp file as last argument. */
++const char *treat(char *tempfile_name, char *theprogram, bool spelling)
++{
++      ssize_t lineno_save = openfile->current->lineno;
++      size_t current_x_save = openfile->current_x;
++      size_t pww_save = openfile->placewewant;
++      bool was_at_eol = (openfile->current->data[openfile->current_x] == 
'\0');
++      struct stat fileinfo;
++      long timestamp_sec, timestamp_nsec;
++      static char **arguments = NULL;
++      pid_t thepid;
++      int program_status;
++      bool replaced = FALSE;
++
++      /* Get the timestamp and the size of the temporary file. */
++      stat(tempfile_name, &fileinfo);
++      timestamp_sec = (long)fileinfo.st_mtim.tv_sec;
++      timestamp_nsec = (long)fileinfo.st_mtim.tv_nsec;
++
++      /* If the number of bytes to check is zero, get out. */
++      if (fileinfo.st_size == 0)
++              return NULL;
++
++      /* Exit from curses mode to give the program control of the terminal. */
++      endwin();
++
++      construct_argument_list(&arguments, theprogram, tempfile_name);
++
++      /* Fork a child process and run the given program in it. */
++      if ((thepid = fork()) == 0) {
++              execvp(arguments[0], arguments);
++
++              /* Terminate the child if the program is not found. */
++              exit(9);
++      } else if (thepid < 0)
++              return _("Could not fork");
++
++      /* Block SIGWINCHes while waiting for the program to end,
++       * so nano doesn't get pushed past the wait(). */
++      block_sigwinch(TRUE);
++      wait(&program_status);
++      block_sigwinch(FALSE);
++
++      /* Restore the terminal state and reenter curses mode. */
++      terminal_init();
++      doupdate();
++
++      if (!WIFEXITED(program_status) || WEXITSTATUS(program_status) > 2) {
++              statusline(ALERT, _("Error invoking '%s'"), arguments[0]);
++              return NULL;
++      } else if (WEXITSTATUS(program_status) != 0)
++              statusline(ALERT, _("Program '%s' complained"), arguments[0]);
++
++      /* Stat the temporary file again. */
++      stat(tempfile_name, &fileinfo);
++
++      /* When the temporary file wasn't touched, say so and leave. */
++      if ((long)fileinfo.st_mtim.tv_sec == timestamp_sec &&
++                              (long)fileinfo.st_mtim.tv_nsec == 
timestamp_nsec) {
++              statusbar(_("Nothing changed"));
++              return NULL;
++      }
++
++#ifndef NANO_TINY
++      /* Replace the marked text (or entire text) with the corrected text. */
++      if (spelling && openfile->mark) {
++              ssize_t was_mark_lineno = openfile->mark->lineno;
++              bool upright = mark_is_before_cursor();
++
++              replaced = replace_buffer(tempfile_name, CUT, "spelling 
correction");
++
++              /* Adjust the end point of the marked region for any change in
++               * length of the region's last line. */
++              if (upright)
++                      current_x_save = openfile->current_x;
++              else
++                      openfile->mark_x = openfile->current_x;
++
++              /* Restore the mark. */
++              openfile->mark = line_from_number(was_mark_lineno);
++      } else
++#endif
++      {
++              openfile->current = openfile->filetop;
++              openfile->current_x = 0;
++
++              replaced = replace_buffer(tempfile_name, CUT_TO_EOF,
++                                      /* TRANSLATORS: The next two go with 
Undid/Redid messages. */
++                                      (spelling ? N_("spelling correction") : 
N_("formatting")));
++      }
++
++      /* Go back to the old position. */
++      goto_line_posx(lineno_save, current_x_save);
++      if (was_at_eol || openfile->current_x > strlen(openfile->current->data))
++              openfile->current_x = strlen(openfile->current->data);
++
++#ifndef NANO_TINY
++      if (replaced)
++              update_undo(COUPLE_END);
++#endif
++
++      openfile->placewewant = pww_save;
++      adjust_viewport(STATIONARY);
++
++      if (spelling)
++              statusbar(_("Finished checking spelling"));
++      else
++              statusbar(_("Buffer has been processed"));
++
++      return NULL;
++}
++#endif /* ENABLE_SPELLER || ENABLE_COLOR */
++
+ #ifdef ENABLE_SPELLER
+ /* Let the user edit the misspelled word.  Return FALSE if the user cancels. 
*/
+ bool fix_spello(const char *word)
+@@ -2307,157 +2458,6 @@ const char *do_int_speller(const char *tempfile_name)
+       return NULL;
+ }
+ 
+-/* Open the specified file, and if that succeeds, remove the text of the 
marked
+- * region or of the entire buffer and read the file contents into its place. 
*/
+-bool replace_buffer(const char *filename, undo_type action, const char 
*operation)
+-{
+-      linestruct *was_cutbuffer = cutbuffer;
+-      int descriptor;
+-      FILE *stream;
+-
+-      descriptor = open_file(filename, FALSE, &stream);
+-
+-      if (descriptor < 0)
+-              return FALSE;
+-
+-      cutbuffer = NULL;
+-
+-#ifndef NANO_TINY
+-      add_undo(COUPLE_BEGIN, operation);
+-
+-      /* Cut either the marked region or the whole buffer. */
+-      add_undo(action, NULL);
+-#endif
+-      do_snip(FALSE, openfile->mark, openfile->mark == NULL, FALSE);
+-#ifndef NANO_TINY
+-      update_undo(action);
+-#endif
+-
+-      /* Discard what was cut. */
+-      free_lines(cutbuffer);
+-      cutbuffer = was_cutbuffer;
+-
+-      /* Insert the spell-checked file into the cleared area. */
+-      read_file(stream, descriptor, filename, TRUE);
+-
+-#ifndef NANO_TINY
+-      add_undo(COUPLE_END, operation);
+-#endif
+-      return TRUE;
+-}
+-
+-/* Execute the given program, with the given temp file as last argument. */
+-const char *treat(char *tempfile_name, char *theprogram, bool spelling)
+-{
+-      ssize_t lineno_save = openfile->current->lineno;
+-      size_t current_x_save = openfile->current_x;
+-      size_t pww_save = openfile->placewewant;
+-      bool was_at_eol = (openfile->current->data[openfile->current_x] == 
'\0');
+-      struct stat fileinfo;
+-      long timestamp_sec, timestamp_nsec;
+-      static char **arguments = NULL;
+-      pid_t thepid;
+-      int program_status;
+-      bool replaced = FALSE;
+-
+-      /* Get the timestamp and the size of the temporary file. */
+-      stat(tempfile_name, &fileinfo);
+-      timestamp_sec = (long)fileinfo.st_mtim.tv_sec;
+-      timestamp_nsec = (long)fileinfo.st_mtim.tv_nsec;
+-
+-      /* If the number of bytes to check is zero, get out. */
+-      if (fileinfo.st_size == 0)
+-              return NULL;
+-
+-      /* Exit from curses mode to give the program control of the terminal. */
+-      endwin();
+-
+-      construct_argument_list(&arguments, theprogram, tempfile_name);
+-
+-      /* Fork a child process and run the given program in it. */
+-      if ((thepid = fork()) == 0) {
+-              execvp(arguments[0], arguments);
+-
+-              /* Terminate the child if the program is not found. */
+-              exit(9);
+-      } else if (thepid < 0)
+-              return _("Could not fork");
+-
+-      /* Block SIGWINCHes while waiting for the program to end,
+-       * so nano doesn't get pushed past the wait(). */
+-      block_sigwinch(TRUE);
+-      wait(&program_status);
+-      block_sigwinch(FALSE);
+-
+-      /* Restore the terminal state and reenter curses mode. */
+-      terminal_init();
+-      doupdate();
+-
+-      if (!WIFEXITED(program_status) || WEXITSTATUS(program_status) > 2) {
+-              statusline(ALERT, _("Error invoking '%s'"), arguments[0]);
+-              return NULL;
+-      } else if (WEXITSTATUS(program_status) != 0)
+-              statusline(ALERT, _("Program '%s' complained"), arguments[0]);
+-
+-      /* Stat the temporary file again. */
+-      stat(tempfile_name, &fileinfo);
+-
+-      /* When the temporary file wasn't touched, say so and leave. */
+-      if ((long)fileinfo.st_mtim.tv_sec == timestamp_sec &&
+-                              (long)fileinfo.st_mtim.tv_nsec == 
timestamp_nsec) {
+-              statusbar(_("Nothing changed"));
+-              return NULL;
+-      }
+-
+-#ifndef NANO_TINY
+-      /* Replace the marked text (or entire text) with the corrected text. */
+-      if (spelling && openfile->mark) {
+-              ssize_t was_mark_lineno = openfile->mark->lineno;
+-              bool upright = mark_is_before_cursor();
+-
+-              replaced = replace_buffer(tempfile_name, CUT, "spelling 
correction");
+-
+-              /* Adjust the end point of the marked region for any change in
+-               * length of the region's last line. */
+-              if (upright)
+-                      current_x_save = openfile->current_x;
+-              else
+-                      openfile->mark_x = openfile->current_x;
+-
+-              /* Restore the mark. */
+-              openfile->mark = line_from_number(was_mark_lineno);
+-      } else
+-#endif
+-      {
+-              openfile->current = openfile->filetop;
+-              openfile->current_x = 0;
+-
+-              replaced = replace_buffer(tempfile_name, CUT_TO_EOF,
+-                                      /* TRANSLATORS: The next two go with 
Undid/Redid messages. */
+-                                      (spelling ? N_("spelling correction") : 
N_("formatting")));
+-      }
+-
+-      /* Go back to the old position. */
+-      goto_line_posx(lineno_save, current_x_save);
+-      if (was_at_eol || openfile->current_x > strlen(openfile->current->data))
+-              openfile->current_x = strlen(openfile->current->data);
+-
+-#ifndef NANO_TINY
+-      if (replaced)
+-              update_undo(COUPLE_END);
+-#endif
+-
+-      openfile->placewewant = pww_save;
+-      adjust_viewport(STATIONARY);
+-
+-      if (spelling)
+-              statusbar(_("Finished checking spelling"));
+-      else
+-              statusbar(_("Buffer has been processed"));
+-
+-      return NULL;
+-}
+-
+ /* Spell check the current file.  If an alternate spell checker is
+  * specified, use it.  Otherwise, use the internal spell checker. */
+ void do_spell(void)
+-- 
+2.28.0
+

diff --git a/app-editors/nano/files/nano-4.9.3-minimal_build_fix.patch 
b/app-editors/nano/files/nano-4.9.3-minimal_build_fix.patch
new file mode 100644
index 00000000000..52112bab723
--- /dev/null
+++ b/app-editors/nano/files/nano-4.9.3-minimal_build_fix.patch
@@ -0,0 +1,46 @@
+From a98f48b4e82db7d30aa04925fb28344f5bce8c7c Mon Sep 17 00:00:00 2001
+From: Benno Schulenberg <[email protected]>
+Date: Mon, 22 Jun 2020 14:00:23 +0200
+Subject: [PATCH] build: fix compilation for --enable-tiny --enable-color
+ --enable-nanorc
+
+Backported to v4.9.3
+Signed-off-by: Lars Wendler <[email protected]>
+---
+ src/nano.c | 2 +-
+ src/text.c | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/nano.c b/src/nano.c
+index be80a073..3ac81ba4 100644
+--- a/src/nano.c
++++ b/src/nano.c
+@@ -1079,7 +1079,7 @@ RETSIGTYPE do_continue(int signal)
+       ungetch(KEY_FLUSH);
+ }
+ 
+-#if !defined(NANO_TINY) || defined(ENABLE_SPELLER)
++#if !defined(NANO_TINY) || defined(ENABLE_SPELLER) || defined(ENABLE_COLOR)
+ /* Block or unblock the SIGWINCH signal, depending on the blockit parameter. 
*/
+ void block_sigwinch(bool blockit)
+ {
+diff --git a/src/text.c b/src/text.c
+index c7690fd0..32727946 100644
+--- a/src/text.c
++++ b/src/text.c
+@@ -2032,10 +2032,10 @@ bool replace_buffer(const char *filename, undo_type 
action, const char *operatio
+ 
+       /* Cut either the marked region or the whole buffer. */
+       add_undo(action, NULL);
+-#endif
+       do_snip(FALSE, openfile->mark, openfile->mark == NULL, FALSE);
+-#ifndef NANO_TINY
+       update_undo(action);
++#else
++      do_snip(FALSE, TRUE, FALSE, FALSE);
+ #endif
+ 
+       /* Discard what was cut. */
+-- 
+2.28.0
+

diff --git a/app-editors/nano/nano-4.9.3.ebuild 
b/app-editors/nano/nano-4.9.3.ebuild
index 076c22b9c60..bd791de7db4 100644
--- a/app-editors/nano/nano-4.9.3.ebuild
+++ b/app-editors/nano/nano-4.9.3.ebuild
@@ -32,6 +32,11 @@ BDEPEND="
        nls? ( sys-devel/gettext )
        virtual/pkgconfig
 "
+PATCHES=(
+       "${FILESDIR}/${P}-disable-speller_build_fix.patch"
+       "${FILESDIR}/${P}-minimal_build_fix.patch" #734856
+)
+
 src_prepare() {
        default
        if [[ ${PV} == "9999" ]] ; then

Reply via email to