sha1_name: pass object name length to diagnose_invalid_sha1_path()
The only caller of diagnose_invalid_sha1_path() extracts a substring from an object name by creating a NUL-terminated copy of the interesting part. Add a length parameter to the function and thus avoid the need for an allocation, thereby simplifying the code. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>
René Scharfe committed
Mar 16, 2013 at 19:29 UTC
b2981d06226ab0fdabf9110c3be7104110b307ae
1 file changed
+14
-18
sha1_name.c
+14
-18
@@ -1137,7 +1137,8 @@ int get_sha1_blob(const char *name, unsigned char *sha1)
1137
static void diagnose_invalid_sha1_path(const char *prefix,
1138
const char *filename,
1139
const unsigned char *tree_sha1,
1140
- const char *object_name)
1140
+ const char *object_name,
1141
+ int object_name_len)
1142
{
1143
struct stat st;
1144
unsigned char sha1[20];
@@ -1147,8 +1148,8 @@ static void diagnose_invalid_sha1_path(const char *prefix,
1148
prefix = "";
1149
1150
if (!lstat(filename, &st))
1150
- die("Path '%s' exists on disk, but not in '%s'.",
1151
- filename, object_name);
1151
+ die("Path '%s' exists on disk, but not in '%.*s'.",
1152
+ filename, object_name_len, object_name);
1153
if (errno == ENOENT || errno == ENOTDIR) {
1154
char *fullname = xmalloc(strlen(filename)
1155
+ strlen(prefix) + 1);
@@ -1158,16 +1159,16 @@ static void diagnose_invalid_sha1_path(const char *prefix,
1159
if (!get_tree_entry(tree_sha1, fullname,
1160
sha1, &mode)) {
1161
die("Path '%s' exists, but not '%s'.\n"
1161
- "Did you mean '%s:%s' aka '%s:./%s'?",
1162
+ "Did you mean '%.*s:%s' aka '%.*s:./%s'?",
1163
fullname,
1164
filename,
1164
- object_name,
1165
+ object_name_len, object_name,
1166
fullname,
1166
- object_name,
1167
+ object_name_len, object_name,
1168
filename);
1169
}
1169
- die("Path '%s' does not exist in '%s'",
1170
- filename, object_name);
1170
+ die("Path '%s' does not exist in '%.*s'",
1171
+ filename, object_name_len, object_name);
1172
}
1173
}
1174
@@ -1332,13 +1333,8 @@ static int get_sha1_with_context_1(const char *name,
1333
}
1334
if (*cp == ':') {
1335
unsigned char tree_sha1[20];
1335
- char *object_name = NULL;
1336
- if (only_to_die) {
1337
- object_name = xmalloc(cp-name+1);
1338
- strncpy(object_name, name, cp-name);
1339
- object_name[cp-name] = '\0';
1340
- }
1341
- if (!get_sha1_1(name, cp-name, tree_sha1, GET_SHA1_TREEISH)) {
1336
+ int len = cp - name;
1337
+ if (!get_sha1_1(name, len, tree_sha1, GET_SHA1_TREEISH)) {
1338
const char *filename = cp+1;
1339
char *new_filename = NULL;
1340
@@ -1348,8 +1344,8 @@ static int get_sha1_with_context_1(const char *name,
1344
ret = get_tree_entry(tree_sha1, filename, sha1, &oc->mode);
1345
if (ret && only_to_die) {
1346
diagnose_invalid_sha1_path(prefix, filename,
1351
- tree_sha1, object_name);
1352
- free(object_name);
1347
+ tree_sha1,
1348
+ name, len);
1349
}
1350
hashcpy(oc->tree, tree_sha1);
1351
strncpy(oc->path, filename,
@@ -1360,7 +1356,7 @@ static int get_sha1_with_context_1(const char *name,
1356
return ret;
1357
} else {
1358
if (only_to_die)
1363
- die("Invalid object name '%s'.", object_name);
1359
+ die("Invalid object name '%.*s'.", len, name);
1360
}
1361
}
1362
return ret;