Skip to content

Commit 76f808a

Browse files
committed
I think that I shall never see
1 parent 8614722 commit 76f808a

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed

docs/guides/101-samples/index.md

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,3 +430,124 @@ for (size_t i=0; i<count; ++i) {
430430
[`git_status_list_entrycount`](http://libgit2.github.com/libgit2/#HEAD/group/status/git_status_list_entrycount),
431431
[`git_status_byindex`](http://libgit2.github.com/libgit2/#HEAD/group/status/git_status_byindex),
432432
[`git_status_entry`](http://libgit2.github.com/libgit2/#HEAD/type/git_status_entry))
433+
434+
435+
## Trees
436+
437+
### Lookups
438+
439+
Each commit has a tree:
440+
441+
```c
442+
git_tree *tree;
443+
int error = git_commit_tree(&tree, commit);
444+
```
445+
446+
You can look them up by OID:
447+
448+
```c
449+
git_tree *tree;
450+
int error = git_tree_lookup(&tree, repo, &oid);
451+
```
452+
453+
Trees can contain trees:
454+
455+
```c
456+
const git_tree_entry *entry = git_tree_entry_byindex(tree, 0);
457+
if (git_tree_entry_type(entry) == GIT_OBJ_TREE) {
458+
git_tree *subtree = NULL;
459+
int error = git_tree_lookup(&subtree, repo, git_tree_entry_id(entry));
460+
}
461+
```
462+
463+
([`git_commit_tree`](http://libgit2.github.com/libgit2/#HEAD/group/commit/git_commit_tree),
464+
[`git_tree_lookup`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_lookup),
465+
[`git_tree_entry_byindex`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_entry_byindex),
466+
[`git_tree_entry_type`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_entry_type))
467+
468+
### Tree Entries
469+
470+
```c
471+
git_object *obj = NULL;
472+
int error = git_revparse_single(&obj, repo, "HEAD^{tree}");
473+
git_tree *tree = (git_tree *)obj;
474+
475+
size_t count = git_tree_entrycount(tree);
476+
git_tree_entry *entry = git_tree_entry_byindex(tree, 0);
477+
478+
const char *name = git_tree_entry_name(entry); /* filename */
479+
git_otype objtype = git_tree_entry_type(entry); /* blob or tree */
480+
git_filemode_t mode = git_tree_entry_filemode(entry); /* *NIX filemode */
481+
482+
git_tree_entry *entry2 = NULL;
483+
error = git_tree_entry_bypath(&entry2, tree, "a/b/c.txt");
484+
git_tree_entry_free(entry2); /* caller has to free this one */
485+
```
486+
487+
([`git_revparse_single`](http://libgit2.github.com/libgit2/#HEAD/group/revparse/git_revparse_single),
488+
[`git_tree_entrycount`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_entrycount),
489+
[`git_tree_entry_byindex`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_entry_byindex),
490+
[`git_tree_entry_name`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_entry_name),
491+
[`git_tree_entry_type`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_entry_type),
492+
[`git_tree_entry_filemode`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_entry_filemode),
493+
[`git_tree_entry_bypath`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_entry_bypath),
494+
[`git_tree_entry_free`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_entry_free))
495+
496+
### Walking
497+
498+
```c
499+
typedef struct { /* … */ } walk_data;
500+
501+
int walk_cb(const char *root,
502+
const git_tree_entry *entry,
503+
void *payload)
504+
{
505+
walk_data *d = (walk_data*)payload;
506+
/* … */
507+
}
508+
509+
git_object *obj = NULL;
510+
int error = git_revparse_single(&obj, repo, "HEAD^{tree}");
511+
git_tree *tree = (git_tree *)obj;
512+
513+
walk_data d = {0};
514+
error = git_tree_walk(tree, GIT_TREEWALK_PRE, walk_cb, &d);
515+
```
516+
517+
([`git_revparse_single`](http://libgit2.github.com/libgit2/#HEAD/group/revparse/git_revparse_single),
518+
[`git_tree_walk`](http://libgit2.github.com/libgit2/#HEAD/group/tree/git_tree_walk),
519+
[`git_treewalk_mode`](http://libgit2.github.com/libgit2/#HEAD/type/git_treewalk_mode),
520+
[`git_treewalk_cb`](http://libgit2.github.com/libgit2/#HEAD/type/git_treewalk_cb))
521+
522+
### Treebuilder
523+
524+
```c
525+
git_treebuilder *bld = NULL;
526+
int error = git_treebuilder_create(&bld, NULL);
527+
528+
/* Add some entries */
529+
git_object *obj = NULL;
530+
error = git_revparse_single(&obj, repo, "HEAD:README.md");
531+
error = git_treebuilder_insert(NULL, bld,
532+
"README.md", /* filename */
533+
git_object_id(obj), /* OID */
534+
0100644); /* mode */
535+
git_object_free(obj);
536+
error = git_revparse_single(&obj, repo, "v0.1.0:foo/bar/baz.c");
537+
error = git_treebuilder_insert(NULL, bld,
538+
"a/b/d.c",
539+
git_object_id(obj),
540+
0100644);
541+
git_object_free(obj);
542+
543+
git_oid oid = {{0}};
544+
error = git_treebuilder_write(&oid, repo, bld);
545+
git_treebuilder_free(bld);
546+
```
547+
548+
([`git_revparse_single`](http://libgit2.github.com/libgit2/#HEAD/group/revparse/git_revparse_single),
549+
[`git_object_free`](http://libgit2.github.com/libgit2/#HEAD/group/object/git_object_free),
550+
[`git_treebuilder_create`](http://libgit2.github.com/libgit2/#HEAD/group/treebuilder/git_treebuilder_create),
551+
[`git_treebuilder_insert`](http://libgit2.github.com/libgit2/#HEAD/group/treebuilder/git_treebuilder_insert),
552+
[`git_treebuilder_write`](http://libgit2.github.com/libgit2/#HEAD/group/treebuilder/git_treebuilder_write),
553+
[`git_treebuilder_free`](http://libgit2.github.com/libgit2/#HEAD/group/treebuilder/git_treebuilder_free))

0 commit comments

Comments
 (0)