зеркало из https://github.com/microsoft/git.git
MyFirstObjectWalk: update recommended usage
The previous change consolidated traverse_commit_list() and traverse_commit_list_filtered(). This allows us to simplify the recommended usage in MyFirstObjectWalk.txt to use this new set of values. While here, add some clarification on the difference between the two methods. Signed-off-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
3e0370a8d2
Коммит
f0d2f84919
|
@ -522,24 +522,25 @@ function shows that the all-object walk is being performed by
|
||||||
`traverse_commit_list()` or `traverse_commit_list_filtered()`. Those two
|
`traverse_commit_list()` or `traverse_commit_list_filtered()`. Those two
|
||||||
functions reside in `list-objects.c`; examining the source shows that, despite
|
functions reside in `list-objects.c`; examining the source shows that, despite
|
||||||
the name, these functions traverse all kinds of objects. Let's have a look at
|
the name, these functions traverse all kinds of objects. Let's have a look at
|
||||||
the arguments to `traverse_commit_list_filtered()`, which are a superset of the
|
the arguments to `traverse_commit_list()`.
|
||||||
arguments to the unfiltered version.
|
|
||||||
|
|
||||||
- `struct list_objects_filter_options *filter_options`: This is a struct which
|
- `struct rev_info *revs`: This is the `rev_info` used for the walk. If
|
||||||
stores a filter-spec as outlined in `Documentation/rev-list-options.txt`.
|
its `filter` member is not `NULL`, then `filter` contains information for
|
||||||
- `struct rev_info *revs`: This is the `rev_info` used for the walk.
|
how to filter the object list.
|
||||||
- `show_commit_fn show_commit`: A callback which will be used to handle each
|
- `show_commit_fn show_commit`: A callback which will be used to handle each
|
||||||
individual commit object.
|
individual commit object.
|
||||||
- `show_object_fn show_object`: A callback which will be used to handle each
|
- `show_object_fn show_object`: A callback which will be used to handle each
|
||||||
non-commit object (so each blob, tree, or tag).
|
non-commit object (so each blob, tree, or tag).
|
||||||
- `void *show_data`: A context buffer which is passed in turn to `show_commit`
|
- `void *show_data`: A context buffer which is passed in turn to `show_commit`
|
||||||
and `show_object`.
|
and `show_object`.
|
||||||
|
|
||||||
|
In addition, `traverse_commit_list_filtered()` has an additional paramter:
|
||||||
|
|
||||||
- `struct oidset *omitted`: A linked-list of object IDs which the provided
|
- `struct oidset *omitted`: A linked-list of object IDs which the provided
|
||||||
filter caused to be omitted.
|
filter caused to be omitted.
|
||||||
|
|
||||||
It looks like this `traverse_commit_list_filtered()` uses callbacks we provide
|
It looks like these methods use callbacks we provide instead of needing us
|
||||||
instead of needing us to call it repeatedly ourselves. Cool! Let's add the
|
to call it repeatedly ourselves. Cool! Let's add the callbacks first.
|
||||||
callbacks first.
|
|
||||||
|
|
||||||
For the sake of this tutorial, we'll simply keep track of how many of each kind
|
For the sake of this tutorial, we'll simply keep track of how many of each kind
|
||||||
of object we find. At file scope in `builtin/walken.c` add the following
|
of object we find. At file scope in `builtin/walken.c` add the following
|
||||||
|
@ -712,20 +713,9 @@ help understand. In our case, that means we omit trees and blobs not directly
|
||||||
referenced by `HEAD` or `HEAD`'s history, because we begin the walk with only
|
referenced by `HEAD` or `HEAD`'s history, because we begin the walk with only
|
||||||
`HEAD` in the `pending` list.)
|
`HEAD` in the `pending` list.)
|
||||||
|
|
||||||
First, we'll need to `#include "list-objects-filter-options.h"` and set up the
|
|
||||||
`struct list_objects_filter_options` at the top of the function.
|
|
||||||
|
|
||||||
----
|
|
||||||
static void walken_object_walk(struct rev_info *rev)
|
|
||||||
{
|
|
||||||
struct list_objects_filter_options filter_options = { 0 };
|
|
||||||
|
|
||||||
...
|
|
||||||
----
|
|
||||||
|
|
||||||
For now, we are not going to track the omitted objects, so we'll replace those
|
For now, we are not going to track the omitted objects, so we'll replace those
|
||||||
parameters with `NULL`. For the sake of simplicity, we'll add a simple
|
parameters with `NULL`. For the sake of simplicity, we'll add a simple
|
||||||
build-time branch to use our filter or not. Replace the line calling
|
build-time branch to use our filter or not. Preface the line calling
|
||||||
`traverse_commit_list()` with the following, which will remind us which kind of
|
`traverse_commit_list()` with the following, which will remind us which kind of
|
||||||
walk we've just performed:
|
walk we've just performed:
|
||||||
|
|
||||||
|
@ -733,19 +723,17 @@ walk we've just performed:
|
||||||
if (0) {
|
if (0) {
|
||||||
/* Unfiltered: */
|
/* Unfiltered: */
|
||||||
trace_printf(_("Unfiltered object walk.\n"));
|
trace_printf(_("Unfiltered object walk.\n"));
|
||||||
traverse_commit_list(rev, walken_show_commit,
|
|
||||||
walken_show_object, NULL);
|
|
||||||
} else {
|
} else {
|
||||||
trace_printf(
|
trace_printf(
|
||||||
_("Filtered object walk with filterspec 'tree:1'.\n"));
|
_("Filtered object walk with filterspec 'tree:1'.\n"));
|
||||||
parse_list_objects_filter(&filter_options, "tree:1");
|
CALLOC_ARRAY(rev->filter, 1);
|
||||||
|
parse_list_objects_filter(rev->filter, "tree:1");
|
||||||
traverse_commit_list_filtered(&filter_options, rev,
|
|
||||||
walken_show_commit, walken_show_object, NULL, NULL);
|
|
||||||
}
|
}
|
||||||
|
traverse_commit_list(rev, walken_show_commit,
|
||||||
|
walken_show_object, NULL);
|
||||||
----
|
----
|
||||||
|
|
||||||
`struct list_objects_filter_options` is usually built directly from a command
|
The `rev->filter` member is usually built directly from a command
|
||||||
line argument, so the module provides an easy way to build one from a string.
|
line argument, so the module provides an easy way to build one from a string.
|
||||||
Even though we aren't taking user input right now, we can still build one with
|
Even though we aren't taking user input right now, we can still build one with
|
||||||
a hardcoded string using `parse_list_objects_filter()`.
|
a hardcoded string using `parse_list_objects_filter()`.
|
||||||
|
@ -784,7 +772,7 @@ object:
|
||||||
----
|
----
|
||||||
...
|
...
|
||||||
|
|
||||||
traverse_commit_list_filtered(&filter_options, rev,
|
traverse_commit_list_filtered(rev,
|
||||||
walken_show_commit, walken_show_object, NULL, &omitted);
|
walken_show_commit, walken_show_object, NULL, &omitted);
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
Загрузка…
Ссылка в новой задаче