Changeset 81260
- Timestamp:
- 07/28/11 03:35:05 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/gsoc11-rev-upgrade/base/src/macports1.0/macports.tcl
r80765 r81260 3793 3793 set libresult [lindex $libresultlist 1] 3794 3794 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 3795 3800 if {$libreturncode != $machista::SUCCESS} { 3796 3801 ui_info "Could not open `[$loadcommand cget -mlt_install_name]': [machista::strerror $libreturncode]" … … 3831 3836 machista::destroy_handle $handle 3832 3837 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" 3833 3843 set broken_ports {} 3834 3844 set broken_files [lsort -unique $broken_files] … … 3840 3850 lappend broken_ports $port 3841 3851 } 3842 3843 3852 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 3845 3857 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" 3848 3897 } 3849 3898 3850 3899 return 0; 3851 3900 } 3901 3902 proc 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.

