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, 69 insertions, 10 deletions
diff --git a/csvncgi/ui-log.c b/csvncgi/ui-log.c
index d0c17b6..a97dd06 100644
--- a/csvncgi/ui-log.c
+++ b/csvncgi/ui-log.c
@@ -167,11 +167,25 @@ static void xml_csvn_log( struct strbuf *sb, const struct strbuf *buf, const cha
             strbuf_addf( sb, "                  <div class=\"col-cmsg\"><div onclick=\"trunc(this)\" class=\"log-cmsg trunc\">%s</div></div>\n", (char *)cmsg );
             if( query_string && *query_string )
             {
-              strbuf_addf( sb, "                  <div class=\"col-rev\"><div onclick=\"trunc(this)\" class=\"log-rev trunc\"><a title=\"Compare with Previous\" href=\"/%s%s/?op=diff&rev=%s&%s\">%s</a></div></div>\n", ctx.repo.name, path, (char *)revision, query_string, (char *)revision );
+              if( ctx.repo.repo_root && *ctx.repo.repo_root )
+              {
+                strbuf_addf( sb, "                  <div class=\"col-rev\"><div onclick=\"trunc(this)\" class=\"log-rev trunc\"><a title=\"Compare with Previous\" href=\"/%s/%s%s/?op=diff&rev=%s&%s\">%s</a></div></div>\n", ctx.repo.repo_root, ctx.repo.name, path, (char *)revision, query_string, (char *)revision );
+              }
+              else
+              {
+                strbuf_addf( sb, "                  <div class=\"col-rev\"><div onclick=\"trunc(this)\" class=\"log-rev trunc\"><a title=\"Compare with Previous\" href=\"/%s%s/?op=diff&rev=%s&%s\">%s</a></div></div>\n", ctx.repo.name, path, (char *)revision, query_string, (char *)revision );
+              }
             }
             else
             {
-              strbuf_addf( sb, "                  <div class=\"col-rev\"><div onclick=\"trunc(this)\" class=\"log-rev trunc\"><a title=\"Compare with Previous\" href=\"/%s%s/?op=diff&rev=%s\">%s</a></div></div>\n", ctx.repo.name, path, (char *)revision, (char *)revision );
+              if( ctx.repo.repo_root && *ctx.repo.repo_root )
+              {
+                strbuf_addf( sb, "                  <div class=\"col-rev\"><div onclick=\"trunc(this)\" class=\"log-rev trunc\"><a title=\"Compare with Previous\" href=\"/%s/%s%s/?op=diff&rev=%s\">%s</a></div></div>\n", ctx.repo.repo_root, path, ctx.repo.name, path, (char *)revision, (char *)revision );
+              }
+              else
+              {
+                strbuf_addf( sb, "                  <div class=\"col-rev\"><div onclick=\"trunc(this)\" class=\"log-rev trunc\"><a title=\"Compare with Previous\" href=\"/%s%s/?op=diff&rev=%s\">%s</a></div></div>\n", ctx.repo.name, path, (char *)revision, (char *)revision );
+              }
             }
             strbuf_addf( sb, "                  <div class=\"col-author\"><div onclick=\"trunc(this)\" class=\"log-author trunc\">%s</div></div>\n", (char *)author );
             strbuf_addf( sb, "                </div>\n\n" );
@@ -215,9 +229,27 @@ static void xml_csvn_log( struct strbuf *sb, const struct strbuf *buf, const cha
         if( prev < 0 ) prev = 0;
 
         if( ctx.env.query_string && *ctx.env.query_string )
-          strbuf_addf( sb, "                      <a href=\"/%s%s/?ofs=%d&%s\">&#x226a;&nbsp; Prev</a>\n", ctx.repo.name, path, prev, ctx.env.query_string );
+        {
+          if( ctx.repo.repo_root && *ctx.repo.repo_root )
+          {
+            strbuf_addf( sb, "                      <a href=\"/%s/%s%s/?ofs=%d&%s\">&#x226a;&nbsp; Prev</a>\n", ctx.repo.repo_root, ctx.repo.name, path, prev, ctx.env.query_string );
+          }
+          else
+          {
+            strbuf_addf( sb, "                      <a href=\"/%s%s/?ofs=%d&%s\">&#x226a;&nbsp; Prev</a>\n", ctx.repo.name, path, prev, ctx.env.query_string );
+          }
+        }
         else
-          strbuf_addf( sb, "                      <a href=\"/%s%s/?ofs=%d\">&#x226a;&nbsp; Prev</a>\n", ctx.repo.name, path, prev );
+        {
+          if( ctx.repo.repo_root && *ctx.repo.repo_root )
+          {
+            strbuf_addf( sb, "                      <a href=\"/%s/%s%s/?ofs=%d\">&#x226a;&nbsp; Prev</a>\n", ctx.repo.repo_root, ctx.repo.name, path, prev );
+          }
+          else
+          {
+            strbuf_addf( sb, "                      <a href=\"/%s%s/?ofs=%d\">&#x226a;&nbsp; Prev</a>\n", ctx.repo.name, path, prev );
+          }
+        }
       }
 
       strbuf_addf( sb, "                    </div>\n" );
@@ -230,9 +262,27 @@ static void xml_csvn_log( struct strbuf *sb, const struct strbuf *buf, const cha
         next = ctx.query.ofs + page_size;
 
         if( ctx.env.query_string && *ctx.env.query_string )
-          strbuf_addf( sb, "                      <a href=\"/%s%s/?ofs=%d&%s\">Next &nbsp;&#x226b;</a>\n", ctx.repo.name, path, next, ctx.env.query_string );
+        {
+          if( ctx.repo.repo_root && *ctx.repo.repo_root )
+          {
+            strbuf_addf( sb, "                      <a href=\"/%s/%s%s/?ofs=%d&%s\">Next &nbsp;&#x226b;</a>\n", ctx.repo.repo_root, ctx.repo.name, path, next, ctx.env.query_string );
+          }
+          else
+          {
+            strbuf_addf( sb, "                      <a href=\"/%s%s/?ofs=%d&%s\">Next &nbsp;&#x226b;</a>\n", ctx.repo.name, path, next, ctx.env.query_string );
+          }
+        }
         else
-          strbuf_addf( sb, "                      <a href=\"/%s%s/?ofs=%d\">Next &nbsp;&#x226b;</a>\n", ctx.repo.name, path, next );
+        {
+          if( ctx.repo.repo_root && *ctx.repo.repo_root )
+          {
+            strbuf_addf( sb, "                      <a href=\"/%s/%s%s/?ofs=%d\">Next &nbsp;&#x226b;</a>\n", ctx.repo.repo_root, ctx.repo.name, path, next );
+          }
+          else
+          {
+            strbuf_addf( sb, "                      <a href=\"/%s%s/?ofs=%d\">Next &nbsp;&#x226b;</a>\n", ctx.repo.name, path, next );
+          }
+        }
       }
 
       strbuf_addf( sb, "                    </div>\n" );
@@ -254,7 +304,8 @@ static void xml_csvn_log( struct strbuf *sb, const struct strbuf *buf, const cha
 static void csvn_print_log( 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;
   char *path = NULL;
 
   if( !sb ) return;
@@ -273,19 +324,27 @@ static void csvn_print_log( struct strbuf *sb, const char *relative_path, int re
 
   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 log --revision %d:0 --xml %s/%s%s 2>/dev/null",
-                revision, co_prefix, repo_path, path );
+                revision, co_prefix, (char *)&repo_path[0], path );
     else
       snprintf( (char *)&cmd[0], 1024,
                 "svn log --xml %s/%s%s 2>/dev/null",
-                co_prefix, repo_path, path );
+                co_prefix, (char *)&repo_path[0], path );
     p = sys_exec_command( &buf, cmd );
     rc = sys_wait_command( p, NULL );
     if( rc != 0 )