// ==UserScript== // @name Manage Debian bug reports directly from web // @description Generate ready-to-send email messages to change the status of bugs (tags and user tags, severity, forwarded address). // @namespace https://salsa.debian.org/gioele/ // @version 20160111.0 // @icon https://www.debian.org/favicon.ico // @include https://bugs.debian.org/* // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/jquery-details/0.1.0/jquery.details.min.js // @grant none // @downloadURL https://update.greasyfork.cloud/scripts/439601/Manage%20Debian%20bug%20reports%20directly%20from%20web.user.js // @updateURL https://update.greasyfork.cloud/scripts/439601/Manage%20Debian%20bug%20reports%20directly%20from%20web.meta.js // ==/UserScript== // prevent JQuery conflicts, see http://wiki.greasespot.net/@grant this.$ = this.jQuery = jQuery.noConflict(true); function bug_number_str_fn() { var bug_link_elem = $('h1 a').first(); var bug_num_str = bug_link_elem.text().substr(1); return bug_num_str; } function bug_title_fn() { var bug_title_elem = $('h1').first(); var bug_title_text_node = bug_title_elem .contents() .filter(function() { return this.nodeType == Node.TEXT_NODE; }).last(); var bug_title_text = bug_title_text_node.text().trim(); return bug_title_text; } function bug_package_fn() { var bug_package_elem = $('a.submitter').first(); var bug_package_text = bug_package_elem.text().trim(); return bug_package_text; } function bug_panel_fn() { var bug_panel = $('
'); bug_panel.append($("Additional fields…")); return bug_panel; } function href_for_mail(to_address, cc_addresses, reply_to_address, subject, body) { reply_to_address = reply_to_address || ""; body = body || ""; var href; href = "mailto:" + to_address; href += "?subject=" + encodeURIComponent(subject); for (var cc_address of cc_addresses) { href += "&cc=" + cc_address; } href += "&body="; if (reply_to_address != "") { href += "Reply-To: " + reply_to_address + "%0D%0A"; } href += encodeURIComponent(body); return href; } function command_for_action(action, value, bug_number_str) { var command; switch (action) { case 'severity': var severity = value; command = 'severity ' + bug_number_str + ' ' + severity; break; case 'tags': var diff = value; command = 'tags ' + bug_number_str + ' ' + diff; break; case 'found': // FIXME: support more than one found command var version = value; command = 'found ' + bug_number_str + ' ' + version; break; case 'notfound': // FIXME: support more than one notfound command var version = value; command = 'notfound ' + bug_number_str + ' ' + version; break; case 'forwarded': var url = value; command = 'forwarded ' + bug_number_str + ' ' + url; break; case 'notforwarded': command = 'notforwarded ' + bug_number_str; break; } return command } function href_for_reply(bug_number_str, bug_package, bug_title, kind, actions) { var to_address; var reply_to_address = bug_number_str + "@bugs.debian.org"; var cc_addresses = []; var subject = "Re: Bug#" + bug_number_str + ": " + bug_title; var body = ""; // addresses switch (kind) { case 'reply': to_address = bug_number_str + '@bugs.debian.org'; cc_addresses.push(bug_number_str + '-submitter@bugs.debian.org'); break; case 'close': to_address = bug_number_str + '-close@bugs.debian.org'; break; case 'subscribe': to_address = bug_number_str + '-subscribe@bugs.debian.org'; subject = subject.replace(/^Re: /, "Subscribe "); reply_to_address = ""; break; } // body var newline = "\r\n"; for (var action in actions) { var value = actions[action]; body += 'Control: ' + command_for_action(action, value, '-1') + newline; } return href_for_mail(to_address, cc_addresses, reply_to_address, subject, body); } function href_for_control(bug_number_str, bug_package, bug_title, actions) { var to_address = "control@bugs.debian.org"; var reply_to_address; var cc_addresses = []; var subject = ""; var body = ""; // subject var action_names = Object.getOwnPropertyNames(actions); if (action_names.length != 0) { subject += action_names[0] + " "; } subject += bug_number_str + " [" + bug_package + "] " + bug_title; // body var newline = "\r\n"; body += "package " + bug_package + newline; for (var action in actions) { var value = actions[action]; body += command_for_action(action, value, bug_number_str) + newline; } body += "thanks" + newline; return href_for_mail(to_address, cc_addresses, reply_to_address, subject, body); } function commands_for_bts(bug_number_str, bug_package, actions) { var cmdline = 'bts'; cmdline += ' package ' + bug_package; var first_action = true; for (var action in actions) { var value = actions[action]; cmdline += ' , '; bug_id = first_action ? bug_number_str : 'it'; cmdline += command_for_action(action, value, bug_id); first_action = false; } return cmdline; } function add_to_info_or_panel(text, field, bug_panel) { var field_orig = $('div.buginfo p:contains("' + text + '")'); if (field_orig.length != 0) { field_orig.after(field); field_orig.hide(); } else { bug_panel.append(field); } } function setup_bug_actions_links() { var reply_link_elem = $('a:contains("Reply")').first(); reply_link_elem.attr('id', 'bug-actions-reply'); reply_link_elem.after($('close')); reply_link_elem.after(', '); var subscribe_link_elem = $('a:contains("subscribe")').first(); subscribe_link_elem.attr('id', 'bug-actions-subscribe'); } function enhance_bug_panel() { var bug_number_str = bug_number_str_fn(); // FIXME if (bug_number_str == "") { return; } var bug_panel = bug_panel_fn(); var severity_field = $('

'); severity_field.append($('Severity:')); severity_field.append(' '); severity_field.append($('')); var severity_select = $('')); tags_field.append($('')); tags_field.on("change keyup keydown", function() { update_bug_links(); }); add_to_info_or_panel("Tags: ", tags_field, bug_panel); var found_field = $('

'); found_field.append($('Found in version ')); found_field.append(' '); found_field.append($('')); found_field.append($('')); found_field.on("change keyup keydown", function() { update_bug_links(); }); add_to_info_or_panel("Found in version", found_field, bug_panel); var forwarded_field = $('

'); forwarded_field.append($('Forwarded to')); forwarded_field.append(' '); forwarded_field.append($('')); forwarded_field.append($('')); forwarded_field.on("change keyup keydown", function() { update_bug_links(); }); add_to_info_or_panel("Forwarded to", forwarded_field, bug_panel); var bug_commands_elem = $('

'); bug_commands_elem.append($('Scheduled bug commands')); bug_commands_elem.append(' '); bug_commands_elem.append($('')); bug_commands_elem.append(' '); bug_commands_elem.append($('submit via control')); bug_commands_elem.append(', '); var submit_via_bts_elem = $('via bts'); submit_via_bts_elem.on('click', function() { $('p#bts-commands-field').show(100); return false; }); bug_commands_elem.append(submit_via_bts_elem); var bts_commands_field = $('

'); bts_commands_field.append('Use this command line: '); bts_commands_field.append(' '); bts_commands_field.append($('')); bts_commands_field.hide(); var bug_command_list_elem = $('