git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Brandon Williams <bmwill@google.com>
To: git@vger.kernel.org
Cc: sbeller@google.com, jrnieder@gmail.com, gitster@pobox.com,
	Brandon Williams <bmwill@google.com>
Subject: [PATCH v4 07/10] submodule: check for unstaged .gitmodules outside of config parsing
Date: Wed,  2 Aug 2017 12:49:20 -0700	[thread overview]
Message-ID: <20170802194923.88239-8-bmwill@google.com> (raw)
In-Reply-To: <20170802194923.88239-1-bmwill@google.com>

Teach 'is_staging_gitmodules_ok()' to be able to determine in the
'.gitmodules' file has unstaged changes based on the passed in index
instead of relying on a global variable which is set during the
submodule-config parsing.

Signed-off-by: Brandon Williams <bmwill@google.com>
---
 builtin/mv.c |  2 +-
 builtin/rm.c |  2 +-
 submodule.c  | 32 +++++++++++++++++---------------
 submodule.h  |  2 +-
 4 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/builtin/mv.c b/builtin/mv.c
index dcf6736b5..94fbaaa5d 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -81,7 +81,7 @@ static void prepare_move_submodule(const char *src, int first,
 	struct strbuf submodule_dotgit = STRBUF_INIT;
 	if (!S_ISGITLINK(active_cache[first]->ce_mode))
 		die(_("Directory %s is in index and no submodule?"), src);
-	if (!is_staging_gitmodules_ok())
+	if (!is_staging_gitmodules_ok(&the_index))
 		die(_("Please stage your changes to .gitmodules or stash them to proceed"));
 	strbuf_addf(&submodule_dotgit, "%s/.git", src);
 	*submodule_gitfile = read_gitfile(submodule_dotgit.buf);
diff --git a/builtin/rm.c b/builtin/rm.c
index 52826d137..4057e73fa 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -286,7 +286,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
 		list.entry[list.nr].name = xstrdup(ce->name);
 		list.entry[list.nr].is_submodule = S_ISGITLINK(ce->ce_mode);
 		if (list.entry[list.nr++].is_submodule &&
-		    !is_staging_gitmodules_ok())
+		    !is_staging_gitmodules_ok(&the_index))
 			die (_("Please stage your changes to .gitmodules or stash them to proceed"));
 	}
 
diff --git a/submodule.c b/submodule.c
index 1d9d2ce09..677b5c401 100644
--- a/submodule.c
+++ b/submodule.c
@@ -37,18 +37,25 @@ static struct oid_array ref_tips_after_fetch;
 static int gitmodules_is_unmerged;
 
 /*
- * This flag is set if the .gitmodules file had unstaged modifications on
- * startup. 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 modifications the user didn't stage herself
- * too. That might change in a future version when we learn to stage the
- * changes we do ourselves without staging any previous modifications.
+ * 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
+ * modifications the user didn't stage herself too. That might change in a
+ * future version when we learn to stage the changes we do ourselves without
+ * staging any previous modifications.
  */
