You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2015/10/28 14:49:46 UTC

svn commit: r1711012 - /subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c

Author: julianfoad
Date: Wed Oct 28 13:49:46 2015
New Revision: 1711012

URL: http://svn.apache.org/viewvc?rev=1711012&view=rev
Log:
On the 'move-tracking-2' branch: Use coloured text output in 'svnmover',
on non-Windows systems.

* subversion/svnmover/svnmover.c
  (ANSI_*): New constants.
  (settext,
   settext_stderr): New macros.
  (notify,
   notify_v): Print notifications in green.
  (do_interactive_cross_branch_move,
   read_words): Print promts and user input in yellow.
  (sub_main,
   main): Print errors in red.

Modified:
    subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c

Modified: subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c?rev=1711012&r1=1711011&r2=1711012&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c Wed Oct 28 13:49:46 2015
@@ -99,6 +99,46 @@ static const svn_token_map_t ui_mode_map
   (strcmp(svn_branch_get_id(branch1, scratch_pool), \
           svn_branch_get_id(branch2, scratch_pool)) == 0)
 
+#ifndef WIN32
+
+/* Some ANSI escape codes for controlling text colour in terminal output. */
+#define TEXT_RESET      "\x1b[0m"
+#define TEXT_FG_BLACK   "\x1b[30m"
+#define TEXT_FG_RED     "\x1b[31m"
+#define TEXT_FG_GREEN   "\x1b[32m"
+#define TEXT_FG_YELLOW  "\x1b[33m"
+#define TEXT_FG_BLUE    "\x1b[34m"
+#define TEXT_FG_MAGENTA "\x1b[35m"
+#define TEXT_FG_CYAN    "\x1b[36m"
+#define TEXT_FG_WHITE   "\x1b[37m"
+#define TEXT_BG_BLACK   "\x1b[40m"
+#define TEXT_BG_RED     "\x1b[41m"
+#define TEXT_BG_GREEN   "\x1b[42m"
+#define TEXT_BG_YELLOW  "\x1b[43m"
+#define TEXT_BG_BLUE    "\x1b[44m"
+#define TEXT_BG_MAGENTA "\x1b[45m"
+#define TEXT_BG_CYAN    "\x1b[46m"
+#define TEXT_BG_WHITE   "\x1b[47m"
+
+#define settext(text_attr) (fputs(text_attr, stdout), fflush(stdout))
+#define settext_stderr(text_attr) (fputs(text_attr, stderr), fflush(stderr))
+
+#else
+
+/* To support colour on Windows, we could try:
+ *
+ * https://github.com/mattn/ansicolor-w32.c
+ *
+ * (I notice some obvious bugs in its puts/fputs implementations: the #defines
+ * point to _fprintf_w32 instead of _fputs_w32, and puts() fails to append a
+ * newline).
+ */
+
+#define settext(code)
+#define settext_stderr(code)
+
+#endif
+
 /* Print a notification. */
 __attribute__((format(printf, 1, 2)))
 static void
@@ -107,9 +147,11 @@ notify(const char *fmt,
 {
   va_list ap;
 
+  settext(TEXT_FG_GREEN);
   va_start(ap, fmt);
   vprintf(fmt, ap);
   va_end(ap);
+  settext(TEXT_RESET);
   printf("\n");
 }
 
@@ -123,9 +165,11 @@ notify_v(const char *fmt,
 
   if (! quiet)
     {
+      settext(TEXT_FG_GREEN);
       va_start(ap, fmt);
       vprintf(fmt, ap);
       va_end(ap);
+      settext(TEXT_RESET);
       printf("\n");
     }
 }
@@ -2177,10 +2221,12 @@ do_interactive_cross_branch_move(svn_bra
       "We can do one of these for you now if you wish.\n"
     ));
 
+  settext_stderr(TEXT_FG_YELLOW);
   err = svn_cmdline_prompt_user2(
           &input,
           "Your choice (c, b, i, or just <enter> to do nothing): ",
           NULL, scratch_pool);
+  settext(TEXT_RESET);
   if (err && (err->apr_err == SVN_ERR_CANCELLED || err->apr_err == APR_EOF))
     {
       svn_error_clear(err);
@@ -3431,7 +3477,9 @@ read_words(apr_array_header_t **words,
   svn_error_t *err;
   const char *input;
 
+  settext(TEXT_FG_YELLOW);
   err = svn_cmdline_prompt_user2(&input, prompt, NULL, result_pool);
+  settext(TEXT_RESET);
   if (err && (err->apr_err == SVN_ERR_CANCELLED || err->apr_err == APR_EOF))
     {
       *words = NULL;
@@ -3791,7 +3839,9 @@ sub_main(int *exit_code, int argc, const
           if (interactive_actions)
             {
               /* Display the error, but don't quit */
+              settext_stderr(TEXT_FG_RED);
               svn_handle_error2(err, stderr, FALSE, "svnmover: ");
+              settext_stderr(TEXT_RESET);
               svn_error_clear(err);
             }
           else
@@ -3838,7 +3888,9 @@ main(int argc, const char *argv[])
   if (err)
     {
       exit_code = EXIT_FAILURE;
+      settext_stderr(TEXT_FG_RED);
       svn_cmdline_handle_exit_error(err, NULL, "svnmover: ");
+      settext_stderr(TEXT_RESET);
     }
 
   svn_pool_destroy(pool);