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:
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 )