From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Shawn O. Pearce" <spearce@spearce.org>, git@vger.kernel.org
Subject: Re: [PATCH 3/4] connect: learn to parse capabilities with values
Date: Fri, 10 Aug 2012 17:15:09 -0400 [thread overview]
Message-ID: <20120810211509.GB888@sigill.intra.peff.net> (raw)
In-Reply-To: <7v7gt6jz3s.fsf@alter.siamese.dyndns.org>
On Fri, Aug 10, 2012 at 01:01:11PM -0700, Junio C Hamano wrote:
> Jeff King <peff@peff.net> writes:
>
> > +/*
> > + * Parse features of the form "feature=value". Returns NULL if the feature
> > + * does not exist, the empty string if it exists but does not have an "=", or
> > + * the content to the right of the "=" until the first space (or end of
> > + * string). The cannot contain literal spaces; double-quoting or similar
> > + * schemes would break compatibility, since older versions of git treat the
> > + * space as a hard-delimiter without any context.
> > + *
> > + * The return value (if non-NULL) is newly allocated on the heap and belongs to
> > + * the caller.
> > + */
> > +char *parse_feature_request_value(const char *feature_list, const char *feature)
> > +{
> > + const char *start = parse_feature_request(feature_list, feature);
> > + const char *end;
> > +
> > + if (!start || prefixcmp(start, feature))
> > + return NULL;
> > + start += strlen(feature);
> > +
> > + if (*start == '=')
> > + start++;
> > + end = strchrnul(start, ' ');
> > +
> > + return xmemdupz(start, end - start);
> > +}
>
> Having to run strlen(feature) three times in this function (once in
> parse_feature_request() as part of strstr() and the edge check of
> the found string, once as part of prefixcmp() here, and then an
> explicit strlen() to skip it) makes me feel dirty.
I thought about that, but it seems like a quite premature optimization.
It is three extra strlens per network conversation. _If_ you have turned
on double-verbosity in fetch-pack. I considered reusing the existing
parse_feature_request function more valuable from a maintenance
standpoint.
I would think the extra memory allocation would dwarf it, anyway.
> It is not wrong per-se, but it is likely that the caller has a
> constant string as the feature when it called this function, so
> perhaps just changing the function signature of server_supports,
> i.e.
>
> const char *server_supports(const char *feature)
> {
> return parse_feature_request(server_capabilities, feature);
> }
>
> to return "var=val " would be more than sufficient.
That was in fact my first iteration, but...
> Then the existing callers can keep doing
>
> if (server_supports("thin-pack"))
> if (!server_supports("quiet"))
>
> and a new caller can do something like
>
> agent = server_supports("agent");
> if (!agent || !agent[5])
> ... no agent ...
> else {
> int span = strcspn(agent + 6, " \t\n");
> printf("I found agent=<%.*s>!\n", span, agent + 6);
> }
>
> which doesn't look too bad.
I didn't want to force callers to have to deal with ad-hoc parsing.
Anyway, do you think this is even worth doing at this point? I'm
lukewarm on the final two patches due to the existence of
GIT_TRACE_PACKET, which is much more likely to be useful.
-Peff
next prev parent reply other threads:[~2012-08-10 21:15 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-10 7:53 [PATCH 0/4] jk/version-string and google code Jeff King
2012-08-10 7:57 ` [PATCH 1/4] send-pack: fix capability-sending logic Jeff King
2012-08-10 7:57 ` [PATCH 2/4] do not send client agent unless server does first Jeff King
2012-08-10 19:45 ` Junio C Hamano
2012-08-10 21:09 ` Jeff King
2012-08-10 7:58 ` [PATCH 3/4] connect: learn to parse capabilities with values Jeff King
2012-08-10 8:06 ` Eric Sunshine
2012-08-10 20:01 ` Junio C Hamano
2012-08-10 21:15 ` Jeff King [this message]
2012-08-10 21:55 ` Junio C Hamano
2012-08-13 19:03 ` Junio C Hamano
2012-08-13 19:07 ` [PATCH 4/4] fetch-pack: mention server version with verbose output Junio C Hamano
2012-08-13 19:43 ` Junio C Hamano
2012-08-13 20:54 ` Jeff King
2012-08-13 21:07 ` Junio C Hamano
2012-08-13 21:07 ` Jeff King
2012-08-13 21:09 ` Junio C Hamano
2012-08-13 21:11 ` Jeff King
2012-08-14 1:59 ` Jeff King
2012-08-14 2:02 ` Jeff King
2012-08-14 4:56 ` Junio C Hamano
2012-08-10 7:59 ` Jeff King
2012-08-10 15:34 ` [PATCH 0/4] jk/version-string and google code Junio C Hamano
2012-08-10 17:46 ` Jeff King
2012-08-10 18:52 ` Junio C Hamano
2012-08-10 21:50 ` Jeff King
2012-08-10 22:29 ` Shawn Pearce
2012-08-10 22:36 ` Junio C Hamano
2012-08-10 15:37 ` Junio C Hamano
2012-08-10 18:06 ` Dave Borowitz
2012-08-10 18:08 ` Jeff King
2012-08-10 18:13 ` Dave Borowitz
2012-08-10 18:25 ` Jeff King
2012-08-10 21:25 ` Junio C Hamano
2012-08-10 21:35 ` Jeff King
2012-08-10 21:42 ` Junio C Hamano
2012-08-10 19:11 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120810211509.GB888@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).