New Ticket     Wiki     Browse Source     Timeline     Roadmap     Ticket Reports     Search

Ticket #18259: quickindex-array.diff

File quickindex-array.diff, 14.1 KB (added by jmr@…, 3 years ago)
  • src/port/port.tcl

     
    690690            set installed_epoch     [lindex $i 5] 
    691691 
    692692            # Get info about the port from the index 
    693             if {[catch {set res [mportsearch $portname no exact]} result]} { 
     693            if {[catch {set res [mportlookup $portname]} result]} { 
    694694                global errorInfo 
    695695                ui_debug "$errorInfo" 
    696                 fatal "search for portname $portname failed: $result" 
     696                fatal "lookup of portname $portname failed: $result" 
    697697            } 
    698698            if {[llength $res] < 2} { 
    699699                if {[macports::ui_isset ports_debug]} { 
     
    13611361        # otherwise try to map the portname to a url 
    13621362        if {$porturl eq ""} { 
    13631363        # Verify the portname, getting portinfo to map to a porturl 
    1364             if {[catch {mportsearch $portname no exact} result]} { 
     1364            if {[catch {mportlookup $portname} result]} { 
    13651365                ui_debug "$::errorInfo" 
    1366                 break_softcontinue "search for portname $portname failed: $result" 1 status 
     1366                break_softcontinue "lookup of portname $portname failed: $result" 1 status 
    13671367            } 
    13681368            if {[llength $result] < 2} { 
    13691369                break_softcontinue "Port $portname not found" 1 status 
    13701370            } 
    1371             set found [expr [llength $result] / 2] 
    1372             if {$found > 1} { 
    1373                 ui_warn "Found $found port $portname definitions, displaying first one." 
    1374             } 
    13751371            array unset portinfo 
    13761372            array set portinfo [lindex $result 1] 
    13771373            set porturl $portinfo(porturl) 
     
    17071703 
    17081704    foreachport $portlist { 
    17091705        if {$porturl eq ""} { 
    1710             # Search for the port. 
    1711             if {[catch {mportsearch $portname no exact} result]} { 
     1706            # Look up the port. 
     1707            if {[catch {mportlookup $portname} result]} { 
    17121708                ui_debug $::errorInfo 
    1713                 break_softcontinue "The search for '$portname' failed: $result" \ 
     1709                break_softcontinue "The lookup of '$portname' failed: $result" \ 
    17141710                                1 status 
    17151711            } 
    17161712            if {[llength $result] < 2} { 
     
    21772173            set installed_epoch [lindex $i 5] 
    21782174 
    21792175            # Get info about the port from the index 
    2180             if {[catch {set res [mportsearch $portname no exact]} result]} { 
     2176            if {[catch {set res [mportlookup $portname]} result]} { 
    21812177                global errorInfo 
    21822178                ui_debug "$errorInfo" 
    21832179                break_softcontinue "search for portname $portname failed: $result" 1 status 
     
    22862282    } 
    22872283    foreachport $portlist { 
    22882284        if {$porturl eq ""} { 
    2289             # search for port 
    2290             if {[catch {mportsearch $portname no exact} result]} { 
     2285            # look up port 
     2286            if {[catch {mportlookup $portname} result]} { 
    22912287                global errorInfo 
    22922288                ui_debug "$errorInfo" 
    2293                 break_softcontinue "search for portname $portname failed: $result" 1 status 
     2289                break_softcontinue "lookup of portname $portname failed: $result" 1 status 
    22942290            } 
    22952291            if {[llength $result] < 2} { 
    22962292                break_softcontinue "Port $portname not found" 1 status 
     
    26032599        if {$porturl == ""} { 
    26042600         
    26052601            # Verify the portname, getting portinfo to map to a porturl 
    2606             if {[catch {set res [mportsearch $portname no exact]} result]} { 
     2602            if {[catch {set res [mportlookup $portname]} result]} { 
    26072603                global errorInfo 
    26082604                ui_debug "$errorInfo" 
    2609                 break_softcontinue "search for portname $portname failed: $result" 1 status 
     2605                break_softcontinue "lookup of portname $portname failed: $result" 1 status 
    26102606            } 
    26112607            if {[llength $res] < 2} { 
    26122608                break_softcontinue "Port $portname not found" 1 status 
     
    27602756        # otherwise try to map the portname to a url 
    27612757        if {$porturl == ""} { 
    27622758            # Verify the portname, getting portinfo to map to a porturl 
    2763             if {[catch {set res [mportsearch $portname no exact]} result]} { 
     2759            if {[catch {set res [mportlookup $portname]} result]} { 
    27642760                global errorInfo 
    27652761                ui_debug "$errorInfo" 
    2766                 break_softcontinue "search for portname $portname failed: $result" 1 status 
     2762                break_softcontinue "lookup of portname $portname failed: $result" 1 status 
    27672763            } 
    27682764            if {[llength $res] < 2} { 
    27692765                break_softcontinue "Port $portname not found" 1 status 
  • src/port/portindex.tcl

     
    141141mporttraverse pindex $directory 
    142142close $fd 
    143143file rename -force $tempportindex [file join $outdir PortIndex] 
     144mports_generate_quickindex [file join $outdir PortIndex] 
    144145puts "\nTotal number of ports parsed:\t$stats(total)\ 
    145146      \nPorts successfully parsed:\t[expr $stats(total) - $stats(failed)]\t\ 
    146147      \nPorts failed:\t\t\t$stats(failed)\n" 
  • src/macports1.0/macports.tcl

     
    710710            unsetenv $envkey 
    711711        } 
    712712    } 
     713     
     714    # load the quick index 
     715    _mports_load_quickindex 
    713716} 
    714717 
    715718proc macports::worker_init {workername portpath porturl portbuildpath options variations} { 
     
    16911694    return $matches 
    16921695} 
    16931696 
     1697# Returns the PortInfo for a single named port. The info comes from the 
     1698# PortIndex, and name matching is case-insensitive. Unlike mportsearch, only 
     1699# the first match is returned, but the return format is otherwise identical. 
     1700# The advantage is that mportlookup is much faster than mportsearch, due to 
     1701# the use of the quick index. 
     1702proc mportlookup {name} { 
     1703    global macports::portdbpath macports::sources 
     1704     
     1705    set sourceno 0 
     1706    set matches [list] 
     1707    foreach source $sources { 
     1708        set source [lindex $source 0] 
     1709        if {[macports::getprotocol $source] != "mports"} { 
     1710            global macports::quick_index 
     1711            if {![info exists quick_index($sourceno,[string tolower $name])]} { 
     1712                incr sourceno 1 
     1713                continue 
     1714            } 
     1715            # The quick index is keyed on the port name, and provides the 
     1716            # offset in the main PortIndex where the given port's PortInfo 
     1717            # line can be found. 
     1718            set offset $quick_index($sourceno,[string tolower $name]) 
     1719            incr sourceno 1 
     1720            if {[catch {set fd [open [macports::getindex $source] r]} result]} { 
     1721                ui_warn "Can't open index file for source: $source" 
     1722            } else { 
     1723                try { 
     1724                    seek $fd $offset 
     1725                    gets $fd line 
     1726                    set name [lindex $line 0] 
     1727                    set len [lindex $line 1] 
     1728                    set line [read $fd $len] 
     1729                         
     1730                    array set portinfo $line 
     1731 
     1732                    switch -regexp -- [macports::getprotocol ${source}] { 
     1733                        {^rsync$} { 
     1734                            # Rsync files are local 
     1735                            set source_url "file://[macports::getsourcepath $source]" 
     1736                        } 
     1737                        {^https?$|^ftp$} { 
     1738                            if {[_source_is_snapshot $source filename extension]} { 
     1739                                # daily snapshot tarball 
     1740                                set source_url "file://[macports::getsourcepath $source]" 
     1741                             } else { 
     1742                                # default action 
     1743                                set source_url $source 
     1744                             } 
     1745                        } 
     1746                        default { 
     1747                            set source_url $source 
     1748                        } 
     1749                    } 
     1750                    if {[info exists portinfo(portarchive)]} { 
     1751                        set porturl ${source_url}/$portinfo(portarchive) 
     1752                    } elseif {[info exists portinfo(portdir)]} { 
     1753                        set porturl ${source_url}/$portinfo(portdir) 
     1754                    } 
     1755                    if {[info exists porturl]} { 
     1756                        lappend line porturl $porturl 
     1757                        ui_debug "Found port in $porturl" 
     1758                    } else { 
     1759                        ui_debug "Found port info: $line" 
     1760                    } 
     1761                    lappend matches $name 
     1762                    lappend matches $line 
     1763                    close $fd 
     1764                    break 
     1765                } catch {*} { 
     1766                    ui_warn "It looks like your PortIndex file may be corrupt." 
     1767                    throw 
     1768                } finally { 
     1769                    catch {close $fd} 
     1770                } 
     1771            } 
     1772        } else { 
     1773            array set attrs [list name $name] 
     1774            set res [macports::index::search $macports::portdbpath $source [array get attrs]] 
     1775            if {[llength $res] > 0} { 
     1776                eval lappend matches $res 
     1777                break 
     1778            } 
     1779        } 
     1780    } 
     1781 
     1782    return $matches 
     1783} 
     1784 
     1785# Loads PortIndex.quick from each source into the quick_index, generating 
     1786# it first if necessary. 
     1787proc _mports_load_quickindex {args} { 
     1788    global macports::sources macports::quick_index 
     1789     
     1790    set sourceno 0 
     1791    foreach source $sources { 
     1792        unset -nocomplain quicklist 
     1793        # chop off any tags 
     1794        set source [lindex $source 0] 
     1795        set index [macports::getindex $source] 
     1796        if {![file exists ${index}.quick] || [file mtime ${index}] > [file mtime ${index}.quick]} { 
     1797            # stale or nonexistent quick index file, so generate a new one 
     1798            if {[catch {set quicklist [mports_generate_quickindex ${index}]}]} { 
     1799                continue 
     1800            } 
     1801        } 
     1802        # only need to read the quick index file if we didn't just update it 
     1803        if {![info exists quicklist]} { 
     1804            if {[catch {set fd [open ${index}.quick r]} result]} { 
     1805                ui_warn "Can't open quick index file for source: $source" 
     1806                continue 
     1807            } else { 
     1808                set quicklist [read $fd] 
     1809                close $fd 
     1810            } 
     1811        } 
     1812        foreach entry [split $quicklist "\n"] { 
     1813            set quick_index($sourceno,[lindex $entry 0]) [lindex $entry 1] 
     1814        } 
     1815        incr sourceno 1 
     1816    } 
     1817    if {!$sourceno} { 
     1818        return -code error "No index(es) found! Have you synced your source indexes?" 
     1819    } 
     1820} 
     1821 
     1822proc mports_generate_quickindex {index} { 
     1823    if {[catch {set indexfd [open ${index} r]} result] || [catch {set quickfd [open ${index}.quick w]} result]} { 
     1824        ui_warn "Can't open index file: $index" 
     1825        return -code error 
     1826    } else { 
     1827        try { 
     1828            set offset [tell $indexfd] 
     1829            set quicklist "" 
     1830            while {[gets $indexfd line] >= 0} { 
     1831                if {[llength $line] != 2} { 
     1832                    continue 
     1833                } 
     1834                set name [lindex $line 0] 
     1835                append quicklist "[string tolower $name] ${offset}\n" 
     1836 
     1837                set len [lindex $line 1] 
     1838                seek $indexfd $len current 
     1839                set offset [tell $indexfd] 
     1840            } 
     1841            puts -nonewline $quickfd $quicklist 
     1842        } catch {*} { 
     1843            ui_warn "It looks like your PortIndex file may be corrupt." 
     1844            throw 
     1845        } finally { 
     1846            close $indexfd 
     1847            close $quickfd 
     1848        } 
     1849    } 
     1850    if {[info exists quicklist]} { 
     1851        return $quicklist 
     1852    } else { 
     1853        ui_warn "Failed to generate quick index for: $index" 
     1854        return -code error 
     1855    } 
     1856} 
     1857 
    16941858proc mportinfo {mport} { 
    16951859    set workername [ditem_key $mport workername] 
    16961860    return [$workername eval array get PortInfo] 
     
    17891953        set dep_portname [lindex [split $depspec :] end] 
    17901954         
    17911955        # Find the porturl 
    1792         if {[catch {set res [mportsearch $dep_portname false exact]} error]} { 
     1956        if {[catch {set res [mportlookup $dep_portname]} error]} { 
    17931957            global errorInfo 
    17941958            ui_debug "$errorInfo" 
    1795             ui_error "Internal error: port search failed: $error" 
     1959            ui_error "Internal error: port lookup failed: $error" 
    17961960            return 1 
    17971961        } 
    17981962         
    1799         unset -nocomplain porturl 
    1800         foreach {name array} $res { 
    1801             array set portinfo $array 
    1802             if {[info exists portinfo(porturl)]} { 
    1803                 set porturl $portinfo(porturl) 
    1804                 break 
    1805             } 
    1806         } 
    1807  
    1808         if {![info exists porturl]} { 
     1963        array unset portinfo 
     1964        array set portinfo [lindex $res 1] 
     1965        if {[info exists portinfo(porturl)]} { 
     1966            set porturl $portinfo(porturl) 
     1967        } else { 
    18091968            ui_error "Dependency '$dep_portname' not found." 
    18101969            return 1 
    18111970        } 
     
    19742133    } 
    19752134 
    19762135    # check if the port is in tree 
    1977     if {[catch {mportsearch $portname false exact} result]} { 
     2136    if {[catch {mportlookup $portname} result]} { 
    19782137        global errorInfo 
    19792138        ui_debug "$errorInfo" 
    1980         ui_error "port search failed: $result" 
     2139        ui_error "port lookup failed: $result" 
    19812140        return 1 
    19822141    } 
    19832142    # argh! port doesnt exist! 
  • portmgr/jobs/PortIndexRegen.sh

     
    127127echo "" >> $COMMIT_MSG 
    128128grep Failed $FAILURE_LOG >> $COMMIT_MSG 
    129129{ cd ${SRCTREE}/dports/ && \ 
    130     $SVN --config-dir $SVN_CONFIG_DIR commit -F $COMMIT_MSG PortIndex > $FAILURE_LOG 2>&1 ; } \ 
     130    $SVN --config-dir $SVN_CONFIG_DIR commit -F $COMMIT_MSG PortIndex PortIndex.quick > $FAILURE_LOG 2>&1 ; } \ 
    131131    || { echo "SVN commit failed." >> $FAILURE_LOG ; bail ; } 
    132132 
    133133# At this point the index was committed successfuly, so we cleanup before we exit.