diff options
Diffstat (limited to 'odb/source-files.c')
| -rw-r--r-- | odb/source-files.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/odb/source-files.c b/odb/source-files.c index a43a197157..df0ea9ee62 100644 --- a/odb/source-files.c +++ b/odb/source-files.c @@ -1,13 +1,28 @@ #include "git-compat-util.h" +#include "abspath.h" +#include "chdir-notify.h" #include "object-file.h" #include "odb/source.h" #include "odb/source-files.h" #include "packfile.h" +static void odb_source_files_reparent(const char *name UNUSED, + const char *old_cwd, + const char *new_cwd, + void *cb_data) +{ + struct odb_source_files *files = cb_data; + char *path = reparent_relative_path(old_cwd, new_cwd, + files->base.path); + free(files->base.path); + files->base.path = path; +} + void odb_source_files_free(struct odb_source_files *files) { if (!files) return; + chdir_notify_unregister(NULL, odb_source_files_reparent, files); odb_source_loose_free(files->loose); packfile_store_free(files->packed); odb_source_release(&files->base); @@ -25,5 +40,13 @@ struct odb_source_files *odb_source_files_new(struct object_database *odb, files->loose = odb_source_loose_new(&files->base); files->packed = packfile_store_new(&files->base); + /* + * Ideally, we would only ever store absolute paths in the source. This + * is not (yet) possible though because we access and assume relative + * paths in the primary ODB source in some user-facing functionality. + */ + if (!is_absolute_path(path)) + chdir_notify_register(NULL, odb_source_files_reparent, files); + return files; } |
