]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
check_canattach hooked up
authorJoey Hess <joey@kodama.kitenet.net>
Thu, 23 Oct 2008 20:56:40 +0000 (16:56 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Thu, 23 Oct 2008 20:56:40 +0000 (16:56 -0400)
IkiWiki/Plugin/git.pm
IkiWiki/Receive.pm
doc/plugins/write.mdwn

index 234e7af2e0fbb847704ab0388f84671d4c619d51..bdac6f7a1b4af0dfb8e59c92249dcbb4599c9b9f 100644 (file)
@@ -9,6 +9,7 @@ use open qw{:utf8 :std};
 
 my $sha1_pattern     = qr/[0-9a-fA-F]{40}/; # pattern to validate Git sha1sums
 my $dummy_commit_msg = 'dummy commit';      # message to skip in recent changes
 
 my $sha1_pattern     = qr/[0-9a-fA-F]{40}/; # pattern to validate Git sha1sums
 my $dummy_commit_msg = 'dummy commit';      # message to skip in recent changes
+my $no_chdir=0;
 
 sub import { #{{{
        hook(type => "checkconfig", id => "git", call => \&checkconfig);
 
 sub import { #{{{
        hook(type => "checkconfig", id => "git", call => \&checkconfig);
@@ -127,8 +128,10 @@ sub safe_git (&@) { #{{{
        if (!$pid) {
                # In child.
                # Git commands want to be in wc.
        if (!$pid) {
                # In child.
                # Git commands want to be in wc.
-               chdir $config{srcdir}
-                   or error("Cannot chdir to $config{srcdir}: $!");
+               if (! $no_chdir) {
+                       chdir $config{srcdir}
+                           or error("Cannot chdir to $config{srcdir}: $!");
+               }
                exec @cmdline or error("Cannot exec '@cmdline': $!");
        }
        # In parent.
                exec @cmdline or error("Cannot exec '@cmdline': $!");
        }
        # In parent.
@@ -606,13 +609,20 @@ sub rcs_receive () { #{{{
        while (<>) {
                chomp;
                my ($oldrev, $newrev, $refname) = split(' ', $_, 3);
        while (<>) {
                chomp;
                my ($oldrev, $newrev, $refname) = split(' ', $_, 3);
-
+               
                # only allow changes to gitmaster_branch
                if ($refname !~ /^refs\/heads\/\Q$config{gitmaster_branch}\E$/) {
                        error sprintf(gettext("you are not allowed to change %s"), $refname);
                }
                # only allow changes to gitmaster_branch
                if ($refname !~ /^refs\/heads\/\Q$config{gitmaster_branch}\E$/) {
                        error sprintf(gettext("you are not allowed to change %s"), $refname);
                }
-
-               foreach my $ci (git_commit_info($oldrev."..".$newrev)) {
+               
+               # Avoid chdir when running git here, because the changes
+               # are in the master git repo, not the srcdir repo.
+               # The pre-recieve hook already puts us in the right place.
+               $no_chdir=1;
+               my @changes=git_commit_info($oldrev."..".$newrev);
+               $no_chdir=0;
+
+               foreach my $ci (@changes) {
                        foreach my $detail (@{ $ci->{'details'} }) {
                                my $file = $detail->{'file'};
 
                        foreach my $detail (@{ $ci->{'details'} }) {
                                my $file = $detail->{'file'};
 
@@ -623,8 +633,7 @@ sub rcs_receive () { #{{{
                                        error sprintf(gettext("you are not allowed to change %s"), $file);
                                }
 
                                        error sprintf(gettext("you are not allowed to change %s"), $file);
                                }
 
-                               my $action;
-                               my $mode;                       
+                               my ($action, $mode, $path);
                                if ($detail->{'status'} =~ /^[M]+\d*$/) {
                                        $action="change";
                                        $mode=$detail->{'mode_to'};
                                if ($detail->{'status'} =~ /^[M]+\d*$/) {
                                        $action="change";
                                        $mode=$detail->{'mode_to'};
@@ -632,6 +641,15 @@ sub rcs_receive () { #{{{
                                elsif ($detail->{'status'} =~ /^[AM]+\d*$/) {
                                        $action="add";
                                        $mode=$detail->{'mode_to'};
                                elsif ($detail->{'status'} =~ /^[AM]+\d*$/) {
                                        $action="add";
                                        $mode=$detail->{'mode_to'};
+                                       if (! pagetype($file)) {
+                                               eval q{use File::Temp};
+                                               die $@ if $@;
+                                               my $fh;
+                                               ($fh, $path)=tempfile("XXXXXXXXXX", UNLINK => 1);
+                                               if (system("git show ".$detail->{sha1_to}." > '$path'") != 0) {
+                                                       error("failed writing temp file");
+                                               }
+                                       }
                                }
                                elsif ($detail->{'status'} =~ /^[DAM]+\d*/) {
                                        $action="remove";
                                }
                                elsif ($detail->{'status'} =~ /^[DAM]+\d*/) {
                                        $action="remove";
@@ -654,6 +672,7 @@ sub rcs_receive () { #{{{
                                push @rets, {
                                        file => $file,
                                        action => $action,
                                push @rets, {
                                        file => $file,
                                        action => $action,
+                                       path => $path,
                                };
                        }
                }
                                };
                        }
                }
index 63944bb81260b5a72a4224879ace1a0ebfc8e761..4d437cf78825c33e2b8680c0b458e530c66557fb 100644 (file)
@@ -66,11 +66,10 @@ sub test () { #{{{
                                }
                        }
                        else {
                                }
                        }
                        else {
-                               # TODO
-                               #if (IkiWiki::Plugin::attachment->can("check_canattach") &&
-                               #    IkiWiki::Plugin::attachment::check_canattach($session, $file, $path)) {
-                               #       next;
-                               #}
+                               if (IkiWiki::Plugin::attachment->can("check_canattach") &&
+                                   IkiWiki::Plugin::attachment::check_canattach($session, $file, $change->{path})) {
+                                       next;
+                               }
                        }
                }
                elsif ($change->{action} eq 'remove') {
                        }
                }
                elsif ($change->{action} eq 'remove') {
index 9f096e4f75243578426cfed39730e6901e686a37..7fbe4bd576f2bedb2c7b464cd3bb68cd60cb2037 100644 (file)
@@ -829,13 +829,16 @@ sense to implement for all RCSs.
 
 It should examine the incoming changes, and do any sanity 
 checks that are appropriate for the RCS to limit changes to safe file adds,
 
 It should examine the incoming changes, and do any sanity 
 checks that are appropriate for the RCS to limit changes to safe file adds,
-removes, and renames. If something bad is found, it should exit
+removes, and changes. If something bad is found, it should exit
 nonzero, to abort the push. Otherwise, it should return a list of
 files that were changed, in the form:
 
        {
                file => # name of file that was changed
                action => # either "add", "change", or "remove"
 nonzero, to abort the push. Otherwise, it should return a list of
 files that were changed, in the form:
 
        {
                file => # name of file that was changed
                action => # either "add", "change", or "remove"
+               path => # temp file containing the new file content, only
+                       # needed for "add", and only if the file is an
+                       # attachment, not a page
        }
 
 The list will then be checked to make sure that each change is one that
        }
 
 The list will then be checked to make sure that each change is one that