Author: rinrab
Date: Wed Apr  1 20:13:34 2026
New Revision: 1932719

Log:
svnbrowse: Add a function that creates model from a specific URL at revision
and performs all required initialization.

* subversion/svnbrowse/svnbrowse.c
  (init_client): Remove function.
  (model_create): New function that replaces init_client.
  (sub_main): Forward to model_create() so it constructs the model; Make the it
   so the ctx local variable is a pointer to that model.

Modified:
   subversion/trunk/subversion/svnbrowse/svnbrowse.c

Modified: subversion/trunk/subversion/svnbrowse/svnbrowse.c
==============================================================================
--- subversion/trunk/subversion/svnbrowse/svnbrowse.c   Wed Apr  1 19:57:01 
2026        (r1932718)
+++ subversion/trunk/subversion/svnbrowse/svnbrowse.c   Wed Apr  1 20:13:34 
2026        (r1932719)
@@ -69,23 +69,6 @@ typedef struct svn_browse__model_t {
 } svn_browse__model_t;
 
 static svn_error_t *
-init_client(svn_browse__model_t *ctx, apr_pool_t *pool)
-{
-  svn_auth_baton_t *auth;
-
-  SVN_ERR(svn_client_create_context2(&ctx->client, NULL, pool));
-
-  /* Set up Authentication stuff. */
-  SVN_ERR(svn_cmdline_create_auth_baton2(&auth, FALSE, NULL, NULL, NULL, FALSE,
-                                         FALSE, FALSE, FALSE, FALSE, FALSE,
-                                         NULL, NULL, NULL, pool));
-
-  ctx->client->auth_baton = auth;
-
-  return SVN_NO_ERROR;
-}
-
-static svn_error_t *
 list_cb(void *baton,
         const char *path,
         const svn_dirent_t *dirent,
@@ -144,6 +127,41 @@ enter_path(svn_browse__model_t *ctx, con
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+model_create(svn_browse__model_t **model_p,
+             const char *url,
+             svn_opt_revision_t revision,
+             apr_pool_t *result_pool,
+             apr_pool_t *scratch_pool)
+{
+  svn_browse__model_t *model = apr_pcalloc(result_pool, sizeof(*model));
+  svn_auth_baton_t *auth;
+  svn_client_ctx_t *client;
+  apr_pool_t *state_pool;
+  svn_browse__state_t *state;
+
+  /* Set up Authentication stuff. */
+  SVN_ERR(svn_cmdline_create_auth_baton2(&auth, FALSE, NULL, NULL, NULL, FALSE,
+                                         FALSE, FALSE, FALSE, FALSE, FALSE,
+                                         NULL, NULL, NULL, result_pool));
+
+  SVN_ERR(svn_client_create_context2(&client, NULL, result_pool));
+  client->auth_baton = auth;
+
+  /* TODO: we must use the repository root URL */
+  model->root = apr_pstrdup(result_pool, url);
+  model->revision = revision;
+  model->client = client;
+  model->pool = result_pool;
+
+  /* the state should be in a separate pool so it's safe to free it */
+  state_pool = svn_pool_create(result_pool);
+  SVN_ERR(state_create(&model->current, model, "", state_pool, scratch_pool));
+
+  *model_p = model;
+  return SVN_NO_ERROR;
+}
+
 static void
 ui_draw(svn_browse__model_t *ctx, apr_pool_t *pool)
 {
@@ -184,19 +202,19 @@ ui_draw(svn_browse__model_t *ctx, apr_po
 static svn_error_t *
 sub_main(int *code, int argc, char *argv[], apr_pool_t *pool)
 {
-  svn_browse__model_t ctx = { 0 };
+  const char *url;
+  svn_opt_revision_t revision;
+  svn_browse__model_t *ctx;
   apr_pool_t *iterpool;
 
   if (argc != 2)
     return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
                             "usage: svnbrowse <URL>");
 
-  SVN_ERR(svn_uri_canonicalize_safe(&ctx.root, NULL, argv[1], pool, pool));
-  ctx.revision.kind = svn_opt_revision_head;
-  ctx.pool = pool;
+  SVN_ERR(svn_uri_canonicalize_safe(&url, NULL, argv[1], pool, pool));
+  revision.kind = svn_opt_revision_head;
 
-  SVN_ERR(init_client(&ctx, pool));
-  SVN_ERR(state_create(&ctx.current, &ctx, "", svn_pool_create(pool), pool));
+  SVN_ERR(model_create(&ctx, url, revision, pool, pool));
 
   /* init the display */
   initscr();
@@ -216,7 +234,7 @@ sub_main(int *code, int argc, char *argv
       const char *new_url;
 
       clear();
-      ui_draw(&ctx, iterpool);
+      ui_draw(ctx, iterpool);
       refresh();
 
       /* getch() reads the next character/key with the following additional
@@ -232,25 +250,25 @@ sub_main(int *code, int argc, char *argv
         {
           case KEY_UP:
           case 'k':
-            ctx.current->selection--;
+            ctx->current->selection--;
             break;
           case KEY_DOWN:
           case 'j':
-            ctx.current->selection++;
+            ctx->current->selection++;
             break;
           case '\n':
           case '\r':
-            item = APR_ARRAY_IDX(ctx.current->list, ctx.current->selection,
+            item = APR_ARRAY_IDX(ctx->current->list, ctx->current->selection,
                                  svn_browse__item_t *);
-            new_url = svn_relpath_join(ctx.current->relpath, item->relpath,
+            new_url = svn_relpath_join(ctx->current->relpath, item->relpath,
                                        iterpool);
-            SVN_ERR(enter_path(&ctx, new_url, iterpool));
+            SVN_ERR(enter_path(ctx, new_url, iterpool));
             break;
           case KEY_BACKSPACE:
           case '-':
           case 'u':
-            new_url = svn_relpath_dirname(ctx.current->relpath, iterpool);
-            SVN_ERR(enter_path(&ctx, new_url, iterpool));
+            new_url = svn_relpath_dirname(ctx->current->relpath, iterpool);
+            SVN_ERR(enter_path(ctx, new_url, iterpool));
             break;
           /* TODO: quit via escape. some say just check for 27, but it I think 
it's
            * a bit ugly. */

Reply via email to