aboutsummaryrefslogtreecommitdiffstats
path: root/odb.c
diff options
context:
space:
mode:
Diffstat (limited to 'odb.c')
-rw-r--r--odb.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/odb.c b/odb.c
index 88b40c81c0..70665fb7f4 100644
--- a/odb.c
+++ b/odb.c
@@ -1,5 +1,6 @@
#include "git-compat-util.h"
#include "abspath.h"
+#include "chdir-notify.h"
#include "commit-graph.h"
#include "config.h"
#include "dir.h"
@@ -142,9 +143,9 @@ static void read_info_alternates(struct object_database *odb,
const char *relative_base,
int depth);
-struct odb_source *odb_source_new(struct object_database *odb,
- const char *path,
- bool local)
+static struct odb_source *odb_source_new(struct object_database *odb,
+ const char *path,
+ bool local)
{
struct odb_source *source;
@@ -1034,6 +1035,32 @@ int odb_write_object_stream(struct object_database *odb,
return odb_source_loose_write_stream(odb->sources, stream, len, oid);
}
+static void odb_update_commondir(const char *name UNUSED,
+ const char *old_cwd,
+ const char *new_cwd,
+ void *cb_data)
+{
+ struct object_database *odb = cb_data;
+ struct odb_source *source;
+
+ /*
+ * In theory, we only have to do this for the primary object source, as
+ * alternates' paths are always resolved to an absolute path.
+ */
+ for (source = odb->sources; source; source = source->next) {
+ char *path;
+
+ if (is_absolute_path(source->path))
+ continue;
+
+ path = reparent_relative_path(old_cwd, new_cwd,
+ source->path);
+
+ free(source->path);
+ source->path = path;
+ }
+}
+
struct object_database *odb_new(struct repository *repo,
const char *primary_source,
const char *secondary_sources)
@@ -1055,6 +1082,8 @@ struct object_database *odb_new(struct repository *repo,
free(to_free);
+ chdir_notify_register(NULL, odb_update_commondir, o);
+
return o;
}
@@ -1106,6 +1135,8 @@ void odb_free(struct object_database *o)
packfile_store_free(o->packfiles);
string_list_clear(&o->submodule_source_paths, 0);
+ chdir_notify_unregister(NULL, odb_update_commondir, o);
+
free(o);
}