summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: d48a72f)
raw | patch | inline | side by side (parent: d48a72f)
author | Linus Torvalds <torvalds@g5.osdl.org> | |
Thu, 14 Jul 2005 18:26:31 +0000 (11:26 -0700) | ||
committer | Linus Torvalds <torvalds@g5.osdl.org> | |
Thu, 14 Jul 2005 18:26:31 +0000 (11:26 -0700) |
The same way "git-diff-tree" can limit its output to just a set of matches,
we can read in just a partial tree for comparison purposes.
we can read in just a partial tree for comparison purposes.
cache.h | patch | blob | history | |
diff-cache.c | patch | blob | history | |
read-tree.c | patch | blob | history | |
tree.c | patch | blob | history |
index a42ce7e3f5e9c67560a22b81aba5734e9425be66..53e3066fd70f92d75661d1f5bd8cbbd5697ae9c6 100644 (file)
--- a/cache.h
+++ b/cache.h
extern int check_sha1_signature(const unsigned char *sha1, void *buf, unsigned long size, const char *type);
/* Read a tree into the cache */
-extern int read_tree(void *buffer, unsigned long size, int stage);
+extern int read_tree(void *buffer, unsigned long size, int stage, char **paths);
extern int write_sha1_from_fd(const unsigned char *sha1, int fd);
extern int write_sha1_to_fd(int fd, const unsigned char *sha1);
diff --git a/diff-cache.c b/diff-cache.c
index c435844a255f492aa7ae367239154c3306b77194..d78cbb5d658dc17de965b0b81a36ad7e24ada202 100644 (file)
--- a/diff-cache.c
+++ b/diff-cache.c
tree = read_object_with_reference(sha1, "tree", &size, NULL);
if (!tree)
die("bad tree object %s", tree_name);
- if (read_tree(tree, size, 1))
+ if (read_tree(tree, size, 1, NULL))
die("unable to read tree object %s", tree_name);
ret = diff_cache(active_cache, active_nr);
diff --git a/read-tree.c b/read-tree.c
index 0d5ded5026c0a87987938c498e271c1d8cce122c..65f2d9a5dc5dd6cf6aaa24ca90d96c5c7ab6992d 100644 (file)
--- a/read-tree.c
+++ b/read-tree.c
buffer = read_object_with_reference(sha1, "tree", &size, NULL);
if (!buffer)
return -1;
- ret = read_tree(buffer, size, stage);
+ ret = read_tree(buffer, size, stage, NULL);
free(buffer);
return ret;
}
index 96f78f6a3407ee86ab73de736e0485614017cb92..8dc27e3b7354b8b8cc7d7491621929c78325a645 100644 (file)
--- a/tree.c
+++ b/tree.c
return add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK);
}
+static int match_tree_entry(const char *base, int baselen, const char *path, unsigned int mode, char **paths)
+{
+ char *match;
+ int pathlen;
+
+ if (!paths)
+ return 1;
+ pathlen = strlen(path);
+ while ((match = *paths++) != NULL) {
+ int matchlen = strlen(match);
+
+ if (baselen >= matchlen) {
+ /* If it doesn't match, move along... */
+ if (strncmp(base, match, matchlen))
+ continue;
+ /* The base is a subdirectory of a path which was specified. */
+ return 1;
+ }
+
+ /* Does the base match? */
+ if (strncmp(base, match, baselen))
+ continue;
+
+ match += baselen;
+ matchlen -= baselen;
+
+ if (pathlen > matchlen)
+ continue;
+
+ if (matchlen > pathlen) {
+ if (match[pathlen] != '/')
+ continue;
+ if (!S_ISDIR(mode))
+ continue;
+ }
+
+ if (strncmp(path, match, pathlen))
+ continue;
+ }
+ return 0;
+}
+
static int read_tree_recursive(void *buffer, unsigned long size,
- const char *base, int baselen, int stage)
+ const char *base, int baselen,
+ int stage, char **match)
{
while (size) {
int len = strlen(buffer)+1;
buffer = sha1 + 20;
size -= len + 20;
+ if (!match_tree_entry(base, baselen, path, mode, match))
+ continue;
+
if (S_ISDIR(mode)) {
int retval;
int pathlen = strlen(path);
newbase[baselen + pathlen] = '/';
retval = read_tree_recursive(eltbuf, eltsize,
newbase,
- baselen + pathlen + 1, stage);
+ baselen + pathlen + 1,
+ stage, match);
free(eltbuf);
free(newbase);
if (retval)
return 0;
}
-int read_tree(void *buffer, unsigned long size, int stage)
+int read_tree(void *buffer, unsigned long size, int stage, char **match)
{
- return read_tree_recursive(buffer, size, "", 0, stage);
+ return read_tree_recursive(buffer, size, "", 0, stage, match);
}
struct tree *lookup_tree(const unsigned char *sha1)