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

[PATCH 00/44] reroll nd/remove-ignore-env.. sb/object-store and sb/packfiles..

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Mar 3, 2018, 11:35 UTC
Message-ID
<20180303113637.26518-1-pclouds@gmail.com>
In-Reply-To
<CACsJy8DWrNzZM1K2vkx2XiETdAR5WhwXEdPijsxd0ZD4Lj=tZw@mail.gmail.com>
On Sat, Mar 3, 2018 at 9:54 AM, Duy Nguyen <pclouds@gmail.com> wrote:
Show 23 quoted lines
> On Thu, Mar 1, 2018 at 2:09 AM, Junio C Hamano <gitster@pobox.com> wrote:
>> Stefan Beller <sbeller@google.com> writes:
>>
>>> On Wed, Feb 28, 2018 at 9:59 AM, Junio C Hamano <gitster@pobox.com> wrote:
>>>> Duy Nguyen <pclouds@gmail.com> writes:
>>>>
>>>>> Looking at the full-series diff though, it makes me wonder if we
>>>>> should keep prepare_packed_git() private (i.e. how we initialize the
>>>>> object store, packfile included, is a private matter). How about
>>>>> something like this on top?
>>>>
>>>> Yup, that looks cleaner.
>>>
>>> I agree that it looks cleaner. So we plan on just putting
>>> it on top of that series?
>>
>> We tend to avoid "oops, that was wrong and here is a band aid on
>> top" for things that are still mushy, so it would be preferrable to
>> get it fixed inline, especially if there are more changes to the
>> other parts of the series coming.
>
> I agree with this. Stefan, if you're getting bored with rerolling
> refactor patches, I can update this series and send out v2.

Since Stefan is traveling, I take this opportunity to reroll it. Unfortunately, I think the fix should go in 46cd557bd9 (object-store: move packed_git and packed_git_mru to object store - 2018-02-23) where we start removing the global "packed_git". But that's in sb/object-store, so.. I'm rerolling all three

01/44 - 05/44: nd/remove-ignore-env-field
  This series is moved up top. After this the patch that touch
  alternate-db in sha1_file.c looks natural because no env is involved
  anymore
  I also take this opportunity to introduce a new patch 01/44 to avoid
  struct initialization that makes it hard to read and update. Later
  patches are also simplified thanks to this.
06/44 - 32/44: sb/object-store
  06/44 is updated to introduce raw_object_store_init() instead of
  RAW_OBJECT_STORE_INIT macro. This function is now used to initialize
  both main repo and submodule ones.
  10/44 (moving "packed_git") also introduces two new access wrapper
  get_packed_git() and get_packed_git_mru()
33/44 - 44/44: sb/packfiles-in-repository
  The only thing new here is 44/44 which makes prepare_packed_git()
  internal. get_packed_git() and get_packed_git_mru() introduced
  earlier will call prepare_packed_git() automatically.
The whole thing is also available at
https://github.com/pclouds/git/tree/ignore-env-object-store-packfiles

And interdiff of all three, compared to what is currently in 'pu'. Looks pretty good in my opinon:

