From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: Jeff King <peff@peff.net>, Rafael Ascensao <rafa.almas@gmail.com>,
Duy Nguyen <pclouds@gmail.com>
Subject: [PATCH 5/8] setup.c: allow other code to be notified when $CWD moves
Date: Wed, 28 Mar 2018 19:55:34 +0200 [thread overview]
Message-ID: <20180328175537.17450-6-pclouds@gmail.com> (raw)
In-Reply-To: <20180328175537.17450-1-pclouds@gmail.com>
From: Duy Nguyen <pclouds@gmail.com>
When the current directory is moved, all relative paths may become
invalid because they are still relative to the old current
directory. At this point in setup_work_tree() many objects have been
initialized and some keep relative paths in their data structure.
$GIT_DIR and $GIT_WORK_TREE for example are the two examples which are
dealt with explicitly in this code: $GIT_WORK_TREE is reset to "." and
set_git_dir() is called the second time with a new relative path.
Introduce a more generic mechanism to let all code get notified and do
the path adjustment themselves instead of pulling all path adjustment
logic in here. The $GIT_DIR and $GIT_WORK_TREE adjustments will
removed from this code in later patches.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
cache.h | 5 +++++
setup.c | 27 ++++++++++++++++++++++++++-
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/cache.h b/cache.h
index 05f32c9659..895abe7e7e 100644
--- a/cache.h
+++ b/cache.h
@@ -522,6 +522,11 @@ extern void set_git_work_tree(const char *tree);
#define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
+typedef void (*cwd_updated_fn)(const char *old_cwd,
+ const char *new_cwd,
+ void *cb_data);
+void add_cwd_update_callback(cwd_updated_fn fn, void *cb_data);
+void removet_cwd_update_callback(cwd_updated_fn fn, void *cb_data);
extern void setup_adjust_path(const char *name, char **path,
const char *old_cwd,
const char *new_cwd);
diff --git a/setup.c b/setup.c
index e26f44185e..e340ee2130 100644
--- a/setup.c
+++ b/setup.c
@@ -376,6 +376,24 @@ int is_inside_work_tree(void)
return inside_work_tree;
}
+struct cwd_update_callback {
+ cwd_updated_fn fn;
+ void *cb_data;
+};
+
+static struct cwd_update_callback *cwd_callbacks;
+static int nr_cwd_callbacks;
+
+void add_cwd_update_callback(cwd_updated_fn fn, void *cb_data)
+{
+ struct cwd_update_callback *cb;
+
+ REALLOC_ARRAY(cwd_callbacks, nr_cwd_callbacks + 1);
+ cb = cwd_callbacks + nr_cwd_callbacks++;
+ cb->fn = fn;
+ cb->cb_data = cb_data;
+}
+
void setup_adjust_path(const char *name, char **path,
const char *old_cwd,
const char *new_cwd)
@@ -398,8 +416,10 @@ void setup_adjust_path(const char *name, char **path,
void setup_work_tree(void)
{
- const char *work_tree, *git_dir;
static int initialized = 0;
+ const char *work_tree, *git_dir;
+ struct strbuf old_cwd = STRBUF_INIT;
+ int i;
if (initialized)
return;
@@ -411,6 +431,7 @@ void setup_work_tree(void)
git_dir = get_git_dir();
if (!is_absolute_path(git_dir))
git_dir = real_path(get_git_dir());
+ strbuf_get_pwd_cwd(&old_cwd);
if (!work_tree || chdir(work_tree))
die(_("this operation must be run in a work tree"));
@@ -421,6 +442,10 @@ void setup_work_tree(void)
if (getenv(GIT_WORK_TREE_ENVIRONMENT))
setenv(GIT_WORK_TREE_ENVIRONMENT, ".", 1);
+ for (i = 0; i < nr_cwd_callbacks; i++)
+ cwd_callbacks[i].fn(old_cwd.buf, work_tree,
+ cwd_callbacks[i].cb_data);
+ strbuf_release(&old_cwd);
set_git_dir(remove_leading_path(git_dir, work_tree));
initialized = 1;
}
--
2.17.0.rc1.439.gca064e2955
next prev parent reply other threads:[~2018-03-28 17:56 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-26 21:27 git complains packed-refs is not a directory when used with GIT_DIR and GIT_WORK_TREE envvars Rafael Ascensao
2018-03-26 21:44 ` Ævar Arnfjörð Bjarmason
2018-03-27 6:31 ` Jeff King
2018-03-27 14:56 ` Duy Nguyen
2018-03-27 16:47 ` Jeff King
2018-03-27 17:09 ` Duy Nguyen
2018-03-27 17:30 ` Duy Nguyen
2018-03-28 9:52 ` Jeff King
2018-03-28 10:10 ` Duy Nguyen
2018-03-28 17:36 ` Jeff King
2018-03-28 17:38 ` [PATCH 1/4] set_git_dir: die when setenv() fails Jeff King
2018-03-28 17:40 ` [PATCH 2/4] add chdir-notify API Jeff King
2018-03-28 17:58 ` Eric Sunshine
2018-03-28 18:02 ` Jeff King
2018-03-29 14:53 ` Duy Nguyen
2018-03-29 17:48 ` Jeff King
2018-03-29 18:12 ` Duy Nguyen
2018-03-28 17:42 ` [PATCH 3/4] set_work_tree: use chdir_notify Jeff King
2018-03-29 17:02 ` Duy Nguyen
2018-03-29 17:23 ` Duy Nguyen
2018-03-29 17:50 ` Jeff King
2018-03-29 17:50 ` Jeff King
2018-03-29 18:01 ` Duy Nguyen
2018-03-30 17:23 ` Jeff King
2018-03-28 17:43 ` [PATCH 4/4] refs: use chdir_notify to update cached relative paths Jeff King
2018-03-30 18:34 ` [PATCH v2 0/5] re-parenting relative directories after chdir Jeff King
2018-03-30 18:34 ` [PATCH v2 1/5] set_git_dir: die when setenv() fails Jeff King
2018-03-30 18:34 ` [PATCH v2 2/5] trace.c: export trace_setup_key Jeff King
2018-03-30 19:46 ` Junio C Hamano
2018-03-30 19:47 ` Jeff King
2018-03-30 19:50 ` Junio C Hamano
2018-03-30 19:54 ` Jeff King
2018-03-30 18:35 ` [PATCH v2 3/5] add chdir-notify API Jeff King
2018-03-30 18:35 ` [PATCH v2 4/5] set_work_tree: use chdir_notify Jeff King
2018-03-30 18:35 ` [PATCH v2 5/5] refs: use chdir_notify to update cached relative paths Jeff King
2018-03-30 19:36 ` [PATCH v2 0/5] re-parenting relative directories after chdir Duy Nguyen
2018-03-28 9:47 ` git complains packed-refs is not a directory when used with GIT_DIR and GIT_WORK_TREE envvars Jeff King
2018-03-28 17:55 ` [PATCH 0/8] " Nguyễn Thái Ngọc Duy
2018-03-28 17:55 ` [PATCH 1/8] strbuf.c: add strbuf_ensure_trailing_dr_sep() Nguyễn Thái Ngọc Duy
2018-03-28 17:55 ` [PATCH 2/8] strbuf.c: reintroduce get_pwd_cwd() (with strbuf_ prefix) Nguyễn Thái Ngọc Duy
2018-03-28 18:02 ` Stefan Beller
2018-03-28 18:05 ` Duy Nguyen
2018-03-28 17:55 ` [PATCH 3/8] trace.c: export trace_setup_key Nguyễn Thái Ngọc Duy
2018-03-28 17:55 ` [PATCH 4/8] setup.c: introduce setup_adjust_path() Nguyễn Thái Ngọc Duy
2018-03-28 17:55 ` Nguyễn Thái Ngọc Duy [this message]
2018-03-28 17:55 ` [PATCH 6/8] environment.c: adjust env containing relpath when $CWD is moved Nguyễn Thái Ngọc Duy
2018-03-28 18:30 ` Jeff King
2018-03-28 18:45 ` Duy Nguyen
2018-03-28 17:55 ` [PATCH 7/8] repository: adjust repo paths when $CWD moves Nguyễn Thái Ngọc Duy
2018-03-28 17:55 ` [PATCH 8/8] refs: adjust main " Nguyễn Thái Ngọc Duy
2018-03-28 18:19 ` [PATCH 0/8] Re: git complains packed-refs is not a directory when used with GIT_DIR and GIT_WORK_TREE envvars Jeff King
2018-03-29 14:57 ` Duy Nguyen
2018-03-30 17:21 ` Jeff King
2018-03-28 22:24 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180328175537.17450-6-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
--cc=rafa.almas@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).