summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cache.h1
-rw-r--r--connected.c1
-rw-r--r--packfile.c53
-rw-r--r--packfile.h1
-rw-r--r--sha1_file.c61
5 files changed, 55 insertions, 62 deletions
diff --git a/cache.h b/cache.h
index 52deb9fa4e..3b1526b9ba 100644
--- a/cache.h
+++ b/cache.h
@@ -1640,7 +1640,6 @@ extern int odb_mkstemp(struct strbuf *template, const char *pattern);
extern int odb_pack_keep(const char *name);
extern void clear_delta_base_cache(void);
-extern struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
/*
* Make sure that a pointer access into an mmap'd index file is within bounds,
diff --git a/connected.c b/connected.c
index 136c2ac168..3e3f0148c8 100644
--- a/connected.c
+++ b/connected.c
@@ -3,6 +3,7 @@
#include "sigchain.h"
#include "connected.h"
#include "transport.h"
+#include "pack.h"
/*
* If we feed all the commits we want to verify to this command
diff --git a/packfile.c b/packfile.c
index 93526ea7b8..efe0ed3e83 100644
--- a/packfile.c
+++ b/packfile.c
@@ -605,3 +605,56 @@ void unuse_pack(struct pack_window **w_cursor)
*w_cursor = NULL;
}
}
+
+static void try_to_free_pack_memory(size_t size)
+{
+ release_pack_memory(size);
+}
+
+struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
+{
+ static int have_set_try_to_free_routine;
+ struct stat st;
+ size_t alloc;
+ struct packed_git *p;
+
+ if (!have_set_try_to_free_routine) {
+ have_set_try_to_free_routine = 1;
+ set_try_to_free_routine(try_to_free_pack_memory);
+ }
+
+ /*
+ * Make sure a corresponding .pack file exists and that
+ * the index looks sane.
+ */
+ if (!strip_suffix_mem(path, &path_len, ".idx"))
+ return NULL;
+
+ /*
+ * ".pack" is long enough to hold any suffix we're adding (and
+ * the use xsnprintf double-checks that)
+ */
+ alloc = st_add3(path_len, strlen(".pack"), 1);
+ p = alloc_packed_git(alloc);
+ memcpy(p->pack_name, path, path_len);
+
+ xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
+ if (!access(p->pack_name, F_OK))
+ p->pack_keep = 1;
+
+ xsnprintf(p->pack_name + path_len, alloc - path_len, ".pack");
+ if (stat(p->pack_name, &st) || !S_ISREG(st.st_mode)) {
+ free(p);
+ return NULL;
+ }
+
+ /* ok, it looks sane as far as we can check without
+ * actually mapping the pack file.
+ */
+ p->pack_size = st.st_size;
+ p->pack_local = local;
+ p->mtime = st.st_mtime;
+ if (path_len < 40 || get_sha1_hex(path + path_len - 40, p->sha1))
+ hashclr(p->sha1);
+ return p;
+}
diff --git a/packfile.h b/packfile.h
index c669c11f88..e182f7fd68 100644
--- a/packfile.h
+++ b/packfile.h
@@ -46,6 +46,7 @@ extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t
extern void close_pack_windows(struct packed_git *);
extern void close_all_packs(void);
extern void unuse_pack(struct pack_window **);
+extern struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
extern void release_pack_memory(size_t);
diff --git a/sha1_file.c b/sha1_file.c
index 9df1bd7c17..a5e13e0d98 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -719,67 +719,6 @@ void *xmmap(void *start, size_t length,
return ret;
}
-static struct packed_git *alloc_packed_git(int extra)
-{
- struct packed_git *p = xmalloc(st_add(sizeof(*p), extra));
- memset(p, 0, sizeof(*p));
- p->pack_fd = -1;
- return p;
-}
-
-static void try_to_free_pack_memory(size_t size)
-{
- release_pack_memory(size);
-}
-
-struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
-{
- static int have_set_try_to_free_routine;
- struct stat st;
- size_t alloc;
- struct packed_git *p;
-
- if (!have_set_try_to_free_routine) {
- have_set_try_to_free_routine = 1;
- set_try_to_free_routine(try_to_free_pack_memory);
- }
-
- /*
- * Make sure a corresponding .pack file exists and that
- * the index looks sane.
- */
- if (!strip_suffix_mem(path, &path_len, ".idx"))
- return NULL;
-
- /*
- * ".pack" is long enough to hold any suffix we're adding (and
- * the use xsnprintf double-checks that)
- */
- alloc = st_add3(path_len, strlen(".pack"), 1);
- p = alloc_packed_git(alloc);
- memcpy(p->pack_name, path, path_len);
-
- xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
- if (!access(p->pack_name, F_OK))
- p->pack_keep = 1;
-
- xsnprintf(p->pack_name + path_len, alloc - path_len, ".pack");
- if (stat(p->pack_name, &st) || !S_ISREG(st.st_mode)) {
- free(p);
- return NULL;
- }
-
- /* ok, it looks sane as far as we can check without
- * actually mapping the pack file.
- */
- p->pack_size = st.st_size;
- p->pack_local = local;
- p->mtime = st.st_mtime;
- if (path_len < 40 || get_sha1_hex(path + path_len - 40, p->sha1))
- hashclr(p->sha1);
- return p;
-}
-
void install_packed_git(struct packed_git *pack)
{
if (pack->pack_fd != -1)