diff --git a/builtin/count-objects.c b/builtin/count-objects.c
index d480301763..ee6ae35244 100644
--- a/builtin/count-objects.c
+++ b/builtin/count-objects.c
@@ -121,9 +121,8 @@ 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 (!the_repository->objects.packed_git)
-			prepare_packed_git(the_repository);
-		for (p = the_repository->objects.packed_git; p; p = p->next) {
+
+		for (p = get_packed_git(the_repository); 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 030c7fb7a0..9911c52bc8 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -726,10 +726,8 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 			uint32_t total = 0, count = 0;
 			struct progress *progress = NULL;
 
-			prepare_packed_git(the_repository);
-
 			if (show_progress) {
-				for (p = the_repository->objects.packed_git; p;
+				for (p = get_packed_git(the_repository); p;
 				     p = p->next) {
 					if (open_pack_index(p))
 						continue;
@@ -738,7 +736,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 
 				progress = start_progress(_("Checking objects"), total);
 			}
-			for (p = the_repository->objects.packed_git; p;
+			for (p = get_packed_git(the_repository); p;
 			     p = p->next) {
 				/* verify gives error messages itself */
 				if (verify_pack(p, fsck_obj_buffer,
diff --git a/builtin/gc.c b/builtin/gc.c
index 80d19c54d5..be63bec09c 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -173,8 +173,7 @@ static int too_many_packs(void)
 	if (gc_auto_pack_limit <= 0)
 		return 0;
 
-	prepare_packed_git(the_repository);
-	for (cnt = 0, p = the_repository->objects.packed_git; p; p = p->next) {
+	for (cnt = 0, p = get_packed_git(the_repository); p; p = p->next) {
 		if (!p->pack_local)
 			continue;
 		if (p->pack_keep)
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 142ec223cb..435f091a69 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -1026,7 +1026,7 @@ static int want_object_in_pack(const struct object_id *oid,
 		if (want != -1)
 			return want;
 	}
-	list_for_each(pos, &the_repository->objects.packed_git_mru) {
+	list_for_each(pos, get_packed_git_mru(the_repository)) {
 		struct packed_git *p = list_entry(pos, struct packed_git, mru);
 		off_t offset;
 
@@ -1045,7 +1045,7 @@ static int want_object_in_pack(const struct object_id *oid,
 			want = want_found_object(exclude, p);
 			if (!exclude && want > 0)
 				list_move(&p->mru,
-					  &the_repository->objects.packed_git_mru);
+					  get_packed_git_mru(the_repository));
 			if (want != -1)
 				return want;
 		}
@@ -2674,7 +2674,7 @@ static void add_objects_in_unpacked_packs(struct rev_info *revs)
 
 	memset(&in_pack, 0, sizeof(in_pack));
 
-	for (p = the_repository->objects.packed_git; p; p = p->next) {
+	for (p = get_packed_git(the_repository); p; p = p->next) {
 		struct object_id oid;
 		struct object *o;
 
@@ -2738,7 +2738,7 @@ static int has_sha1_pack_kept_or_nonlocal(const struct object_id *oid)
 	struct packed_git *p;
 
 	p = (last_found != (void *)1) ? last_found :
-					the_repository->objects.packed_git;
+					get_packed_git(the_repository);
 
 	while (p) {
 		if ((!p->pack_local || p->pack_keep) &&
@@ -2747,7 +2747,7 @@ static int has_sha1_pack_kept_or_nonlocal(const struct object_id *oid)
 			return 1;
 		}
 		if (p == last_found)
-			p = the_repository->objects.packed_git;
+			p = get_packed_git(the_repository);
 		else
 			p = p->next;
 		if (p == last_found)
@@ -2783,7 +2783,7 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
 	uint32_t i;
 	struct object_id oid;
 
-	for (p = the_repository->objects.packed_git; p; p = p->next) {
+	for (p = get_packed_git(the_repository); p; p = p->next) {
 		if (!p->pack_local || p->pack_keep)
 			continue;
 
@@ -3151,10 +3151,9 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 	if (progress && all_progress_implied)
 		progress = 2;
 
-	prepare_packed_git(the_repository);
 	if (ignore_packed_keep) {
 		struct packed_git *p;
-		for (p = the_repository->objects.packed_git; p; p = p->next)
+		for (p = get_packed_git(the_repository); p; p = p->next)
 			if (p->pack_local && p->pack_keep)
 				break;
 		if (!p) /* no keep-able packs found */
@@ -3167,7 +3166,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 		 * also covers non-local objects
 		 */
 		struct packed_git *p;
-		for (p = the_repository->objects.packed_git; p; p = p->next) {
+		for (p = get_packed_git(the_repository); 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 3b02f94248..02b5f0becc 100644
--- a/builtin/pack-redundant.c
+++ b/builtin/pack-redundant.c
@@ -572,7 +572,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 = the_repository->objects.packed_git;
+	struct packed_git *p = get_packed_git(the_repository);
 
 	if (strlen(filename) < 40)
 		die("Bad pack filename: %s", filename);
@@ -587,7 +587,7 @@ static struct pack_list * add_pack_file(const char *filename)
 
 static void load_all(void)
 {
-	struct packed_git *p = the_repository->objects.packed_git;
+	struct packed_git *p = get_packed_git(the_repository);
 
 	while (p) {
 		add_pack(p);
@@ -630,8 +630,6 @@ int cmd_pack_redundant(int argc, const char **argv, const char *prefix)
 			break;
 	}
 
-	prepare_packed_git(the_repository);
-
 	if (load_all_packs)
 		load_all();
 	else
diff --git a/common-main.c b/common-main.c
index 6a689007e7..7d716d5a54 100644
--- a/common-main.c
+++ b/common-main.c
@@ -34,6 +34,8 @@ int main(int argc, const char **argv)
 
 	git_setup_gettext();
 
+	initialize_the_repository();
+
 	attr_start();
 
 	git_extract_argv0_path(argv[0]);
diff --git a/environment.c b/environment.c
index b2128c1188..c05705e384 100644
--- a/environment.c
+++ b/environment.c
@@ -13,8 +13,8 @@
 #include "refs.h"
 #include "fmt-merge-msg.h"
 #include "commit.h"
-#include "object-store.h"
 #include "argv-array.h"
+#include "object-store.h"
 
 int trust_executable_bit = 1;
 int trust_ctime = 1;
diff --git a/fast-import.c b/fast-import.c
index d2032e4ade..2298bfcdfd 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -1112,7 +1112,7 @@ static int store_object(
 		duplicate_count_by_type[type]++;
 		return 1;
 	} else if (find_sha1_pack(oid.hash,
-				  the_repository->objects.packed_git)) {
+				  get_packed_git(the_repository))) {
 		e->type = type;
 		e->pack_id = MAX_PACK_ID;
 		e->idx.offset = 1; /* just not zero! */
@@ -1308,7 +1308,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
 		truncate_pack(&checkpoint);
 
 	} else if (find_sha1_pack(oid.hash,
-				  the_repository->objects.packed_git)) {
+				  get_packed_git(the_repository))) {
 		e->type = OBJ_BLOB;
 		e->pack_id = MAX_PACK_ID;
 		e->idx.offset = 1; /* just not zero! */
@@ -3472,7 +3472,6 @@ int cmd_main(int argc, const char **argv)
 		rc_free[i].next = &rc_free[i + 1];
 	rc_free[cmd_save - 1].next = NULL;
 
-	prepare_packed_git(the_repository);
 	start_packfile();
 	set_die_routine(die_nicely);
 	set_checkpoint_signal();
diff --git a/http-backend.c b/http-backend.c
index defa6ba350..22d2e1668e 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -518,14 +518,13 @@ static void get_info_packs(struct strbuf *hdr, char *arg)
 	size_t cnt = 0;
 
 	select_getanyfile(hdr);
-	prepare_packed_git(the_repository);
-	for (p = the_repository->objects.packed_git; p; p = p->next) {
+	for (p = get_packed_git(the_repository); p; p = p->next) {
 		if (p->pack_local)
 			cnt++;
 	}
 
 	strbuf_grow(&buf, cnt * 53 + 2);
-	for (p = the_repository->objects.packed_git; p; p = p->next) {
+	for (p = get_packed_git(the_repository); p; p = p->next) {
 		if (p->pack_local)
 			strbuf_addf(&buf, "P %s\n", p->pack_name + objdirlen + 6);
 	}
diff --git a/object-store.h b/object-store.h
index 9b1303549b..521f5a1755 100644
--- a/object-store.h
+++ b/object-store.h
@@ -90,9 +90,9 @@ struct raw_object_store {
 	/* Path to extra alternate object database if not NULL */
 	char *alternate_db;
 
-	struct packed_git *packed_git;
+	struct packed_git *packed_git; /* private */
 	/* A most-recently-used ordered version of the packed_git list. */
-	struct list_head packed_git_mru;
+	struct list_head packed_git_mru; /* private */
 
 	struct alternate_object_database *alt_odb_list;
 	struct alternate_object_database **alt_odb_tail;
@@ -112,8 +112,7 @@ struct raw_object_store {
 	unsigned packed_git_initialized : 1;
 };
 
-#define RAW_OBJECT_STORE_INIT(o) { NULL, NULL, NULL, LIST_HEAD_INIT(o.packed_git_mru), NULL, NULL, 0, 0, 0 }
-
+void raw_object_store_init(struct raw_object_store *o);
 void raw_object_store_clear(struct raw_object_store *o);
 
 /*
diff --git a/object.c b/object.c
index 5317cfc390..60ca76b285 100644
--- a/object.c
+++ b/object.c
@@ -447,6 +447,12 @@ void clear_commit_marks_all(unsigned int flags)
 	}
 }
 
+void raw_object_store_init(struct raw_object_store *o)
+{
+	memset(o, 0, sizeof(*o));
+	INIT_LIST_HEAD(&o->packed_git_mru);
+}
+
 static void free_alt_odb(struct alternate_object_database *alt)
 {
 	strbuf_release(&alt->scratch);
diff --git a/pack-bitmap.c b/pack-bitmap.c
index bcc04bc45e..2a007b5539 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -335,8 +335,7 @@ static int open_pack_bitmap(void)
 
 	assert(!bitmap_git.map && !bitmap_git.loaded);
 
-	prepare_packed_git(the_repository);
-	for (p = the_repository->objects.packed_git; p; p = p->next) {
+	for (p = get_packed_git(the_repository); p; p = p->next) {
 		if (open_pack_bitmap_1(p) == 0)
 			ret = 0;
 	}
diff --git a/packfile.c b/packfile.c
index 1a045157d0..773cd99a13 100644
--- a/packfile.c
+++ b/packfile.c
@@ -802,6 +802,7 @@ static void prepare_packed_git_one(struct repository *r, char *objdir, int local
 	strbuf_release(&path);
 }
 
+static void prepare_packed_git(struct repository *r);
 /*
  * Give a fast, rough count of the number of objects in the repository. This
  * ignores loose objects completely. If you have a lot of them, then either
@@ -882,7 +883,7 @@ static void prepare_packed_git_mru(struct repository *r)
 		list_add_tail(&p->mru, &r->objects.packed_git_mru);
 }
 
-void prepare_packed_git(struct repository *r)
+static void prepare_packed_git(struct repository *r)
 {
 	struct alternate_object_database *alt;
 
@@ -904,6 +905,18 @@ void reprepare_packed_git(struct repository *r)
 	prepare_packed_git(r);
 }
 
+struct packed_git *get_packed_git(struct repository *r)
+{
+	prepare_packed_git(r);
+	return r->objects.packed_git;
+}
+
+struct list_head *get_packed_git_mru(struct repository *r)
+{
+	prepare_packed_git(r);
+	return &r->objects.packed_git_mru;
+}
+
 unsigned long unpack_object_header_buffer(const unsigned char *buf,
 		unsigned long len, enum object_type *type, unsigned long *sizep)
 {
diff --git a/packfile.h b/packfile.h
index 6f7b9e91d6..efda10329c 100644
--- a/packfile.h
+++ b/packfile.h
@@ -34,10 +34,12 @@ extern struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_
 #define PACKDIR_FILE_GARBAGE 4
 extern void (*report_garbage)(unsigned seen_bits, const char *path);
 
-extern void prepare_packed_git(struct repository *r);
 extern void reprepare_packed_git(struct repository *r);
 extern void install_packed_git(struct repository *r, struct packed_git *pack);
 
+struct packed_git *get_packed_git(struct repository *r);
+struct list_head *get_packed_git_mru(struct repository *r);
+
 /*
  * Give a rough count of objects in the repository. This sacrifices accuracy
  * for speed.
diff --git a/repository.c b/repository.c
index 4f44384dde..34c0a7f180 100644
--- a/repository.c
+++ b/repository.c
@@ -5,16 +5,17 @@
 #include "submodule-config.h"
 
 /* The main repository */
-static struct repository the_repo = {
-	NULL, NULL,
-	RAW_OBJECT_STORE_INIT(the_repo.objects),
-	NULL, NULL, NULL,
-	NULL, NULL, NULL,
-	&the_index,
-	&hash_algos[GIT_HASH_SHA1],
-	0
-};
-struct repository *the_repository = &the_repo;
+static struct repository the_repo;
+struct repository *the_repository;
+
+void initialize_the_repository(void)
+{
+	the_repository = &the_repo;
+
+	the_repo.index = &the_index;
+	raw_object_store_init(&the_repo.objects);
+	repo_set_hash_algo(&the_repo, GIT_HASH_SHA1);
+}
 
 static void expand_base_dir(char **out, const char *in,
 			    const char *base_dir, const char *def_in)
@@ -134,12 +135,14 @@ static int read_and_verify_repository_format(struct repository_format *format,
  * Initialize 'repo' based on the provided 'gitdir'.
  * Return 0 upon success and a non-zero value upon failure.
  */
-int repo_init(struct repository *repo, const char *gitdir, const char *worktree)
+static int repo_init(struct repository *repo,
+		     const char *gitdir,
+		     const char *worktree)
 {
 	struct repository_format format;
 	memset(repo, 0, sizeof(*repo));
 
-	INIT_LIST_HEAD(&repo->objects.packed_git_mru);
+	raw_object_store_init(&repo->objects);
 
 	if (repo_init_gitdir(repo, gitdir))
 		goto error;
diff --git a/repository.h b/repository.h
index e05a77a099..6c383c05c6 100644
--- a/repository.h
+++ b/repository.h
@@ -93,7 +93,7 @@ extern void repo_set_gitdir(struct repository *repo,
 			    const struct set_gitdir_args *optional);
 extern void repo_set_worktree(struct repository *repo, const char *path);
 extern void repo_set_hash_algo(struct repository *repo, int algo);
-extern int repo_init(struct repository *repo, const char *gitdir, const char *worktree);
+extern void initialize_the_repository(void);
 extern int repo_submodule_init(struct repository *submodule,
 			       struct repository *superproject,
 			       const char *path);
diff --git a/server-info.c b/server-info.c
index f5e4d1cc89..af737acd24 100644
--- a/server-info.c
+++ b/server-info.c
@@ -200,8 +200,7 @@ static void init_pack_info(const char *infofile, int force)
 	objdir = get_object_directory();
 	objdirlen = strlen(objdir);
 
-	prepare_packed_git(the_repository);
-	for (p = the_repository->objects.packed_git; p; p = p->next) {
+	for (p = get_packed_git(the_repository); p; p = p->next) {
 		/* we ignore things on alternate path since they are
 		 * not available to the pullers in general.
 		 */
@@ -211,7 +210,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 = the_repository->objects.packed_git; p; p = p->next) {
+	for (i = 0, p = get_packed_git(the_repository); 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 773322ac81..f25a0970ca 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -195,8 +195,7 @@ static void find_short_packed_object(struct disambiguate_state *ds)
 {
 	struct packed_git *p;
 
-	prepare_packed_git(the_repository);
-	for (p = the_repository->objects.packed_git; p && !ds->ambiguous;
+	for (p = get_packed_git(the_repository); p && !ds->ambiguous;
 	     p = p->next)
 		unique_in_pack(p, ds);
 }
@@ -566,8 +565,7 @@ static void find_abbrev_len_packed(struct min_abbrev_data *mad)
 {
 	struct packed_git *p;
 
-	prepare_packed_git(the_repository);
-	for (p = the_repository->objects.packed_git; p; p = p->next)
+	for (p = get_packed_git(the_repository); p; p = p->next)
 		find_abbrev_len_for_pack(p, mad);
 }
 
-- 
2.16.1.435.g8f24da2e1a
Previous: Duy NguyenNext: Nguyễn Thái Ngọc Duy
Message 2 of 135 in “Re: [PATCH 00/11] Moving global state into the repository object (part 2)”
  1. Duy NguyenMar 3, 2018
  2. 00/44 reroll nd/remove-ignore-env.. sb/object-store and sb/packfiles..Nguyễn Thái Ngọc Duy, Mar 3, 2018
  3. 01/44 repository: initialize the_repository in main()Nguyễn Thái Ngọc Duy, Mar 3, 2018
  4. Brandon WilliamsMar 21, 2018
  5. 02/44 repository.c: move env-related setup code back to environment.cNguyễn Thái Ngọc Duy, Mar 3, 2018
  6. Jonathan TanMar 19, 2018
  7. Duy NguyenMar 19, 2018
  8. Brandon WilliamsMar 21, 2018
  9. 03/44 repository.c: delete dead functionsNguyễn Thái Ngọc Duy, Mar 3, 2018
  10. Brandon WilliamsMar 21, 2018
  11. 04/44 sha1_file.c: move delayed getenv(altdb) back to setup_git_env()Nguyễn Thái Ngọc Duy, Mar 3, 2018
  12. Brandon WilliamsMar 21, 2018
  13. 05/44 repository: delete ignore_env memberNguyễn Thái Ngọc Duy, Mar 3, 2018
  14. Brandon WilliamsMar 21, 2018
  15. 06/44 repository: introduce raw object store fieldNguyễn Thái Ngọc Duy, Mar 3, 2018
  16. Eric SunshineMar 4, 2018
  17. Brandon WilliamsMar 21, 2018
  18. 07/44 object-store: migrate alternates struct and functions from cache.hNguyễn Thái Ngọc Duy, Mar 3, 2018
  19. 08/44 object-store: move alt_odb_list and alt_odb_tail to object storeNguyễn Thái Ngọc Duy, Mar 3, 2018
  20. 09/44 object-store: free alt_odb_listNguyễn Thái Ngọc Duy, Mar 3, 2018
  21. Eric SunshineMar 4, 2018
  22. Duy NguyenMar 5, 2018
  23. Brandon WilliamsMar 21, 2018
  24. 10/44 object-store: move packed_git and packed_git_mru to object storeNguyễn Thái Ngọc Duy, Mar 3, 2018
  25. Jonathan TanMar 19, 2018
  26. Duy NguyenMar 23, 2018
  27. Brandon WilliamsMar 21, 2018
  28. Duy NguyenMar 23, 2018
  29. Duy NguyenMar 23, 2018
  30. Brandon WilliamsMar 23, 2018
  31. 11/44 object-store: close all packs upon clearing the object storeNguyễn Thái Ngọc Duy, Mar 3, 2018
  32. Brandon WilliamsMar 21, 2018
  33. 12/44 pack: move prepare_packed_git_run_once to object storeNguyễn Thái Ngọc Duy, Mar 3, 2018
  34. Brandon WilliamsMar 21, 2018
  35. 13/44 pack: move approximate object count to object storeNguyễn Thái Ngọc Duy, Mar 3, 2018
  36. Eric SunshineMar 4, 2018
  37. Duy NguyenMar 4, 2018
  38. Brandon WilliamsMar 21, 2018
  39. 14/44 sha1_file: add raw_object_store argument to alt_odb_usableNguyễn Thái Ngọc Duy, Mar 3, 2018
  40. 15/44 sha1_file: add repository argument to link_alt_odb_entryNguyễn Thái Ngọc Duy, Mar 3, 2018
  41. 16/44 sha1_file: add repository argument to read_info_alternatesNguyễn Thái Ngọc Duy, Mar 3, 2018
  42. 17/44 sha1_file: add repository argument to link_alt_odb_entriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  43. 18/44 sha1_file: add repository argument to prepare_alt_odbNguyễn Thái Ngọc Duy, Mar 3, 2018
  44. 19/44 sha1_file: allow link_alt_odb_entries to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  45. Brandon WilliamsMar 21, 2018
  46. 20/44 sha1_file: allow prepare_alt_odb to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  47. 21/44 sha1_file: add repository argument to sha1_file_nameNguyễn Thái Ngọc Duy, Mar 3, 2018
  48. 22/44 sha1_file: add repository argument to stat_sha1_fileNguyễn Thái Ngọc Duy, Mar 3, 2018
  49. 23/44 sha1_file: add repository argument to open_sha1_fileNguyễn Thái Ngọc Duy, Mar 3, 2018
  50. 24/44 sha1_file: add repository argument to map_sha1_file_1Nguyễn Thái Ngọc Duy, Mar 3, 2018
  51. 25/44 sha1_file: add repository argument to map_sha1_fileNguyễn Thái Ngọc Duy, Mar 3, 2018
  52. 26/44 sha1_file: add repository argument to sha1_loose_object_infoNguyễn Thái Ngọc Duy, Mar 3, 2018
  53. 27/44 sha1_file: allow sha1_file_name to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  54. 28/44 sha1_file: allow stat_sha1_file to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  55. 29/44 sha1_file: allow open_sha1_file to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  56. 30/44 sha1_file: allow map_sha1_file_1 to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  57. 31/44 sha1_file: allow map_sha1_file to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  58. 32/44 sha1_file: allow sha1_loose_object_info to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  59. Brandon WilliamsMar 21, 2018
  60. 35/44 packfile: allow install_packed_git to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  61. 34/44 packfile: allow rearrange_packed_git to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  62. 36/44 packfile: add repository argument to prepare_packed_git_oneNguyễn Thái Ngọc Duy, Mar 3, 2018
  63. 37/44 packfile: add repository argument to prepare_packed_gitNguyễn Thái Ngọc Duy, Mar 3, 2018
  64. Eric SunshineMar 4, 2018
  65. 38/44 packfile: add repository argument to reprepare_packed_gitNguyễn Thái Ngọc Duy, Mar 3, 2018
  66. 39/44 packfile: allow prepare_packed_git_one to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  67. Jonathan TanMar 19, 2018
  68. 33/44 packfile: allow prepare_packed_git_mru to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  69. 40/44 packfile: allow prepare_packed_git to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  70. Brandon WilliamsMar 21, 2018
  71. Junio C HamanoMar 22, 2018
  72. 41/44 packfile: allow reprepare_packed_git to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  73. 42/44 packfile: add repository argument to find_pack_entryNguyễn Thái Ngọc Duy, Mar 3, 2018
  74. 43/44 packfile: allow find_pack_entry to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 3, 2018
  75. 44/44 packfile: keep prepare_packed_git() privateNguyễn Thái Ngọc Duy, Mar 3, 2018
  76. Jonathan TanMar 19, 2018
  77. Brandon WilliamsMar 21, 2018
  78. Junio C HamanoMar 5, 2018
  79. Brandon WilliamsMar 21, 2018
  80. 0/1 nd/remove-ignore-env-field updatesNguyễn Thái Ngọc Duy, Mar 23, 2018
  81. 1/1 repository.h: add comment and clarify repo_set_gitdirNguyễn Thái Ngọc Duy, Mar 23, 2018
  82. Stefan BellerMar 26, 2018
  83. Stefan BellerMar 26, 2018
  84. 00/27 sb/object-store updatesNguyễn Thái Ngọc Duy, Mar 23, 2018
  85. 04/27 object-store: free alt_odb_listNguyễn Thái Ngọc Duy, Mar 23, 2018
  86. Brandon WilliamsMar 23, 2018
  87. 02/27 object-store: migrate alternates struct and functions from cache.hNguyễn Thái Ngọc Duy, Mar 23, 2018
  88. 03/27 object-store: move alt_odb_list and alt_odb_tail to object storeNguyễn Thái Ngọc Duy, Mar 23, 2018
  89. 10/27 sha1_file: add repository argument to link_alt_odb_entryNguyễn Thái Ngọc Duy, Mar 23, 2018
  90. 17/27 sha1_file: add repository argument to stat_sha1_fileNguyễn Thái Ngọc Duy, Mar 23, 2018
  91. 20/27 sha1_file: add repository argument to map_sha1_fileNguyễn Thái Ngọc Duy, Mar 23, 2018
  92. 22/27 sha1_file: allow sha1_file_name to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  93. 27/27 sha1_file: allow sha1_loose_object_info to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  94. 23/27 sha1_file: allow stat_sha1_file to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  95. 14/27 sha1_file: allow link_alt_odb_entries to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  96. 26/27 sha1_file: allow map_sha1_file to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  97. 16/27 sha1_file: add repository argument to sha1_file_nameNguyễn Thái Ngọc Duy, Mar 23, 2018
  98. 21/27 sha1_file: add repository argument to sha1_loose_object_infoNguyễn Thái Ngọc Duy, Mar 23, 2018
  99. 24/27 sha1_file: allow open_sha1_file to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  100. 25/27 sha1_file: allow map_sha1_file_1 to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  101. 15/27 sha1_file: allow prepare_alt_odb to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  102. 12/27 sha1_file: add repository argument to link_alt_odb_entriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  103. 08/27 pack: move approximate object count to object storeNguyễn Thái Ngọc Duy, Mar 23, 2018
  104. 09/27 sha1_file: add raw_object_store argument to alt_odb_usableNguyễn Thái Ngọc Duy, Mar 23, 2018
  105. 11/27 sha1_file: add repository argument to read_info_alternatesNguyễn Thái Ngọc Duy, Mar 23, 2018
  106. 13/27 sha1_file: add repository argument to prepare_alt_odbNguyễn Thái Ngọc Duy, Mar 23, 2018
  107. 18/27 sha1_file: add repository argument to open_sha1_fileNguyễn Thái Ngọc Duy, Mar 23, 2018
  108. 19/27 sha1_file: add repository argument to map_sha1_file_1Nguyễn Thái Ngọc Duy, Mar 23, 2018
  109. 05/27 object-store: move packed_git and packed_git_mru to object storeNguyễn Thái Ngọc Duy, Mar 23, 2018
  110. 06/27 object-store: close all packs upon clearing the object storeNguyễn Thái Ngọc Duy, Mar 23, 2018
  111. 07/27 pack: move prepare_packed_git_run_once to object storeNguyễn Thái Ngọc Duy, Mar 23, 2018
  112. 01/27 repository: introduce raw object store fieldNguyễn Thái Ngọc Duy, Mar 23, 2018
  113. Brandon WilliamsMar 23, 2018
  114. Brandon WilliamsMar 23, 2018
  115. Junio C HamanoMar 23, 2018
  116. Duy NguyenMar 23, 2018
  117. Eric SunshineMar 23, 2018
  118. Duy NguyenMar 24, 2018
  119. Stefan BellerMar 26, 2018
  120. Junio C HamanoMar 26, 2018
  121. Junio C HamanoMar 26, 2018
  122. 00/12 sb/packfiles-in-repository updatesNguyễn Thái Ngọc Duy, Mar 23, 2018
  123. 01/12 packfile: allow prepare_packed_git_mru to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  124. 02/12 packfile: allow rearrange_packed_git to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  125. 06/12 packfile: add repository argument to reprepare_packed_gitNguyễn Thái Ngọc Duy, Mar 23, 2018
  126. 08/12 packfile: allow prepare_packed_git to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  127. 03/12 packfile: allow install_packed_git to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  128. 09/12 packfile: allow reprepare_packed_git to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  129. 07/12 packfile: allow prepare_packed_git_one to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  130. 05/12 packfile: add repository argument to prepare_packed_gitNguyễn Thái Ngọc Duy, Mar 23, 2018
  131. 10/12 packfile: add repository argument to find_pack_entryNguyễn Thái Ngọc Duy, Mar 23, 2018
  132. 11/12 packfile: allow find_pack_entry to handle arbitrary repositoriesNguyễn Thái Ngọc Duy, Mar 23, 2018
  133. 12/12 packfile: keep prepare_packed_git() privateNguyễn Thái Ngọc Duy, Mar 23, 2018
  134. 04/12 packfile: add repository argument to prepare_packed_git_oneNguyễn Thái Ngọc Duy, Mar 23, 2018
  135. Brandon WilliamsMar 23, 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.