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.

master
Joey Hess 2010-07-01 16:20:03 -04:00
parent 824ad84e2b
commit 0eabe6f794
4 changed files with 63 additions and 7 deletions

View 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",

View 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',

View 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) {
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", fd);
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,10 +154,41 @@ $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
my @cc=exists $ENV{CC} ? possibly_foolish_untaint($ENV{CC}) : 'cc';

3
debian/changelog vendored
View 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