aboutsummaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorShawn Pearce <spearce@spearce.org>2006-10-29 04:37:11 -0500
committerJunio C Hamano <junkio@cox.net>2006-10-29 12:46:21 -0800
commitd4ff6d92c3d7020233a9b4990a3545ee54a5c033 (patch)
treeb948434fc4ef4f7c02a2e18020a881fd51f5f59e /sha1_file.c
parent6dcfa306f2b67b733a7eb2d7ded1bc9987809edb (diff)
downloadgit-d4ff6d92c3d7020233a9b4990a3545ee54a5c033.tar.gz
git-d4ff6d92c3d7020233a9b4990a3545ee54a5c033.tar.xz
Allow short pack names to git-pack-objects --unpacked=.
This allows us to pass just the file name of a pack rather than the complete path when we want pack-objects to consider its contents as though they were loose objects. This can be helpful if $GIT_OBJECT_DIRECTORY contains shell metacharacters which make it cumbersome to pass complete paths safely in a shell script. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/sha1_file.c b/sha1_file.c
index e89d24c01..5e6c8b8bb 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1203,6 +1203,24 @@ unsigned long find_pack_entry_one(const unsigned char *sha1,
return 0;
}
+static int matches_pack_name(struct packed_git *p, const char *ig)
+{
+ const char *last_c, *c;
+
+ if (!strcmp(p->pack_name, ig))
+ return 0;
+
+ for (c = p->pack_name, last_c = c; *c;)
+ if (*c == '/')
+ last_c = ++c;
+ else
+ ++c;
+ if (!strcmp(last_c, ig))
+ return 0;
+
+ return 1;
+}
+
static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e, const char **ignore_packed)
{
struct packed_git *p;
@@ -1214,7 +1232,7 @@ static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e, cons
if (ignore_packed) {
const char **ig;
for (ig = ignore_packed; *ig; ig++)
- if (!strcmp(p->pack_name, *ig))
+ if (!matches_pack_name(p, *ig))
break;
if (*ig)
continue;