Skip to content

Commit 441e585

Browse files
committed
Merge branch 'tree-refactoring' into develop
2 parents ec13bb4 + 45d3483 commit 441e585

File tree

12 files changed

+338
-104
lines changed

12 files changed

+338
-104
lines changed

docs/classes/tree/is_tree.rst

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,40 @@
11
.. index::
2-
single: isBlob (Git\Tree method)
2+
single: remove (Git\Tree method)
33

44

5-
Git\\Tree::isBlob
5+
Git\\Tree::remove
66
===========================================================
77

8-
inherits Git\\Object.
9-
108
Description
119
***********************************************************
1210

13-
public **Git\\Tree::isBlob** ()
11+
public **Git\\Tree::remove** (string *$name*)
1412

1513

1614
Parameters
1715
***********************************************************
1816

17+
*name*
18+
specified file name
1919

2020
Return Values
2121
***********************************************************
2222

23+
void
24+
2325
Examples
2426
***********************************************************
2527

28+
.. code-block:: php
29+
30+
<?php
31+
$repository = new Git\Repository("/path/to/repository");
32+
$hash = "";// blob / tree hash.
33+
$tree = new Git\Tree($repository);
34+
$tree->remove("README");
35+
$tree_hash = $tree->write();
36+
2637
See Also
2738
***********************************************************
2839

29-
:doc:`Git\\Object::isBlob </classes/object/is_blob>`
40+
:doc:`Git\\Tree </classes/tree/index>`

src/commit.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -315,16 +315,14 @@ PHP_METHOD(git_commit, getTree)
315315

316316
git_oid *tree_oid;
317317
zval *git_tree;
318-
zval *entries;
319318
zval *entry;
320319

321320
MAKE_STD_ZVAL(git_tree);
322-
MAKE_STD_ZVAL(entries);
323-
array_init(entries);
324321
object_init_ex(git_tree, git_tree_class_entry);
325322
php_git_tree_t *tobj = (php_git_tree_t *) zend_object_store_get_object(git_tree TSRMLS_CC);
326323
tobj->object = tree;
327324

325+
/*
328326
int r = git_tree_entrycount(tree);
329327
int i = 0;
330328
@@ -334,7 +332,7 @@ PHP_METHOD(git_commit, getTree)
334332
}
335333
336334
add_property_zval(git_tree,"entries", entries);
337-
335+
*/
338336
RETURN_ZVAL(git_tree,0,0);
339337
}
340338

src/config.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ if test $PHP_GIT != "no"; then
2929
PHP_ADD_LIBRARY_WITH_PATH(git2, $LIBGIT2_LIBDIR, GIT_SHARED_LIBADD)
3030

3131
PHP_SUBST(GIT_SHARED_LIBADD)
32-
PHP_NEW_EXTENSION(git,php_git.c reference.c reference_manager.c repository.c signature.c commit.c index_entry.c index_iterator.c index.c tree.c blob.c tree_entry.c walker.c object.c rawobject.c tag.c odb.c backend.c, $ext_shared)
32+
PHP_NEW_EXTENSION(git,php_git.c reference.c reference_manager.c repository.c signature.c commit.c index_entry.c index_iterator.c index.c tree_iterator.c tree.c blob.c tree_entry.c walker.c object.c rawobject.c tag.c odb.c backend.c, $ext_shared)
3333

3434
ifdef([PHP_ADD_EXTENSION_DEP],
3535
[

src/php_git.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ PHP_MINIT_FUNCTION(git) {
138138
git_index_init(TSRMLS_C);
139139
git_init_signature(TSRMLS_C);
140140
git_init_walker(TSRMLS_C);
141+
git_tree_iterator_init(TSRMLS_C);
141142
git_init_tree(TSRMLS_C);
142143
git_init_commit(TSRMLS_C);
143144
git_init_tree_entry(TSRMLS_C);

src/php_git.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ extern PHPAPI zend_class_entry *git_index_iterator_class_entry;
5555
extern PHPAPI zend_class_entry *git_index_entry_class_entry;
5656
extern PHPAPI zend_class_entry *git_walker_class_entry;
5757
extern PHPAPI zend_class_entry *git_tree_class_entry;
58+
extern PHPAPI zend_class_entry *git_tree_iterator_class_entry;
5859
extern PHPAPI zend_class_entry *git_tree_entry_class_entry;
5960
extern PHPAPI zend_class_entry *git_commit_class_entry;
6061
extern PHPAPI zend_class_entry *git_signature_class_entry;
@@ -85,6 +86,11 @@ typedef struct{
8586
git_tree_entry *entry;
8687
} php_git_tree_entry_t;
8788

89+
typedef struct{
90+
zend_object zo;
91+
git_tree *tree;
92+
long offset;
93+
} php_git_tree_iterator_t;
8894

8995
typedef struct{
9096
zend_object zo;

src/repository.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,6 @@ PHP_METHOD(git_repository, getTree)
348348
zval *object = getThis();
349349
git_tree *tree;
350350
zval *git_tree;
351-
zval *entries;
352351

353352
git_oid oid;
354353
char *hash;
@@ -375,22 +374,11 @@ PHP_METHOD(git_repository, getTree)
375374
}
376375

377376
MAKE_STD_ZVAL(git_tree);
378-
MAKE_STD_ZVAL(entries);
379-
array_init(entries);
380377
object_init_ex(git_tree, git_tree_class_entry);
381378

382-
int r = git_tree_entrycount(tree);
383-
zval *array_ptr;
384-
385-
for(i = 0; i < r; i++){
386-
create_tree_entry_from_entry(&array_ptr, git_tree_entry_byindex(tree,i));
387-
add_next_index_zval(entries, array_ptr);
388-
}
389-
390379
php_git_tree_t *tobj = (php_git_tree_t *) zend_object_store_get_object(git_tree TSRMLS_CC);
391380
tobj->object = tree;
392381

393-
add_property_zval(git_tree,"entries", entries);
394382
RETURN_ZVAL(git_tree,0,0);
395383
}
396384

src/tree.c

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_git_tree_path, 0, 0, 1)
4444
ZEND_ARG_INFO(0, path)
4545
ZEND_END_ARG_INFO()
4646

47+
ZEND_BEGIN_ARG_INFO_EX(arginfo_git_tree_get_entry, 0, 0, 1)
48+
ZEND_ARG_INFO(0, position)
49+
ZEND_END_ARG_INFO()
50+
51+
ZEND_BEGIN_ARG_INFO_EX(arginfo_git_tree_remove, 0, 0, 1)
52+
ZEND_ARG_INFO(0, name)
53+
ZEND_END_ARG_INFO()
54+
4755
static void php_git_tree_free_storage(php_git_tree_t *obj TSRMLS_DC)
4856
{
4957
zend_object_std_dtor(&obj->zo TSRMLS_CC);
@@ -195,11 +203,92 @@ PHP_METHOD(git_tree, __construct)
195203
}
196204
}
197205

