git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v6 01/12] objects.c: introduce `exclude_level` enum

From
Teng Long <dyroneteng@gmail.com>
Date
Oct 19, 2021, 11:38 UTC
Message-ID
<3a885678c9cee6ed4a70a7c88c15a7fa1b332150.1634634814.git.tenglong@alibaba-inc.com>
In-Reply-To
<cover.1634634814.git.tenglong@alibaba-inc.com>
From: Teng Long <dyroneteng@gmail.com>

Currently packfile-uri supports the exclusion of blob objects, but in some scenarios, users may wish to exclude more types of objects, such as commits, trees and tags, the difference with blob is they are more complicated. In addition to the meaning of a single object itself, it may also represent a collection of the objects that it includes (trees and blob in a root-tree) or reaches (ancestors of a commit). The exclusion range is designed by an enum named `exclude_level` in "pack-objects.c" that enumerate three values, "ET_SELF", "ET_INCLUDE" and "ET_REACHABLE".

Here are some explanations for their differences:
- Scene 1: "ET_SELF" for excluding object itself.

Reason to support the "ET_SELF" is because the definition of exclusion-level should be better to be consistent, no matter what the object type is. Excluding a single object itself has meaning for blobs, because blob is the smallest granularity among object types, and indeed, sometimes there are some frequently used big-size blobs in repository.

If you want to exclude more ownership or reachable objects, it can be considered to use "ET_INCLUDE" or "ET_REACHABLE".

- Scene 2: "ET_INCLUDE" for excluding object itself and objects it
contains.

When a commit is specified to be excluded as packfile-uri, more offen, it's hoped to exclude the trees and blobs contained in its top-level tree, as well as the commit itself, but not the ancestors of the commit. This applies to scenarios where we want to exclude a specified non-blob object that includes some big-size objects.

Commit, tag and tree are suitable for this scenario. When a tag is specified, it will exclude the dereference commit, and all trees and blobs contained in its top-tree, as well as the tag itself if it's not a lightweight one.

- Scene 3: "ET_REACHABLE" for excluding object itself, all the objects
it contains, and its ancestors.

For further exclusion range, the ancestors are needed to excluded together, for example, the clone scenes.

This commit only defines the `exclude_level` enum type. The implementations of non-blob object types will be added in subsequent commits.

Signed-off-by: Teng Long <dyroneteng@gmail.com>
---
 builtin/pack-objects.c | 44 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 6d13cd3e1a..73b92a0c90 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -127,9 +127,52 @@ enum missing_action {
 };
 static enum missing_action arg_missing_action;
 static show_object_fn fn_show_object;
+/*
+ * exclude_level defines how to make the exclusion when the object matches
+ * a packfile-uri (uploadpack.excludeobject or uploadpack.blobpackfileuri)
+ * configuration.
+ *
+ * - ET_SELF;
+ *   This type means only the object itself will be excluded, and all other
+ *   objects it includes or reachable will not. For example, if object type is:
+ *   	- BLOB:  The blob object will be excluded
+ *   	- TREE:  The tree object will be excluded, the sub-trees and blobs it
+ *   	  includes will not be excluded.
+ *   	- COMMIT: The commit object will be excluded, all the trees and blobs
+ *   	  that be included in its top-level tree will not be excluded.
+ *   	- TAG: TAG object will be excluded, the referrenced commit object will
+ *   	  not be excluded.
+ * - ET_INCLUDE;
+ *   This type means that not only the object itself will be excluded, but
+ *   also the objects it includes. For example, if object type is:
+ *   	- BLOB:  Same with 'ET_SELF'
+ *   	- TREE:  The tree object, and also the sub-trees and blobs that
+ *   	  the object includes will be excluded.
+ *   	- COMMIT: The commit object, and also all the trees and blobs
+ *   	  contained in its top-level tree will be excluded.
+ *   	- TAG: The TAG object will be excluded, and also the referrenced
+ *   	  commit will be excluded (the referrenced commit exclusion will
+ *   	  treat as a 'ET_INCLUDE' way).
+ * - ET_REACHABLE;
+ *   This type means that not only the object and all the objects it includes
+ *   will be excluded, but also the reachable objects. For exmple, if object
+ *   type is:
+ *   	- BLOB:  Same with 'ET_INCLUDE'
+ *   	- TREE:  Same with 'ET_INCLUDE'
+ *   	- COMMIT: The Objects in the case of 'ET_INCLUDE' will be excluded,
+ *   	  and also the ancestors of the commit will be excluded.
+ *   	- TAG: The Objects in the case of 'ET_INCLUDE' will be excluded, and
+ *   	  also the ancestors of the referrenced commit will be excluded.
+ */
 
