git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 04/26] object-store: move packed_git and packed_git_mru to object store

From
Stefan Beller <sbeller@google.com>
Date
Feb 13, 2018, 01:22 UTC
Message-ID
<20180213012241.187007-5-sbeller@google.com>
In-Reply-To
<20180213012241.187007-1-sbeller@google.com>

In a process with multiple repositories open, packfile accessors should be associated to a single repository and not shared globally. Move packed_git and packed_git_mru into the_repository and adjust callers to reflect this.

Patch generated by
 1. Moving the struct packed_git declaration to object-store.h
    and packed_git, packed_git_mru globals to struct object_store.
 2. Applying the semantic patch
    contrib/coccinelle/refactoring/packed_git.cocci to adjust callers.
    This semantic patch is placed in a sub directory of the coccinelle
    contrib dir, as this semantic patch is not expected to be of general
    usefulness; it is only useful during developing this series and
    merging it with other topics in flight. At a later date, just
    delete that semantic patch.
 3. Applying line wrapping fixes from "make style" to break the
    resulting long lines.
 4. Adding missing #includes of repository.h and object-store.h
    where needed.
 5. As the packfiles are now owned by an objectstore/repository, which
    is ephemeral unlike globals, we introduce memory leaks. So address
    them in raw_object_store_clear().
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin/count-objects.c                         |  6 ++--
 builtin/fsck.c                                  |  7 +++--
 builtin/gc.c                                    |  4 ++-
 builtin/index-pack.c                            |  1 +
 builtin/pack-objects.c                          | 21 ++++++++-----
 builtin/pack-redundant.c                        |  6 ++--
 builtin/receive-pack.c                          |  1 +
 cache.h                                         | 28 ------------------
 contrib/coccinelle/refactoring/packed_git.cocci |  7 +++++
 fast-import.c                                   |  6 ++--
 http-backend.c                                  |  6 ++--
 http-push.c                                     |  1 +
 http-walker.c                                   |  1 +
 http.c                                          |  1 +
 mru.h                                           |  1 +
 object-store.h                                  | 32 +++++++++++++++++++-
 object.c                                        |  6 ++++
 pack-bitmap.c                                   |  4 ++-
 pack-check.c                                    |  1 +
 pack-revindex.c                                 |  1 +
 packfile.c                                      | 39 +++++++++++++------------
 reachable.c                                     |  1 +
 server-info.c                                   |  6 ++--
 sha1_name.c                                     |  5 ++--
 24 files changed, 120 insertions(+), 72 deletions(-)
 create mode 100644 contrib/coccinelle/refactoring/packed_git.cocci
diff --git a/builtin/count-objects.c b/builtin/count-objects.c
index 33343818c8..9334648dcc 100644
--- a/builtin/count-objects.c
+++ b/builtin/count-objects.c
@@ -7,6 +7,8 @@
 #include "cache.h"
 #include "config.h"
 #include "dir.h"
+#include "repository.h"
+#include "object-store.h"
 #include "builtin.h"
 #include "parse-options.h"
 #include "quote.h"
@@ -120,9 +122,9 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix)
 		struct strbuf loose_buf = STRBUF_INIT;
 		struct strbuf pack_buf = STRBUF_INIT;
 		struct strbuf garbage_buf = STRBUF_INIT;
-		if (!packed_git)
+		if (!the_repository->objects.packed_git)
 			prepare_packed_git();
