(module svn-client * (import chicken scheme foreign) (declare (foreign-declare #< #include #include #include #include #include #include #include #include #include #include #include #include #include static svn_opt_revision_t revision_head; static svn_opt_revision_t revision_unspecified; char *svnwiki_user, *svnwiki_pass; apr_pool_t *svn_pool; svn_client_ctx_t *svn_ctx; svn_error_t * svnwiki_simple_first_credentials (void **credentials, void **iter_baton, void *provider_baton, apr_hash_t *parameters, const char *realmstring, apr_pool_t *pool) { svn_auth_cred_simple_t *cred; *credentials = cred = apr_pcalloc(pool, sizeof(svn_auth_cred_simple_t)); cred->username = apr_pstrdup (pool, svnwiki_user); cred->password = apr_pstrdup (pool, svnwiki_pass); cred->may_save = 0; return 0; } svn_error_t * svnwiki_username_first_credentials (void **credentials, void **iter_baton, void *provider_baton, apr_hash_t *parameters, const char *realmstring, apr_pool_t *pool) { svn_auth_cred_username_t *cred; *credentials = cred = apr_pcalloc(pool, sizeof(svn_auth_cred_simple_t)); cred->username = apr_pstrdup (pool, svnwiki_user); cred->may_save = 0; return 0; } svn_error_t * svnwiki_log_callback (const char **log_msg, const char **tmp_file, apr_array_header_t *commit_items, void *baton, apr_pool_t *pool) { *tmp_file = NULL; *log_msg = baton; return SVN_NO_ERROR; } svn_auth_provider_t svnwiki_auth_simple = { SVN_AUTH_CRED_SIMPLE, svnwiki_simple_first_credentials, NULL, NULL }; svn_auth_provider_object_t svnwiki_auth_simple_obj = { &svnwiki_auth_simple, NULL }; svn_auth_provider_t svnwiki_auth_username = { SVN_AUTH_CRED_USERNAME, svnwiki_username_first_credentials, NULL, NULL }; svn_auth_provider_object_t svnwiki_auth_username_obj = { &svnwiki_auth_username, NULL }; EOF )) ;;; Pools (define-record apr-pool ptr) (define-foreign-type apr-pool-type (pointer "apr_pool_t") apr-pool-ptr make-apr-pool) (define svn-pool-create (foreign-lambda apr-pool-type "svn_pool_create" apr-pool-type)) ;;; Hashes (define-record apr-hash ptr) (define-foreign-type apr-hash-type (pointer "apr_hash_t") apr-hash-ptr make-apr-hash) (define-record apr-hash-index ptr) (define-foreign-type apr-hash-index-type (pointer "apr_hash_index_t") apr-hash-index-ptr make-apr-hash-index) (define apr-hash-first (foreign-lambda* apr-hash-index-type ((apr-hash-type hash)) "return(apr_hash_first(svn_pool, hash));")) (define apr-hash-next (foreign-lambda* apr-hash-index-type ((apr-hash-index-type index)) #<config, NULL, svn_pool); providers = apr_array_make(svn_pool, 2, sizeof(svn_auth_provider_object_t *)); *(svn_auth_provider_object_t **)apr_array_push(providers) = &svnwiki_auth_simple_obj; *(svn_auth_provider_object_t **)apr_array_push(providers) = &svnwiki_auth_username_obj; svn_auth_open(&svn_ctx->auth_baton, providers, svn_pool); revision_head.kind = svn_opt_revision_head; revision_unspecified.kind = svn_opt_revision_unspecified; return(NULL); EOF )) ;;; Info (define-record svn-info ptr) ;(define (make-svn-info-with-finalizer x) ; (set-finalizer! x (foreign-lambda void "free" (pointer "svn_info_t"))) ; (make-svn-info x)) (define-foreign-type svn-info-type (pointer "svn_info_t") svn-info-ptr ;make-svn-info-with-finalizer) make-svn-info) (define svn-info-url (foreign-lambda* c-string ((svn-info-type info)) #<URL); EOF )) (define svn-info-repos-root-url (foreign-lambda* c-string ((svn-info-type info)) #<repos_root_URL); EOF )) (define svn-info-rev (foreign-lambda* long ((svn-info-type info)) #<rev); EOF )) ;;; Revisions (define-record svn-opt-revision ptr) (define (make-svn-opt-revision-with-finalizer x) (set-finalizer! x (foreign-lambda void "free" (pointer "svn_opt_revision_t"))) (make-svn-opt-revision x)) (define-foreign-type svn-opt-revision-type (pointer "svn_opt_revision_t") svn-opt-revision-ptr make-svn-opt-revision-with-finalizer) (define make-svn-opt-revision-number (foreign-lambda* svn-opt-revision-type ((long num)) #<kind = svn_opt_revision_number; rev->value.number = num; } return(rev); EOF )) (define svn-opt-revision-head (make-svn-opt-revision (foreign-value "&revision_head" (pointer "svn_opt_revision_t")))) (define svn-opt-revision-unspecified (make-svn-opt-revision (foreign-value "&revision_unspecified" (pointer "svn_opt_revision_t")))) (define svn-opt-revision-number (foreign-lambda* long ((svn-opt-revision-type rev)) #<kind == svn_opt_revision_number ? rev->value.number : -1); EOF )) (define svn-opt-revision-kind (foreign-lambda* unsigned-int ((svn-opt-revision-type rev)) #<kind); EOF )) (define-foreign-type svn-revnum-type long) ;;; svn_log_changed_path_t (define-record svn-log-changed-path ptr) (define (make-svn-log-changed-path-with-finalizer x) (set-finalizer! x (foreign-lambda* void (((pointer "svn_log_changed_path_t") obj)) "if (obj) free(obj->copyfrom_path); free(obj);")) (make-svn-log-changed-path x)) (define-foreign-type svn-log-changed-path-type (pointer "svn_log_changed_path_t") svn-log-changed-path-ptr make-svn-log-changed-path-with-finalizer) (define svn-log-changed-path-action (foreign-lambda* char ((svn-log-changed-path-type info)) #<action); EOF )) (define svn-log-changed-path-copy-from-path (foreign-lambda* c-string ((svn-log-changed-path-type info)) #<copyfrom_path); EOF )) (define svn-log-changed-path-copy-from-rev (foreign-lambda* long ((svn-log-changed-path-type info)) #<copyfrom_rev); EOF )) ;;; Other stuff (define svn-commit (foreign-lambda* scheme-object ((c-string path) (c-string user) (c-string pass) (c-string changes)) #<log_msg_func = svnwiki_log_callback; svn_ctx->log_msg_baton = changes; err = svn_client_commit(&commit_info, targets, FALSE, svn_ctx, svn_pool); if (err) { svn_handle_error(err, stderr, FALSE); svn_error_clear(err); return(C_SCHEME_FALSE); } if (!commit_info || commit_info->revision == SVN_INVALID_REVNUM) return(C_SCHEME_TRUE); return(C_fix(commit_info->revision)); EOF )) (define svn-update (foreign-lambda* scheme-object ((c-string url) (c-string path) (svn-opt-revision-type rev) (c-string user) (c-string pass)) #<kind == svn_node_file ? C_fix(value->size) : C_SCHEME_FALSE, value->created_rev, result); } return(result); EOF )) (define-external (svn_ls_add (c-string key) (scheme-object size) (long rev) (scheme-object result)) scheme-object (cons (list key size rev) result)) ; Currently returns a list of all property values for a given file. (define svn-propget (foreign-safe-lambda* scheme-object ((c-string propname) (c-string target) (c-string user) (c-string pass) (scheme-object result)) #<data, resultroot)); } apr_pool_destroy(pool); result = CHICKEN_gc_root_ref(resultroot); CHICKEN_delete_gc_root(resultroot); return(result); EOF )) (define-external (svn_propget_add (c-string key) (c-string value) ((pointer void) result)) scheme-object (cons (list key value) (gc-root-ref result))) (define svn-propset (foreign-safe-lambda* scheme-object ((c-string propname) (c-string propval) (c-string target) (bool recurse) (bool skip_checks)) #<copyfrom_path) new->copyfrom_path = strdup(new->copyfrom_path); CHICKEN_gc_root_set(resultroot, changed_paths_fix_one(key, new, resultroot)); } apr_pool_destroy(pool); result = CHICKEN_gc_root_ref(resultroot); CHICKEN_delete_gc_root(resultroot); return(result); EOF )) (define svn-client-log2 (foreign-safe-lambda* bool ((c-string path) (svn-opt-revision-type start) (svn-opt-revision-type end) (int limit) (bool discover_changed_paths) (bool strict_node_history) (c-string user) (c-string pass) (scheme-object func)) #<