-static int gitmodules_is_modified;
-
-int is_staging_gitmodules_ok(void)
+int is_staging_gitmodules_ok(const struct index_state *istate)
 {
-	return !gitmodules_is_modified;
+	int pos = index_name_pos(istate, GITMODULES_FILE, strlen(GITMODULES_FILE));
+
+	if ((pos >= 0) && (pos < istate->cache_nr)) {
+		struct stat st;
+		if (lstat(GITMODULES_FILE, &st) == 0 &&
+		    ce_match_stat(istate->cache[pos], &st, 0) & DATA_CHANGED)
+			return 0;
+	}
+
+	return 1;
 }
 
 /*
@@ -231,11 +238,6 @@ void gitmodules_config(void)
 				    !memcmp(ce->name, GITMODULES_FILE, 11))
 					gitmodules_is_unmerged = 1;
 			}
-		} else if (pos < active_nr) {
-			struct stat st;
-			if (lstat(GITMODULES_FILE, &st) == 0 &&
-			    ce_match_stat(active_cache[pos], &st, 0) & DATA_CHANGED)
-				gitmodules_is_modified = 1;
 		}
 
 		if (!gitmodules_is_unmerged)
diff --git a/submodule.h b/submodule.h
index 29a1ecd19..b14660585 100644
--- a/submodule.h
+++ b/submodule.h
@@ -33,7 +33,7 @@ struct submodule_update_strategy {
 };
 #define SUBMODULE_UPDATE_STRATEGY_INIT {SM_UPDATE_UNSPECIFIED, NULL}
 
-extern int is_staging_gitmodules_ok(void);
+extern int is_staging_gitmodules_ok(const struct index_state *istate);
 extern int update_path_in_gitmodules(const char *oldpath, const char *newpath);
 extern int remove_path_from_gitmodules(const char *path);
 extern void stage_updated_gitmodules(void);
-- 
2.14.0.rc1.383.gd1ce394fe2-goog


  parent reply	other threads:[~2017-08-02 19:49 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-11 22:04 [PATCH 0/3] Convert grep to recurse in-process Brandon Williams
2017-07-11 22:04 ` [PATCH 1/3] repo_read_index: don't discard the index Brandon Williams
2017-07-11 23:51   ` Jonathan Nieder
2017-07-12 17:27     ` Brandon Williams
2017-07-11 23:58   ` Stefan Beller
2017-07-12 17:23     ` Brandon Williams
2017-07-11 22:04 ` [PATCH 2/3] setup: have the_repository use the_index Brandon Williams
2017-07-12  0:00   ` Jonathan Nieder
2017-07-12  0:07     ` Stefan Beller
2017-07-12 17:30     ` Brandon Williams
2017-07-12  0:11   ` Junio C Hamano
2017-07-12 18:01     ` Brandon Williams
2017-07-12 20:38       ` Junio C Hamano
2017-07-12 21:33         ` Jonathan Nieder
2017-07-12 21:40           ` Junio C Hamano
2017-07-18 21:34             ` Junio C Hamano
2017-07-11 22:04 ` [PATCH 3/3] grep: recurse in-process using 'struct repository' Brandon Williams
2017-07-11 22:44   ` Jacob Keller
2017-07-12 18:54     ` Brandon Williams
2017-07-12  0:04   ` Stefan Beller
2017-07-12 18:56     ` Brandon Williams
2017-07-12  0:25   ` Jonathan Nieder
2017-07-12 18:49     ` Brandon Williams
2017-07-12  7:42 ` [PATCH 0/3] Convert grep to recurse in-process Jeff King
2017-07-12 18:06   ` Brandon Williams
2017-07-12 18:17     ` Jeff King
2017-07-12 18:24       ` Jonathan Nieder
2017-07-12 18:33         ` Jeff King
2017-07-12 18:09   ` Jonathan Nieder
2017-07-12 18:17     ` Stefan Beller
2017-07-12 18:27     ` Jeff King
2017-07-14 22:28 ` [PATCH v2 " Brandon Williams
2017-07-14 22:28   ` [PATCH v2 1/3] repo_read_index: don't discard the index Brandon Williams
2017-07-14 22:28   ` [PATCH v2 2/3] repository: have the_repository use the_index Brandon Williams
2017-07-14 22:28   ` [PATCH v2 3/3] grep: recurse in-process using 'struct repository' Brandon Williams
2017-07-18 19:05   ` [PATCH v3 00/10] Convert grep to recurse in-process Brandon Williams
2017-07-18 19:05     ` [PATCH v3 01/10] repo_read_index: don't discard the index Brandon Williams
2017-07-18 19:05     ` [PATCH v3 02/10] repository: have the_repository use the_index Brandon Williams
2017-07-18 19:05     ` [PATCH v3 03/10] cache.h: add GITMODULES_FILE macro Brandon Williams
2017-07-31 23:11       ` [PATCH] convert any hard coded .gitmodules file string to the MACRO Stefan Beller
2017-08-01 13:14         ` Jeff Hostetler
2017-08-01 17:35           ` Stefan Beller
2017-08-01 20:26             ` Junio C Hamano
2017-08-02 17:26               ` Brandon Williams
2017-08-02 17:46               ` Brandon Williams
2017-07-18 19:05     ` [PATCH v3 04/10] config: add config_from_gitmodules Brandon Williams
2017-07-18 19:05     ` [PATCH v3 05/10] submodule: remove submodule.fetchjobs from submodule-config parsing Brandon Williams
2017-07-18 19:05     ` [PATCH v3 06/10] submodule: remove fetch.recursesubmodules " Brandon Williams
2017-07-18 19:05     ` [PATCH v3 07/10] submodule: check for unstaged .gitmodules outside of config parsing Brandon Williams
2017-07-31 23:41       ` Stefan Beller
2017-08-02 17:41         ` Brandon Williams
2017-08-02 18:00           ` Brandon Williams
2017-07-18 19:05     ` [PATCH v3 08/10] submodule: check for unmerged " Brandon Williams
2017-07-18 19:05     ` [PATCH v3 09/10] submodule: merge repo_read_gitmodules and gitmodules_config Brandon Williams
2017-07-18 19:05     ` [PATCH v3 10/10] grep: recurse in-process using 'struct repository' Brandon Williams
2017-07-18 19:36     ` [PATCH v3 00/10] Convert grep to recurse in-process Junio C Hamano
2017-07-18 20:06       ` Brandon Williams
2017-08-02 19:49     ` [PATCH v4 " Brandon Williams
2017-08-02 19:49       ` [PATCH v4 01/10] repo_read_index: don't discard the index Brandon Williams
2017-08-02 19:49       ` [PATCH v4 02/10] repository: have the_repository use the_index Brandon Williams
2017-08-02 19:49       ` [PATCH v4 03/10] cache.h: add GITMODULES_FILE macro Brandon Williams
2017-08-02 19:49       ` [PATCH v4 04/10] config: add config_from_gitmodules Brandon Williams
2017-08-02 19:49       ` [PATCH v4 05/10] submodule: remove submodule.fetchjobs from submodule-config parsing Brandon Williams
2017-08-02 19:49       ` [PATCH v4 06/10] submodule: remove fetch.recursesubmodules " Brandon Williams
2017-08-02 19:49       ` Brandon Williams [this message]
2017-08-02 19:49       ` [PATCH v4 08/10] submodule: check for unmerged .gitmodules outside of config parsing Brandon Williams
2017-08-02 19:49       ` [PATCH v4 09/10] submodule: merge repo_read_gitmodules and gitmodules_config Brandon Williams
2017-08-02 19:49       ` [PATCH v4 10/10] grep: recurse in-process using 'struct repository' Brandon Williams

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=20170802194923.88239-8-bmwill@google.com \
    --to=bmwill@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=sbeller@google.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).