New Ticket     Tickets     Wiki     Browse Source     Timeline     Roadmap     Ticket Reports     Search

Changeset 81260


Ignore:
Timestamp:
07/28/11 03:35:05 (4 years ago)
Author:
cal@…
Message:

rev-upgrade: topologically sort broken ports

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/gsoc11-rev-upgrade/base/src/macports1.0/macports.tcl

    r80765 r81260  
    37933793                    set libresult     [lindex $libresultlist 1] 
    37943794 
     3795                    # if {[string first "/usr/" [$loadcommand cget -mlt_install_name]] == 0} { 
     3796                    #     # TODO: Filter whitelist 
     3797                    #     ui_warn "File links against /usr/*: `[$b path]' links against `[$loadcommand cget -mlt_install_name]'" 
     3798                    # } 
     3799 
    37953800                    if {$libreturncode != $machista::SUCCESS} { 
    37963801                        ui_info "Could not open `[$loadcommand cget -mlt_install_name]': [machista::strerror $libreturncode]" 
     
    38313836        machista::destroy_handle $handle 
    38323837 
     3838        if {[llength $broken_files] == 0} { 
     3839            ui_msg "---> No broken files found. :)" 
     3840            return 0; 
     3841        } 
     3842        ui_msg "---> Found [llength $broken_files] broken file(s), matching files to ports" 
    38333843        set broken_ports {} 
    38343844        set broken_files [lsort -unique $broken_files] 
     
    38403850            lappend broken_ports $port 
    38413851        } 
    3842  
    38433852        set broken_ports [lsort -unique $broken_ports] 
    3844         ui_msg "broken ports: [llength $broken_ports]" 
     3853 
     3854        ui_msg "---> Found [llength $broken_ports] broken port(s), determining rebuild order" 
     3855        # broken_ports are the nodes in our graph 
     3856        # now we need adjacents 
    38453857        foreach port $broken_ports { 
    3846             ui_msg "    $port" 
    3847         } 
     3858            # initialize with empty list 
     3859            set adjlist($port) {} 
     3860            set revadjlist($port) {} 
     3861        } 
     3862 
     3863        array set visited {} 
     3864        foreach port $broken_ports { 
     3865            # stack of broken nodes we've come across 
     3866            set stack {} 
     3867            lappend stack $port 
     3868 
     3869            # build graph 
     3870            if {![info exists visited($port)]} { 
     3871                revupgrade_buildgraph $port stack adjlist revadjlist visited 
     3872            } 
     3873        } 
     3874 
     3875        set unsorted_ports $broken_ports 
     3876        set topsort_ports {} 
     3877        while {[llength $unsorted_ports] > 0} { 
     3878            foreach port $unsorted_ports { 
     3879                if {[llength $adjlist($port)] == 0} { 
     3880                    # this node has no further dependencies 
     3881                    # add it to topsorted list 
     3882                    lappend topsort_ports $port 
     3883                    # remove from unsorted list 
     3884                    set index [lsearch $unsorted_ports $port] 
     3885                    set unsorted_ports [concat [lrange $unsorted_ports 0 $index-1] [lrange $unsorted_ports $index+1 end]] 
     3886 
     3887                    # remove edges  
     3888                    foreach target $revadjlist($port) { 
     3889                        set index [lsearch $adjlist($target) $port] 
     3890                        set adjlist($target) [concat [lrange $adjlist($target) 0 $index-1] [lrange $adjlist($target) $index+1 end]] 
     3891                    } 
     3892                } 
     3893            } 
     3894        } 
     3895 
     3896        ui_msg "---> Rebuilding in order: $topsort_ports" 
    38483897    } 
    38493898 
    38503899    return 0; 
    38513900} 
     3901 
     3902proc revupgrade_buildgraph {port stackname adjlistname revadjlistname visitedname} { 
     3903    upvar $stackname stack 
     3904    upvar $adjlistname adjlist 
     3905    upvar $revadjlistname revadjlist 
     3906    upvar $visitedname visited 
     3907 
     3908    ui_debug "Processing port $port" 
     3909    set dependent_ports [get_dependent_ports $port false] 
     3910    foreach dep $dependent_ports { 
     3911        array set deparray $dep 
     3912        set depname $deparray(name) 
     3913 
     3914        if {[info exists visited($depname)]} { 
     3915            continue 
     3916        } 
     3917        set visited($depname) true 
     3918        set is_broken_port false 
     3919 
     3920        if {[info exists adjlist($depname)]} { 
     3921            ui_debug "Dependency $depname is broken, adding edge from [lindex $stack 0] to $depname" 
     3922            ui_debug "Making $depname new head of stack" 
     3923            # $dep is one of the broken ports 
     3924            # add an edge to the last broken port in the DFS 
     3925            lappend adjlist([lindex $stack 0]) $depname 
     3926            lappend revadjlist($depname) [lindex $stack 0] 
     3927            # make this port the new last broken port by prepending it to the stack 
     3928            set stack [linsert last_visited 0 $depname] 
     3929             
     3930            set is_broken_port true 
     3931        } 
     3932        revupgrade_buildgraph $depname stack adjlist revadjlist visited 
     3933        if {$is_broken_port} { 
     3934            ui_debug "Removing $depname from stack" 
     3935            # remove $dep from the stack 
     3936            set stack [lrange $stack 1 end] 
     3937        } 
     3938    } 
     3939} 
     3940 
Note: See TracChangeset for help on using the changeset viewer.