Revision: 122852 https://trac.macports.org/changeset/122852 Author: ksammons@macports.org Date: 2014-07-31 14:02:25 -0700 (Thu, 31 Jul 2014) Log Message: ----------- Merged from https://www.github.com/centip3de/GSoC.git Modified Paths: -------------- branches/gsoc14-cleanup/src/macports1.0/doctor.tcl branches/gsoc14-cleanup/src/macports1.0/macports.tcl branches/gsoc14-cleanup/src/port/port branches/gsoc14-cleanup/src/port/port.tcl Modified: branches/gsoc14-cleanup/src/macports1.0/doctor.tcl =================================================================== --- branches/gsoc14-cleanup/src/macports1.0/doctor.tcl 2014-07-31 20:45:18 UTC (rev 122851) +++ branches/gsoc14-cleanup/src/macports1.0/doctor.tcl 2014-07-31 21:02:25 UTC (rev 122852) @@ -1,5 +1,6 @@ # Todo: +<<<<<<< HEAD # Move port_doctor.ini to the port tree, below _resources # Command-Line tools version check # Support comments for the parser @@ -11,21 +12,83 @@ namespace eval doctor { proc main {} { +======= +# Check the $DISPLAY + +# Done: +# Add -q for quiet mode, where we don't print anything +# Check for command line tools +# Check for any DYLD_* environmental variables +# Check for '.la' in dylib and '.prl' +# Check if installed files are readable +# Check for sqlite +# Check for openssl +# Crowd-source more ideas from the mailing-list +# Check if $PATH is first +# Check for issues with compilation. Compile small, simple file, check for "couldn't create cache file" +# check_for_stray_developer_directory +# Check for *.h, *.hpp, *.hxx in /usr/local/include +# Check for *.dylib in /usr/local/lib +# Check for other package managers. Fink = /sw, homebrew = /usr/local/Cellar +# Check for all files installed by ports exists +# Check for archives from all ports exists +# Check for things in /usr/local +# Check for x11.app if the OS is 10.6 and suggest installing xorg-server or the site on macosforge +# Add error catching for line's without an equals sign. +# Support comments for the parser +# Check for amount of drive space +# Move port_doctor.ini to the port tree, below _resources +# Check for curl +# Check for rsync +# Check if macports is in /opt/local + + +package provide doctor 1.0 + +package require macports +package require reclaim 1.0 + +namespace eval doctor { + + # Command line argument that determines whether or not to output things fancily. + variable quiet 0 + + proc main {opts} { + +>>>>>>> svn # The main function. Handles all the calls to the correct functions, and sets the config_options array, # as well as the parser_options array. # # Args: +<<<<<<< HEAD # None # Returns: # None +======= + # opts - The options passed in. Currently the only option availible is 'quiet'. + # Returns: + # None + + # Setting the 'quiet' variable based on what was passed in. + if {$opts ne ""} { + set doctor::quiet 1 + } else { + set doctor::quiet 0 + } + +>>>>>>> svn array set config_options [list] set parser_options {"macports_location" "profile_path" "shell_location" "xcode_version_10.9" "xcode_version_10.8" \ "xcode_version_10.7" "xcode_version_10.6" "xcode_version_10.7" "xcode_version_10.6" "xcode_version_10.5" \ "xcode_version_10.4" "xcode_build"} set user_config_path ${macports::portdbpath}/port_doctor.ini +<<<<<<< HEAD set xcode_config_path ${macports::portdbpath}/xcode_versions.ini +======= + set xcode_config_path ${macports::portdbpath}/sources/rsync.macports.org/release/tarballs/ports/_resources/xcode_versions.ini +>>>>>>> svn # Make sure at least a default copy of the xcode and user config exist make_xcode_config @@ -38,8 +101,434 @@ # Start the checks check_path $config_options(macports_location) $config_options(profile_path) $config_options(shell_location) check_xcode config_options +<<<<<<< HEAD +======= + check_for_app curl + check_for_app rsync + check_for_app openssl + check_for_app sqlite3 + check_macports_location + check_free_space + check_for_x11 + check_for_files_in_usr_local + check_tarballs + check_port_files + check_for_package_managers + check_for_stray_developer_directory + check_compilation_error_cache + check_for_dyld + check_for_clt } + proc check_for_clt {} { + + # Checks to see if the Xcode Command Line Tools are installed by checking if the file + # /Library/Developer/CommandLineTools exists if the system is running 10.9, or if they're + # running an older version, if the command xcode-select -p outputs something. + # + # Args: + # None + # Returns: + # None + + output "command line tools" + + set version ${macports::macosx_version} + + if {$version == 10.9} { + + if {![file exists "/Library/Developer/CommandLineTools/"]} { + + ui_warn "Xcode Command Line Tools are not installed! To install them, please enter the command: + xcode-select --install" + success_fail 0 + return + } + success_fail 1 + return + + } else { + + set xcode_select [exec xcode-select -p] + + if {$xcode_select eq ""} { + + ui_warn "Xcode Command Line Tools are not installed! To install them, please enter the command: + xcode-selct --install" + success_fail 0 + return + } + success_fail 1 + } + } + + proc check_for_dyld {} { + + # Checks to see if the current MacPorts session is running with a DYLD_* environmental + # variable set. + # + # Args: + # None + # Returns: + # None + + output "DYLD_* environmental variables" + + set printenv [exec printenv] + set split [split $printenv] + + if {[regexp {DYLD_.} $split]} { + ui_warn "found a DYLD_* environmental variable. These are known to cause issues with MacPorts. Please\ + unset the variable for the duration MacPorts is running." + + success_fail 0 + return + } + + success_fail 1 + } + + proc output {string} { + + # Outputs the given string formatted correctly. + # + # Args: + # string - The string to be output + # Returns: + # None + + if {${doctor::quiet} eq 0} { + ui_msg -nonewline "Checking for $string... " + } + } + + proc success_fail {result} { + + # Either outputs a [SUCCESS] or [FAILED], depending on the result. + # + # Args: + # result - An integer value. 1 = [SUCCESS], anything else = [FAILED] + # Returns: + # None + + if {${doctor::quiet} eq 0} { + + if {$result == 1} { + + ui_msg "\[SUCCESS\]" + return + } + + ui_msg "\[FAILED\]" + } + } + + proc check_compilation_error_cache {} { + + # Checks to see if the compiler can compile properly, or it throws the error, "couldn't create cache file". + # + # Args: + # None + # Returns: + # None + + output "compilation errors" + + set filename "test.c" + set fd [open $filename w] + + puts $fd "int main() { return 0; }" + close $fd + + set output [exec clang $filename -o main_test] + + file delete $filename + file delete "main_test" + + if {"couldn't create cache file" in $output} { + ui_warn "found errors when attempting to compile file. To fix this issue, delete your tmp folder using: + rm -rf \$TMPDIR" + success_fail 0 + return + } + + success_fail 1 + + } + + proc check_for_stray_developer_directory {} { + + # Checks to see if the script to remove leftover files from Xcode has been run or not. Implementation heavily influenced + # by Homebrew implementation. + # + # Args: + # None + # Returns: + # None + + output "stray developer directory" + + set uninstaller "/Developer/Library/uninstall-developer-folder" + + if {${macports::xcodeversion} >= 4.3 && [file exists $uninstaller]} { + ui_warn "you have leftover files from an older version of Xcode. You should delete them by using, $uninstaller" + + success_fail 0 + return + } + + success_fail 1 + } + + proc check_for_package_managers {} { + + # Checks to see if either Fink or Homebrew are installed on the system. If they are, it warns them and suggest they uninstall + # or move them to a different location. + # + # Args: + # None + # Returns: + # None + + output "HomeBrew" + + if {[file exists "/usr/local/Cellar"]} { + ui_warn "it seems you have Homebrew installed on this system -- Because Homebrew uses /usr/local, this can potentially cause issues \ + with MacPorts. We'd recommend you either uninstall it, or move it from /usr/local for now." + + success_fail 0 + + } else { + + success_fail 1 + } + + output "Fink" + if {[file exists "/sf"]} { + ui_warn "it seems you have Fink installed on your system -- This could potentially cause issues with MacPorts. We'd recommend you'd \ + either uninstall it, or move it from /sf for now." + + success_fail 0 + + } else { + + success_fail 1 + } + } + + proc check_port_files {} { + + # Checks to see if each file installed by all active and installed ports actually exists on the filesystem. If not, it warns + # the user and suggests the user deactivate and reactivate the port. + # + # Args: + # None + # Returns: + # None + + + set apps [reclaim::get_info] + + foreach app $apps { + + + set name [lindex $app 0] + set active [lindex $app 4] + set files [registry::port_registered $name] + + if {$active} { + + foreach file $files { + + output "file '$file' on disk" + + if {![file exists $file]} { + success_fail 0 + ui_warn "couldn't find file '$file' for port '$name'. Please deactivate and reactivate the port to fix this issue." + + } elseif {![file readable $file]} { + success_fail 0 + ui_warn "'$file' installed by port '$name' is currently not readable. Please try again. If this problem persists, please contact\ + the mailing list." + + } else { + + success_fail 1 + } + } + } + } + + } + + proc check_tarballs {} { + + # Checks if the archives for each installed port in /opt/local/var/macports/software/$name is actually in there. If not, it warns + # the user and suggest a reinstallation of the port. + # + # Args: + # None + # Returns: + # None + + set apps [reclaim::get_info] + + foreach app $apps { + + output "'$app's tarball on disk" + + set name [lindex $app 0] + set version [lindex $app 1] + set revision [lindex $app 2] + set variants [lindex $app 3] + set epoch [lindex $app 5] + + set ref [registry::open_entry $name $version $revision $variants $epoch] + set image_dir [registry::property_retrieve $ref location] + + if {![file exists $image_dir]} { + ui_warn "couldn't find the archive for '$name'. Please uninstall and reinstall this application." + success_fail 0 + } else { + success_fail 1 + } + } + } + + proc check_for_files_in_usr_local {} { + + # Checks for dylibs in /usr/local/lib and header files in /usr/local/include, and warns the user about said files if they + # are found. + # + # Args: + # None + # Returns: + # None + + output "dylibs in /usr/local/lib" + + if {[glob -nocomplain -directory "/usr/local/lib" *.dylib *.la *.prl] ne ""} { + ui_warn "found dylib's in your /usr/local/lib directory. These are known to cause problems. We'd recommend \ + you remove them." + + success_fail 0 + + } else { + + success_fail 1 + } + + output "header files in /usr/local/include" + + if {[glob -nocomplain -directory "/usr/local/include" *.h *.hpp *.hxx] ne ""} { + ui_warn "found header files in your /usr/local/include directory. These are known to cause problems. We'd recommend \ + you remove them." + + success_fail 0 + + } else { + + success_fail 1 + } + } + + proc check_for_x11 {} { + + # Checks to see if the user is using the X11.app, and if they're on 10.6. If they are, it alerts them about it. + # + # Args: + # None + # Returns: + # None + + output "X11.app on OS X 10.6 systems" + + set mac_version ${macports::macosx_version} + + if {$mac_version == 10.6} { + + if {[file exists /Applications/X11.app]} { + ui_error "it seems you have Mac OSX 10.6 installed, and are using X11 from \"X11.app\". This has been known to cause issues. \ + To fix this, please install xorg-server, by using the command 'sudo port install xorg-server', or installing it from \ + their website, http://xquartz.macosforge.org/trac/wiki/Releases." + + success_fail 0 + return + } + } + + success_fail 1 + } + + proc check_free_space {} { + + # Checks to see if the user has less than 5 gigs of space left, and warns if they don't. + # + # Args: + # None + # Returns: + # None + + output "free disk space" + + set output [exec df -g] + set tokens [split $output \n] + set disk_info [lindex $tokens 1] + set availible [lindex $disk_info 3] + + if {$availible < 5} { + ui_warn "you have less than 5 gigabytes free on your machine! This can cause serious errors. We recommend trying to clear out unnecessary \ + programs and files by running 'sudo port reclaim', or manually uninstalling/deleting programs and folders on your drive." + + success_fail 0 + return + } + + success_fail 1 + } + + proc check_macports_location {} { + + # Checks to see if port is where it should be. If it isn't, freak the frick out. + # + # Args: + # None + # Returns: + # None + + output "MacPort's location" + + if {[file exists ${macports::prefix}/bin/port] == 0} { + ui_error "port was not in ${macports::prefix}/bin. This can potentially cause errors. It's recommended you move it back to ${macports::prefix}/bin." + success_fail 0 + return + } + + success_fail 1 + } + + proc check_for_app {app} { + + # Check's if the binary supplied exists in /usr/bin. If it doesn't, it warns the user. + # + # Args: + # app - The name of the app to check for. + # Returns + # None + + output "for '$app'" + + if {[file exists /usr/bin/$app] == 0} { + ui_error "$app is needed by MacPorts to function normally, but wasn't found on this system. We'd recommend \ + installing it for continued use of MacPorts." + success_fail 0 + return + } + + success_fail 1 +>>>>>>> svn + } + proc check_xcode {config_options} { # Checks to see if the currently installed version of Xcode works with the curent OS version. @@ -49,6 +538,11 @@ # Returns: # None +<<<<<<< HEAD +======= + output "correct Xcode version" + +>>>>>>> svn upvar $config_options config set mac_version ${macports::macosx_version} @@ -56,12 +550,20 @@ set xcode_versions $config(xcode_version_$mac_version) if {$xcode_current in $xcode_versions} { +<<<<<<< HEAD +======= + success_fail 1 +>>>>>>> svn return } else { ui_error "currently installed version of Xcode, $xcode_current, is not supported by MacPorts. \ For your currently installed system, only the following versions of Xcode are supported: \ $xcode_versions" +<<<<<<< HEAD +======= + success_fail 0 +>>>>>>> svn } } @@ -74,8 +576,14 @@ # Returns: # None +<<<<<<< HEAD set path ${macports::portdbpath}/xcode_versions.ini +======= + #FIXME: This most likely shouldn't be hardcoded... but for now it is. Fix it. + set path ${macports::portdbpath}/sources/rsync.macports.org/release/tarballs/ports/_resources/xcode_versions.ini +>>>>>>> svn + if {[file exists $path] == 0} { ui_warn "No configuration file found at $path. Creating generic config file." @@ -109,7 +617,11 @@ ui_warn "No configuration file found at $path. Creating generic config file." set fd [open $path w] +<<<<<<< HEAD puts $fd "macports_location=/opt/local" +======= + puts $fd "macports_location=${macports::prefix}" +>>>>>>> svn puts $fd "profile_path=${macports::user_home}/.bash_profile" puts $fd "shell_location=/bin/bash" @@ -119,8 +631,13 @@ proc get_config {config_options parser_options path} { +<<<<<<< HEAD # Reads in and parses the configureation file, port_doctor.ini. After parsing, all variables found are assigned # in the 'config_options' associative array. +======= + # Reads in and parses the configuration file passed in to $path. After parsing, all variables found are assigned + # in the 'config_options' associative array. +>>>>>>> svn # # Args: # config_options - The associative array responsible for holding all the configuration options. @@ -138,11 +655,28 @@ close $fd foreach line $data { +<<<<<<< HEAD set tokens [split $line "="] if {[lindex $tokens 0] in $parser_options} { set config([lindex $tokens 0]) [lindex $tokens 1] +======= + + # Ignore comments + if {[string index $line 0] eq "#" } { + continue + } + + #The tokens + set tokens [split $line "="] + + # Only care about things that are in $parser_options + if {[lindex $tokens 0] in $parser_options} { + set config([lindex $tokens 0]) [lindex $tokens 1] + + # Ignore whitespace +>>>>>>> svn } elseif {[lindex $tokens 0] eq ""} { continue @@ -168,6 +702,14 @@ set split [split $path :] if {"$port_loc/bin" in $split && "$port_loc/sbin" in $split } { +<<<<<<< HEAD +======= + + if {[lindex $split 0] != "$port_loc/bin"} { + ui_warn "$port_loc/bin is not first in your PATH environmental variable. This may or may not \ + cause problems in the future." + } +>>>>>>> svn return } else { @@ -188,11 +730,16 @@ puts $fd "export PATH=$port_loc/bin:$port_loc/sbin:\$PATH" close $fd +<<<<<<< HEAD ui_msg "Reloading $profile_path..." exec $shell_loc $profile_path ui_msg "Port should now be successfully set up." +======= + ui_msg "Added PATH properly. Please execute, 'source $profile_path' in a new terminal window." + +>>>>>>> svn } elseif {$input == "n" || $input == "N"} { ui_msg "Not fixing your \$PATH variable." Modified: branches/gsoc14-cleanup/src/macports1.0/macports.tcl =================================================================== --- branches/gsoc14-cleanup/src/macports1.0/macports.tcl 2014-07-31 20:45:18 UTC (rev 122851) +++ branches/gsoc14-cleanup/src/macports1.0/macports.tcl 2014-07-31 21:02:25 UTC (rev 122852) @@ -4371,7 +4371,11 @@ return yes } +<<<<<<< HEAD proc macports::doctor_main {} { +======= +proc macports::doctor_main {opts} { +>>>>>>> svn # Calls the main function for the 'port doctor' command. # @@ -4380,7 +4384,11 @@ # Returns: # 0 on successful execution. +<<<<<<< HEAD doctor::main +======= + doctor::main $opts +>>>>>>> svn return 0 } Modified: branches/gsoc14-cleanup/src/port/port =================================================================== --- branches/gsoc14-cleanup/src/port/port 2014-07-31 20:45:18 UTC (rev 122851) +++ branches/gsoc14-cleanup/src/port/port 2014-07-31 21:02:25 UTC (rev 122852) @@ -2732,11 +2732,24 @@ } proc action_doctor { action portlist opts } { +<<<<<<< HEAD macports::doctor_main +======= + if {[prefix_unwritable]} { + return 1 + } + macports::doctor_main $opts +>>>>>>> svn return 0 } proc action_reclaim { action portlist opts } { +<<<<<<< HEAD +======= + if {[prefix_unwritable]} { + return 1 + } +>>>>>>> svn macports::reclaim_main return 0 } @@ -4350,6 +4363,7 @@ log {{phase 1} {level 1}} upgrade {force enforce-variants no-replace no-rev-upgrade} rev-upgrade {id-loadcmd-check} + doctor {quiet} } ## Modified: branches/gsoc14-cleanup/src/port/port.tcl =================================================================== --- branches/gsoc14-cleanup/src/port/port.tcl 2014-07-31 20:45:18 UTC (rev 122851) +++ branches/gsoc14-cleanup/src/port/port.tcl 2014-07-31 21:02:25 UTC (rev 122852) @@ -1,4 +1,3 @@ -#!@TCLSH@ # -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4 # $Id: port.tcl 119177 2014-04-18 22:35:29Z cal@macports.org $ # @@ -2732,11 +2731,24 @@ } proc action_doctor { action portlist opts } { +<<<<<<< HEAD macports::doctor_main +======= + if {[prefix_unwritable]} { + return 1 + } + macports::doctor_main $opts +>>>>>>> svn return 0 } proc action_reclaim { action portlist opts } { +<<<<<<< HEAD +======= + if {[prefix_unwritable]} { + return 1 + } +>>>>>>> svn macports::reclaim_main return 0 } @@ -4350,6 +4362,7 @@ log {{phase 1} {level 1}} upgrade {force enforce-variants no-replace no-rev-upgrade} rev-upgrade {id-loadcmd-check} + doctor {quiet} } ##
participants (1)
-
ksammons@macports.org