]> Git repositories of Nishi - repoview.git/commitdiff
adding rv_remove_repo
authorNishi <nishi@nishi.boats>
Wed, 21 Aug 2024 14:24:05 +0000 (14:24 +0000)
committerNishi <nishi@nishi.boats>
Wed, 21 Aug 2024 14:24:05 +0000 (14:24 +0000)
git-svn-id: file:///raid/svn-personal/repoview/trunk@14 7e8b2a19-8934-dd40-8cb3-db22cdd5a80f

CGI/repo.c
CGI/rv_repo.h
CGI/theme/modern.c

index 7d323e5acf2c01aa0bc463a5b0b7199cfa6b17bf..df4f54dce4be2525b7c594bba1e2ce8351df4d3a 100644 (file)
@@ -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];
index e62bf3c16ed151512f2476b78c387c7f9f2d2442..95eccab438ccfdeda34146f8396d2b796bd8615d 100644 (file)
@@ -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
index c27d77fe0f504756c9d8164eaab10787b5d29282..ff7d82da966978306b752af7115e2c1d328148f8 100644 (file)
@@ -245,7 +245,7 @@ void render_page(void) {
                cbuf[1] = 0;
                add_data(&page, "Username cannot contain '<code>");
                add_data(&page, cbuf);
-               add_data(&page, "</code>'.<br>");
+               add_data(&page, "</code>' and '<code>#</code>'.<br>");
                add_data(&page, "       <input type=\"submit\" value=\"Signup\">\n");
                add_data(&page, "</form>\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, "       </table>\n");
                        add_data(&page, "Repository name cannot contain '<code>");
                        add_data(&page, cbuf);
-                       add_data(&page, "</code>'.");
+                       add_data(&page, "</code>' and '<code>#</code>'.");
                        add_data(&page, "</form>\n");
                        add_data(&page, "<h2 id=\"repolist\">Repository List</h2>\n");
                        add_data(&page, "<table border=\"0\">\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;