Changeset 138095 for trunk/base


Ignore:
Timestamp:
Jun 28, 2015, 5:20:40 AM (5 years ago)
Author:
jmr@…
Message:

recursive uninstall: correctly handle case where only some versions of a port have the requested flag, do more fine-grained dependent checking, style and efficiency improvements

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/base/src/registry2.0/portuninstall.tcl

    r138001 r138095  
    250250        # allow deps to not be excluded from the list below just because this port is still a dependent
    251251        if {[info exists options(ports_uninstall_follow-dependencies)] && [string is true -strict $options(ports_uninstall_follow-dependencies)]} {
    252             set uports [list $portname]
     252            set uports [list [list $portname $version $revision $variants]]
    253253        }
    254254    } else {
     
    308308            if {![catch {set ilist [registry::installed $dep]}]} {
    309309                foreach i $ilist {
    310                     set iversion [lindex $i 1]
    311                     set irevision [lindex $i 2]
    312                     set ivariants [lindex $i 3]
     310                    lassign $i dep iversion irevision ivariants
     311                    if {[list $dep $iversion $irevision $ivariants] in $uports} {
     312                        continue
     313                    }
    313314                    set regref [registry::open_entry $dep $iversion $irevision $ivariants [lindex $i 5]]
    314315                    if {![registry::property_retrieve $regref requested]} {
    315                         set dependentlist [registry::list_dependents $dep $iversion $irevision $ivariants]
    316                         set dependents {}
    317                         foreach depdt $dependentlist {
    318                             lappend dependents [lindex $depdt 2]
    319                         }
    320316                        set all_dependents_uninstalling 1
    321                         foreach depdt $dependents {
    322                             if {[lsearch -exact $uports $depdt] == -1} {
     317                        foreach depdt [$regref dependents] {
     318                            if {[list [$depdt name] [$depdt version] [$depdt revision] [$depdt variants]] ni $uports} {
    323319                                set all_dependents_uninstalling 0
    324320                                break
     
    326322                        }
    327323                        if {$all_dependents_uninstalling} {
    328                             lappend uports $dep
     324                            lappend uports [list $dep $iversion $irevision $ivariants]
    329325                            lappend portilist $dep@${iversion}_${irevision}${ivariants}
    330326                            set uninstalling_this_dep 1
     
    338334                    set depdeps [registry_uninstall::generate_deplist $depref $optionslist]
    339335                    foreach d $depdeps {
    340                         if {[lsearch -exact [lrange $alldeps $j+1 end] $d] == -1} {
     336                        if {$d ni [lrange $alldeps $j+1 end]} {
    341337                            lappend alldeps $d
    342338                        }
     
    355351    # uninstall all dependencies in order from uports
    356352    foreach dp $uports {
    357         if {![catch {set ilist [registry::installed $dp]}]} {
    358             foreach i $ilist {
    359                 set iversion [lindex $i 1]
    360                 set irevision [lindex $i 2]
    361                 set ivariants [lindex $i 3]
    362                 set regref [registry::open_entry $dp $iversion $irevision $ivariants [lindex $i 5]]
    363                 if {[info exists options(ports_dryrun)] && [string is true -strict $options(ports_dryrun)]} {
    364                     if {$dp ne $portname} {
    365                         ui_msg "For $dp @${iversion}_${irevision}${ivariants}: skipping uninstall (dry run)"
    366                     }
    367                 } else {
    368                     if {[info exists options(ports_uninstall_no-exec)] || ![registry::run_target $regref uninstall [array get options]]} {
    369                         registry_uninstall::uninstall $dp $iversion $irevision $ivariants [array get options]
    370                     }
     353        lassign $dp iname iversion irevision ivariants
     354        if {![catch {registry::open_entry $iname $iversion $irevision $ivariants ""} regref]} {
     355            if {[info exists options(ports_dryrun)] && [string is true -strict $options(ports_dryrun)]} {
     356                if {$iname ne $portname} {
     357                    ui_msg "For $iname @${iversion}_${irevision}${ivariants}: skipping uninstall (dry run)"
     358                }
     359            } else {
     360                if {[info exists options(ports_uninstall_no-exec)] || ![registry::run_target $regref uninstall [array get options]]} {
     361                    registry_uninstall::uninstall $iname $iversion $irevision $ivariants [array get options]
    371362                }
    372363            }
Note: See TracChangeset for help on using the changeset viewer.