summaryrefslogtreecommitdiff
path: root/submodule.c
diff options
context:
space:
mode:
authorAntonio Ospite <ao2@ao2.it>2018-10-05 13:05:59 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-10-09 03:40:21 (GMT)
commitb5c259f226ba06f64b399ff4c6b843542352395f (patch)
treeb7cd20784b013f6bc2f788b399a047c087aae5bf /submodule.c
parent23dd8f5bb104d01b90e2f7a3f2e1acf0a205083e (diff)
downloadgit-b5c259f226ba06f64b399ff4c6b843542352395f.zip
git-b5c259f226ba06f64b399ff4c6b843542352395f.tar.gz
git-b5c259f226ba06f64b399ff4c6b843542352395f.tar.bz2
submodule: add a helper to check if it is safe to write to .gitmodules
Introduce a helper function named is_writing_gitmodules_ok() to verify that the .gitmodules file is safe to write. The function name follows the scheme of is_staging_gitmodules_ok(). The two symbolic constants GITMODULES_INDEX and GITMODULES_HEAD are used to get help from the C preprocessor in preventing typos, especially for future users. This is in preparation for a future change which teaches git how to read .gitmodules from the index or from the current branch if the file is not available in the working tree. The rationale behind the check is that writing to .gitmodules requires the file to be present in the working tree, unless a brand new .gitmodules is being created (in which case the .gitmodules file would not exist at all: neither in the working tree nor in the index or in the current branch). Expose the functionality also via a "submodule-helper config --check-writeable" command, as git scripts may want to perform the check before modifying submodules configuration. Signed-off-by: Antonio Ospite <ao2@ao2.it> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'submodule.c')
-rw-r--r--submodule.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/submodule.c b/submodule.c
index 2e97032..2b7082b 100644
--- a/submodule.c
+++ b/submodule.c
@@ -51,6 +51,24 @@ int is_gitmodules_unmerged(const struct index_state *istate)
}
/*
+ * Check if the .gitmodules file is safe to write.
+ *
+ * Writing to the .gitmodules file requires that the file exists in the
+ * working tree or, if it doesn't, that a brand new .gitmodules file is going
+ * to be created (i.e. it's neither in the index nor in the current branch).
+ *
+ * It is not safe to write to .gitmodules if it's not in the working tree but
+ * it is in the index or in the current branch, because writing new values
+ * (and staging them) would blindly overwrite ALL the old content.
+ */
+int is_writing_gitmodules_ok(void)
+{
+ struct object_id oid;
+ return file_exists(GITMODULES_FILE) ||
+ (get_oid(GITMODULES_INDEX, &oid) < 0 && get_oid(GITMODULES_HEAD, &oid) < 0);
+}
+
+/*
* Check if the .gitmodules file has unstaged modifications. This must be
* checked before allowing modifications to the .gitmodules file with the
* intention to stage them later, because when continuing we would stage the