cSvn-UI for SVN Repositories

cGit-UI – is a web interface for Subversion (SVN) Repositories. cSvn CGI script is writen in C and therefore it's fast enough

6 Commits   0 Branches   2 Tags
author: kx <kx@radix.pro> 2023-04-12 19:21:06 +0300 committer: kx <kx@radix.pro> 2023-04-12 19:21:06 +0300 commit: c7693c71799633467d154afe65f9b4810cec42f5 parent: c8b2593c941778dcfa307badf981160e19d2932b
Commit Summary:
Added repo-root variable for repositories which placed in subdirectory relative svnserve root
Diffstat:
1 file changed, 75 insertions, 21 deletions
diff --git a/csvncgi/ui-file.c b/csvncgi/ui-file.c
index b20d86e..d7fe731 100644
--- a/csvncgi/ui-file.c
+++ b/csvncgi/ui-file.c
@@ -56,21 +56,30 @@
 static int csvn_file_last_changed_revision( const char *relative_path )
 {
   const char *co_prefix = ctx.repo.checkout_ro_prefix;
-  const char *repo_path = ctx.repo.name;
+  const char *name      = ctx.repo.name;
+  const char *repo_root = ctx.repo.repo_root;
   int ret = 0;
 
   if( !relative_path ) return ret;
 
   if( co_prefix )
   {
-    char cmd[1024];
+    char repo_path[PATH_MAX] = { 0 };
+    char cmd[PATH_MAX];
     struct strbuf buf = STRBUF_INIT;
     pid_t p = (pid_t) -1;
     int   rc;
 
+    if( repo_root && *repo_root )
+    {
+      strcat( (char *)&repo_path[0], repo_root );
+      strcat( (char *)&repo_path[0], "/" );
+    }
+    strcat( (char *)&repo_path[0], name );
+
     snprintf( (char *)&cmd[0], 1024,
               "svn info --show-item last-changed-revision --no-newline %s/%s/%s 2>/dev/null",
-              co_prefix, repo_path, relative_path );
+              co_prefix, (char *)&repo_path[0], relative_path );
     p = sys_exec_command( &buf, cmd );
     rc = sys_wait_command( p, NULL );
     if( rc != 0 )
@@ -109,15 +118,33 @@ static void csvn_print_file_links( struct strbuf *sb, const char *relative_path,
 
   if( query_string && *query_string )
   {
-    strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-scroll\"></span><a href=\"/%s/%s/?op=log&rev=%s&%s\">log</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0], query_string );
-    strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-diff\"></span><a href=\"/%s/%s/?op=diff&rev=%s&%s\">diff</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0], query_string );
-    strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-blame\"></span><a href=\"/%s/%s/?op=blame&rev=%s&%s\">blame</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0], query_string );
+    if( ctx.repo.repo_root && *ctx.repo.repo_root )
+    {
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-scroll\"></span><a href=\"/%s/%s/%s/?op=log&rev=%s&%s\">log</a></div>\n", ctx.repo.repo_root, ctx.repo.name, relative_path, (char *)&rev[0], query_string );
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-diff\"></span><a href=\"/%s/%s/%s/?op=diff&rev=%s&%s\">diff</a></div>\n", ctx.repo.repo_root, ctx.repo.name, relative_path, (char *)&rev[0], query_string );
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-blame\"></span><a href=\"/%s/%s/%s/?op=blame&rev=%s&%s\">blame</a></div>\n", ctx.repo.repo_root, ctx.repo.name, relative_path, (char *)&rev[0], query_string );
+    }
+    else
+    {
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-scroll\"></span><a href=\"/%s/%s/?op=log&rev=%s&%s\">log</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0], query_string );
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-diff\"></span><a href=\"/%s/%s/?op=diff&rev=%s&%s\">diff</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0], query_string );
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-blame\"></span><a href=\"/%s/%s/?op=blame&rev=%s&%s\">blame</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0], query_string );
+    }
   }
   else
   {
-    strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-scroll\"></span><a href=\"/%s/%s/?op=log&rev=%s\">log</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0] );
-    strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-diff\"></span><a href=\"/%s/%s/?op=diff&rev=%s\">diff</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0] );
-    strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-blame\"></span><a href=\"/%s/%s/?op=blame&rev=%s\">blame</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0] );
+    if( ctx.repo.repo_root && *ctx.repo.repo_root )
+    {
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-scroll\"></span><a href=\"/%s/%s/%s/?op=log&rev=%s\">log</a></div>\n", ctx.repo.repo_root, ctx.repo.name, relative_path, (char *)&rev[0] );
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-diff\"></span><a href=\"/%s/%s/%s/?op=diff&rev=%s\">diff</a></div>\n", ctx.repo.repo_root, ctx.repo.name, relative_path, (char *)&rev[0] );
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-blame\"></span><a href=\"/%s/%s/%s/?op=blame&rev=%s\">blame</a></div>\n", ctx.repo.repo_root, ctx.repo.name, relative_path, (char *)&rev[0] );
+    }
+    else
+    {
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-scroll\"></span><a href=\"/%s/%s/?op=log&rev=%s\">log</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0] );
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-diff\"></span><a href=\"/%s/%s/?op=diff&rev=%s\">diff</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0] );
+      strbuf_addf( sb, "    <div class=\"item\"><span class=\"icon las la-blame\"></span><a href=\"/%s/%s/?op=blame&rev=%s\">blame</a></div>\n", ctx.repo.name, relative_path, (char *)&rev[0] );
+    }
   }
 
   strbuf_addf( sb, "  </div>\n" );
