// // This is the main JS file for QuickSearch. // // Derived from: // // * C. Begle's SimpleSearch tool: // http://www.mozilla.org/quality/help/simplesearch.html // http://www.mozilla.org/quality/help/bugreport.js // // * Jesse Ruderman's bugzilla search page: // http://www.cs.hmc.edu/~jruderma/s/bugz.html // // Created by // Andreas Franke // // Contributors: // Stephen Lee // Use no_result variable to avoid problems with "undefined" on some browsers var no_result="---"; // do_unshift(l, s) is equivalent to l.unshift(s), but some browsers do not // support the built-in function. function do_unshift(l, s) { l.length = l.length + 1; for (var i=l.length-1; i>0; i--) { l[i] = l[i-1]; } l[0] = s; return l.length; } // do_shift(l) is equivalent to l.shift(s), but some browsers do not // support the built-in function. function do_shift(l) { var l0=l[0]; for (var i=0; i "dependson" // "OtherBugsDependingOnThis"--> "blocked" //add_mapping("dependson", "dependson"); //add_mapping("blocked", "blocked"); // Substring search doesn't make much sense for the following fields: // "Attachment is patch" --> "attachments.ispatch" // "Last changed date" --> "delta_ts" // "Days since bug changed" --> "(to_days(now()) - to_days(bugs.delta_ts))" //"groupset" //"everconfirmed" //"bug","bugid","bugno" --> "bug_id" // "votes" --> "votes" // "votes>5", "votes>=5", "votes=>5" works now, see below // "votes:5" is interpreted as "votes>=5" function findIndex(array,value) { for (var i=0; i= 0) return f2[i]; return no_result; } // `keywords' is defined externally function is_keyword(s) { return member(s, keywords); } // `platforms' is defined externally function is_platform(str) { return member (str.toLowerCase(),platforms); } // `severities' is defined externally function is_severity(str) { return member(str.toLowerCase(),severities); } // `product_exceptions' is defined externally function match_product(str) { var s = str.toLowerCase(); return (s.length > 2) && (! member(s,product_exceptions)); } // `component_exceptions are defined externally function match_component(str) { var s = str.toLowerCase(); return (s.length > 2) && (! member(s,component_exceptions)); } var status_and_resolution = ""; // for pretty debug output only; these vars var charts = ""; // always hold the data from the last query // derived from http://www.mozilla.org/quality/help/bugreport.js function make_chart(expr, field, type, value) { charts += "" + "" + expr + "" + "" + field + "" + "" + type + "" + "" + value + "" + ""; return "&field" + expr + "=" + field + "&type" + expr + "=" + type + "&value" + expr + "=" + escape(value).replace(/[+]/g,"%2B"); } // returns true if at least one of comparelist had the prefix, false otherwise function addPrefixMatches(prefix, comparelist, resultlist) { var foundMatch = false; for (var i=0; i "foo%20bar" parts = input.split('"'); if ((parts.length % 2) != 1) { alert('Unterminated quote'); abort = true; return no_result; } for (i=1; i 0)) { prefixesNotFoundError(failedPrefixes,statuses,resolutions); abort = true; } return foundMatch; } if (word[0] == "ALL") { // special case: search for bugs regardless of status addAll(statusResolved,bug_status); do_shift(word); } else if (word[0] == "OPEN") { // special case: search for open bugs only do_shift(word); } else if (word[0].match("^[+][A-Z]+(,[A-Z]+)*$")) { // e.g. +DUP,FIX w0 = do_shift(word); prefixes = w0.substring(1).split(","); if (! matchPrefixes(prefixes,statusResolved,resolutions)) { do_unshift(word,w0); } } else if (word[0].match("^[A-Z]+(,[A-Z]+)*$")) { // e.g. NEW,ASSI,REOP,FIX bug_status = new Array(); // reset w0 = do_shift(word); prefixes = w0.split(","); if (! matchPrefixes(prefixes,statusAll,resolutions)) { do_unshift(word,w0); bug_status = statusOpen.reverse(); //reset to default bug_status } } else { // default case: // search for unresolved bugs only // uncomment this to include duplicate bugs in the search // add("DUPLICATE",resolution); } if (resolution.length > 0) { resolution = resolution.reverse(); do_unshift(resolution,"---"); addAll(statusResolved,bug_status); } bug_status = bug_status.reverse(); bug_status = map(bug_status,escape); searchURL += "?bug_status=" + bug_status.join("&bug_status="); status_and_resolution += 'Status: '+bug_status+''; if (resolution.length > 0) { resolution = map(resolution,escape); searchURL += "&resolution=" + resolution.join("&resolution="); status_and_resolution += '
'+'Resolution: '+resolution+''; } // end of bug_status & resolution stuff chart = 0; and = 0; or = 0; negation = false; function negate_comparison_type(type) { switch(type) { case "substring": return "notsubstring"; case "anywords": return "nowords"; case "regexp": return "notregexp"; default: // e.g. "greaterthan" alert("Can't negate comparison type: `" + type + "'"); abort = true; return "dummy"; } } function add_chart(field,type,value) { // undo escaping for value: '"foo%20bar"' --> 'foo bar' var parts = value.split('"'); if ((parts.length % 2) != 1) { alert('Internal error: unescaping failure'); abort = true; } for (var i=1; ixx if (w.match("^votes>[0-9]+$")) { n = w.split(">")[1]; add_chart("votes","greaterthan",n); continue; } // votes>=xx, votes=>xx if (w.match("^votes(>=|=>)[0-9]+$")) { separator = w.match("^votes(>=|=>)[0-9]+$")[1]; n = w.split(separator)[1]; add_chart("votes","greaterthan",String(n-1)); continue; } // really default case if (match_product(w)) { add_chart("product","substring",w); } if (match_component(w)) { add_chart("component","substring",w); } if (is_keyword(w)) { add_chart("keywords","substring",w); if (w.length > 2) { add_chart("short_desc","substring",w); add_chart("status_whiteboard","substring",w); } } else { add_chart("short_desc","substring",w); add_chart("status_whiteboard","substring",w); } if (searchLong) add_chart("longdesc","substring",w); // URL field (for IP addrs, host.names, scheme://urls) if (w.match(/[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+/) || w.match(/^[A-Za-z]+([.][A-Za-z]+)+/) || w.match(/[:][\/][\/]/) || w.match(/localhost/) || w.match(/mailto[:]?/) // || w.match(/[A-Za-z]+[:][0-9]+/) //host:port ) add_chart("bug_file_loc","substring",w); } } } and = 0; or = 0; } //searchURL += "&cmdtype=doit"; if (abort == false) { return searchURL; } else { return no_result; } } function unique_id () { return (new Date()).getTime(); } function ShowURL(mode) { var input = document.f.id.value; var searchURL = make_query_URL(bugzilla+"buglist.cgi", input, false); if (searchURL != no_result) { var pieces = searchURL.replace(/[\?]/g,"\n?").replace(/[\&]/g,"\n&"); if (mode == "alert") { alert(pieces); } else { var table = "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + charts + "" + "
Chart-And-OrFieldTypeValue
"; var html = '' + '' + '' + input + '' + '' + '' + '' + 'Submit Query' + '' + '

' + status_and_resolution + '

' + table + '

' +
                             pieces.replace(/[\n]/g,"
") + '
' + '' + ''; var w = window.open("","preview_"+unique_id()); w.document.write(html); w.document.close(); } } } // // new interface: // searchLong is a boolean now (not a checkbox/radiobutton) // function Search(url, input, searchLong) { var inputstring = new String(input); var word = inputstring.split(/[\s]+/); // Check for empty input if ( word.length == 1 && word[0] == "" ) return; // Check for potential Bugzilla-busting intensive queries if ((searchLong!=false) && word.length > 4) { var message = "Searching Descriptions for more than four words " + "will take a very long time indeed. Please choose " + "no more than four keywords for your query."; alert(message); return; } var searchURL = make_query_URL(url, inputstring, searchLong); if (searchURL != no_result) { go_to(searchURL); //window.open(searchURL, "other" ); } else { return; } } // // original interface, untested // //function SearchForBugs (input, searchRadio) { // if (searchRadio[0].checked) { // return Search(bugzilla + "buglist.cgi", input, false); // } else { // return Search(bugzilla + "buglist.cgi", input, true); // } //} // derived from http://www.cs.hmc.edu/~jruderma/s/bugz.html // QuickSearch combines lookup-by-bug-number and search // in a single textbox. It's name must be document.f.id . // // type nothing: // --> go to bugzilla front page // type a number: // --> go to that bug number // type several numbers, separated by commas: // --> go to a buglist of just those bug numbers // type anything else: // --> search summary, product, component, keywords, status whiteboard // (and URL if it's an IP address, a host.name, or an absolute://URL) function QuickSearch () { var input = document.f.id.value; //remove leading and trailing whitespace input = input.replace(/^[\s]+/,"").replace(/[\s]+$/,""); if (input == "") { //once this _is_ on http://bugzilla.mozilla.org, it should just return; go_to(bugzilla); } else if (input.match(/^[0-9, ]*$/)) { if (input.indexOf(",") == -1) { // only _one_ bug number --> show_bug go_to(bugzilla+"show_bug.cgi?id="+escape(input)); } else { // comma-separated bug numbers --> buglist go_to(bugzilla+"buglist.cgi?bug_id="+escape(input) + "&bugidtype=include&order=bugs.bug_id"); } } else { Search(bugzilla+"buglist.cgi",input,false); } return; } function LoadQuery() { var input = document.f.id.value; //remove leading and trailing whitespace input = input.replace(/^[\s]+/,"").replace(/[\s]+$/,""); Search(bugzilla+"query.cgi",input,false); return; }