]> git.ipfire.org Git - thirdparty/git.git/blobdiff - worktree.c
worktree: check if a submodule uses worktrees
[thirdparty/git.git] / worktree.c
index eb6121263b0d56b6b7ea7c5024e9ceb68256c1c5..d4606aa8cd5ab476599a2f91f9d96ae03389fbab 100644 (file)
@@ -380,3 +380,53 @@ const struct worktree *find_shared_symref(const char *symref,
 
        return existing;
 }
+
+int submodule_uses_worktrees(const char *path)
+{
+       char *submodule_gitdir;
+       struct strbuf sb = STRBUF_INIT;
+       DIR *dir;
+       struct dirent *d;
+       int ret;
+       struct repository_format format;
+
+       submodule_gitdir = git_pathdup_submodule(path, "%s", "");
+       if (!submodule_gitdir)
+               return 0;
+
+       /* The env would be set for the superproject. */
+       get_common_dir_noenv(&sb, submodule_gitdir);
+
+       /*
+        * The check below is only known to be good for repository format
+        * version 0 at the time of writing this code.
+        */
+       strbuf_addstr(&sb, "/config");
+       read_repository_format(&format, sb.buf);
+       if (format.version != 0) {
+               strbuf_release(&sb);
+               return 1;
+       }
+
+       /* Replace config by worktrees. */
+       strbuf_setlen(&sb, sb.len - strlen("config"));
+       strbuf_addstr(&sb, "worktrees");
+
+       /* See if there is any file inside the worktrees directory. */
+       dir = opendir(sb.buf);
+       strbuf_release(&sb);
+       free(submodule_gitdir);
+
+       if (!dir)
+               return 0;
+
+       while ((d = readdir(dir)) != NULL) {
+               if (is_dot_or_dotdot(d->d_name))
+                       continue;
+
+               ret = 1;
+               break;
+       }
+       closedir(dir);
+       return ret;
+}