206+
PHP_METHOD(git_tree, getIterator)
207+
{
208+
php_git_tree_t *this = (php_git_tree_t *) zend_object_store_get_object(getThis() TSRMLS_CC);
209+
zval *iterator;
210+
211+
MAKE_STD_ZVAL(iterator);
212+
object_init_ex(iterator,git_tree_iterator_class_entry);
213+
php_git_tree_iterator_t *obj = (php_git_tree_iterator_t *) zend_object_store_get_object(iterator TSRMLS_CC);
214+
obj->tree = this->object;
215+
obj->offset = 0;
216+
RETURN_ZVAL(iterator,0,0);
217+
}
218+
219+
PHP_METHOD(git_tree, getEntry)
220+
{
221+
php_git_tree_t *this = (php_git_tree_t *) zend_object_store_get_object(getThis() TSRMLS_CC);
222+
git_tree_entry *entry;
223+
zval *git_tree_entry;
224+
int offset = 0;
225+
226+
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
227+
"l", &offset) == FAILURE){
228+
return;
229+
}
230+
231+
entry = git_tree_entry_byindex(this->object,offset);
232+
create_tree_entry_from_entry(&git_tree_entry, entry);
233+
RETURN_ZVAL(git_tree_entry,0, 0);
234+
}
235+
236+
PHP_METHOD(git_tree, remove)
237+
{
238+
php_git_tree_t *this = (php_git_tree_t *) zend_object_store_get_object(getThis() TSRMLS_CC);
239+
char *path;
240+
int path_len = 0;
241+
242+
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
243+
"s", &path, &path_len) == FAILURE){
244+
return;
245+
}
246+
247+
git_tree_entry *entry = git_tree_entry_byname(this->object,path);
248+
if(entry == NULL){
249+
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC,
250+
"specified path does not exist.");
251+
RETURN_FALSE;
252+
}
253+
254+
int result = git_tree_remove_entry_byname(this->object, path);
255+
if(result != GIT_SUCCESS){
256+
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC,
257+
"can't remove tree entry");
258+
RETURN_FALSE
259+
}
260+
RETURN_TRUE;
261+
}
262+
263+
PHP_METHOD(git_tree, getEntries)
264+
{
265+
php_git_tree_t *this = (php_git_tree_t *) zend_object_store_get_object(getThis() TSRMLS_CC);
266+
git_tree_entry *entry;
267+
int i;
268+
269+
int r = git_tree_entrycount(this->object);
270+
zval *entries;
271+
MAKE_STD_ZVAL(entries);
272+
array_init(entries);
273+
zval *array_ptr;
274+
for(i = 0; i < r; i++){
275+
create_tree_entry_from_entry(&array_ptr, git_tree_entry_byindex(this->object,i));
276+
add_next_index_zval(entries, array_ptr);
277+
}
278+
279+
RETURN_ZVAL(entries,0,0);
280+
}
281+
282+
198283
PHPAPI function_entry php_git_tree_methods[] = {
199284
PHP_ME(git_tree, __construct, arginfo_git_tree__construct, ZEND_ACC_PUBLIC)
285+
PHP_ME(git_tree, getEntry, arginfo_git_tree_get_entry, ZEND_ACC_PUBLIC)
286+
PHP_ME(git_tree, getEntries, NULL, ZEND_ACC_PUBLIC)
287+
PHP_ME(git_tree, getIterator, NULL, ZEND_ACC_PUBLIC)
200288
PHP_ME(git_tree, count, NULL, ZEND_ACC_PUBLIC)
201289
PHP_ME(git_tree, path, arginfo_git_tree_path, ZEND_ACC_PUBLIC)
202290
PHP_ME(git_tree, add, arginfo_git_tree_add, ZEND_ACC_PUBLIC)
291+
PHP_ME(git_tree, remove, arginfo_git_tree_remove, ZEND_ACC_PUBLIC)
203292
{NULL, NULL, NULL}
204293
};
205294

@@ -210,5 +299,5 @@ void git_init_tree(TSRMLS_D)
210299
git_tree_class_entry = zend_register_internal_class_ex(&ce, git_object_class_entry, NULL TSRMLS_CC);
211300
git_tree_class_entry->create_object = php_git_tree_new;
212301

213-
zend_class_implements(git_tree_class_entry TSRMLS_CC, 1, spl_ce_Countable);
302+
zend_class_implements(git_tree_class_entry TSRMLS_CC, 2, spl_ce_Countable,zend_ce_aggregate);
214303
}

0 commit comments

Comments
 (0)