Updated Branches:
  refs/heads/master 1acd9cb84 -> 21d285d7a

[CB-1122] Diagnostic tool for Cordova iOS Xcode projects


Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/commit/21d285d7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/tree/21d285d7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/diff/21d285d7

Branch: refs/heads/master
Commit: 21d285d7a2625057726fefde68b678a0e2144907
Parents: 1acd9cb
Author: Shazron Abdullah <shaz...@apache.org>
Authored: Sat Sep 8 00:38:16 2012 -0700
Committer: Shazron Abdullah <shaz...@apache.org>
Committed: Sat Sep 8 00:38:16 2012 -0700

----------------------------------------------------------------------
 bin/diagnose_project |  176 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 176 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/21d285d7/bin/diagnose_project
----------------------------------------------------------------------
diff --git a/bin/diagnose_project b/bin/diagnose_project
new file mode 100755
index 0000000..9f9558a
--- /dev/null
+++ b/bin/diagnose_project
@@ -0,0 +1,176 @@
+#!/usr/bin/python
+"""
+Prints out information regarding a Cordova project for diagnostic purposes.
+Currently this only reports information but does not give any recommendations 
yet.
+
+Usage: CordovaVersion/bin/diagnose_project path/to/your/app.xcodeproj
+"""
+
+import os
+import sys
+import plistlib
+import shutil
+import tempfile
+import pprint
+
+def Usage():
+  print __doc__
+  sys.exit(1)
+
+def AbsParentPath(path):
+  return os.path.abspath(os.path.join(path, os.path.pardir))
+
+def AbsFrameworkPath(argv0):
+  script_path = argv0
+  # This can happen if the script's dir is in the user's PATH
+  if not os.path.exists(script_path):
+    raise Exception('Could not locale framework directory.')
+  return AbsParentPath(AbsParentPath(script_path))
+
+def AbsProjectPath(relative_path):
+  # Do an extra abspath here to strip off trailing / if present.
+  project_path = os.path.abspath(relative_path)
+  if project_path.endswith('.pbxproj'):
+    project_path = AbsParentPath(project_path)
+  elif project_path.endswith('.xcodeproj'):
+    pass
+  else:
+    raise Exception('The following is not a valid path to an XCode project: 
%s' % project_path)
+  return project_path
+
+def getXcodePlist(pbxPath):
+       tmpfile = tempfile.mktemp (".xml")
+       os.system("plutil -convert xml1 -o %s %s" % (tmpfile, pbxPath))
+
+       return plistlib.readPlist( tmpfile )
+       
+def getXcodeBuildSettings(diagKeys, xcodePlist):
+       allObjects = xcodePlist['objects']
+       rootObj = allObjects[ xcodePlist['rootObject'] ]
+       
+       buildSettings = {};
+
+       bclist = allObjects[ rootObj['buildConfigurationList'] 
]['buildConfigurations']
+       for conflist in bclist:
+               cl = allObjects[conflist];
+               clname = cl.get("name", 'no name')
+               buildSettings[clname] = {}
+               for key in diagKeys:
+                       val = cl['buildSettings'].get(key, '(not found)')
+                       buildSettings[clname][key] = val
+       
+       return buildSettings
+  
+def main(argv):
+       if len(argv) != 2:
+               Usage()
+
+       framework_path = AbsFrameworkPath(argv[0])
+       project_path = AbsProjectPath(argv[1])
+
+       parent_project_path = AbsParentPath(project_path)
+       cordova_lib_xcode_path = os.path.join(framework_path, 'CordovaLib', 
'CordovaLib.xcodeproj')
+       subproject_path = os.path.relpath(cordova_lib_xcode_path, 
parent_project_path)
+
+       projPbx = os.path.join(project_path, 'project.pbxproj')
+
+       buildSettingsKeys = ['HEADER_SEARCH_PATHS', 'ARCHS', 
'USER_HEADER_SEARCH_PATHS', 'IPHONEOS_DEPLOYMENT_TARGET', 'OTHER_LDFLAGS', 
'GCC_VERSION']
+
+       projPlist = getXcodePlist(projPbx)
+       allObjects = projPlist['objects']
+       rootObj = allObjects[ projPlist['rootObject'] ]
+
+       print 
"\n\n-------------------------------------BEGIN--------------------------------------"
+       print "Inspecting project: %s" % (projPbx) 
+
+       print 
"\n\n--------------------------------------------------------------------------------"
+       print "Finding your project's sub-projects...\n"
+
+       subprojKeys = ['name', 'path', 'sourceTree']
+       subprojValues = []
+
+       subprojRef = rootObj['projectReferences']
+       for subproj in subprojRef:
+         sp = {}
+         subprojGroup = allObjects[ subproj['ProjectRef'] ]
+         for key in subprojKeys:
+               val = subprojGroup.get(key, "(not found)")
+               sp[key] = val;
+         print "Sub-project:", sp
+         subprojValues.append(sp)
+       
+  
+       print 
"\n\n--------------------------------------------------------------------------------"
+       print "Inspecting your project's Build Settings...\n"
+
+       buildSettings = getXcodeBuildSettings(buildSettingsKeys, projPlist)
+       pp = pprint.PrettyPrinter(indent=4)
+
+       for key in buildSettings:
+         print key, ":" 
+         pp.pprint(buildSettings[key])
+       
+       print 
"\n\n--------------------------------------------------------------------------------"
+       print "Inspecting Xcode Preferences...\n"
+
+       xcodeBinaryPrefsPath = os.path.join( os.path.expanduser("~"), 
"Library", "Preferences", "com.apple.dt.Xcode.plist" );
+       xcodePrefsPlist = getXcodePlist(xcodeBinaryPrefsPath)
+
+       xcodeCordovaLib = 
xcodePrefsPlist['IDEApplicationwideBuildSettings'].get("CORDOVALIB", "(not 
found)")
+       print "CORDOVALIB:", xcodeCordovaLib
+       print "Build Location Style:", 
xcodePrefsPlist.get('IDEBuildLocationStyle', "(unknown)")
+
+       print 
"\n\n--------------------------------------------------------------------------------"
+       print "Inspecting your CordovaLib's Build Settings...\n"
+
+       usesXcodeVariable = False
+       cdvlibPath = None
+       cdvlibProjName = 'CordovaLib.xcodeproj'
+       
+       for sp in subprojValues:
+         if cdvlibProjName in sp['path']:
+               if 'CORDOVALIB' in sp['sourceTree']:
+                       print "Your project is using the CORDOVALIB Xcode 
variable (source tree)."
+                       cdvlibPath = os.path.join( xcodeCordovaLib, 
cdvlibProjName)
+               else:
+                       cdvlibPath = sp['path']
+       
+       print "Path is:", cdvlibPath, "\n"
+
+       cdvlibNormalizedPath = os.path.normpath( 
os.path.join(parent_project_path, cdvlibPath) )
+       cdvlibPbx = os.path.join( cdvlibNormalizedPath , 'project.pbxproj' )
+
+       cdvPlist = getXcodePlist(cdvlibPbx)
+       cdvBuildSettingsKeys = ['PUBLIC_HEADERS_FOLDER_PATH', 'ARCHS', 
'USER_HEADER_SEARCH_PATHS', 'IPHONEOS_DEPLOYMENT_TARGET', 'OTHER_LDFLAGS', 
'GCC_VERSION']
+
+       cdvBuildSettings = getXcodeBuildSettings(cdvBuildSettingsKeys, cdvPlist)
+       pp.pprint( cdvBuildSettings )
+
+       print 
"\n\n--------------------------------------------------------------------------------"
+       print "Inspecting CordovaLib Version...\n"
+  
+       cdvlibFolder = AbsParentPath(cdvlibNormalizedPath)
+       cdvlibVersionFile = os.path.join( cdvlibFolder, "VERSION")
+
+       try:
+               vf = open(cdvlibVersionFile, 'r')
+               print "VERSION file:", vf.readline()
+               vf.close()
+       except:
+               print "VERSION file not found at:", cdvlibVersionFile
+
+       cdvlibAvailabilityFile = os.path.join( cdvlibFolder, "Classes", 
"CDVAvailability.h" )
+       try:
+           af = open(cdvlibAvailabilityFile, 'r')
+           match = "#define CORDOVA_VERSION_MIN_REQUIRED"
+           for line in af:
+                       if match in line:
+                               print "CDVAvailability.h version:", 
line.strip().replace(match, ""),
+           af.close()
+       except:
+               print "CDVAvailability.h file not found at:", 
cdvlibAvailabilityFile, 
+
+       print 
"\n\n--------------------------------------END---------------------------------------"
+
+if __name__ == '__main__':
+  main(sys.argv)

Reply via email to