X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/ac62a47ea431271447909b17e883eeaefa87aaea..426200b34aef45e3987edf79bc157209f435fb8b:/IkiWiki/Rcs/git.pm diff --git a/IkiWiki/Rcs/git.pm b/IkiWiki/Rcs/git.pm index f71b57774..ecf560d0b 100644 --- a/IkiWiki/Rcs/git.pm +++ b/IkiWiki/Rcs/git.pm @@ -197,7 +197,7 @@ sub _parse_diff_tree ($@) { #{{{ } debug("No 'tree' seen in diff-tree output") if !defined $ci{'tree'}; - + if (defined $ci{'parents'}) { $ci{'parent'} = @{ $ci{'parents'} }[0]; } @@ -205,15 +205,13 @@ sub _parse_diff_tree ($@) { #{{{ $ci{'parent'} = 0 x 40; } - # Commit message. - while (my $line = shift @{ $dt_ref }) { - if ($line =~ m/^$/) { - # Trailing empty line signals next section. - last; - }; + # Commit message (optional). + while ($dt_ref->[0] =~ /^ /) { + my $line = shift @{ $dt_ref }; $line =~ s/^ //; push @{ $ci{'comment'} }, $line; } + shift @{ $dt_ref } if $dt_ref->[0] =~ /^$/; # Modified files. while (my $line = shift @{ $dt_ref }) { @@ -320,19 +318,29 @@ sub rcs_commit ($$$;$$) { #{{{ my $conflict = _merge_past($prev, $file, $dummy_commit_msg); return $conflict if defined $conflict; } - - # Set the commit author to the web committer. + + rcs_add($file); + return rcs_commit_staged($message, $user, $ipaddr); +} #}}} + +sub rcs_commit_staged ($$$) { + # Commits all staged changes. Changes can be staged using rcs_add, + # rcs_remove, and rcs_rename. + my ($message, $user, $ipaddr)=@_; + + # Set the commit author and email to the web committer. my %env=%ENV; if (defined $user || defined $ipaddr) { - $ENV{GIT_AUTHOR_NAME}=defined $user ? $user : $ipaddr; - $ENV{GIT_AUTHOR_EMAIL}=""; - $message.="\n\nWeb-commit: true\n"; + my $u=defined $user ? $user : $ipaddr; + $ENV{GIT_AUTHOR_NAME}=$u; + $ENV{GIT_AUTHOR_EMAIL}="$u\@web"; } # git commit returns non-zero if file has not been really changed. # so we should ignore its exit status (hence run_or_non). $message = possibly_foolish_untaint($message); - if (run_or_non('git', 'commit', '-q', '-m', $message, '-i', $file)) { + if (run_or_non('git', 'commit', '--cleanup=verbatim', + '-q', '-m', $message)) { if (length $config{gitorigin_branch}) { run_or_cry('git', 'push', $config{gitorigin_branch}); } @@ -340,7 +348,7 @@ sub rcs_commit ($$$;$$) { #{{{ %ENV=%env; return undef; # success -} #}}} +} sub rcs_add ($) { # {{{ # Add file to archive. @@ -350,6 +358,20 @@ sub rcs_add ($) { # {{{ run_or_cry('git', 'add', $file); } #}}} +sub rcs_remove ($) { # {{{ + # Remove file from archive. + + my ($file) = @_; + + run_or_cry('git', 'rm', '-f', $file); +} #}}} + +sub rcs_rename ($$) { # {{{ + my ($src, $dest) = @_; + + run_or_cry('git', 'mv', '-f', $src, $dest); +} #}}} + sub rcs_recentchanges ($) { #{{{ # List of recent changes. @@ -361,7 +383,7 @@ sub rcs_recentchanges ($) { #{{{ my @rets; foreach my $ci (git_commit_info('HEAD', $num)) { # Skip redundant commits. - next if (@{$ci->{'comment'}}[0] eq $dummy_commit_msg); + next if ($ci->{'comment'} && @{$ci->{'comment'}}[0] eq $dummy_commit_msg); my ($sha1, $when) = ( $ci->{'sha1'}, @@ -384,28 +406,24 @@ sub rcs_recentchanges ($) { #{{{ }; } - my $web_commit=0; my @messages; my $pastblank=0; foreach my $line (@{$ci->{'comment'}}) { $pastblank=1 if $line eq ''; next if $pastblank && $line=~m/^ *(signed[ \-]off[ \-]by[ :]|acked[ \-]by[ :]|cc[ :])/i; - if ($pastblank && $line=~m/^ *web-commit: true$/i) { - $web_commit=1; - next; - } push @messages, { line => $line }; } - my $user; + my $user=$ci->{'author_username'}; + my $web_commit = ($ci->{'author'} =~ /\@web>/); + # compatability code for old web commit messages - if (! $web_commit && defined $messages[0] && - $messages[0]->{line} =~ m/$config{web_commit_regexp}/) { + if (! $web_commit && + defined $messages[0] && + $messages[0]->{line} =~ m/$config{web_commit_regexp}/) { $user = defined $2 ? "$2" : "$3"; $messages[0]->{line} = $4; - } - else { - $user = $ci->{'author_username'}; + $web_commit=1; } push @rets, {