+enum exclude_level {
+    ET_SELF,
+    ET_INCLUDE,
+    ET_REACHABLE,
+};
 struct configured_exclusion {
 	struct oidmap_entry e;
+	int level;
 	char *pack_hash_hex;
 	char *uri;
 };
@@ -3003,6 +3046,7 @@ static int git_pack_config(const char *k, const char *v, void *cb)
 		if (oidmap_get(&configured_exclusions, &ex->e.oid))
 			die(_("object already configured in another "
 			      "uploadpack.blobpackfileuri (got '%s')"), v);
+		ex->level = ET_SELF;
 		ex->pack_hash_hex = xcalloc(1, pack_end - oid_end);
 		memcpy(ex->pack_hash_hex, oid_end + 1, pack_end - oid_end - 1);
 		ex->uri = xstrdup(pack_end + 1);
-- 
2.31.1.453.g945ddc3a74.dirty
Previous: Teng LongNext: Teng Long
Message 61 of 72 in “Packfile-uris support excluding commit objects”
  1. Packfile-uris support excluding commit objectsTeng Long, May 7, 2021
  2. Ævar Arnfjörð BjarmasonMay 10, 2021
  3. 0/3 packfile-uris: commit objects exclusionTeng Long, May 18, 2021
  4. 1/3 packfile-uris: support for excluding commit objectTeng Long, May 18, 2021
  5. Junio C HamanoMay 19, 2021
  6. Junio C HamanoMay 20, 2021
  7. 2/3 packfile-uris.txt: excluding commit objectTeng Long, May 18, 2021
  8. 3/3 t5702: excluding commits with packfile-urisTeng Long, May 18, 2021
  9. 0/3 packfile-uris: commit objects exclusioTeng Long, Jul 26, 2021
  10. 1/3 packfile-uris: support for excluding commit objectsTeng Long, Jul 26, 2021
  11. Junio C HamanoJul 26, 2021
  12. Felipe ContrerasJul 26, 2021
  13. Teng LongAug 11, 2021
  14. 2/3 t5702: support for excluding commit objectsTeng Long, Jul 26, 2021
  15. Ævar Arnfjörð BjarmasonJul 26, 2021
  16. Teng LongAug 11, 2021
  17. 3/3 packfile-uri.txt: support for excluding commit objectsTeng Long, Jul 26, 2021
  18. Junio C HamanoJul 26, 2021
  19. Teng LongAug 11, 2021
  20. Ævar Arnfjörð BjarmasonJul 26, 2021
  21. Teng LongAug 11, 2021
  22. 0/7 packfile-uris: commits and trees exclusionTeng Long, Aug 11, 2021
  23. 1/7 pack-objects.c: introduce new method `match_packfile_uri_exclusions`Teng Long, Aug 11, 2021
  24. 2/7 Add new parameter "carry_data" for "show_object" functionTeng Long, Aug 11, 2021
  25. 3/7 packfile-uri: support for excluding commit objectsTeng Long, Aug 11, 2021
  26. 4/7 packfile-uri: support for excluding tree objectsTeng Long, Aug 11, 2021
  27. 5/7 packfile-uri.txt: support for excluding commits and treesTeng Long, Aug 11, 2021
  28. Bagas SanjayaAug 11, 2021
  29. 6/7 t5702: replace with "test_when_finished" for cleanupTeng Long, Aug 11, 2021
  30. 7/7 t5702: support for excluding commit objectsTeng Long, Aug 11, 2021
  31. 00/14 packfile-uris: commits, trees and tags exclusionTeng Long, Aug 25, 2021
  32. 01/14 pack-objects.c: introduce new method `match_packfile_uri_exclusions`Teng Long, Aug 25, 2021
  33. 02/14 Add new parameter "carry_data" for "show_object" functionTeng Long, Aug 25, 2021
  34. Junio C HamanoAug 26, 2021
  35. Teng LongSep 2, 2021
  36. 03/14 packfile-uri: support for excluding commit objectsTeng Long, Aug 25, 2021
  37. Ævar Arnfjörð BjarmasonAug 25, 2021
  38. Teng LongSep 2, 2021
  39. Junio C HamanoAug 26, 2021
  40. Teng LongSep 2, 2021
  41. 04/14 packfile-uri: support for excluding tree objectsTeng Long, Aug 25, 2021
  42. 05/14 packfile-uri.txt: support for excluding commits and treesTeng Long, Aug 25, 2021
  43. Ævar Arnfjörð BjarmasonAug 25, 2021
  44. Teng LongSep 2, 2021
  45. 06/14 t5702: replace with "test_when_finished" for cleanupTeng Long, Aug 25, 2021
  46. Ævar Arnfjörð BjarmasonAug 25, 2021
  47. Teng LongSep 2, 2021
  48. 07/14 t5702: support for excluding commit objectsTeng Long, Aug 25, 2021
  49. 08/14 Add new parameter "carry_data" for "show_commit functionTeng Long, Aug 25, 2021
  50. 09/14 commit.h: add wrapped tags in commit structTeng Long, Aug 25, 2021
  51. Ævar Arnfjörð BjarmasonAug 25, 2021
  52. Teng LongSep 2, 2021
  53. ZheNing HuSep 2, 2021
  54. Teng LongSep 2, 2021
  55. 10/14 object.h: add referred tags in `referred_objects` structTeng Long, Aug 25, 2021
  56. 11/14 packfile-uri: support for excluding tag objectsTeng Long, Aug 25, 2021
  57. 12/14 packfile-uri.txt: support for excluding tag objectsTeng Long, Aug 25, 2021
  58. 13/14 t5702: add tag exclusion test caseTeng Long, Aug 25, 2021
  59. 14/14 pack-objects.c: introduce `want_exclude_object` functionTeng Long, Aug 25, 2021
  60. 00/12 packfile-uri: support excluding multiple object typesTeng Long, Oct 19, 2021
  61. 01/12 objects.c: introduce `exclude_level` enumTeng Long, Oct 19, 2021
  62. 02/12 Introduce function `match_packfile_uri_exclusions`Teng Long, Oct 19, 2021
  63. 03/12 Replace `show_data` with structure `show_info`Teng Long, Oct 19, 2021
  64. 04/12 Introduce `uploadpack.excludeobject` configurationTeng Long, Oct 19, 2021
  65. 05/12 t5702: test cases for `uploadpack.excludeobject`Teng Long, Oct 19, 2021
  66. 06/12 packfile-uri: support for excluding commitsTeng Long, Oct 19, 2021
  67. 07/12 t5702: test cases for excluding commitsTeng Long, Oct 19, 2021
  68. 08/12 packfile-uri: support for excluding treesTeng Long, Oct 19, 2021
  69. 09/12 t5702: test cases for excluding treesTeng Long, Oct 19, 2021
  70. 10/12 packfile-uri: support for excluding tagsTeng Long, Oct 19, 2021
  71. 11/12 t5702: test cases for excluding tagsTeng Long, Oct 19, 2021
  72. 12/12 packfile-uri.txt: support multiple object typesTeng Long, Oct 19, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.