@@ -144,7 +171,8 @@ static int csvn_write_markdown_content( struct strbuf *sb, const struct strbuf *
 static void csvn_print_markdown_file( struct strbuf *sb, const char *relative_path, int revision )
 {
   const char *co_prefix = ctx.repo.checkout_ro_prefix;
-  const char *repo_path = ctx.repo.name;
+  const char *name      = ctx.repo.name;
+  const char *repo_root = ctx.repo.repo_root;
 
   if( !sb || !relative_path ) return;
 
@@ -154,19 +182,27 @@ static void csvn_print_markdown_file( struct strbuf *sb, const char *relative_pa
 
   if( co_prefix )
   {
-    char cmd[1024];
+    char repo_path[PATH_MAX] = { 0 };
+    char cmd[PATH_MAX];
     struct strbuf buf = STRBUF_INIT;
     pid_t p = (pid_t) -1;
     int   rc;
 
+    if( repo_root && *repo_root )
+    {
+      strcat( (char *)&repo_path[0], repo_root );
+      strcat( (char *)&repo_path[0], "/" );
+    }
+    strcat( (char *)&repo_path[0], name );
+
     if( revision )
       snprintf( (char *)&cmd[0], 1024,
                 "svn cat --revision %d %s/%s/%s 2>/dev/null",
-                revision, co_prefix, repo_path, relative_path );
+                revision, co_prefix, (char *)&repo_path[0], relative_path );
     else
       snprintf( (char *)&cmd[0], 1024,
                 "svn cat %s/%s/%s 2>/dev/null",
-                co_prefix, repo_path, relative_path );
+                co_prefix, (char *)&repo_path[0], relative_path );
     p = sys_exec_command( &buf, cmd );
     rc = sys_wait_command( p, NULL );
     if( rc != 0 )
@@ -191,7 +227,8 @@ static void csvn_print_markdown_file( struct strbuf *sb, const char *relative_pa
 static void csvn_print_file( struct strbuf *sb, const char *relative_path, int revision, const char *lang )
 {
   const char *co_prefix = ctx.repo.checkout_ro_prefix;
-  const char *repo_path = ctx.repo.name;
+  const char *name      = ctx.repo.name;
+  const char *repo_root = ctx.repo.repo_root;
 
   if( !sb || !relative_path ) return;
 
@@ -204,20 +241,28 @@ static void csvn_print_file( struct strbuf *sb, const char *relative_path, int r
 
   if( co_prefix )
   {
-    char cmd[1024];
+    char repo_path[PATH_MAX] = { 0 };
+    char cmd[PATH_MAX];
     struct strbuf buf = STRBUF_INIT;
     char  *raw = NULL;
     pid_t  p = (pid_t) -1;
     int    rc;
 
+    if( repo_root && *repo_root )
+    {
+      strcat( (char *)&repo_path[0], repo_root );
+      strcat( (char *)&repo_path[0], "/" );
+    }
+    strcat( (char *)&repo_path[0], name );
+
     if( revision )
       snprintf( (char *)&cmd[0], 1024,
                 "svn cat --revision %d %s/%s/%s 2>/dev/null",
-                revision, co_prefix, repo_path, relative_path );
+                revision, co_prefix, (char *)&repo_path[0], relative_path );
     else
       snprintf( (char *)&cmd[0], 1024,
                 "svn cat %s/%s/%s 2>/dev/null",
-                co_prefix, repo_path, relative_path );
+                co_prefix, (char *)&repo_path[0], relative_path );
     p = sys_exec_command( &buf, cmd );
     rc = sys_wait_command( p, NULL );
     if( rc != 0 )
@@ -244,25 +289,34 @@ static void csvn_print_file( struct strbuf *sb, const char *relative_path, int r
 static void csvn_print_image_file( struct strbuf *sb, const char *relative_path, int revision )
 {
   const char *co_prefix = ctx.repo.checkout_ro_prefix;
-  const char *repo_path = ctx.repo.name;
+  const char *name      = ctx.repo.name;
+  const char *repo_root = ctx.repo.repo_root;
 
   if( !sb || !relative_path ) return;
 
   if( co_prefix )
   {
-    char cmd[1024];
+    char repo_path[PATH_MAX] = { 0 };
+    char cmd[PATH_MAX];
     struct strbuf buf = STRBUF_INIT;
     pid_t  p = (pid_t) -1;
     int    rc;
 
+    if( repo_root && *repo_root )
+    {
+      strcat( (char *)&repo_path[0], repo_root );
+      strcat( (char *)&repo_path[0], "/" );
+    }
+    strcat( (char *)&repo_path[0], name );
+
     if( revision )
       snprintf( (char *)&cmd[0], 1024,
                 "svn cat --revision %d %s/%s/%s 2>/dev/null",
-                revision, co_prefix, repo_path, relative_path );
+                revision, co_prefix, (char *)&repo_path[0], relative_path );
     else
       snprintf( (char *)&cmd[0], 1024,
                 "svn cat %s/%s/%s 2>/dev/null",
-                co_prefix, repo_path, relative_path );
+                co_prefix, (char *)&repo_path[0], relative_path );
     p = sys_exec_command( &buf, cmd );
     rc = sys_wait_command( p, NULL );
     if( rc != 0 )