From: Nishi Date: Wed, 21 Aug 2024 14:24:05 +0000 (+0000) Subject: adding rv_remove_repo X-Git-Url: https://git.chaotic.ninja/gitweb/nishi/?a=commitdiff_plain;h=ad8c649a463b9482296fd2a3899191054f69880c;p=repoview.git adding rv_remove_repo git-svn-id: file:///raid/svn-personal/repoview/trunk@14 7e8b2a19-8934-dd40-8cb3-db22cdd5a80f --- diff --git a/CGI/repo.c b/CGI/repo.c index 7d323e5..df4f54d 100644 --- a/CGI/repo.c +++ b/CGI/repo.c @@ -166,6 +166,58 @@ long long rv_get_filesize(const char* repouser, const char* path) { } } +void rv_remove_repo(const char* repouser) { + printf(""); + char* svnpath = rv_strcat3(SVN_ROOT, "/", repouser); + pid_t pid = fork(); + if(pid == 0) { + char* cmd[] = {"rm", "-rf", svnpath, NULL}; + execvp("rm", cmd); + _exit(0); + } else { + waitpid(pid, 0, 0); + } + free(svnpath); + + FILE* f = fopen(APACHE_AUTHZ, "r+"); + lockf(fileno(f), F_LOCK, 0); + + fseek(f, 0, SEEK_SET); + struct stat s; + stat(APACHE_AUTHZ, &s); + char* buffer = malloc(s.st_size + 1); + fread(buffer, 1, s.st_size, f); + buffer[s.st_size] = 0; + + f = freopen(APACHE_AUTHZ, "w+", f); + lockf(fileno(f), F_LOCK, 0); + int incr = 0; + int i; + char* start = rv_strcat("#%START ", repouser); + bool discard = false; + for(i = 0;; i++) { + if(buffer[i] == '\n' || buffer[i] == 0) { + char oldc = buffer[i]; + buffer[i] = 0; + + char* line = buffer + incr; + if(strcmp(line, start) == 0) { + discard = true; + } else if(discard && strcmp(line, "#%END") == 0) { + discard = false; + } else if(!discard) { + fprintf(f, "%s\n", line); + } + + incr = i + 1; + if(oldc == 0) break; + } + } + + lockf(fileno(f), F_ULOCK, 0); + fclose(f); +} + bool rv_get_list(const char* repouser, const char* path, void (*handler)(const char* pathname), int* isdir) { char* svnpath = rv_strcat3(SVN_ROOT, "/", repouser); int pipes[2]; diff --git a/CGI/rv_repo.h b/CGI/rv_repo.h index e62bf3c..95eccab 100644 --- a/CGI/rv_repo.h +++ b/CGI/rv_repo.h @@ -13,5 +13,6 @@ char* rv_get_readme(const char* repouser); bool rv_get_list(const char* repouser, const char* path, void (*handler)(const char* pathname), int* isdir); char* rv_read_file(const char* repouser, char* path); long long rv_get_filesize(const char* repouser, const char* path); +void rv_remove_repo(const char* repouser); #endif diff --git a/CGI/theme/modern.c b/CGI/theme/modern.c index c27d77f..ff7d82d 100644 --- a/CGI/theme/modern.c +++ b/CGI/theme/modern.c @@ -245,7 +245,7 @@ void render_page(void) { cbuf[1] = 0; add_data(&page, "Username cannot contain '"); add_data(&page, cbuf); - add_data(&page, "'.
"); + add_data(&page, "' and '#'.
"); add_data(&page, " \n"); add_data(&page, "\n"); } else if(strcmp(query, "sendsignup") == 0) { @@ -268,7 +268,7 @@ void render_page(void) { bool reject = false; char* name = rv_get_query("username"); for(i = 0; name[i] != 0; i++) { - if(name[i] == REPO_USER_DELIM) { + if(name[i] == REPO_USER_DELIM || name[i] == '#') { char cbuf[2]; cbuf[0] = REPO_USER_DELIM; cbuf[1] = 0; @@ -386,7 +386,7 @@ void render_page(void) { add_data(&page, " \n"); add_data(&page, "Repository name cannot contain '"); add_data(&page, cbuf); - add_data(&page, "'."); + add_data(&page, "' and '#'."); add_data(&page, "\n"); add_data(&page, "

Repository List

\n"); add_data(&page, "\n"); @@ -410,7 +410,7 @@ void render_page(void) { bool reject = false; char* name = rv_get_query("name"); for(i = 0; name[i] != 0; i++) { - if(name[i] == REPO_USER_DELIM) { + if(name[i] == REPO_USER_DELIM || name[i] == '#') { char cbuf[2]; cbuf[0] = REPO_USER_DELIM; cbuf[1] = 0;