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 $no_chdir=0;
 
 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.
-               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.
@@ -606,13 +609,20 @@ sub rcs_receive () { #{{{
        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);
                }
-
-               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'};
 
@@ -623,8 +633,7 @@ sub rcs_receive () { #{{{
                                        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'};
@@ -632,6 +641,15 @@ sub rcs_receive () { #{{{
                                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";
@@ -654,6 +672,7 @@ sub rcs_receive () { #{{{
                                push @rets, {
                                        file => $file,
                                        action => $action,
+                                       path => $path,
                                };
                        }
                }
index 63944bb81260b5a72a4224879ace1a0ebfc8e761..4d437cf78825c33e2b8680c0b458e530c66557fb 100644 (file)
@@ -66,11 +66,10 @@ sub test () { #{{{
                                }
                        }
                        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') {
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,
-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"
+               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