+
+int is_submodule_modified(const char *path)
+{
+ int len, i;
+ struct child_process cp;
+ const char *argv[] = {
+ "status",
+ "--porcelain",
+ NULL,
+ };
+ const char *env[LOCAL_REPO_ENV_SIZE + 3];
+ struct strbuf buf = STRBUF_INIT;
+
+ for (i = 0; i < LOCAL_REPO_ENV_SIZE; i++)
+ env[i] = local_repo_env[i];
+
+ strbuf_addf(&buf, "%s/.git/", path);
+ if (!is_directory(buf.buf)) {
+ strbuf_release(&buf);
+ /* The submodule is not checked out, so it is not modified */
+ return 0;
+
+ }
+ strbuf_reset(&buf);
+
+ strbuf_addf(&buf, "GIT_WORK_TREE=%s", path);
+ env[i++] = strbuf_detach(&buf, NULL);
+ strbuf_addf(&buf, "GIT_DIR=%s/.git", path);
+ env[i++] = strbuf_detach(&buf, NULL);
+ env[i] = NULL;
+
+ memset(&cp, 0, sizeof(cp));
+ cp.argv = argv;
+ cp.env = env;
+ cp.git_cmd = 1;
+ cp.no_stdin = 1;
+ cp.out = -1;
+ if (start_command(&cp))
+ die("Could not run git status --porcelain");
+
+ len = strbuf_read(&buf, cp.out, 1024);
+ close(cp.out);
+
+ if (finish_command(&cp))
+ die("git status --porcelain failed");
+
+ for (i = LOCAL_REPO_ENV_SIZE; env[i]; i++)
+ free((char *)env[i]);
+ strbuf_release(&buf);
+ return len != 0;
+}