[41330] contrib

blb at macports.org blb at macports.org
Thu Oct 30 17:40:01 PDT 2008


Revision: 41330
          http://trac.macports.org/changeset/41330
Author:   blb at macports.org
Date:     2008-10-30 17:40:01 -0700 (Thu, 30 Oct 2008)
Log Message:
-----------
Add my in-progress work on recursive port dependency stuff

Added Paths:
-----------
    contrib/port-rdeps/
    contrib/port-rdeps/port-rdeps

Added: contrib/port-rdeps/port-rdeps
===================================================================
--- contrib/port-rdeps/port-rdeps	                        (rev 0)
+++ contrib/port-rdeps/port-rdeps	2008-10-31 00:40:01 UTC (rev 41330)
@@ -0,0 +1,179 @@
+#!/usr/bin/tclsh
+#
+# Run a recursive dependency listing against a given port, outputing
+# either a basic text display of the result, or dot language so a graph
+# can be created.
+# The dot functionality can be used by doing:
+# $ port-rdeps -d apache2 | dot -Tpng -o apache2.png
+#
+# Todo:
+# Does not differentiate, in output, between bin/lib/run type dependencies
+# Once "good enough", integrate into port
+#
+# http://trac.macports.org/ticket/11892
+
+
+set MY_VERSION 1.0
+
+
+set portsSeen [list]
+
+
+proc printUsage {} {
+   puts "Usage: $::argv0 \[-dhrV\] \[-t macports-tcl-path\] port-name \[variants...\]"
+   puts "   -d   Output dot-format instead of plain ASCII"
+   puts "   -h   This help"
+   puts "   -r   Reduce ASCII output, showing a given port only once"
+   puts "   -t   Give a different location for the base MacPorts Tcl"
+   puts "        file (defaults to /Library/Tcl)"
+   puts "   -V   show version and MacPorts version being used"
+   puts ""
+   puts "port-name is the name of a port to show dependencies"
+   puts "variants is the list of variants to enable/disable: +one -two..."
+}
+
+
+proc dependenciesForPort {portName variantInfo} {
+   set dependencyList [list]
+   set portSearchResult [mportsearch $portName no exact]
+   if {[llength $portSearchResult] < 1} {
+      puts "Warning: port \"$portName\" not found"
+      return [list]
+   }
+   array set portInfo [lindex $portSearchResult 1]
+   set mport [mportopen $portInfo(porturl) {} $variantInfo]
+   array unset portInfo
+   array set portInfo [mportinfo $mport]
+   mportclose $mport
+   array set dependencyDictionary {depends_build build depends_lib lib depends_run run}
+   foreach dependencyType [array names dependencyDictionary] {
+      if {[info exists portInfo($dependencyType)] && [string length $portInfo($dependencyType)] > 0} {
+         foreach dependency $portInfo($dependencyType) {
+            set afterColon [expr {[string last ":" $dependency] + 1}]
+            lappend dependencyList "[string range $dependency $afterColon end]"
+         }
+      }
+   }
+
+   return $dependencyList
+}
+
+
+proc print_dependencies {dependencyArray portName outputAscii reduceAscii} {
+   upvar $dependencyArray portDependencies
+   global portsSeen
+   if {$outputAscii} {
+      set spaces [string repeat " " [expr {$outputAscii * 2}]]
+      set outputAscii [expr {$outputAscii + 1}]
+   }
+   foreach aPort $portDependencies($portName) {
+      if {$outputAscii && $reduceAscii && [lsearch -exact $portsSeen $aPort] != -1} {
+         continue
+      } else {
+         lappend portsSeen $aPort
+      }
+      if {$outputAscii} {
+         puts "${spaces}${aPort}"
+      } else {
+         puts "\"$portName\" -> \"$aPort\""
+      }
+      print_dependencies portDependencies $aPort $outputAscii $reduceAscii
+   }
+}
+
+
+proc find_all_dependencies {portName variantInfo outputAscii reduceAscii} {
+   array set portDependencies {}
+   set portList [list $portName]
+   while {[llength $portList] > 0} {
+      set aPort [lindex $portList 0]
+      set portDependencies($aPort) [dependenciesForPort $aPort $variantInfo]
+      set portList [lreplace $portList 0 0]
+      foreach possiblyNewPort $portDependencies($aPort) {
+         if {![info exists portDependencies($possiblyNewPort)]} {
+            lappend portList $possiblyNewPort
+         }
+      }
+   }
+
+   if {$outputAscii} {
+      puts "Dependencies of $portName:"
+   } else {
+      puts "strict digraph \"$portName\" \{"
+   }
+
+   print_dependencies portDependencies $portName $outputAscii $reduceAscii
+
+   if {!$outputAscii} {
+      puts "\}"
+   }
+}
+
+
+# Begin
+
+set asciiOutput 1
+set reduceAsciiOutput 0
+set macportsTclPath /Library/Tcl
+set showVersion 0
+
+while {[string index [lindex $::argv 0] 0] == "-" } {
+   switch [string range [lindex $::argv 0] 1 end] {
+      d {
+         set asciiOutput 0
+      }
+      h {
+         printUsage
+         exit 0
+      }
+      r {
+         set reduceAsciiOutput 1
+      }
+      t {
+         if {[llength $::argv] < 2} {
+            puts "-t needs a path"
+            printUsage
+            exit 1
+         }
+         set macportsTclPath [lindex $::argv 1]
+         set ::argv [lrange $::argv 1 end]
+      }
+      V {
+         set showVersion 1
+      }
+      default {
+         puts "Unknown option [lindex $::argv 0]"
+         printUsage
+         exit 1
+      }
+   }
+   set ::argv [lrange $::argv 1 end]
+}
+
+source ${macportsTclPath}/macports1.0/macports_fastload.tcl
+package require macports
+mportinit
+
+if {$showVersion} {
+   puts "Version $MY_VERSION"
+   puts "MacPorts version [macports::version]"
+   exit 0
+}
+
+if {[llength $::argv] == 0} {
+   puts "Error: missing port-name"
+   printUsage
+   exit 1
+}
+set portName [lindex $::argv 0]
+set ::argv [lrange $::argv 1 end]
+
+array set variantInfo {}
+foreach variantSetting $::argv {
+   set flag [string index $variantSetting 0]
+   set variantName [string range $variantSetting 1 end]
+   set variantInfo($variantName) $flag
+}
+
+find_all_dependencies $portName [array get variantInfo] $asciiOutput $reduceAsciiOutput
+


Property changes on: contrib/port-rdeps/port-rdeps
___________________________________________________________________
Added: svn:executable
   + *
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20081030/dfa47c34/attachment-0001.html>


More information about the macports-changes mailing list