]> git.proxmox.com Git - libgit2.git/blobdiff - src/submodule.h
treebuilder: fix memory leaks in `write_with_buffer`
[libgit2.git] / src / submodule.h
index c7a6aaf763bb0ca5523da4d9b689c5b0d20d1a65..456a93979de7b8af7d4aa57722433522eef6cd98 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 the libgit2 contributors
+ * Copyright (C) the libgit2 contributors. All rights reserved.
  *
  * This file is part of libgit2, distributed under the GNU GPL v2 with
  * a Linking Exception. For full terms see the included COPYING file.
@@ -7,6 +7,10 @@
 #ifndef INCLUDE_submodule_h__
 #define INCLUDE_submodule_h__
 
+#include "git2/submodule.h"
+#include "git2/repository.h"
+#include "fileops.h"
+
 /* Notes:
  *
  * Submodule information can be in four places: the index, the config files
  * an entry for every submodule found in the HEAD and index, and for every
  * submodule described in .gitmodules.  The fields are as follows:
  *
- * - `owner` is the git_repository containing this submodule
+ * - `rc` tracks the refcount of how many hash table entries in the
+ *   git_submodule_cache there are for this submodule.  It only comes into
+ *   play if the name and path of the submodule differ.
+ *
  * - `name` is the name of the submodule from .gitmodules.
  * - `path` is the path to the submodule from the repo root.  It is almost
  *    always the same as `name`.
  * - `url` is the url for the submodule.
- * - `tree_oid` is the SHA1 for the submodule path in the repo HEAD.
- * - `index_oid` is the SHA1 for the submodule recorded in the index.
- * - `workdir_oid` is the SHA1 for the HEAD of the checked out submodule.
  * - `update` is a git_submodule_update_t value - see gitmodules(5) update.
+ * - `update_default` is the update value from the config
  * - `ignore` is a git_submodule_ignore_t value - see gitmodules(5) ignore.
- * - `fetch_recurse` is 0 or 1 - see gitmodules(5) fetchRecurseSubmodules.
- * - `refcount` tracks how many hashmap entries there are for this submodule.
- *   It only comes into play if the name and path of the submodule differ.
- * - `flags` is for internal use, tracking where this submodule has been
- *   found (head, index, config, workdir) and other misc info about it.
+ * - `ignore_default` is the ignore value from the config
+ * - `fetch_recurse` is a git_submodule_recurse_t value - see gitmodules(5)
+ *    fetchRecurseSubmodules.
+ * - `fetch_recurse_default` is the recurse value from the config
+ *
+ * - `repo` is the parent repository that contains this submodule.
+ * - `flags` after for internal use, tracking where this submodule has been
+ *   found (head, index, config, workdir) and known status info, etc.
+ * - `head_oid` is the SHA1 for the submodule path in the repo HEAD.
+ * - `index_oid` is the SHA1 for the submodule recorded in the index.
+ * - `wd_oid` is the SHA1 for the HEAD of the checked out submodule.
  *
  * If the submodule has been added to .gitmodules but not yet git added,
- * then the `index_oid` will be valid and zero.  If the submodule has been
- * deleted, but the delete has not been committed yet, then the `index_oid`
- * will be set, but the `url` will be NULL.
+ * then the `index_oid` will be zero but still marked valid.  If the
+ * submodule has been deleted, but the delete has not been committed yet,
+ * then the `index_oid` will be set, but the `url` will be NULL.
  */
 struct git_submodule {
-       git_repository *owner;
+       git_refcount rc;
+
+       /* information from config */
        char *name;
-       char *path; /* important: may point to same string data as "name" */
+       char *path; /* important: may just point to "name" string */
        char *url;
-       uint32_t flags;
-       git_oid head_oid;
-       git_oid index_oid;
-       git_oid wd_oid;
-       /* information from config */
+       char *branch;
        git_submodule_update_t update;
        git_submodule_update_t update_default;
        git_submodule_ignore_t ignore;
        git_submodule_ignore_t ignore_default;
-       int fetch_recurse;
+       git_submodule_recurse_t fetch_recurse;
+       git_submodule_recurse_t fetch_recurse_default;
+
        /* internal information */
-       int refcount;
+       git_repository *repo;
+       uint32_t flags;
+       git_oid head_oid;
+       git_oid index_oid;
+       git_oid wd_oid;
 };
 
+/* Force revalidation of submodule data cache (alloc as needed) */
+extern int git_submodule_cache_refresh(git_repository *repo);
+
+/* Release all submodules */
+extern void git_submodule_cache_free(git_repository *repo);
+
 /* Additional flags on top of public GIT_SUBMODULE_STATUS values */
 enum {
        GIT_SUBMODULE_STATUS__WD_SCANNED          = (1u << 20),
@@ -99,4 +120,30 @@ enum {
 #define GIT_SUBMODULE_STATUS__CLEAR_INTERNAL(S) \
        ((S) & ~(0xFFFFFFFFu << 20))
 
+/* Internal lookup does not attempt to refresh cached data */
+extern int git_submodule__lookup(
+       git_submodule **out, git_repository *repo, const char *path);
+
+/* Internal status fn returns status and optionally the various OIDs */
+extern int git_submodule__status(
+       unsigned int *out_status,
+       git_oid *out_head_id,
+       git_oid *out_index_id,
+       git_oid *out_wd_id,
+       git_submodule *sm,
+       git_submodule_ignore_t ign);
+
+/* Open submodule repository as bare repo for quick HEAD check, etc. */
+extern int git_submodule_open_bare(
+       git_repository **repo,
+       git_submodule *submodule);
+
+extern int git_submodule_parse_ignore(
+       git_submodule_ignore_t *out, const char *value);
+extern int git_submodule_parse_update(
+       git_submodule_update_t *out, const char *value);
+
+extern int git_submodule__map(
+       git_repository *repo,
+       git_strmap *map);
 #endif