aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
authorJoey Hess <joey@kitenet.net>2010-07-01 16:20:03 -0400
committerJoey Hess <joey@kitenet.net>2010-07-01 16:57:20 -0400
commit0eabe6f79498e3339205aeff2c79ae1e85498ab4 (patch)
tree5c404112c98d5ac1afce09db892b509153984839 /IkiWiki
parent824ad84e2b490e3aa9107e3a3d244bd8e041d918 (diff)
downloadikiwiki-0eabe6f79498e3339205aeff2c79ae1e85498ab4.tar
ikiwiki-0eabe6f79498e3339205aeff2c79ae1e85498ab4.tar.gz
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.
Diffstat (limited to 'IkiWiki')
-rw-r--r--IkiWiki/Plugin/git.pm8
-rw-r--r--IkiWiki/Wrapper.pm52
2 files changed, 53 insertions, 7 deletions
diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm
index 992c6226b..0f92476c9 100644
--- a/IkiWiki/Plugin/git.pm
+++ b/IkiWiki/Plugin/git.pm
@@ -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',
diff --git a/IkiWiki/Wrapper.pm b/IkiWiki/Wrapper.pm
index 73f0896e8..bd134c9a3 100644
--- a/IkiWiki/Wrapper.pm
+++ b/IkiWiki/Wrapper.pm
@@ -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