pathspec: remove PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE flag
[gitweb.git] / submodule.c
index 5615d7392efaf18816ba2a6910a224df581be72e..80851d04471adfea10e8edbe75b4823d8810d7f7 100644 (file)
@@ -282,6 +282,69 @@ int is_submodule_populated_gently(const char *path, int *return_error_code)
        return ret;
 }
 
+/*
+ * Dies if the provided 'prefix' corresponds to an unpopulated submodule
+ */
+void die_in_unpopulated_submodule(const struct index_state *istate,
+                                 const char *prefix)
+{
+       int i, prefixlen;
+
+       if (!prefix)
+               return;
+
+       prefixlen = strlen(prefix);
+
+       for (i = 0; i < istate->cache_nr; i++) {
+               struct cache_entry *ce = istate->cache[i];
+               int ce_len = ce_namelen(ce);
+
+               if (!S_ISGITLINK(ce->ce_mode))
+                       continue;
+               if (prefixlen <= ce_len)
+                       continue;
+               if (strncmp(ce->name, prefix, ce_len))
+                       continue;
+               if (prefix[ce_len] != '/')
+                       continue;
+
+               die(_("in unpopulated submodule '%s'"), ce->name);
+       }
+}
+
+/*
+ * Dies if any paths in the provided pathspec descends into a submodule
+ */
+void die_path_inside_submodule(const struct index_state *istate,
+                              const struct pathspec *ps)
+{
+       int i, j;
+
+       for (i = 0; i < istate->cache_nr; i++) {
+               struct cache_entry *ce = istate->cache[i];
+               int ce_len = ce_namelen(ce);
+
+               if (!S_ISGITLINK(ce->ce_mode))
+                       continue;
+
+               for (j = 0; j < ps->nr ; j++) {
+                       const struct pathspec_item *item = &ps->items[j];
+
+                       if (item->len <= ce_len)
+                               continue;
+                       if (item->match[ce_len] != '/')
+                               continue;
+                       if (strncmp(ce->name, item->match, ce_len))
+                               continue;
+                       if (item->len == ce_len + 1)
+                               continue;
+
+                       die(_("Pathspec '%s' is in submodule '%.*s'"),
+                           item->original, ce_len, ce->name);
+               }
+       }
+}
+
 int parse_submodule_update_strategy(const char *value,
                struct submodule_update_strategy *dst)
 {
@@ -1474,8 +1537,7 @@ int submodule_move_head(const char *path,
                        cp1.no_stdin = 1;
                        cp1.dir = path;
 
-                       argv_array_pushl(&cp1.args, "update-ref", "HEAD",
-                                        new ? new : EMPTY_TREE_SHA1_HEX, NULL);
+                       argv_array_pushl(&cp1.args, "update-ref", "HEAD", new, NULL);
 
                        if (run_command(&cp1)) {
                                ret = -1;