summaryrefslogtreecommitdiff
path: root/doc/todo/bzr.mdwn
blob: 46f2ecdc02c185eb451813aa3c275bb154681919 (plain)

This is mostly based on the Mercurial plugin (in fact, apart from the commands being run, only the name of the rcs was changed in rcs_recentchanges, and rcs_commit was only changed to work around bzr's lack of a switch to set the username). bzr_log could probably be written better by someone better at perl, and rcs_getctime and rcs_notify aren't written at all. --[[bma]]

#!/usr/bin/perl

use warnings;
use strict;
use IkiWiki;
use Encode;
use open qw{:utf8 :std};

package IkiWiki;

sub bzr_log($) {
        my $out = shift;

        my @lines = <$out>;

        my @entries = split(/\n-+\s/,join("", @lines));

        my @ret = ();

        foreach my $entry (@entries) {

                my ($initial,$i) = split(/message:/,$entry,2);
                my ($message, $j, $files) = split(/(added|modified|removed):/,$i,3);
                $message =~ s/\n/\\n/g;
                $files =~ s/\n//g;
                $entry = $initial . "\ndescription: " . $message . "\nfiles: " . $files;

                my @lines = split(/\n/,$entry);
                shift(@lines);

                my %entry;
                foreach (@lines) {
                        my ($key,$value) = split(/: /);
                        $entry{$key} = $value;
                }
                $entry{description}=~s/\\n/\n/g;
                $entry{files}=~s/\s\s+/\ /g;
                $entry{files}=~s/^\s+//g;

                $ret[@ret] = {
                        "description" =>  $entry{description},
                        "user" => $entry{committer},
                        "files" => $entry{files},
                        "date" => $entry{timestamp},
                }
        }

        return @ret;
}

sub rcs_update () { #{{{
        # Not needed.
} #}}}

sub rcs_prepedit ($) { #{{{
        return "";
} #}}}

sub rcs_commit ($$$;$$) { #{{{
        my ($file, $message, $rcstoken, $user, $ipaddr) = @_;

        if (defined $user) {
                $user = possibly_foolish_untaint($user);
        }
        elsif (defined $ipaddr) {
                $user = "Anonymous from ".possibly_foolish_untaint($ipaddr);
        }
        else {
                $user = "Anonymous";
        }

        $message = possibly_foolish_untaint($message);
        if (! length $message) {
                $message = "no message given";
        }

        my $olduser = `bzr whoami`;
        chomp $olduser;
        system("bzr","whoami",$user); # This will set the branch username; there doesn't seem to be a way to do it on a per-commit basis.
                                      # Save the old one and restore after the commit.
        my @cmdline = ("bzr", "commit", "-m", $message, $config{srcdir}."/".$file);
        if (system(@cmdline) != 0) {
                warn "'@cmdline' failed: $!";
        }

        $olduser=possibly_foolish_untaint($olduser);
        system("bzr","whoami",$olduser);

        return undef; # success
} #}}}

sub rcs_add ($) { # {{{
        my ($file) = @_;

        my @cmdline = ("bzr", "add", "--quiet", "$config{srcdir}/$file");
        if (system(@cmdline) != 0) {
                warn "'@cmdline' failed: $!";
        }
} #}}}

sub rcs_recentchanges ($) { #{{{
        my ($num) = @_;

        eval q{use CGI 'escapeHTML'};
        error($@) if $@;

        my @cmdline = ("bzr", "log", "--long", "--verbose", "--limit", $num,$config{srcdir});
        open (my $out, "@cmdline |");

        eval q{use Date::Parse};
        error($@) if $@;

        my @ret;
        foreach my $info (bzr_log($out)) {
                my @pages = ();
                my @message = ();

                foreach my $msgline (split(/\n/, $info->{description})) {
                        push @message, { line => $msgline };
                }

                foreach my $file (split / /,$info->{files}) {
                        my $diffurl = $config{'diffurl'};
                        $diffurl =~ s/\[\[file\]\]/$file/go;
                        $diffurl =~ s/\[\[r2\]\]/$info->{changeset}/go;

                        push @pages, {
                                page => pagename($file),
                                diffurl => $diffurl,
                        };
                }

                my $user = $info->{"user"};
                $user =~ s/\s*<.*>\s*$//;
                $user =~ s/^\s*//;

                push @ret, {
                        rev        => $info->{"changeset"},
                        user       => $user,
                        committype => "bzr",
                        when       => time - str2time($info->{"date"}),
                        message    => [@message],
                        pages      => [@pages],
                };
        }

        return @ret;
} #}}}

sub rcs_notify () { #{{{
        # TODO
} #}}}

sub rcs_getctime ($) { #{{{
        # TODO
} #}}}

1

[[patch]]