git: Added git_wrapper_background_command option. Can be used to eg, make the git...
authorJoey Hess <joey@kitenet.net>
Thu, 1 Jul 2010 20:20:03 +0000 (16:20 -0400)
committerJoey Hess <joey@kitenet.net>
Thu, 1 Jul 2010 20:57:20 +0000 (16:57 -0400)
IkiWiki.pm
IkiWiki/Plugin/git.pm
IkiWiki/Wrapper.pm
debian/changelog

index 35b38df46bbc4d71116c151688c34d982d24b34f..701f7137dd78483215637e205bbde0b720ea0387 100644 (file)
@@ -441,6 +441,13 @@ sub getsetup () {
                safe => 0,
                rebuild => 0,
        },
+       wrapper_background_command => {
+               type => "internal",
+               default => '',
+               description => "background shell command to run",
+               safe => 0,
+               rebuild => 0,
+       },
        gettime => {
                type => "internal",
                description => "running in gettime mode",
index 992c6226b6b69f859b80458fb6b21da52a28a49c..0f92476c94403df7b52a28f62e0f4a17d5988794 100644 (file)
@@ -41,6 +41,7 @@ sub checkconfig () {
                push @{$config{wrappers}}, {
                        wrapper => $config{git_wrapper},
                        wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"),
+                       wrapper_background_command => $config{git_wrapper_background_command},
                };
        }
 
@@ -78,6 +79,13 @@ sub getsetup () {
                        safe => 0, # file
                        rebuild => 0,
                },
+               git_wrapper_background_command => {
+                       type => "string",
+                       example => "git push github",
+                       description => "shell command for git_wrapper to run, in the background",
+                       safe => 0, # command
+                       rebuild => 0,
+               },
                git_wrappermode => {
                        type => "string",
                        example => '06755',
index 73f0896e8cd161cce0166dd2d0ff247316d7be41..bd134c9a35c2fa87eef5a505e43984bdc26cc1d5 100644 (file)
@@ -73,17 +73,23 @@ EOF
                # otherwise. The fd of the lock is stored in
                # IKIWIKI_CGILOCK_FD so unlockwiki can close it.
                $pre_exec=<<"EOF";
-       {
-               int fd=open("$config{wikistatedir}/cgilock", O_CREAT | O_RDWR, 0666);
-               if (fd != -1 && flock(fd, LOCK_EX) == 0) {
-                       char *fd_s=malloc(8);
-                       sprintf(fd_s, "%i", fd);
-                       setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
-               }
+       lockfd=open("$config{wikistatedir}/cgilock", O_CREAT | O_RDWR, 0666);
+       if (lockfd != -1 && flock(lockfd, LOCK_EX) == 0) {
+               char *fd_s=malloc(8);
+               sprintf(fd_s, "%i", lockfd);
+               setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
        }
 EOF
        }
 
+       my $set_background_command='';
+       if (defined $config{wrapper_background_command} &&
+           length $config{wrapper_background_command}) {
+               my $background_command=delete $config{wrapper_background_command};
+               $set_background_command=~s/"/\\"/g;
+               $set_background_command='#define BACKGROUND_COMMAND "'.$background_command.'"';
+       }
+
        $Data::Dumper::Indent=0; # no newlines
        my $configstring=Data::Dumper->Dump([\%config], ['*config']);
        $configstring=~s/\\/\\\\/g;
@@ -114,6 +120,7 @@ void addenv(char *var, char *val) {
 }
 
 int main (int argc, char **argv) {
+       int lockfd=-1;
        char *s;
 
 $check_commit_hook
@@ -147,9 +154,40 @@ $envsave
        }
 
 $pre_exec
+
+$set_background_command
+#ifdef BACKGROUND_COMMAND
+       if (lockfd != -1) {
+               close(lockfd);
+       }
+
+       pid_t pid=fork();
+       if (pid == -1) {
+               perror("fork");
+               exit(1);
+       }
+       else if (pid == 0) {
+               execl("$this", "$this", NULL);
+               perror("exec $this");
+               exit(1);                
+       }
+       else {
+               waitpid(pid, NULL, 0);
+
+               if (daemon(1, 0) == 0) {
+                       system(BACKGROUND_COMMAND);
+                       exit(0);
+               }
+               else {
+                       perror("daemon");
+                       exit(1);
+               }
+       }
+#else
        execl("$this", "$this", NULL);
        perror("exec $this");
        exit(1);
+#endif
 }
 EOF
 
index 4ce720ab60d6434d9ca065bf2b1ef90624ecd016..7d857d9c0987c04da5e286a43f3cf25271a6e7f1 100644 (file)
@@ -17,6 +17,9 @@ ikiwiki (3.20100624) UNRELEASED; urgency=low
   * Use comment template on comments page of example blog.
   * comment.tmpl: Fix up display when inline uses it to display a non-comment
     page. (Such as a discussion page.)
+  * git: Added git_wrapper_background_command option. Can be used to eg, 
+    make the git wrapper push to github in the background after ikiwiki
+    runs.
 
  -- Joey Hess <joeyh@debian.org>  Wed, 23 Jun 2010 15:30:04 -0400