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, 39 insertions, 12 deletions
diff --git a/csvncgi/ui-shared.c b/csvncgi/ui-shared.c
index e34141e..1079486 100644
--- a/csvncgi/ui-shared.c
+++ b/csvncgi/ui-shared.c
@@ -406,23 +406,32 @@ static void xml_csvn_info( struct strbuf *sb, struct csvn_info *info )
 void csvn_repo_info( struct csvn_info *info, 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( 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 info --revision %d --xml %s/%s/ 2>/dev/null",
-                revision, co_prefix, repo_path );
+                revision, co_prefix, (char *)&repo_path[0] );
     else
       snprintf( (char *)&cmd[0], 1024,
                 "svn info --xml %s/%s/ 2>/dev/null",
-                co_prefix, repo_path );
+                co_prefix, (char *)&repo_path[0] );
     p = sys_exec_command( &buf, cmd );
     rc = sys_wait_command( p, NULL );
     if( rc != 0 )
@@ -650,25 +659,34 @@ static const char *mime_info( struct csvn_info *info, const char *buffer, size_t
 void csvn_rpath_mime_info( struct csvn_info *info, 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( !info || !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 | tr -d '\\0' | head -c 1024",
-                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 | tr -d '\\0' | head -c 1024",
-                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 )
@@ -689,25 +707,34 @@ void csvn_rpath_mime_info( struct csvn_info *info, const char *relative_path, in
 void csvn_rpath_info( struct csvn_info *info, 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( !info || !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 info --revision %d --xml %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 info --xml %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 )