Keep track of whether a pack is local or not
authorLinus Torvalds <torvalds@osdl.org>
Thu, 13 Oct 2005 22:38:28 +0000 (15:38 -0700)
committerJunio C Hamano <junkio@cox.net>
Thu, 13 Oct 2005 22:38:28 +0000 (15:38 -0700)
If we want to re-pack just local packfiles, we need to know whether a
particular object is local or not.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
cache.h
sha1_file.c
verify-pack.c

diff --git a/cache.h b/cache.h
index 1a7e047d762a6f4eab05b6fc34e156c9886ceae9..328658235b8bb46132fd1717d9152f5f0cc9668e 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -313,6 +313,7 @@ extern struct packed_git {
        void *pack_base;
        unsigned int pack_last_used;
        unsigned int pack_use_cnt;
+       int pack_local;
        unsigned char sha1[20];
        char pack_name[0]; /* something like ".git/objects/pack/xxxxx.pack" */
 } *packed_git;
@@ -352,7 +353,7 @@ extern struct packed_git *find_sha1_pack(const unsigned char *sha1,
 
 extern int use_packed_git(struct packed_git *);
 extern void unuse_packed_git(struct packed_git *);
-extern struct packed_git *add_packed_git(char *, int);
+extern struct packed_git *add_packed_git(char *, int, int);
 extern int num_packed_objects(const struct packed_git *p);
 extern int nth_packed_object_sha1(const struct packed_git *, int, unsigned char*);
 extern int find_pack_entry_one(const unsigned char *, struct pack_entry *, struct packed_git *);
index f0590049098b5371bc72855acc5736f9d5f61e2b..e45679975e7fcbfae0497f25ab56b6bbd0ff1155 100644 (file)
@@ -416,7 +416,7 @@ int use_packed_git(struct packed_git *p)
        return 0;
 }
 
-struct packed_git *add_packed_git(char *path, int path_len)
+struct packed_git *add_packed_git(char *path, int path_len, int local)
 {
        struct stat st;
        struct packed_git *p;
@@ -444,6 +444,7 @@ struct packed_git *add_packed_git(char *path, int path_len)
        p->pack_base = NULL;
        p->pack_last_used = 0;
        p->pack_use_cnt = 0;
+       p->pack_local = local;
        return p;
 }
 
@@ -484,7 +485,7 @@ void install_packed_git(struct packed_git *pack)
        packed_git = pack;
 }
 
-static void prepare_packed_git_one(char *objdir)
+static void prepare_packed_git_one(char *objdir, int local)
 {
        char path[PATH_MAX];
        int len;
@@ -506,7 +507,7 @@ static void prepare_packed_git_one(char *objdir)
 
                /* we have .idx.  Is it a file we can map? */
                strcpy(path + len, de->d_name);
-               p = add_packed_git(path, len + namelen);
+               p = add_packed_git(path, len + namelen, local);
                if (!p)
                        continue;
                p->next = packed_git;
@@ -522,11 +523,11 @@ void prepare_packed_git(void)
 
        if (run_once)
                return;
-       prepare_packed_git_one(get_object_directory());
+       prepare_packed_git_one(get_object_directory(), 1);
        prepare_alt_odb();
        for (alt = alt_odb_list; alt; alt = alt->next) {
                alt->name[0] = 0;
-               prepare_packed_git_one(alt->base);
+               prepare_packed_git_one(alt->base, 0);
        }
        run_once = 1;
 }
index 80b60a6b7cdfb2f45bb34331dbc372fcbabe8c5a..c99db9dd79315dff4ac19c79b35275cd02397e60 100644 (file)
@@ -15,12 +15,12 @@ static int verify_one_pack(char *arg, int verbose)
                        len--;
                }
                /* Should name foo.idx now */
-               if ((g = add_packed_git(arg, len)))
+               if ((g = add_packed_git(arg, len, 1)))
                        break;
                /* No?  did you name just foo? */
                strcpy(arg + len, ".idx");
                len += 4;
-               if ((g = add_packed_git(arg, len)))
+               if ((g = add_packed_git(arg, len, 1)))
                        break;
                return error("packfile %s not found.", arg);
        }