~launchpad-pqm/launchpad/devel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/* Copyright 2011 Canonical Ltd.  This software is licensed under the
 * GNU Affero General Public License version 3 (see the file LICENSE).
 *
 * Expandable branch revisions.
 *
 * @module lp.code.branch.revisionexpander
 * @requires node, lp.client.plugins
 */

YUI.add('lp.code.branch.revisionexpander', function(Y) {

var namespace = Y.namespace('lp.code.branch.revisionexpander');

/*
 * Take a single revno, or a pair of revnos specifying a revision range, and
 * construct a URL to get the diff of those revnos using
 * LP.cache.branch_diff_link.
 */
function bmp_get_diff_url(start_revno, end_revno) {
    var diff_url;
    if (Y.Lang.isUndefined(end_revno)) {
        /* No end_revno passed, so only after a single revision diff. */
        return LP.cache.branch_diff_link + start_revno;
    }
    diff_url = LP.cache.branch_diff_link + end_revno;
    if (start_revno !== 0) {
       diff_url += '/' + start_revno;
    } else if (start_revno === 0 && end_revno !== 1) {
       diff_url += '/null:';
    }
    return diff_url;
}

function difftext_to_node(difftext) {
    var node = Y.Node.create('<table class="diff"></table>');
    var difflines = difftext.split('\n');
    var i;
    /* Remove the empty final row caused by a trailing newline
     * (if it is empty) */
    if (difflines.length > 0 && difflines[difflines.length-1] === '') {
        difflines.pop();
    }

    for (i=0; i < difflines.length; i++) {
        var line = difflines[i];
        var line_node = Y.Node.create('<td/>');
        line_node.set('text', line + '\n');
        /* Colour the unified diff */
        var header_pat = /^(===|---|\+\+\+) /;
        var chunk_pat = /^@@ /;
        if (line.match(header_pat)) {
            line_node.addClass('diff-header');
        } else if (line.match(chunk_pat)) {
            line_node.addClass('diff-chunk');
        } else {
            switch (line[0]) {
                case '+':
                    line_node.addClass('diff-added');
                    break;
                case '-':
                    line_node.addClass('diff-removed');
                    break;
            }
        }
        line_node.addClass('text');
        var row = Y.Node.create('<tr></tr>');
        row.appendChild(line_node);
        node.appendChild(row);
    }
    return node;
}

function revision_expander_config(expander){
   return {
        on: {
            success: function nodify_result(diff) {
                expander.receive(difftext_to_node(diff));
            },
            failure: function(trid, response, args) {
                expander.receive(Y.Node.create('<pre><i>Error</i></pre>'));
            }
        }
   };
}

function bmp_diff_loader(expander, lp_client) {
    if (lp_client === undefined) {
        lp_client = new Y.lp.client.Launchpad();
    }
    var rev_no_range = expander.icon_node.get(
        'id').replace('expandable-', '').split('-');
    var start_revno = rev_no_range[0]-1;
    var end_revno = rev_no_range[1];

    lp_client.get(bmp_get_diff_url(start_revno, end_revno),
        revision_expander_config(expander));
}

namespace.bmp_diff_loader = bmp_diff_loader;
namespace.difftext_to_node = difftext_to_node;
namespace.bmp_get_diff_url = bmp_get_diff_url;

}, "0.1", {"requires": ["node", "lp.app.widgets.expander"]});