From: Johan Herland <johan@herland.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: Shawn Pearce <spearce@spearce.org>,
Johan Herland <johan@herland.net>,
git@vger.kernel.org
Subject: [PATCHv4 03/10] Tighten rules for matching server capabilities in server_supports()
Date: Mon, 23 May 2011 02:51:56 +0200 [thread overview]
Message-ID: <1306111923-16859-4-git-send-email-johan@herland.net> (raw)
In-Reply-To: <1306111923-16859-1-git-send-email-johan@herland.net>
When using server_supports() to match a given "feature" against the server
capabilities, follow these rules:
- "feature" must appear at the beginning of server_capabilities, or the
byte immediately before the matched location in server_capabilities
must be a SP; and
- if "feature" does not end with an equal sign, it does not expect a
value. The byte after the matched location in server_capabilities must
be either the end of string or a SP. A feature that expects a value is
checked with 'server_supports("feature=")' and the matched location in
server_capabilities can be followed by anything (i.e. if at the end of
string or a SP, it gets an empty string as the value, and otherwise it
will get the stretch of bytes after the '=' up to the next SP).
Given the server_capabilities string "foo=ab bar=froboz boz",
this patch should make it behave as follows:
server_supports("foo=") matches "foo=ab", returns "ab";
server_supports("ab") does not match anything;
server_supports("bar") does not match anything;
server_supports("boz") matches (and returns "boz"), without failing
at the end of bar=froboz that comes earlier.
Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Johan Herland <johan@herland.net>
---
cache.h | 2 +-
connect.c | 30 +++++++++++++++++++++++++++---
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/cache.h b/cache.h
index 009b365..1a9338f 100644
--- a/cache.h
+++ b/cache.h
@@ -995,7 +995,7 @@ struct extra_have_objects {
unsigned char (*array)[20];
};
extern struct ref **get_remote_heads(int in, struct ref **list, int nr_match, char **match, unsigned int flags, struct extra_have_objects *);
-extern int server_supports(const char *feature);
+extern const char *server_supports(const char *feature);
extern struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path);
diff --git a/connect.c b/connect.c
index 2119c3f..3c0a706 100644
--- a/connect.c
+++ b/connect.c
@@ -8,6 +8,7 @@
#include "url.h"
static char *server_capabilities;
+static size_t server_capabilities_len;
static int check_ref(const char *name, int len, unsigned int flags)
{
@@ -80,8 +81,16 @@ struct ref **get_remote_heads(int in, struct ref **list,
name_len = strlen(name);
if (len != name_len + 41) {
+ char *p;
free(server_capabilities);
server_capabilities = xstrdup(name + name_len + 1);
+ server_capabilities_len = strlen(server_capabilities);
+ /* split capabilities on SP */
+ for (p = server_capabilities;
+ p < server_capabilities + server_capabilities_len;
+ p++)
+ if (*p == ' ')
+ *p = '\0';
}
if (extra_have &&
@@ -102,10 +111,25 @@ struct ref **get_remote_heads(int in, struct ref **list,
return list;
}
-int server_supports(const char *feature)
+const char *server_supports(const char *feature)
{
- return server_capabilities &&
- strstr(server_capabilities, feature) != NULL;
+ const char *p = server_capabilities;
+ size_t feature_len = strlen(feature);
+ int need_value = feature[feature_len - 1] == '=';
+
+ if (!server_capabilities)
+ return NULL;
+
+ for (p = server_capabilities;
+ p < server_capabilities + server_capabilities_len;
+ p += strlen(p) + 1) {
+ if (need_value) {
+ if (!strncmp(p, feature, feature_len))
+ return p + feature_len;
+ } else if (!strcmp(p, feature))
+ return p;
+ }
+ return NULL;
}
int path_match(const char *path, int nr, char **match)
--
1.7.5.rc1.3.g4d7b
next prev parent reply other threads:[~2011-05-23 0:52 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-23 0:51 [PATCHv4 00/10] Push limits Johan Herland
2011-05-23 0:51 ` [PATCHv4 01/10] Update technical docs to reflect side-band-64k capability in receive-pack Johan Herland
2011-05-23 0:51 ` [PATCHv4 02/10] send-pack: Attempt to retrieve remote status even if pack-objects fails Johan Herland
2011-05-23 20:06 ` Junio C Hamano
2011-05-23 22:58 ` Johan Herland
2011-05-23 0:51 ` Johan Herland [this message]
2011-05-23 0:51 ` [PATCHv4 04/10] receive-pack: Prepare for addition of the new 'limit-*' family of capabilities Johan Herland
2011-05-23 20:21 ` Junio C Hamano
2011-05-24 0:16 ` Johan Herland
2011-05-23 0:51 ` [PATCHv4 05/10] pack-objects: Teach new option --max-commit-count, limiting #commits in pack Johan Herland
2011-05-23 23:17 ` Junio C Hamano
2011-05-24 0:18 ` Johan Herland
2011-05-23 0:51 ` [PATCHv4 06/10] send-pack/receive-pack: Allow server to refuse pushes with too many commits Johan Herland
2011-05-23 23:39 ` Junio C Hamano
2011-05-24 1:11 ` Johan Herland
2011-05-23 0:52 ` [PATCHv4 07/10] pack-objects: Allow --max-pack-size to be used together with --stdout Johan Herland
2011-05-24 0:09 ` Junio C Hamano
2011-05-24 1:15 ` Johan Herland
2011-05-23 0:52 ` [PATCHv4 08/10] send-pack/receive-pack: Allow server to refuse pushing too large packs Johan Herland
2011-05-24 0:12 ` Junio C Hamano
2011-05-23 0:52 ` [PATCHv4 09/10] pack-objects: Estimate pack size; abort early if pack size limit is exceeded Johan Herland
2011-05-23 16:11 ` Shawn Pearce
2011-05-23 17:07 ` Johan Herland
2011-05-24 0:18 ` Junio C Hamano
2011-05-24 1:17 ` Johan Herland
2011-05-23 0:52 ` [PATCHv4 10/10] receive-pack: Allow server to refuse pushes with too many objects Johan Herland
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=1306111923-16859-4-git-send-email-johan@herland.net \
--to=johan@herland.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).