Merge branch 'lt/config' into next
* lt/config: git config syntax updates Another config file parsing fix. checkout: use --aggressive when running a 3-way merge (-m). Fix git-pack-objects for 64-bit platforms fix diff-delta bad memory access
This commit is contained in:
commit
ea892b27b1
94
config.c
94
config.c
@ -134,6 +134,41 @@ static int get_value(config_fn_t fn, char *name, unsigned int len)
|
||||
return fn(name, value);
|
||||
}
|
||||
|
||||
static int get_extended_base_var(char *name, int baselen, int c)
|
||||
{
|
||||
do {
|
||||
if (c == '\n')
|
||||
return -1;
|
||||
c = get_next_char();
|
||||
} while (isspace(c));
|
||||
|
||||
/* We require the format to be '[base "extension"]' */
|
||||
if (c != '"')
|
||||
return -1;
|
||||
name[baselen++] = '.';
|
||||
|
||||
for (;;) {
|
||||
int c = get_next_char();
|
||||
if (c == '\n')
|
||||
return -1;
|
||||
if (c == '"')
|
||||
break;
|
||||
if (c == '\\') {
|
||||
c = get_next_char();
|
||||
if (c == '\n')
|
||||
return -1;
|
||||
}
|
||||
name[baselen++] = c;
|
||||
if (baselen > MAXNAME / 2)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Final ']' */
|
||||
if (get_next_char() != ']')
|
||||
return -1;
|
||||
return baselen;
|
||||
}
|
||||
|
||||
static int get_base_var(char *name)
|
||||
{
|
||||
int baselen = 0;
|
||||
@ -144,6 +179,8 @@ static int get_base_var(char *name)
|
||||
return -1;
|
||||
if (c == ']')
|
||||
return baselen;
|
||||
if (isspace(c))
|
||||
return get_extended_base_var(name, baselen, c);
|
||||
if (!isalnum(c) && c != '.')
|
||||
return -1;
|
||||
if (baselen > MAXNAME / 2)
|
||||
@ -335,10 +372,12 @@ static int store_aux(const char* key, const char* value)
|
||||
store.offset[store.seen] = ftell(config_file);
|
||||
store.state = KEY_SEEN;
|
||||
store.seen++;
|
||||
} else if (strrchr(key, '.') - key == store.baselen &&
|
||||
} else {
|
||||
if (strrchr(key, '.') - key == store.baselen &&
|
||||
!strncmp(key, store.key, store.baselen)) {
|
||||
store.state = SECTION_SEEN;
|
||||
store.offset[store.seen] = ftell(config_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@ -346,8 +385,30 @@ static int store_aux(const char* key, const char* value)
|
||||
|
||||
static void store_write_section(int fd, const char* key)
|
||||
{
|
||||
const char *dot = strchr(key, '.');
|
||||
int len1 = store.baselen, len2 = -1;
|
||||
|
||||
dot = strchr(key, '.');
|
||||
if (dot) {
|
||||
int dotlen = dot - key;
|
||||
if (dotlen < len1) {
|
||||
len2 = len1 - dotlen - 1;
|
||||
len1 = dotlen;
|
||||
}
|
||||
}
|
||||
|
||||
write(fd, "[", 1);
|
||||
write(fd, key, store.baselen);
|
||||
write(fd, key, len1);
|
||||
if (len2 >= 0) {
|
||||
write(fd, " \"", 2);
|
||||
while (--len2 >= 0) {
|
||||
unsigned char c = *++dot;
|
||||
if (c == '"')
|
||||
write(fd, "\\", 1);
|
||||
write(fd, &c, 1);
|
||||
}
|
||||
write(fd, "\"", 1);
|
||||
}
|
||||
write(fd, "]\n", 2);
|
||||
}
|
||||
|
||||
@ -421,7 +482,7 @@ int git_config_set(const char* key, const char* value)
|
||||
int git_config_set_multivar(const char* key, const char* value,
|
||||
const char* value_regex, int multi_replace)
|
||||
{
|
||||
int i;
|
||||
int i, dot;
|
||||
int fd = -1, in_fd;
|
||||
int ret;
|
||||
char* config_filename = strdup(git_path("config"));
|
||||
@ -446,16 +507,23 @@ int git_config_set_multivar(const char* key, const char* value,
|
||||
* Validate the key and while at it, lower case it for matching.
|
||||
*/
|
||||
store.key = (char*)malloc(strlen(key)+1);
|
||||
for (i = 0; key[i]; i++)
|
||||
if (i != store.baselen &&
|
||||
((!isalnum(key[i]) && key[i] != '.') ||
|
||||
(i == store.baselen+1 && !isalpha(key[i])))) {
|
||||
fprintf(stderr, "invalid key: %s\n", key);
|
||||
free(store.key);
|
||||
ret = 1;
|
||||
goto out_free;
|
||||
} else
|
||||
store.key[i] = tolower(key[i]);
|
||||
dot = 0;
|
||||
for (i = 0; key[i]; i++) {
|
||||
unsigned char c = key[i];
|
||||
if (c == '.')
|
||||
dot = 1;
|
||||
/* Leave the extended basename untouched.. */
|
||||
if (!dot || i > store.baselen) {
|
||||
if (!isalnum(c) || (i == store.baselen+1 && !isalpha(c))) {
|
||||
fprintf(stderr, "invalid key: %s\n", key);
|
||||
free(store.key);
|
||||
ret = 1;
|
||||
goto out_free;
|
||||
}
|
||||
c = tolower(c);
|
||||
}
|
||||
store.key[i] = c;
|
||||
}
|
||||
store.key[i] = 0;
|
||||
|
||||
/*
|
||||
|
@ -199,7 +199,6 @@ struct delta_index * create_delta_index(const void *buf, unsigned long bufsize)
|
||||
entry->next = hash[i];
|
||||
hash[i] = entry++;
|
||||
hash_count[i]++;
|
||||
entries--;
|
||||
}
|
||||
}
|
||||
|
||||
@ -230,10 +229,6 @@ struct delta_index * create_delta_index(const void *buf, unsigned long bufsize)
|
||||
}
|
||||
free(hash_count);
|
||||
|
||||
/* If we didn't use all hash entries, free the unused memory. */
|
||||
if (entries)
|
||||
index = realloc(index, memsize - entries * sizeof(*entry));
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
|
@ -156,7 +156,7 @@ static void prepare_pack_revindex(struct pack_revindex *rix)
|
||||
|
||||
rix->revindex = xmalloc(sizeof(unsigned long) * (num_ent + 1));
|
||||
for (i = 0; i < num_ent; i++) {
|
||||
long hl = *((long *)(index + 24 * i));
|
||||
uint32_t hl = *((uint32_t *)(index + 24 * i));
|
||||
rix->revindex[i] = ntohl(hl);
|
||||
}
|
||||
/* This knows the pack format -- the 20-byte trailer
|
||||
|
@ -64,12 +64,13 @@ static int show_config(const char* key_, const char* value_)
|
||||
|
||||
static int get_value(const char* key_, const char* regex_)
|
||||
{
|
||||
int i;
|
||||
char *tl;
|
||||
|
||||
key = malloc(strlen(key_)+1);
|
||||
for (i = 0; key_[i]; i++)
|
||||
key[i] = tolower(key_[i]);
|
||||
key[i] = 0;
|
||||
key = strdup(key_);
|
||||
for (tl=key+strlen(key)-1; tl >= key && *tl != '.'; --tl)
|
||||
*tl = tolower(*tl);
|
||||
for (tl=key; *tl && *tl != '.'; ++tl)
|
||||
*tl = tolower(*tl);
|
||||
|
||||
if (use_key_regexp) {
|
||||
key_regexp = (regex_t*)malloc(sizeof(regex_t));
|
||||
|
@ -1161,7 +1161,7 @@ int find_pack_entry_one(const unsigned char *sha1,
|
||||
int mi = (lo + hi) / 2;
|
||||
int cmp = memcmp(index + 24 * mi + 4, sha1, 20);
|
||||
if (!cmp) {
|
||||
e->offset = ntohl(*((int*)(index + 24 * mi)));
|
||||
e->offset = ntohl(*((uint32_t *)(index + 24 * mi)));
|
||||
memcpy(e->sha1, sha1, 20);
|
||||
e->p = p;
|
||||
return 1;
|
||||
|
@ -229,7 +229,7 @@ test_expect_failure 'invalid key' 'git-repo-config inval.2key blabla'
|
||||
test_expect_success 'correct key' 'git-repo-config 123456.a123 987'
|
||||
|
||||
test_expect_success 'hierarchical section' \
|
||||
'git-repo-config 1.2.3.alpha beta'
|
||||
'git-repo-config Version.1.2.3eX.Alpha beta'
|
||||
|
||||
cat > expect << EOF
|
||||
[beta] ; silly comment # another comment
|
||||
@ -241,8 +241,8 @@ noIndent= sillyValue ; 'nother silly comment
|
||||
NoNewLine = wow2 for me
|
||||
[123456]
|
||||
a123 = 987
|
||||
[1.2.3]
|
||||
alpha = beta
|
||||
[Version "1.2.3eX"]
|
||||
Alpha = beta
|
||||
EOF
|
||||
|
||||
test_expect_success 'hierarchical section value' 'cmp .git/config expect'
|
||||
@ -251,7 +251,7 @@ cat > expect << EOF
|
||||
beta.noindent=sillyValue
|
||||
nextsection.nonewline=wow2 for me
|
||||
123456.a123=987
|
||||
1.2.3.alpha=beta
|
||||
version.1.2.3eX.alpha=beta
|
||||
EOF
|
||||
|
||||
test_expect_success 'working --list' \
|
||||
|
Loading…
Reference in New Issue
Block a user