public PBXGroup GetGroup( string name, string path = null, PBXGroup parent = null ) { if( string.IsNullOrEmpty( name ) ) return null; if( parent == null ) parent = rootGroup; foreach( KeyValuePair<string, PBXGroup> current in groups ) { if( string.IsNullOrEmpty( current.Value.name ) ) { if( current.Value.path.CompareTo( name ) == 0 && parent.HasChild( current.Key ) ) { return current.Value; } } else if( current.Value.name.CompareTo( name ) == 0 && parent.HasChild( current.Key ) ) { return current.Value; } } PBXGroup result = new PBXGroup( name, path ); groups.Add( result ); parent.AddChild( result ); modified = true; return result; }
public XCProject( string filePath ) : this() { if( !System.IO.Directory.Exists( filePath ) ) { Debug.LogWarning( "XCode project path does not exist: " + filePath ); return; } if( filePath.EndsWith( ".xcodeproj" ) ) { Debug.Log( "Opening project " + filePath ); this.projectRootPath = Path.GetDirectoryName( filePath ); this.filePath = filePath; } else { Debug.Log( "Looking for xcodeproj files in " + filePath ); string[] projects = System.IO.Directory.GetDirectories( filePath, "*.xcodeproj" ); if( projects.Length == 0 ) { Debug.LogWarning( "Error: missing xcodeproj file" ); return; } this.projectRootPath = filePath; //if the path is relative to the project, we need to make it absolute if (!System.IO.Path.IsPathRooted(projectRootPath)) projectRootPath = Application.dataPath.Replace("Assets", "") + projectRootPath; //Debug.Log ("projectRootPath adjusted to " + projectRootPath); this.filePath = projects[ 0 ]; } projectFileInfo = new FileInfo( Path.Combine( this.filePath, "project.pbxproj" ) ); string contents = projectFileInfo.OpenText().ReadToEnd(); PBXParser parser = new PBXParser(); _datastore = parser.Decode( contents ); if( _datastore == null ) { throw new System.Exception( "Project file not found at file path " + filePath ); } if( !_datastore.ContainsKey( "objects" ) ) { Debug.Log( "Errore " + _datastore.Count ); return; } _objects = (PBXDictionary)_datastore["objects"]; modified = false; _rootObjectKey = (string)_datastore["rootObject"]; if( !string.IsNullOrEmpty( _rootObjectKey ) ) { _project = new PBXProject( _rootObjectKey, (PBXDictionary)_objects[ _rootObjectKey ] ); _rootGroup = new PBXGroup( _rootObjectKey, (PBXDictionary)_objects[ _project.mainGroupID ] ); } else { Debug.LogWarning( "error: project has no root object" ); _project = null; _rootGroup = null; } }
public bool AddFolder( string folderPath, PBXGroup parent = null, string[] exclude = null, bool recursive = true, bool createBuildFile = true ) { Debug.Log("Folder PATH: "+folderPath); if( !Directory.Exists( folderPath ) ){ Debug.Log("Directory doesn't exist?"); return false; } if (folderPath.EndsWith(".lproj")){ Debug.Log("Ended with .lproj"); return AddLocFolder(folderPath, parent, exclude, createBuildFile); } DirectoryInfo sourceDirectoryInfo = new DirectoryInfo( folderPath ); if( exclude == null ){ Debug.Log("Exclude was null"); exclude = new string[] {}; } if( parent == null ){ Debug.Log("Parent was null"); parent = rootGroup; } // Create group PBXGroup newGroup = GetGroup( sourceDirectoryInfo.Name, null /*relative path*/, parent ); Debug.Log("New Group created"); foreach( string directory in Directory.GetDirectories( folderPath ) ) { Debug.Log( "DIR: " + directory ); if( directory.EndsWith( ".bundle" ) ) { // Treat it like a file and copy even if not recursive // TODO also for .xcdatamodeld? Debug.LogWarning( "This is a special folder: " + directory ); AddFile( directory, newGroup, "SOURCE_ROOT", createBuildFile ); continue; } if( recursive ) { Debug.Log( "recursive" ); AddFolder( directory, newGroup, exclude, recursive, createBuildFile ); } } // Adding files. string regexExclude = string.Format( @"{0}", string.Join( "|", exclude ) ); foreach( string file in Directory.GetFiles( folderPath ) ) { if( Regex.IsMatch( file, regexExclude ) ) { continue; } Debug.Log("Adding Files for Folder"); AddFile( file, newGroup, "SOURCE_ROOT", createBuildFile ); } modified = true; return modified; }
// We support neither recursing into nor bundles contained inside loc folders public bool AddLocFolder( string folderPath, PBXGroup parent = null, string[] exclude = null, bool createBuildFile = true) { DirectoryInfo sourceDirectoryInfo = new DirectoryInfo( folderPath ); if( exclude == null ) exclude = new string[] {}; if( parent == null ) parent = rootGroup; // Create group as needed System.Uri projectFolderURI = new System.Uri( projectFileInfo.DirectoryName ); System.Uri locFolderURI = new System.Uri( folderPath ); var relativePath = projectFolderURI.MakeRelativeUri( locFolderURI ).ToString(); PBXGroup newGroup = GetGroup( sourceDirectoryInfo.Name, relativePath, parent ); // Add loc region to project string nom = sourceDirectoryInfo.Name; string region = nom.Substring(0, nom.Length - ".lproj".Length); project.AddRegion(region); // Adding files. string regexExclude = string.Format( @"{0}", string.Join( "|", exclude ) ); foreach( string file in Directory.GetFiles( folderPath ) ) { if( Regex.IsMatch( file, regexExclude ) ) { continue; } // Add a variant group for the language as well var variant = new PBXVariantGroup(System.IO.Path.GetFileName( file ), null, "GROUP"); variantGroups.Add(variant); // The group gets a reference to the variant, not to the file itself newGroup.AddChild(variant); AddFile( file, variant, "GROUP", createBuildFile ); } modified = true; return modified; }
public PBXDictionary AddFile( string filePath, PBXGroup parent = null, string tree = "SOURCE_ROOT", bool createBuildFiles = true, bool weak = false ) { //Debug.Log("AddFile " + filePath + ", " + parent + ", " + tree + ", " + (createBuildFiles? "TRUE":"FALSE") + ", " + (weak? "TRUE":"FALSE") ); PBXDictionary results = new PBXDictionary(); if (filePath == null) { Debug.LogError ("AddFile called with null filePath"); return results; } string absPath = string.Empty; if( Path.IsPathRooted( filePath ) ) { Debug.Log( "Path is Rooted" ); absPath = filePath; } else if( tree.CompareTo( "SDKROOT" ) != 0) { absPath = Path.Combine( Application.dataPath, filePath ); } if( !( File.Exists( absPath ) || Directory.Exists( absPath ) ) && tree.CompareTo( "SDKROOT" ) != 0 ) { Debug.Log( "Missing file: " + filePath ); return results; } else if( tree.CompareTo( "SOURCE_ROOT" ) == 0 ) { Debug.Log( "Source Root File" ); System.Uri fileURI = new System.Uri( absPath ); System.Uri rootURI = new System.Uri( ( projectRootPath + "/." ) ); filePath = rootURI.MakeRelativeUri( fileURI ).ToString(); } else if( tree.CompareTo("GROUP") == 0) { Debug.Log( "Group File" ); filePath = System.IO.Path.GetFileName( filePath ); } if( parent == null ) { parent = _rootGroup; } //Check if there is already a file PBXFileReference fileReference = GetFile( System.IO.Path.GetFileName( filePath ) ); if( fileReference != null ) { Debug.Log("File already exists: " + filePath); //not a warning, because this is normal for most builds! return null; } fileReference = new PBXFileReference( filePath, (TreeEnum)System.Enum.Parse( typeof(TreeEnum), tree ) ); parent.AddChild( fileReference ); fileReferences.Add( fileReference ); results.Add( fileReference.guid, fileReference ); //Create a build file for reference if( !string.IsNullOrEmpty( fileReference.buildPhase ) && createBuildFiles ) { switch( fileReference.buildPhase ) { case "PBXFrameworksBuildPhase": foreach( KeyValuePair<string, PBXFrameworksBuildPhase> currentObject in frameworkBuildPhases ) { BuildAddFile(fileReference,currentObject,weak); } if ( !string.IsNullOrEmpty( absPath ) && ( tree.CompareTo( "SOURCE_ROOT" ) == 0 )) { string libraryPath = Path.Combine( "$(SRCROOT)", Path.GetDirectoryName( filePath ) ); if (File.Exists(absPath)) { this.AddLibrarySearchPaths( new PBXList( libraryPath ) ); } else { this.AddFrameworkSearchPaths( new PBXList( libraryPath ) ); } } break; case "PBXResourcesBuildPhase": foreach( KeyValuePair<string, PBXResourcesBuildPhase> currentObject in resourcesBuildPhases ) { Debug.Log( "Adding Resources Build File" ); BuildAddFile(fileReference,currentObject,weak); } break; case "PBXShellScriptBuildPhase": foreach( KeyValuePair<string, PBXShellScriptBuildPhase> currentObject in shellScriptBuildPhases ) { Debug.Log( "Adding Script Build File" ); BuildAddFile(fileReference,currentObject,weak); } break; case "PBXSourcesBuildPhase": foreach( KeyValuePair<string, PBXSourcesBuildPhase> currentObject in sourcesBuildPhases ) { Debug.Log( "Adding Source Build File" ); BuildAddFile(fileReference,currentObject,weak); } break; case "PBXCopyFilesBuildPhase": foreach( KeyValuePair<string, PBXCopyFilesBuildPhase> currentObject in copyBuildPhases ) { Debug.Log( "Adding Copy Files Build Phase" ); BuildAddFile(fileReference,currentObject,weak); } break; case null: Debug.LogWarning( "File Not Supported: " + filePath ); break; default: Debug.LogWarning( "File Not Supported." ); return null; } } return results; }