-		for (p = packed_git; p; p = p->next) {
+		for (p = the_repository->objects.packed_git; p; p = p->next) {
 			if (!p->pack_local)
 				continue;
 			if (open_pack_index(p))
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 1048255da1..d4d249c2ed 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -2,6 +2,7 @@
 #include "cache.h"
 #include "repository.h"
 #include "config.h"
+#include "object-store.h"
 #include "commit.h"
 #include "tree.h"
 #include "blob.h"
@@ -707,7 +708,8 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 			prepare_packed_git();
 
 			if (show_progress) {
-				for (p = packed_git; p; p = p->next) {
+				for (p = the_repository->objects.packed_git; p;
+				     p = p->next) {
 					if (open_pack_index(p))
 						continue;
 					total += p->num_objects;
@@ -715,7 +717,8 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 
 				progress = start_progress(_("Checking objects"), total);
 			}
-			for (p = packed_git; p; p = p->next) {
+			for (p = the_repository->objects.packed_git; p;
+			     p = p->next) {
 				/* verify gives error messages itself */
 				if (verify_pack(p, fsck_obj_buffer,
 						progress, count))
diff --git a/builtin/gc.c b/builtin/gc.c
index 3c5eae0edf..6970f325e5 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -11,6 +11,7 @@
  */
 
 #include "builtin.h"
+#include "repository.h"
 #include "config.h"
 #include "tempfile.h"
 #include "lockfile.h"
@@ -18,6 +19,7 @@
 #include "run-command.h"
 #include "sigchain.h"
 #include "argv-array.h"
+#include "object-store.h"
 #include "commit.h"
 #include "packfile.h"
 
@@ -173,7 +175,7 @@ static int too_many_packs(void)
 		return 0;
 
 	prepare_packed_git();
-	for (cnt = 0, p = packed_git; p; p = p->next) {
+	for (cnt = 0, p = the_repository->objects.packed_git; p; p = p->next) {
 		if (!p->pack_local)
 			continue;
 		if (p->pack_keep)
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 4c51aec81f..1902d4e096 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -12,6 +12,7 @@
 #include "exec_cmd.h"
 #include "streaming.h"
 #include "thread-utils.h"
+#include "object-store.h"
 #include "packfile.h"
 
 static const char index_pack_usage[] =
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 6b9cfc289d..2ee8b69238 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -1,6 +1,8 @@
 #include "builtin.h"
 #include "cache.h"
+#include "repository.h"
 #include "config.h"
+#include "object-store.h"
 #include "attr.h"
 #include "object.h"
 #include "blob.h"
@@ -1023,7 +1025,8 @@ static int want_object_in_pack(const struct object_id *oid,
 			return want;
 	}
 
-	for (entry = packed_git_mru.head; entry; entry = entry->next) {
+	for (entry = the_repository->objects.packed_git_mru.head; entry;
+	     entry = entry->next) {
 		struct packed_git *p = entry->item;
 		off_t offset;
 
@@ -1041,7 +1044,8 @@ static int want_object_in_pack(const struct object_id *oid,
 			}
 			want = want_found_object(exclude, p);
 			if (!exclude && want > 0)
-				mru_mark(&packed_git_mru, entry);
+				mru_mark(&the_repository->objects.packed_git_mru,
+					 entry);
 			if (want != -1)
 				return want;
 		}
@@ -2648,7 +2652,7 @@ static void add_objects_in_unpacked_packs(struct rev_info *revs)
 
 	memset(&in_pack, 0, sizeof(in_pack));
 
-	for (p = packed_git; p; p = p->next) {
+	for (p = the_repository->objects.packed_git; p; p = p->next) {
 		struct object_id oid;
 		struct object *o;
 
@@ -2711,7 +2715,8 @@ static int has_sha1_pack_kept_or_nonlocal(const struct object_id *oid)
 	static struct packed_git *last_found = (void *)1;
 	struct packed_git *p;
 
-	p = (last_found != (void *)1) ? last_found : packed_git;
+	p = (last_found != (void *)1) ? last_found :
+					the_repository->objects.packed_git;
 
 	while (p) {
 		if ((!p->pack_local || p->pack_keep) &&
@@ -2720,7 +2725,7 @@ static int has_sha1_pack_kept_or_nonlocal(const struct object_id *oid)
 			return 1;
 		}
 		if (p == last_found)
-			p = packed_git;
+			p = the_repository->objects.packed_git;
 		else
 			p = p->next;
 		if (p == last_found)
@@ -2756,7 +2761,7 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
 	uint32_t i;
 	struct object_id oid;
 
-	for (p = packed_git; p; p = p->next) {
+	for (p = the_repository->objects.packed_git; p; p = p->next) {
 		if (!p->pack_local || p->pack_keep)
 			continue;
 
@@ -3119,7 +3124,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 	prepare_packed_git();
 	if (ignore_packed_keep) {
 		struct packed_git *p;
-		for (p = packed_git; p; p = p->next)
+		for (p = the_repository->objects.packed_git; p; p = p->next)
 			if (p->pack_local && p->pack_keep)
 				break;
 		if (!p) /* no keep-able packs found */
@@ -3132,7 +3137,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 		 * also covers non-local objects
 		 */
 		struct packed_git *p;
-		for (p = packed_git; p; p = p->next) {
+		for (p = the_repository->objects.packed_git; p; p = p->next) {
 			if (!p->pack_local) {
 				have_non_local_packs = 1;
 				break;
diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c
index aaa8136322..55462bc826 100644
--- a/builtin/pack-redundant.c
+++ b/builtin/pack-redundant.c
@@ -7,6 +7,8 @@
 */
 
 #include "builtin.h"
+#include "repository.h"
+#include "object-store.h"
 #include "packfile.h"
 
 #define BLKSIZE 512
@@ -571,7 +573,7 @@ static struct pack_list * add_pack(struct packed_git *p)
 
 static struct pack_list * add_pack_file(const char *filename)
 {
-	struct packed_git *p = packed_git;
+	struct packed_git *p = the_repository->objects.packed_git;
 
 	if (strlen(filename) < 40)
 		die("Bad pack filename: %s", filename);
@@ -586,7 +588,7 @@ static struct pack_list * add_pack_file(const char *filename)
 
 static void load_all(void)
 {
-	struct packed_git *p = packed_git;
+	struct packed_git *p = the_repository->objects.packed_git;
 
 	while (p) {
 		add_pack(p);
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index b7ce7c7f52..b2eac79a6e 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -7,6 +7,7 @@
 #include "sideband.h"
 #include "run-command.h"
 #include "exec_cmd.h"
+#include "object-store.h"
 #include "commit.h"
 #include "object.h"
 #include "remote.h"
diff --git a/cache.h b/cache.h
index 918c2f15b4..459fd01dbb 100644
--- a/cache.h
+++ b/cache.h
@@ -1633,34 +1633,6 @@ struct pack_window {
 	unsigned int inuse_cnt;
 };
 
-extern struct packed_git {
-	struct packed_git *next;
-	struct pack_window *windows;
-	off_t pack_size;
-	const void *index_data;
-	size_t index_size;
-	uint32_t num_objects;
-	uint32_t num_bad_objects;
-	unsigned char *bad_object_sha1;
-	int index_version;
-	time_t mtime;
-	int pack_fd;
-	unsigned pack_local:1,
-		 pack_keep:1,
-		 freshened:1,
-		 do_not_close:1;
-	unsigned char sha1[20];
-	struct revindex_entry *revindex;
-	/* something like ".git/objects/pack/xxxxx.pack" */
-	char pack_name[FLEX_ARRAY]; /* more */
-} *packed_git;
-
-/*
- * A most-recently-used ordered version of the packed_git list, which can
- * be iterated instead of packed_git (and marked via mru_mark).
- */
-extern struct mru packed_git_mru;
-
 struct pack_entry {
 	off_t offset;
 	unsigned char sha1[20];
diff --git a/contrib/coccinelle/refactoring/packed_git.cocci b/contrib/coccinelle/refactoring/packed_git.cocci
new file mode 100644
index 0000000000..da317a51a9
--- /dev/null
+++ b/contrib/coccinelle/refactoring/packed_git.cocci
@@ -0,0 +1,7 @@
+@@ @@
+- packed_git
++ the_repository->objects.packed_git
+
+@@ @@
+- packed_git_mru
++ the_repository->objects.packed_git_mru
diff --git a/fast-import.c b/fast-import.c
index b70ac025e0..1685fe59a2 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -154,8 +154,10 @@ Format of STDIN stream:
 
 #include "builtin.h"
 #include "cache.h"
+#include "repository.h"
 #include "config.h"
 #include "lockfile.h"
+#include "object-store.h"
 #include "object.h"
 #include "blob.h"
 #include "tree.h"
@@ -1110,7 +1112,7 @@ static int store_object(
 	if (e->idx.offset) {
 		duplicate_count_by_type[type]++;
 		return 1;
-	} else if (find_sha1_pack(oid.hash, packed_git)) {
+	} else if (find_sha1_pack(oid.hash, the_repository->objects.packed_git)) {
 		e->type = type;
 		e->pack_id = MAX_PACK_ID;
 		e->idx.offset = 1; /* just not zero! */
@@ -1305,7 +1307,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
 		duplicate_count_by_type[OBJ_BLOB]++;
 		truncate_pack(&checkpoint);
 
-	} else if (find_sha1_pack(oid.hash, packed_git)) {
+	} else if (find_sha1_pack(oid.hash, the_repository->objects.packed_git)) {
 		e->type = OBJ_BLOB;
 		e->pack_id = MAX_PACK_ID;
 		e->idx.offset = 1; /* just not zero! */
diff --git a/http-backend.c b/http-backend.c
index f3dc218b2a..4d93126c15 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -1,7 +1,9 @@
 #include "cache.h"
 #include "config.h"
+#include "repository.h"
 #include "refs.h"
 #include "pkt-line.h"
+#include "object-store.h"
 #include "object.h"
 #include "tag.h"
 #include "exec_cmd.h"
@@ -518,13 +520,13 @@ static void get_info_packs(struct strbuf *hdr, char *arg)
 
 	select_getanyfile(hdr);
 	prepare_packed_git();
-	for (p = packed_git; p; p = p->next) {
+	for (p = the_repository->objects.packed_git; p; p = p->next) {
 		if (p->pack_local)
 			cnt++;
 	}
 
 	strbuf_grow(&buf, cnt * 53 + 2);
-	for (p = packed_git; p; p = p->next) {
+	for (p = the_repository->objects.packed_git; p; p = p->next) {
 		if (p->pack_local)
 			strbuf_addf(&buf, "P %s\n", p->pack_name + objdirlen + 6);
 	}
diff --git a/http-push.c b/http-push.c
index 14435ab65d..34c5d030b7 100644
--- a/http-push.c
+++ b/http-push.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "object-store.h"
 #include "commit.h"
 #include "tag.h"
 #include "blob.h"
diff --git a/http-walker.c b/http-walker.c
index 1ae8363de2..a1c6f2639b 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -4,6 +4,7 @@
 #include "http.h"
 #include "list.h"
 #include "transport.h"
+#include "object-store.h"
 #include "packfile.h"
 
 struct alt_base {
diff --git a/http.c b/http.c
index 5977712712..ab989b88dd 100644
--- a/http.c
+++ b/http.c
@@ -1,6 +1,7 @@
 #include "git-compat-util.h"
 #include "http.h"
 #include "config.h"
+#include "object-store.h"
 #include "pack.h"
 #include "sideband.h"
 #include "run-command.h"
diff --git a/mru.h b/mru.h
index 42e4aeaa10..d7de81efb9 100644
--- a/mru.h
+++ b/mru.h
@@ -37,6 +37,7 @@ struct mru_entry {
 struct mru {
 	struct mru_entry *head, *tail;
 };
+#define MRU_INIT { NULL, NULL }
 
 void mru_append(struct mru *mru, void *item);
 void mru_mark(struct mru *mru, struct mru_entry *entry);
diff --git a/object-store.h b/object-store.h
index 44b8f84753..8778ab9685 100644
--- a/object-store.h
+++ b/object-store.h
@@ -2,6 +2,7 @@
 #define OBJECT_STORE_H
 
 #include "cache.h"
+#include "mru.h"
 
 struct raw_object_store {
 	/*
@@ -10,11 +11,40 @@ struct raw_object_store {
 	 */
 	char *objectdir;
 
+	struct packed_git *packed_git;
+	/*
+	 * A most-recently-used ordered version of the packed_git list, which can
+	 * be iterated instead of packed_git (and marked via mru_mark).
+	 */
+	struct mru packed_git_mru;
+
 	struct alternate_object_database *alt_odb_list;
 	struct alternate_object_database **alt_odb_tail;
 };
-#define RAW_OBJECT_STORE_INIT { NULL, NULL, NULL }
+#define RAW_OBJECT_STORE_INIT { NULL, NULL, MRU_INIT, NULL, NULL }
 
 void raw_object_store_clear(struct raw_object_store *o);
 
+struct packed_git {
+	struct packed_git *next;
+	struct pack_window *windows;
+	off_t pack_size;
+	const void *index_data;
+	size_t index_size;
+	uint32_t num_objects;
+	uint32_t num_bad_objects;
+	unsigned char *bad_object_sha1;
+	int index_version;
+	time_t mtime;
+	int pack_fd;
+	unsigned pack_local:1,
+		 pack_keep:1,
+		 freshened:1,
+		 do_not_close:1;
+	unsigned char sha1[20];
+	struct revindex_entry *revindex;
+	/* something like ".git/objects/pack/xxxxx.pack" */
+	char pack_name[FLEX_ARRAY]; /* more */
+};
+
 #endif /* OBJECT_STORE_H */
diff --git a/object.c b/object.c
index d778f09717..81d083bec1 100644
--- a/object.c
+++ b/object.c
@@ -466,4 +466,10 @@ void raw_object_store_clear(struct raw_object_store *o)
 
 	free_alt_odbs(o);
 	o->alt_odb_tail = NULL;
+
+	mru_clear(&o->packed_git_mru);
+	/*
+	 * TODO: call close_all_packs once migrated to
+	 * take an object store argument
+	 */
 }
diff --git a/pack-bitmap.c b/pack-bitmap.c
index 9270983e5f..d51172b1d5 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -5,11 +5,13 @@
 #include "revision.h"
 #include "progress.h"
 #include "list-objects.h"
+#include "object-store.h"
 #include "pack.h"
 #include "pack-bitmap.h"
 #include "pack-revindex.h"
 #include "pack-objects.h"
 #include "packfile.h"
+#include "repository.h"
 
 /*
  * An entry on the bitmap index, representing the bitmap for a given
@@ -335,7 +337,7 @@ static int open_pack_bitmap(void)
 	assert(!bitmap_git.map && !bitmap_git.loaded);
 
 	prepare_packed_git();
-	for (p = packed_git; p; p = p->next) {
+	for (p = the_repository->objects.packed_git; p; p = p->next) {
 		if (open_pack_bitmap_1(p) == 0)
 			ret = 0;
 	}
diff --git a/pack-check.c b/pack-check.c
index 073c1fbd46..c80c3ed8fd 100644
--- a/pack-check.c
+++ b/pack-check.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "pack.h"
+#include "object-store.h"
 #include "pack-revindex.h"
 #include "progress.h"
 #include "packfile.h"
diff --git a/pack-revindex.c b/pack-revindex.c
index 1b7ebd8d7e..82c3119652 100644
--- a/pack-revindex.c
+++ b/pack-revindex.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "pack-revindex.h"
+#include "object-store.h"
 
 /*
  * Pack index for existing packs give us easy access to the offsets into
diff --git a/packfile.c b/packfile.c
index d61076faaf..11b0e6613c 100644
--- a/packfile.c
+++ b/packfile.c
@@ -7,6 +7,7 @@
 #include "packfile.h"
 #include "delta.h"
 #include "list.h"
+#include "object-store.h"
 #include "streaming.h"
 #include "sha1-lookup.h"
 
@@ -40,8 +41,6 @@ static unsigned int pack_open_fds;
 static unsigned int pack_max_fds;
 static size_t peak_pack_mapped;
 static size_t pack_mapped;
-struct packed_git *packed_git;
-struct mru packed_git_mru;
 
 #define SZ_FMT PRIuMAX
 static inline uintmax_t sz_fmt(size_t s) { return s; }
@@ -241,7 +240,7 @@ static int unuse_one_window(struct packed_git *current)
 
 	if (current)
 		scan_windows(current, &lru_p, &lru_w, &lru_l);
-	for (p = packed_git; p; p = p->next)
+	for (p = the_repository->objects.packed_git; p; p = p->next)
 		scan_windows(p, &lru_p, &lru_w, &lru_l);
 	if (lru_p) {
 		munmap(lru_w->base, lru_w->len);
@@ -311,7 +310,7 @@ void close_all_packs(void)
 {
 	struct packed_git *p;
 
-	for (p = packed_git; p; p = p->next)
+	for (p = the_repository->objects.packed_git; p; p = p->next)
 		if (p->do_not_close)
 			die("BUG: want to close pack marked 'do-not-close'");
 		else
@@ -379,7 +378,7 @@ static int close_one_pack(void)
 	struct pack_window *mru_w = NULL;
 	int accept_windows_inuse = 1;
 
-	for (p = packed_git; p; p = p->next) {
+	for (p = the_repository->objects.packed_git; p; p = p->next) {
 		if (p->pack_fd == -1)
 			continue;
 		find_lru_pack(p, &lru_p, &mru_w, &accept_windows_inuse);
@@ -677,8 +676,8 @@ void install_packed_git(struct packed_git *pack)
 	if (pack->pack_fd != -1)
 		pack_open_fds++;
 
-	pack->next = packed_git;
-	packed_git = pack;
+	pack->next = the_repository->objects.packed_git;
+	the_repository->objects.packed_git = pack;
 }
 
 void (*report_garbage)(unsigned seen_bits, const char *path);
@@ -760,7 +759,8 @@ static void prepare_packed_git_one(char *objdir, int local)
 		base_len = path.len;
 		if (strip_suffix_mem(path.buf, &base_len, ".idx")) {
 			/* Don't reopen a pack we already have. */
-			for (p = packed_git; p; p = p->next) {
+			for (p = the_repository->objects.packed_git; p;
+			     p = p->next) {
 				size_t len;
 				if (strip_suffix(p->pack_name, ".pack", &len) &&
 				    len == base_len &&
@@ -810,7 +810,7 @@ unsigned long approximate_object_count(void)
 
 		prepare_packed_git();
 		count = 0;
-		for (p = packed_git; p; p = p->next) {
+		for (p = the_repository->objects.packed_git; p; p = p->next) {
 			if (open_pack_index(p))
 				continue;
 			count += p->num_objects;
@@ -859,17 +859,18 @@ static int sort_pack(const void *a_, const void *b_)
 
 static void rearrange_packed_git(void)
 {
-	packed_git = llist_mergesort(packed_git, get_next_packed_git,
-				     set_next_packed_git, sort_pack);
+	the_repository->objects.packed_git = llist_mergesort(
+		the_repository->objects.packed_git, get_next_packed_git,
+		set_next_packed_git, sort_pack);
 }
 
 static void prepare_packed_git_mru(void)
 {
 	struct packed_git *p;
 
-	mru_clear(&packed_git_mru);
-	for (p = packed_git; p; p = p->next)
-		mru_append(&packed_git_mru, p);
+	mru_clear(&the_repository->objects.packed_git_mru);
+	for (p = the_repository->objects.packed_git; p; p = p->next)
+		mru_append(&the_repository->objects.packed_git_mru, p);
 }
 
 static int prepare_packed_git_run_once = 0;
@@ -1003,7 +1004,7 @@ const struct packed_git *has_packed_and_bad(const unsigned char *sha1)
 	struct packed_git *p;
 	unsigned i;
 
-	for (p = packed_git; p; p = p->next)
+	for (p = the_repository->objects.packed_git; p; p = p->next)
 		for (i = 0; i < p->num_bad_objects; i++)
 			if (!hashcmp(sha1, p->bad_object_sha1 + 20 * i))
 				return p;
@@ -1835,12 +1836,12 @@ int find_pack_entry(const unsigned char *sha1, struct pack_entry *e)
 	struct mru_entry *p;
 
 	prepare_packed_git();
-	if (!packed_git)
+	if (!the_repository->objects.packed_git)
 		return 0;
 
-	for (p = packed_git_mru.head; p; p = p->next) {
+	for (p = the_repository->objects.packed_git_mru.head; p; p = p->next) {
 		if (fill_pack_entry(sha1, e, p->item)) {
-			mru_mark(&packed_git_mru, p);
+			mru_mark(&the_repository->objects.packed_git_mru, p);
 			return 1;
 		}
 	}
@@ -1887,7 +1888,7 @@ int for_each_packed_object(each_packed_object_fn cb, void *data, unsigned flags)
 	int pack_errors = 0;
 
 	prepare_packed_git();
-	for (p = packed_git; p; p = p->next) {
+	for (p = the_repository->objects.packed_git; p; p = p->next) {
 		if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
 			continue;
 		if (open_pack_index(p)) {
diff --git a/reachable.c b/reachable.c
index 88d7d679da..59ed16ba76 100644
--- a/reachable.c
+++ b/reachable.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "refs.h"
+#include "object-store.h"
 #include "tag.h"
 #include "commit.h"
 #include "blob.h"
diff --git a/server-info.c b/server-info.c
index 26a6c20b7d..96885c45f6 100644
--- a/server-info.c
+++ b/server-info.c
@@ -1,5 +1,7 @@
 #include "cache.h"
+#include "repository.h"
 #include "refs.h"
+#include "object-store.h"
 #include "object.h"
 #include "commit.h"
 #include "tag.h"
@@ -200,7 +202,7 @@ static void init_pack_info(const char *infofile, int force)
 	objdirlen = strlen(objdir);
 
 	prepare_packed_git();
-	for (p = packed_git; p; p = p->next) {
+	for (p = the_repository->objects.packed_git; p; p = p->next) {
 		/* we ignore things on alternate path since they are
 		 * not available to the pullers in general.
 		 */
@@ -210,7 +212,7 @@ static void init_pack_info(const char *infofile, int force)
 	}
 	num_pack = i;
 	info = xcalloc(num_pack, sizeof(struct pack_info *));
-	for (i = 0, p = packed_git; p; p = p->next) {
+	for (i = 0, p = the_repository->objects.packed_git; p; p = p->next) {
 		if (!p->pack_local)
 			continue;
 		info[i] = xcalloc(1, sizeof(struct pack_info));
diff --git a/sha1_name.c b/sha1_name.c
index 957ce25680..016c883b5c 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -196,7 +196,8 @@ static void find_short_packed_object(struct disambiguate_state *ds)
 	struct packed_git *p;
 
 	prepare_packed_git();
-	for (p = packed_git; p && !ds->ambiguous; p = p->next)
+	for (p = the_repository->objects.packed_git; p && !ds->ambiguous;
+	     p = p->next)
 		unique_in_pack(p, ds);
 }
 
@@ -566,7 +567,7 @@ static void find_abbrev_len_packed(struct min_abbrev_data *mad)
 	struct packed_git *p;
 
 	prepare_packed_git();
-	for (p = packed_git; p; p = p->next)
+	for (p = the_repository->objects.packed_git; p; p = p->next)
 		find_abbrev_len_for_pack(p, mad);
 }
 
-- 
2.16.1.73.ga2c3e9663f.dirty
Previous: Stefan BellerNext: Stefan Beller
Message 102 of 239 in “Moving global state into the repository object (part 1)”
  1. 00/26 Moving global state into the repository object (part 1)Stefan Beller, Feb 13, 2018
  2. 01/26 repository: introduce raw object store fieldStefan Beller, Feb 13, 2018
  3. 02/26 object-store: move alt_odb_list and alt_odb_tail to object storeStefan Beller, Feb 13, 2018
  4. Brandon WilliamsFeb 13, 2018
  5. Stefan BellerFeb 13, 2018
  6. 03/26 object-store: free alt_odb_listStefan Beller, Feb 13, 2018
  7. 05/26 object-store: close all packs upon clearing the object storeStefan Beller, Feb 13, 2018
  8. 07/26 pack: move approximate object count to object storeStefan Beller, Feb 13, 2018
  9. 10/26 sha1_file: add repository argument to read_info_alternatesStefan Beller, Feb 13, 2018
  10. 08/26 sha1_file: add raw_object_store argument to alt_odb_usableStefan Beller, Feb 13, 2018
  11. 11/26 sha1_file: add repository argument to link_alt_odb_entriesStefan Beller, Feb 13, 2018
  12. 09/26 sha1_file: add repository argument to link_alt_odb_entryStefan Beller, Feb 13, 2018
  13. 15/26 sha1_file: add repository argument to sha1_file_nameStefan Beller, Feb 13, 2018
  14. 14/26 sha1_file: allow prepare_alt_odb to handle arbitrary repositoriesStefan Beller, Feb 13, 2018
  15. Duy NguyenFeb 14, 2018
  16. Brandon WilliamsFeb 14, 2018
  17. 0/2 Fix initializing the_hash_algoNguyễn Thái Ngọc Duy, Feb 23, 2018
  18. 1/2 setup.c: initialize the_repository correctly in all casesNguyễn Thái Ngọc Duy, Feb 23, 2018
  19. brian m. carlsonFeb 23, 2018
  20. Duy NguyenFeb 24, 2018
  21. 2/2 Revert "repository: pre-initialize hash algo pointer"Nguyễn Thái Ngọc Duy, Feb 23, 2018
  22. Stefan BellerFeb 23, 2018
  23. Junio C HamanoFeb 23, 2018
  24. Stefan BellerFeb 23, 2018
  25. Junio C HamanoFeb 23, 2018
  26. brian m. carlsonFeb 23, 2018
  27. Brandon WilliamsFeb 23, 2018
  28. Duy NguyenFeb 24, 2018
  29. Junio C HamanoFeb 26, 2018
  30. Duy NguyenMar 3, 2018
  31. brian m. carlsonFeb 23, 2018
  32. 0/5 Fix initializing the_hash_algoNguyễn Thái Ngọc Duy, Feb 24, 2018
  33. 1/5 setup.c: initialize the_repository correctly in all casesNguyễn Thái Ngọc Duy, Feb 24, 2018
  34. 2/5 sha1_file.c: keep a good name for "unknown" hash_algos[UNKNOWN]Nguyễn Thái Ngọc Duy, Feb 24, 2018
  35. brian m. carlsonFeb 24, 2018
  36. 3/5 index-pack: check (and optionally set) hash algo based on input fileNguyễn Thái Ngọc Duy, Feb 24, 2018
  37. brian m. carlsonFeb 24, 2018
  38. 4/5 diff.c: initialize hash algo when running in --no-index modeNguyễn Thái Ngọc Duy, Feb 24, 2018
  39. Eric SunshineFeb 24, 2018
  40. Duy NguyenFeb 24, 2018
  41. Duy NguyenFeb 24, 2018
  42. brian m. carlsonFeb 24, 2018
  43. 5/5 Revert "repository: pre-initialize hash algo pointer"Nguyễn Thái Ngọc Duy, Feb 24, 2018
  44. brian m. carlsonFeb 24, 2018
  45. Duy NguyenFeb 25, 2018
  46. brian m. carlsonFeb 25, 2018
  47. 0/6 Fix initializing the_hash_algoNguyễn Thái Ngọc Duy, Feb 25, 2018
  48. 1/6 setup.c: initialize the_repository correctly in all casesNguyễn Thái Ngọc Duy, Feb 25, 2018
  49. 2/6 sha1_file.c: keep a good name for "unknown" hash_algos[UNKNOWN]Nguyễn Thái Ngọc Duy, Feb 25, 2018
  50. 3/6 cache.h: make the_hash_algo read-onlyNguyễn Thái Ngọc Duy, Feb 25, 2018
  51. 4/6 index-pack: check (and optionally set) hash algo based on input fileNguyễn Thái Ngọc Duy, Feb 25, 2018
  52. 5/6 diff.c: initialize hash algo when running in --no-index modeNguyễn Thái Ngọc Duy, Feb 25, 2018
  53. 6/6 Revert "repository: pre-initialize hash algo pointer"Nguyễn Thái Ngọc Duy, Feb 25, 2018
  54. brian m. carlsonFeb 25, 2018
  55. Stefan BellerFeb 26, 2018
  56. 0/4 Delete ignore_env member in struct repositoryNguyễn Thái Ngọc Duy, Feb 26, 2018
  57. 1/4 repository.c: move env-related setup code back to environment.cNguyễn Thái Ngọc Duy, Feb 26, 2018
  58. Eric SunshineFeb 26, 2018
  59. Duy NguyenFeb 27, 2018
  60. Duy NguyenFeb 27, 2018
  61. Stefan BellerFeb 26, 2018
  62. Duy NguyenFeb 27, 2018
  63. 2/4 repository.c: delete dead functionsNguyễn Thái Ngọc Duy, Feb 26, 2018
  64. 3/4 sha1_file.c: move delayed getenv(altdb) back to setup_git_env()Nguyễn Thái Ngọc Duy, Feb 26, 2018
  65. 4/4 repository: delete ignore_env memberNguyễn Thái Ngọc Duy, Feb 26, 2018
  66. Junio C HamanoFeb 26, 2018
  67. Stefan BellerFeb 26, 2018
  68. Duy NguyenFeb 27, 2018
  69. 0/4 Delete ignore_env member in struct repositoryNguyễn Thái Ngọc Duy, Feb 27, 2018
  70. 1/4 repository.c: move env-related setup code back to environment.cNguyễn Thái Ngọc Duy, Feb 27, 2018
  71. Brandon WilliamsFeb 27, 2018
  72. 4/4 repository: delete ignore_env memberNguyễn Thái Ngọc Duy, Feb 27, 2018
  73. Brandon WilliamsFeb 27, 2018
  74. 2/4 repository.c: delete dead functionsNguyễn Thái Ngọc Duy, Feb 27, 2018
  75. Brandon WilliamsFeb 27, 2018
  76. 3/4 sha1_file.c: move delayed getenv(altdb) back to setup_git_env()Nguyễn Thái Ngọc Duy, Feb 27, 2018
  77. Brandon WilliamsFeb 27, 2018
  78. Duy NguyenFeb 28, 2018
  79. Eric SunshineFeb 27, 2018
  80. Stefan BellerFeb 27, 2018
  81. 0/4 Delete ignore_env member in struct repositoryNguyễn Thái Ngọc Duy, Feb 28, 2018
  82. 1/4 repository.c: move env-related setup code back to environment.cNguyễn Thái Ngọc Duy, Feb 28, 2018
  83. 2/4 repository.c: delete dead functionsNguyễn Thái Ngọc Duy, Feb 28, 2018
  84. 3/4 sha1_file.c: move delayed getenv(altdb) back to setup_git_env()Nguyễn Thái Ngọc Duy, Feb 28, 2018
  85. 4/4 repository: delete ignore_env memberNguyễn Thái Ngọc Duy, Feb 28, 2018
  86. Brandon WilliamsFeb 28, 2018
  87. Junio C HamanoFeb 28, 2018
  88. 19/26 sha1_file: add repository argument to map_sha1_fileStefan Beller, Feb 13, 2018
  89. 20/26 sha1_file: add repository argument to sha1_loose_object_infoStefan Beller, Feb 13, 2018
  90. 21/26 sha1_file: allow sha1_file_name to handle arbitrary repositoriesStefan Beller, Feb 13, 2018
  91. 22/26 sha1_file: allow stat_sha1_file to handle arbitrary repositoriesStefan Beller, Feb 13, 2018
  92. 24/26 sha1_file: allow map_sha1_file_1 to handle arbitrary repositoriesStefan Beller, Feb 13, 2018
  93. 26/26 sha1_file: allow sha1_loose_object_info to handle arbitrary repositoriesStefan Beller, Feb 13, 2018
  94. 23/26 sha1_file: allow open_sha1_file to handle arbitrary repositoriesStefan Beller, Feb 13, 2018
  95. 25/26 sha1_file: allow map_sha1_file to handle arbitrary repositoriesStefan Beller, Feb 13, 2018
  96. 16/26 sha1_file: add repository argument to stat_sha1_fileStefan Beller, Feb 13, 2018
  97. 17/26 sha1_file: add repository argument to open_sha1_fileStefan Beller, Feb 13, 2018
  98. 18/26 sha1_file: add repository argument to map_sha1_file_1Stefan Beller, Feb 13, 2018
  99. 12/26 sha1_file: add repository argument to prepare_alt_odbStefan Beller, Feb 13, 2018
  100. 13/26 sha1_file: allow link_alt_odb_entries to handle arbitrary repositoriesStefan Beller, Feb 13, 2018
  101. 06/26 pack: move prepare_packed_git_run_once to object storeStefan Beller, Feb 13, 2018
  102. 04/26 object-store: move packed_git and packed_git_mru to object storeStefan Beller, Feb 13, 2018
  103. Stefan BellerFeb 13, 2018
  104. Duy NguyenFeb 13, 2018
  105. Duy NguyenFeb 13, 2018
  106. Brandon WilliamsFeb 13, 2018
  107. Stefan BellerFeb 13, 2018
  108. Junio C HamanoFeb 13, 2018
  109. Stefan BellerFeb 13, 2018
  110. Junio C HamanoFeb 13, 2018
  111. Stefan BellerFeb 13, 2018
  112. Junio C HamanoFeb 14, 2018
  113. Jonathan NiederFeb 13, 2018
  114. Duy NguyenFeb 14, 2018
  115. Brandon WilliamsFeb 13, 2018
  116. Junio C HamanoFeb 15, 2018
  117. Stefan BellerFeb 15, 2018
  118. 00/16 Moving global state into the repository object (part 1)Stefan Beller, Feb 16, 2018
  119. 01/16 repository: introduce raw object store fieldStefan Beller, Feb 16, 2018
  120. 03/16 object-store: free alt_odb_listStefan Beller, Feb 16, 2018
  121. 02/16 object-store: move alt_odb_list and alt_odb_tail to object storeStefan Beller, Feb 16, 2018
  122. 06/16 pack: move prepare_packed_git_run_once to object storeStefan Beller, Feb 16, 2018
  123. 10/16 sha1_file: allow prepare_alt_odb to handle arbitrary object storesStefan Beller, Feb 16, 2018
  124. 12/16 sha1_file: allow stat_sha1_file to handle arbitrary object storesStefan Beller, Feb 16, 2018
  125. 14/16 sha1_file: allow map_sha1_file_1 to handle arbitrary object storesStefan Beller, Feb 16, 2018
  126. 15/16 sha1_file: allow map_sha1_file to handle arbitrary object storesStefan Beller, Feb 16, 2018
  127. 13/16 sha1_file: allow open_sha1_file to handle arbitrary object storesStefan Beller, Feb 16, 2018
  128. 16/16 sha1_file: allow sha1_loose_object_info to handle arbitrary object storesStefan Beller, Feb 16, 2018
  129. 09/16 sha1_file: allow link_alt_odb_entries to handle arbitrary object storesStefan Beller, Feb 16, 2018
  130. 11/16 sha1_file: allow sha1_file_name to handle arbitrary object storesStefan Beller, Feb 16, 2018
  131. 07/16 pack: move approximate object count to object storeStefan Beller, Feb 16, 2018
  132. 08/16 sha1_file: add raw_object_store argument to alt_odb_usableStefan Beller, Feb 16, 2018
  133. 04/16 object-store: move packed_git and packed_git_mru to object storeStefan Beller, Feb 16, 2018
  134. Junio C HamanoFeb 16, 2018
  135. 05/16 object-store: close all packs upon clearing the object storeStefan Beller, Feb 16, 2018
  136. Jonathan NiederFeb 16, 2018
  137. Stefan BellerFeb 20, 2018
  138. Brandon WilliamsFeb 20, 2018
  139. Stefan BellerFeb 20, 2018
  140. Junio C HamanoFeb 20, 2018
  141. Stefan BellerFeb 20, 2018
  142. Junio C HamanoFeb 20, 2018
  143. Stefan BellerFeb 20, 2018
  144. 00/27 Moving global state into the repository object (part 1)Stefan Beller, Feb 21, 2018
  145. 01/27 repository: introduce raw object store fieldStefan Beller, Feb 21, 2018
  146. Jonathan NiederFeb 22, 2018
  147. 02/27 object-store: migrate alternates struct and functions from cache.hStefan Beller, Feb 21, 2018
  148. Brandon WilliamsFeb 22, 2018
  149. 05/27 object-store: move packed_git and packed_git_mru to object storeStefan Beller, Feb 21, 2018
  150. Junio C HamanoFeb 21, 2018
  151. Stefan BellerFeb 23, 2018
  152. Jonathan NiederFeb 22, 2018
  153. Stefan BellerFeb 23, 2018
  154. 08/27 pack: move approximate object count to object storeStefan Beller, Feb 21, 2018
  155. Brandon WilliamsFeb 22, 2018
  156. Stefan BellerFeb 23, 2018
  157. Jeff KingFeb 26, 2018
  158. Stefan BellerFeb 26, 2018
  159. 10/27 sha1_file: add repository argument to link_alt_odb_entryStefan Beller, Feb 21, 2018
  160. 11/27 sha1_file: add repository argument to read_info_alternatesStefan Beller, Feb 21, 2018
  161. 13/27 sha1_file: add repository argument to prepare_alt_odbStefan Beller, Feb 21, 2018
  162. Jonathan NiederFeb 22, 2018
  163. Stefan BellerFeb 23, 2018
  164. 15/27 sha1_file: allow prepare_alt_odb to handle arbitrary repositoriesStefan Beller, Feb 21, 2018
  165. Jonathan TanFeb 22, 2018
  166. Stefan BellerFeb 23, 2018
  167. 14/27 sha1_file: allow link_alt_odb_entries to handle arbitrary repositoriesStefan Beller, Feb 21, 2018
  168. Brandon WilliamsFeb 22, 2018
  169. 09/27 sha1_file: add raw_object_store argument to alt_odb_usableStefan Beller, Feb 21, 2018
  170. Jonathan TanFeb 22, 2018
  171. 19/27 sha1_file: add repository argument to map_sha1_file_1Stefan Beller, Feb 21, 2018
  172. Jonathan TanFeb 22, 2018
  173. 18/27 sha1_file: add repository argument to open_sha1_fileStefan Beller, Feb 21, 2018
  174. 24/27 sha1_file: allow open_sha1_file to handle arbitrary repositoriesStefan Beller, Feb 21, 2018
  175. Jonathan TanFeb 22, 2018
  176. 22/27 sha1_file: allow sha1_file_name to handle arbitrary repositoriesStefan Beller, Feb 21, 2018
  177. Jonathan TanFeb 22, 2018
  178. Stefan BellerFeb 23, 2018
  179. 23/27 sha1_file: allow stat_sha1_file to handle arbitrary repositoriesStefan Beller, Feb 21, 2018
  180. 27/27 sha1_file: allow sha1_loose_object_info to handle arbitrary repositoriesStefan Beller, Feb 21, 2018
  181. 26/27 sha1_file: allow map_sha1_file to handle arbitrary repositoriesStefan Beller, Feb 21, 2018
  182. Jonathan NiederFeb 22, 2018
  183. 25/27 sha1_file: allow map_sha1_file_1 to handle arbitrary repositoriesStefan Beller, Feb 21, 2018
  184. 20/27 sha1_file: add repository argument to map_sha1_fileStefan Beller, Feb 21, 2018
  185. 21/27 sha1_file: add repository argument to sha1_loose_object_infoStefan Beller, Feb 21, 2018
  186. Jonathan NiederFeb 22, 2018
  187. 12/27 sha1_file: add repository argument to link_alt_odb_entriesStefan Beller, Feb 21, 2018
  188. 17/27 sha1_file: add repository argument to stat_sha1_fileStefan Beller, Feb 21, 2018
  189. Jonathan NiederFeb 22, 2018
  190. 03/27 object-store: move alt_odb_list and alt_odb_tail to object storeStefan Beller, Feb 21, 2018
  191. Brandon WilliamsFeb 22, 2018
  192. 16/27 sha1_file: add repository argument to sha1_file_nameStefan Beller, Feb 21, 2018
  193. Brandon WilliamsFeb 22, 2018
  194. Stefan BellerFeb 23, 2018
  195. Brandon WilliamsFeb 23, 2018
  196. 04/27 object-store: free alt_odb_listStefan Beller, Feb 21, 2018
  197. Brandon WilliamsFeb 22, 2018
  198. 07/27 pack: move prepare_packed_git_run_once to object storeStefan Beller, Feb 21, 2018
  199. Jonathan TanFeb 22, 2018
  200. 06/27 object-store: close all packs upon clearing the object storeStefan Beller, Feb 21, 2018
  201. Brandon WilliamsFeb 22, 2018
  202. Stefan BellerFeb 22, 2018
  203. 00/27 Moving global state into the repository object (part 1)Stefan Beller, Feb 24, 2018
  204. 01/27 repository: introduce raw object store fieldStefan Beller, Feb 24, 2018
  205. Duy NguyenFeb 26, 2018
  206. Junio C HamanoFeb 26, 2018
  207. Brandon WilliamsFeb 26, 2018
  208. Stefan BellerFeb 26, 2018
  209. Duy NguyenFeb 26, 2018
  210. 02/27 object-store: migrate alternates struct and functions from cache.hStefan Beller, Feb 24, 2018
  211. 04/27 object-store: free alt_odb_listStefan Beller, Feb 24, 2018
  212. 05/27 object-store: move packed_git and packed_git_mru to object storeStefan Beller, Feb 24, 2018
  213. 08/27 pack: move approximate object count to object storeStefan Beller, Feb 24, 2018
  214. 06/27 object-store: close all packs upon clearing the object storeStefan Beller, Feb 24, 2018
  215. 03/27 object-store: move alt_odb_list and alt_odb_tail to object storeStefan Beller, Feb 24, 2018
  216. 15/27 sha1_file: allow prepare_alt_odb to handle arbitrary repositoriesStefan Beller, Feb 24, 2018
  217. 19/27 sha1_file: add repository argument to map_sha1_file_1Stefan Beller, Feb 24, 2018
  218. 16/27 sha1_file: add repository argument to sha1_file_nameStefan Beller, Feb 24, 2018
  219. 22/27 sha1_file: allow sha1_file_name to handle arbitrary repositoriesStefan Beller, Feb 24, 2018
  220. 23/27 sha1_file: allow stat_sha1_file to handle arbitrary repositoriesStefan Beller, Feb 24, 2018
  221. 20/27 sha1_file: add repository argument to map_sha1_fileStefan Beller, Feb 24, 2018
  222. 26/27 sha1_file: allow map_sha1_file to handle arbitrary repositoriesStefan Beller, Feb 24, 2018
  223. 27/27 sha1_file: allow sha1_loose_object_info to handle arbitrary repositoriesStefan Beller, Feb 24, 2018
  224. 21/27 sha1_file: add repository argument to sha1_loose_object_infoStefan Beller, Feb 24, 2018
  225. 25/27 sha1_file: allow map_sha1_file_1 to handle arbitrary repositoriesStefan Beller, Feb 24, 2018
  226. 10/27 sha1_file: add repository argument to link_alt_odb_entryStefan Beller, Feb 24, 2018
  227. 24/27 sha1_file: allow open_sha1_file to handle arbitrary repositoriesStefan Beller, Feb 24, 2018
  228. 17/27 sha1_file: add repository argument to stat_sha1_fileStefan Beller, Feb 24, 2018
  229. 18/27 sha1_file: add repository argument to open_sha1_fileStefan Beller, Feb 24, 2018
  230. 13/27 sha1_file: add repository argument to prepare_alt_odbStefan Beller, Feb 24, 2018
  231. 14/27 sha1_file: allow link_alt_odb_entries to handle arbitrary repositoriesStefan Beller, Feb 24, 2018
  232. 07/27 pack: move prepare_packed_git_run_once to object storeStefan Beller, Feb 24, 2018
  233. 12/27 sha1_file: add repository argument to link_alt_odb_entriesStefan Beller, Feb 24, 2018
  234. 09/27 sha1_file: add raw_object_store argument to alt_odb_usableStefan Beller, Feb 24, 2018
  235. 11/27 sha1_file: add repository argument to read_info_alternatesStefan Beller, Feb 24, 2018
  236. Duy NguyenFeb 24, 2018
  237. Stefan BellerFeb 26, 2018
  238. Duy NguyenFeb 27, 2018
  239. Jonathan TanFeb 26, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.