aboutsummaryrefslogtreecommitdiff
path: root/tmp-objdir.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2026-03-10 10:13:40 -0700
committerJunio C Hamano <gitster@pobox.com>2026-03-10 10:13:40 -0700
commit6cdef943d28fa7d6964ec570b33a0bff4c80ea8c (patch)
treea0e3158cc93a48d1b2c7c77747536f0bd39a0165 /tmp-objdir.c
parentd181b9354cf85b44455ce3ca9e6af0b9559e0ae2 (diff)
parentd6fc6fe6f8b74e663d6013f830b535f50bfc1414 (diff)
downloadgit-6cdef943d28fa7d6964ec570b33a0bff4c80ea8c.tar.xz
Merge branch 'ps/odb-sources' into ps/object-counting
* ps/odb-sources: odb/source: make `begin_transaction()` function pluggable odb/source: make `write_alternate()` function pluggable odb/source: make `read_alternates()` function pluggable odb/source: make `write_object_stream()` function pluggable odb/source: make `write_object()` function pluggable odb/source: make `freshen_object()` function pluggable odb/source: make `for_each_object()` function pluggable odb/source: make `read_object_stream()` function pluggable odb/source: make `read_object_info()` function pluggable odb/source: make `close()` function pluggable odb/source: make `reprepare()` function pluggable odb/source: make `free()` function pluggable odb/source: introduce source type for robustness odb: move reparenting logic into respective subsystems odb: embed base source in the "files" backend odb: introduce "files" source odb: split `struct odb_source` into separate header
Diffstat (limited to 'tmp-objdir.c')
-rw-r--r--tmp-objdir.c42
1 files changed, 19 insertions, 23 deletions
diff --git a/tmp-objdir.c b/tmp-objdir.c
index 9f5a1788cd..e436eed07e 100644
--- a/tmp-objdir.c
+++ b/tmp-objdir.c
@@ -36,6 +36,21 @@ static void tmp_objdir_free(struct tmp_objdir *t)
free(t);
}
+static void tmp_objdir_reparent(const char *name UNUSED,
+ const char *old_cwd,
+ const char *new_cwd,
+ void *cb_data)
+{
+ struct tmp_objdir *t = cb_data;
+ char *path;
+
+ path = reparent_relative_path(old_cwd, new_cwd,
+ t->path.buf);
+ strbuf_reset(&t->path);
+ strbuf_addstr(&t->path, path);
+ free(path);
+}
+
int tmp_objdir_destroy(struct tmp_objdir *t)
{
int err;
@@ -51,6 +66,7 @@ int tmp_objdir_destroy(struct tmp_objdir *t)
err = remove_dir_recursively(&t->path, 0);
+ chdir_notify_unregister(NULL, tmp_objdir_reparent, t);
tmp_objdir_free(t);
return err;
@@ -137,6 +153,9 @@ struct tmp_objdir *tmp_objdir_create(struct repository *r,
strbuf_addf(&t->path, "%s/tmp_objdir-%s-XXXXXX",
repo_get_object_directory(r), prefix);
+ if (!is_absolute_path(t->path.buf))
+ chdir_notify_register(NULL, tmp_objdir_reparent, t);
+
if (!mkdtemp(t->path.buf)) {
/* free, not destroy, as we never touched the filesystem */
tmp_objdir_free(t);
@@ -315,26 +334,3 @@ void tmp_objdir_replace_primary_odb(struct tmp_objdir *t, int will_destroy)
t->path.buf, will_destroy);
t->will_destroy = will_destroy;
}
-
-struct tmp_objdir *tmp_objdir_unapply_primary_odb(void)
-{
- if (!the_tmp_objdir || !the_tmp_objdir->prev_source)
- return NULL;
-
- odb_restore_primary_source(the_tmp_objdir->repo->objects,
- the_tmp_objdir->prev_source, the_tmp_objdir->path.buf);
- the_tmp_objdir->prev_source = NULL;
- return the_tmp_objdir;
-}
-
-void tmp_objdir_reapply_primary_odb(struct tmp_objdir *t, const char *old_cwd,
- const char *new_cwd)
-{
- char *path;
-
- path = reparent_relative_path(old_cwd, new_cwd, t->path.buf);
- strbuf_reset(&t->path);
- strbuf_addstr(&t->path, path);
- free(path);
- tmp_objdir_replace_primary_odb(t, t->will_destroy);
-}