Index: svn.c
===================================================================
RCS file: /repository/pecl/svn/svn.c,v
retrieving revision 1.31
diff -u -r1.31 svn.c
--- svn.c	12 Dec 2007 03:39:11 -0000	1.31
+++ svn.c	3 Jan 2008 09:39:05 -0000
@@ -123,6 +123,7 @@
 	PHP_FE(svn_export, NULL)
 	PHP_FE(svn_copy, NULL)
 	PHP_FE(svn_switch, NULL)
+	PHP_FE(svn_blame, NULL)
 	PHP_FE(svn_repos_create, NULL)
 	PHP_FE(svn_repos_recover, NULL)
 	PHP_FE(svn_repos_hotcopy, NULL)
@@ -1750,7 +1751,109 @@
 }
 /* }}} */
 
+static svn_error_t *
+php_svn_blame_message_receiver (void *baton,
+				apr_int64_t line_no,
+				svn_revnum_t rev,
+				const char *author,
+				const char *date,
+				const char *line,
+				apr_pool_t *pool)
+{
+	zval *return_value = (zval *)baton, *row;
+
+	TSRMLS_FETCH();
+
+	if (rev == 0) {
+		return SVN_NO_ERROR;
+	}
+
+	MAKE_STD_ZVAL(row);
+	array_init(row);
+
+	//printf ("Revision %ld\n", rev);
+	//RETURN_FALSE;
+
+	add_assoc_long(row, "rev", (long) rev);
+
+	if (line_no) {
+		add_assoc_long(row, "line_no", line_no);
+	}
+	if (author) {
+		add_assoc_string(row, "author", (char *) author, 1);
+	}
+	if (date) {
+		add_assoc_string(row, "date", (char *) date, 1);
+	}
+	if (line) {
+		add_assoc_string(row, "line", (char *) line, 1);
+	}
 
+	add_next_index_zval(return_value, row); 
+	return SVN_NO_ERROR;
+}
+
+/* {{{ proto array svn_blame(string repos_url[, int revision_no])
+ */
+PHP_FUNCTION(svn_blame)
+{
+	const char *repos_url = NULL; 
+	int repos_url_len;
+	int revision = -1;
+	svn_error_t *err;
+	svn_opt_revision_t 	start_revision = { 0 }, end_revision = { 0 };
+	apr_pool_t *subpool;
+	
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &repos_url, &repos_url_len, &revision) == FAILURE) {
+		RETURN_FALSE;
+	}
+
+	init_svn_client(TSRMLS_C);
+	subpool = svn_pool_create(SVN_G(pool));
+	if (!subpool) {
+		RETURN_FALSE;
+	}
+
+	RETVAL_FALSE;
+ 	
+	if (revision == -1) {
+		start_revision.kind =  svn_opt_revision_head;
+		end_revision.kind   =  svn_opt_revision_head;
+	} else {						
+		start_revision.kind =  svn_opt_revision_number;
+		start_revision.value.number = revision ;
+
+		end_revision.kind   =  svn_opt_revision_number;
+		end_revision.value.number = revision ;
+	}
+
+	/* DEBUG stuff
+	php_printf( "revision : %d\n", revision );
+	php_printf( "start_revision.kind : %d\n", start_revision.kind );
+	php_printf( "start_revision.value.number : %d\n\n", start_revision.value.number );
+	 
+	RETURN_FALSE;
+	*/
+
+	array_init(return_value);
+
+	err = svn_client_blame(
+			repos_url,
+			&start_revision,
+			&end_revision,
+			php_svn_blame_message_receiver,
+			(void *) return_value,
+			SVN_G(ctx),
+			subpool);
+
+	if (err) {
+		php_svn_handle_error(err TSRMLS_CC);
+		RETVAL_FALSE;
+	}
+
+	svn_pool_destroy(subpool);
+}
+/* }}} */
 
 /* {{{ proto resource svn_repos_create(string path [, array config [, array fsconfig]])
    Create a new subversion repository at path */

