Re: [PATCHv8 6/6] submodule: add absorb-git-dir function
From: Duy Nguyen <hidden>
Date: 2016-12-19 05:36:13
On Mon, Dec 12, 2016 at 11:04:35AM -0800, Stefan Beller wrote:
quoted hunk ↗ jump to hunk
diff --git a/dir.c b/dir.c index e0efd3c2c3..d872cc1570 100644 --- a/dir.c +++ b/dir.c@@ -2773,3 +2773,15 @@ void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_) free(work_tree); free(git_dir); } + +/* + * Migrate the git directory of the given path from old_git_dir to new_git_dir. + */ +void relocate_gitdir(const char *path, const char *old_git_dir, const char *new_git_dir) +{ + if (rename(old_git_dir, new_git_dir) < 0) + die_errno(_("could not migrate git directory from '%s' to '%s'"), + old_git_dir, new_git_dir); + + connect_work_tree_and_git_dir(path, new_git_dir);
Should we worry about recovering (e.g. maybe move new_git_dir back to old_git_dir) if this connect_work_tree_and_git_dir() fails? Both write_file() and git_config_set_.. in this function may die(). In such a case the repo is in broken state and the user needs pretty good submodule understanding to recover from it, I think. Recovering is not easy (nor entirely safe) either, though I suppose if we keep original copies for modified files, then we could restore them after moving the directory back and pray the UNIX gods that all operations succeed. -- Duy