]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Rcs/git.pm
* aggregate: Don't let feeds set creation times for pages in the future.
[ikiwiki.git] / IkiWiki / Rcs / git.pm
index c436deb4da0ab7334ac087ca318ac41b2847fa72..d4d2ec7a943b7c2fd6639dc25555947e3b5ad467 100644 (file)
@@ -51,7 +51,7 @@ sub run_or_non ($@) { _safe_git(undef,            @_) }
 sub _merge_past ($$$) { #{{{
        # Unlike with Subversion, Git cannot make a 'svn merge -rN:M file'.
        # Git merge commands work with the committed changes, except in the
-       # implicit case of '-m' of git-checkout(1).  So we should invent a
+       # implicit case of '-m' of git checkout(1).  So we should invent a
        # kludge here.  In principle, we need to create a throw-away branch
        # in preparing for the merge itself.  Since branches are cheap (and
        # branching is fast), this shouldn't cost high.
@@ -60,7 +60,7 @@ sub _merge_past ($$$) { #{{{
        # possible approach to get rid of this situation could be that we first
        # make a temporary commit in the master branch and later restore the
        # initial state (this is possible since Git has the ability to undo a
-       # commit, i.e. 'git-reset --soft HEAD^').  The method can be summarized
+       # commit, i.e. 'git reset --soft HEAD^').  The method can be summarized
        # as follows:
        #
        #       - create a diff of HEAD:current-sha1
@@ -103,30 +103,30 @@ sub _merge_past ($$$) { #{{{
                my $branch = "throw_away_${sha1}"; # supposed to be unique
 
                # Create a throw-away branch and rewind backward.
-               push @undo, sub { run_or_cry('git-branch', '-D', $branch) };
-               run_or_die('git-branch', $branch, $sha1);
+               push @undo, sub { run_or_cry('git', 'branch', '-D', $branch) };
+               run_or_die('git', 'branch', $branch, $sha1);
 
                # Switch to throw-away branch for the merge operation.
                push @undo, sub {
-                       if (!run_or_cry('git-checkout', $config{gitmaster_branch})) {
-                               run_or_cry('git-checkout','-f',$config{gitmaster_branch});
+                       if (!run_or_cry('git', 'checkout', $config{gitmaster_branch})) {
+                               run_or_cry('git', 'checkout','-f',$config{gitmaster_branch});
                        }
                };
-               run_or_die('git-checkout', $branch);
+               run_or_die('git', 'checkout', $branch);
 
                # Put the modified file in _this_ branch.
                rename($hidden, $target)
                    or error("rename '$hidden' to '$target' failed: $!");
 
                # _Silently_ commit all modifications in the current branch.
-               run_or_non('git-commit', '-m', $message, '-a');
+               run_or_non('git', 'commit', '-m', $message, '-a');
                # ... and re-switch to master.
-               run_or_die('git-checkout', $config{gitmaster_branch});
+               run_or_die('git', 'checkout', $config{gitmaster_branch});
 
                # Attempt to merge without complaining.
-               if (!run_or_non('git-pull', '--no-commit', '.', $branch)) {
+               if (!run_or_non('git', 'pull', '--no-commit', '.', $branch)) {
                        $conflict = readfile($target);
-                       run_or_die('git-reset', '--hard');
+                       run_or_die('git', 'reset', '--hard');
                }
        };
        my $failure = $@;
@@ -196,10 +196,14 @@ sub _parse_diff_tree ($@) { #{{{
                }
        }
 
-       debug("No 'tree' or 'parents' seen in diff-tree output")
-           if !defined $ci{'tree'} || !defined $ci{'parents'};
+       debug("No 'tree' seen in diff-tree output") if !defined $ci{'tree'};
 
-       $ci{'parent'} = @{ $ci{'parents'} }[0] if defined $ci{'parents'};
+       if (defined $ci{'parents'}) {
+               $ci{'parent'} = @{ $ci{'parents'} }[0];
+       }
+       else {
+               $ci{'parent'} = 0 x 40;
+       }
 
        # Commit message.
        while (my $line = shift @{ $dt_ref }) {
@@ -254,10 +258,10 @@ sub git_commit_info ($;$) { #{{{
 
        $num ||= 1;
 
-       my @raw_lines = run_or_die('git-log', "--max-count=$num", 
-               '--pretty=raw', '--raw', '--abbrev=40', '--always', '-m',
+       my @raw_lines = run_or_die('git', 'log', "--max-count=$num", 
+               '--pretty=raw', '--raw', '--abbrev=40', '--always', '-c',
                '-r', $sha1, '--', '.');
-       my ($prefix) = run_or_die('git-rev-parse', '--show-prefix');
+       my ($prefix) = run_or_die('git', 'rev-parse', '--show-prefix');
 
        my @ci;
        while (my $parsed = _parse_diff_tree(($prefix or ""), \@raw_lines)) {
@@ -275,7 +279,7 @@ sub git_sha1 (;$) { #{{{
        my $file = shift || q{--};
 
        # Ignore error since a non-existing file might be given.
-       my ($sha1) = run_or_non('git-rev-list', '--max-count=1', 'HEAD', $file);
+       my ($sha1) = run_or_non('git', 'rev-list', '--max-count=1', 'HEAD', $file);
        if ($sha1) {
                ($sha1) = $sha1 =~ m/($sha1_pattern)/; # sha1 is untainted now
        } else { debug("Empty sha1sum for '$file'.") }
@@ -286,7 +290,7 @@ sub rcs_update () { #{{{
        # Update working directory.
 
        if (length $config{gitorigin_branch}) {
-               run_or_cry('git-pull', $config{gitorigin_branch});
+               run_or_cry('git', 'pull', $config{gitorigin_branch});
        }
 } #}}}
 
@@ -319,7 +323,7 @@ sub rcs_commit ($$$;$$) { #{{{
        # action.  But it takes time for a Git process to finish its job
        # (especially if a merge required), so we must re-lock to prevent
        # race conditions.  Only when the time of the real commit action
-       # (i.e. git-push(1)) comes, we'll unlock the directory.
+       # (i.e. git push) comes, we'll unlock the directory.
        lockwiki();
 
        # Check to see if the page has been changed by someone else since
@@ -332,13 +336,13 @@ sub rcs_commit ($$$;$$) { #{{{
                return $conflict if defined $conflict;
        }
 
-       # git-commit(1) returns non-zero if file has not been really changed.
+       # 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', '-m', $message, '-i', $file)) {
+       if (run_or_non('git', 'commit', '-q', '-m', $message, '-i', $file)) {
                unlockwiki();
                if (length $config{gitorigin_branch}) {
-                       run_or_cry('git-push', $config{gitorigin_branch});
+                       run_or_cry('git', 'push', $config{gitorigin_branch});
                }
        }
 
@@ -350,7 +354,7 @@ sub rcs_add ($) { # {{{
 
        my ($file) = @_;
 
-       run_or_cry('git-add', $file);
+       run_or_cry('git', 'add', $file);
 } #}}}
 
 sub rcs_recentchanges ($) { #{{{
@@ -363,10 +367,8 @@ sub rcs_recentchanges ($) { #{{{
 
        my @rets;
        foreach my $ci (git_commit_info('HEAD', $num)) {
-               my $title = @{ $ci->{'comment'} }[0];
-
                # Skip redundant commits.
-               next if ($title eq $dummy_commit_msg);
+               next if (@{$ci->{'comment'}}[0] eq $dummy_commit_msg);
 
                my ($sha1, $when) = (
                        $ci->{'sha1'},
@@ -388,7 +390,7 @@ sub rcs_recentchanges ($) { #{{{
                                diffurl => $diffurl,
                        };
                }
-               push @messages, { line => $title };
+               push @messages, { line => $_ } foreach @{$ci->{'comment'}};
 
                my ($user, $type) = (q{}, "web");
 
@@ -409,7 +411,7 @@ sub rcs_recentchanges ($) { #{{{
                        when       => $when,
                        message    => [@messages],
                        pages      => [@pages],
-               };
+               } if @pages;
 
                last if @rets >= $num;
        }
@@ -431,12 +433,9 @@ sub rcs_notify () { #{{{
        #
        # Here, we rely on a simple fact: we can extract all parts of the
        # notification content by parsing the "HEAD" commit (which also
-       # triggers a refresh of IkiWiki pages) and we can obtain the diff
-       # by comparing HEAD and HEAD^ (the previous commit).
-
-       my $sha1 = 'HEAD'; # the commit which triggers this action
+       # triggers a refresh of IkiWiki pages).
 
-       my $ci = git_commit_info($sha1);
+       my $ci = git_commit_info('HEAD');
        return if !defined $ci;
 
        my @changed_pages = map { $_->{'file'} } @{ $ci->{'details'} };
@@ -451,13 +450,15 @@ sub rcs_notify () { #{{{
                $message = join "\n", @{ $ci->{'comment'} };
        }
 
+       my $sha1 = $ci->{'sha1'};
+
        require IkiWiki::UserInfo;
        send_commit_mails(
                sub {
                        $message;
                },
                sub {
-                       join "\n", run_or_die('git-diff', "${sha1}^", $sha1);
+                       join "\n", run_or_die('git', 'diff', "${sha1}^", $sha1);
                }, $user, @changed_pages
        );
 } #}}}