@@ -430,3 +430,124 @@ for (size_t i=0; i<count; ++i) {
430
430
[ ` git_status_list_entrycount ` ] ( http://libgit2.github.com/libgit2/#HEAD/group/status/git_status_list_entrycount ) ,
431
431
[ ` git_status_byindex ` ] ( http://libgit2.github.com/libgit2/#HEAD/group/status/git_status_byindex ) ,
432
432
[ ` 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