[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: RFC: New Response type to aid rlog reponse parsing
From: |
patrick keshishian |
Subject: |
Re: RFC: New Response type to aid rlog reponse parsing |
Date: |
Mon, 20 Nov 2017 16:57:22 -0800 |
User-agent: |
Mutt/1.8.2 (2017-04-18) |
Hi Thorsten,
Sorry for the delayed reply (project I'm working on is taking
far too many cycles).
On Sun, Nov 19, 2017 at 07:58:47PM -0800, patrick keshishian wrote:
> ---------- Forwarded message ----------
> From: Thorsten Glaser <address@hidden>
> Date: Sat, 18 Nov 2017 23:56:07 +0000 (UTC)
> Subject: Re: RFC: New Response type to aid rlog reponse parsing
> To: patrick keshishian <address@hidden>
> Cc: address@hidden
>
> patrick keshishian dixit:
>
> >Attached is a patch implementing LOGM change against cvs-1.11.23
>
> I've implemented it differently, especially in order to never
> send partial lines to the client (in a network packet). If you
> wish, have a look at / review the following patch.
Just from reading the diff it looks OK. However, I didn't comprehend
the sending "partial lines to the client" bit.
> I'm currently sanity.sh-testing it, this will take the night.
Hopefully your tests don't show any regression.
I can patch my CVS server with your diff when I break away from
my work.
Thanks for the update!
Happy Thanksgiving!
--patrick
p.s., sending from a different account (not subscribed to CVS list)
hopefully it'll make it.
> --- src/gnu/usr.bin/cvs/src/buffer.c:1.2 Sat Oct 22 14:33:29 2016
> +++ src/gnu/usr.bin/cvs/src/buffer.c Sat Nov 18 22:05:10 2017
> @@ -1052,7 +1055,14 @@ buf_copy_lines (struct buffer *outbuf, s
> }
>
> /* Put in the command. */
> - buf_append_char (outbuf, command);
> + switch (command) {
> + case CVS_OUTPUT_EX_LOGM:
> + buf_output0 (outbuf, "LOGM");
> + break;
> + default:
> + buf_append_char (outbuf, command);
> + break;
> + }
> buf_append_char (outbuf, ' ');
>
> if (inbuf->data != nldata)
> --- src/gnu/usr.bin/cvs/src/client.c:1.8 Sat Aug 12 01:51:22 2017
> +++ src/gnu/usr.bin/cvs/src/client.c Sat Nov 18 22:05:11 2017
> @@ -3079,6 +3079,7 @@ struct response responses[] =
> rs_optional),
> RSP_LINE("M", handle_m, response_type_normal, rs_essential),
> RSP_LINE("Mbinary", handle_mbinary, response_type_normal, rs_optional),
> + RSP_LINE("LOGM", handle_m, response_type_normal, rs_optional),
> RSP_LINE("E", handle_e, response_type_normal, rs_essential),
> RSP_LINE("F", handle_f, response_type_normal, rs_optional),
> RSP_LINE("MT", handle_mt, response_type_normal, rs_optional),
> --- src/gnu/usr.bin/cvs/src/cvs.h:1.7 Fri Oct 21 16:41:16 2016
> +++ src/gnu/usr.bin/cvs/src/cvs.h Sat Nov 18 22:05:12 2017
> @@ -920,11 +921,15 @@ void tag_check_valid (const char *, int,
>
> /* From server.c and documented there. */
> void cvs_output (const char *, size_t);
> +void cvs_output_ex (const char *, size_t, int);
> void cvs_output_binary (char *, size_t);
> void cvs_outerr (const char *, size_t);
> void cvs_flusherr (void);
> void cvs_flushout (void);
> void cvs_output_tagged (const char *, const char *);
> +int supported_response (const char *);
> +
> +#define CVS_OUTPUT_EX_LOGM 0x80000001
>
> extern const char *global_session_id;
>
> --- src/gnu/usr.bin/cvs/src/log.c:1.1.101.2 Tue Apr 19 20:33:18 2005
> +++ src/gnu/usr.bin/cvs/src/log.c Sat Nov 18 22:05:12 2017
> @@ -145,6 +148,7 @@ static void log_version (struct log_data
> RCSNode *, RCSVers *, int);
> static int log_branch (Node *, void *);
> static int version_compare (const char *, const char *, int);
> +static void logm_output (const char *);
>
> static struct log_data log_data;
> static int is_rlog;
> @@ -1681,11 +1685,10 @@ log_version (struct log_data *log_data,
> cvs_output ("*** empty log message ***\n", 0);
> else
> {
> + /* assert: last thing cvs_output???ed was a newline */
> /* FIXME: Technically, the log message could contain a null
> byte. */
> - cvs_output (p->data, 0);
> - if (((char *)p->data)[strlen (p->data) - 1] != '\n')
> - cvs_output ("\n", 1);
> + logm_output(p->data);
> }
> }
>
> @@ -1780,3 +1783,23 @@ version_compare (const char *v1, const c
> ++v2;
> }
> }
> +
> +static void
> +logm_output(const char *str)
> +{
> + /* assert: str is not empty */
> + size_t len = strlen(str);
> + int buftag = 'M';
> + static char has_logm = 0;
> +
> + if (server_active) {
> + if (!has_logm)
> + has_logm = supported_response("LOGM") ? 1 : 2;
> + if (has_logm == 1)
> + buftag = CVS_OUTPUT_EX_LOGM;
> + }
> +
> + cvs_output_ex(str, len, buftag);
> + if (/*len > 0 &&*/ str[len - 1] != '\n')
> + cvs_output_ex("\n", 1, buftag);
> +}
> --- src/gnu/usr.bin/cvs/src/server.c:1.14 Sat Aug 12 01:08:25 2017
> +++ src/gnu/usr.bin/cvs/src/server.c Sat Nov 18 22:05:12 2017
> @@ -548,8 +553,8 @@ alloc_pending_warning (size_t size)
>
>
>
> -static int
> -supported_response (char *name)
> +int
> +supported_response (const char *name)
> {
> struct response *rs;
>
> @@ -7703,6 +7708,12 @@ krb_encrypt_buffer_initialize( struct bu
> void
> cvs_output (const char *str, size_t len)
> {
> + cvs_output_ex (str, len, 'M');
> +}
> +
> +void
> +cvs_output_ex (const char *str, size_t len, int buftag)
> +{
> if (len == 0)
> len = strlen (str);
> #ifdef SERVER_SUPPORT
> @@ -7711,7 +7722,7 @@ cvs_output (const char *str, size_t len)
> if (buf_to_net)
> {
> buf_output (saved_output, str, len);
> - buf_copy_lines (buf_to_net, saved_output, 'M');
> + buf_copy_lines (buf_to_net, saved_output, buftag);
> }
> # if HAVE_SYSLOG_H
> else
> @@ -7726,7 +7737,7 @@ cvs_output (const char *str, size_t len)
> if (protocol)
> {
> buf_output (saved_output, str, len);
> - buf_copy_lines (protocol, saved_output, 'M');
> + buf_copy_lines (protocol, saved_output, buftag);
> buf_send_counted (protocol);
> }
> # if HAVE_SYSLOG_H
>
>
> bye,
> //mirabilos