From 6d93b0d78f8a551a8896b6234fffc24d357b4e0d Mon Sep 17 00:00:00 2001 From: Andrew Wooster Date: Sun, 13 Mar 2016 13:37:41 -0700 Subject: [PATCH] Fixes around finding paths to files in the project. --- Source/XCGroup.m | 9 ++++--- Source/XCSourceFile.m | 25 ++++++++++++++++-- XcodeEditor.xcodeproj/project.pbxproj | 7 ++++- .../PathRelativeToProjectRoot.zip | Bin 0 -> 38447 bytes XcodeEditorTests/Utils/XCTestResourceUtils.h | 4 +++ XcodeEditorTests/Utils/XCTestResourceUtils.m | 10 +++++++ XcodeEditorTests/XCGroupTests.m | 22 ++++++++++++++- 7 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 XcodeEditorTests/Resources/TestProjects/PathRelativeToProjectRoot.zip diff --git a/Source/XCGroup.m b/Source/XCGroup.m index fe12d3e..88b00da 100755 --- a/Source/XCGroup.m +++ b/Source/XCGroup.m @@ -489,15 +489,18 @@ - (NSString *)pathRelativeToProjectRoot XCGroup *group = nil; NSString *key = [_key copy]; - while ((group = [_project groupForGroupMemberWithKey:key]) != nil && [group pathRelativeToParent] != nil) { - [pathComponents addObject:[group pathRelativeToParent]]; + while ((group = [_project groupForGroupMemberWithKey:key]) != nil) { + if ([group pathRelativeToParent] != nil) { + [pathComponents addObject:[group pathRelativeToParent]]; + } key = [[group key] copy]; } - + NSMutableString *fullPath = [[NSMutableString alloc] init]; for (NSInteger i = (NSInteger) [pathComponents count] - 1; i >= 0; i--) { [fullPath appendFormat:@"%@/", pathComponents[i]]; } + _pathRelativeToProjectRoot = [[fullPath stringByAppendingPathComponent:_pathRelativeToParent] copy]; } return _pathRelativeToProjectRoot; diff --git a/Source/XCSourceFile.m b/Source/XCSourceFile.m index 7c2158e..1829c1a 100755 --- a/Source/XCSourceFile.m +++ b/Source/XCSourceFile.m @@ -210,8 +210,29 @@ - (NSString *)displayName - (NSString *)pathRelativeToProjectRoot { - NSString *parentPath = [[_project groupForGroupMemberWithKey:_key] pathRelativeToProjectRoot]; - NSString *result = [parentPath stringByAppendingPathComponent:_name]; + NSString *result = nil; + if ([_sourceTree isEqualToString:@""]) { + NSString *component = nil; + if (_path) { + component = _path; + } else if (_name) { + component = _name; + } + NSString *parentPath = [[_project groupForGroupMemberWithKey:_key] pathRelativeToProjectRoot]; + result = [parentPath stringByAppendingPathComponent:component]; + } else if ([_sourceTree isEqualToString:@"SOURCE_ROOT"]) { + if (_path) { + result = _path; + } else if (_name) { + result = _name; + } + } else if ([_sourceTree isEqualToString:@"SDKROOT"]) { + //pass + } else if ([_sourceTree isEqualToString:@"BUILT_PRODUCTS_DIR"]) { + // pass + } else { + result = _sourceTree; + } return result; } diff --git a/XcodeEditor.xcodeproj/project.pbxproj b/XcodeEditor.xcodeproj/project.pbxproj index 08f6607..5e3e5c5 100644 --- a/XcodeEditor.xcodeproj/project.pbxproj +++ b/XcodeEditor.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 49EE86B01C95EF8200CBF750 /* PathRelativeToProjectRoot.zip in Resources */ = {isa = PBXBuildFile; fileRef = 49EE86AF1C95EF8200CBF750 /* PathRelativeToProjectRoot.zip */; }; 5D5AC8761C6A423C00E5B3DA /* XCBuildShellScript.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D5AC8721C6A423C00E5B3DA /* XCBuildShellScript.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5D5AC8771C6A423C00E5B3DA /* XCBuildShellScript.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5AC8731C6A423C00E5B3DA /* XCBuildShellScript.m */; }; 5D5AC8781C6A423C00E5B3DA /* XCBuildShellScriptDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D5AC8741C6A423C00E5B3DA /* XCBuildShellScriptDefinition.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -71,6 +72,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 49EE86AF1C95EF8200CBF750 /* PathRelativeToProjectRoot.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = PathRelativeToProjectRoot.zip; sourceTree = ""; }; 5D5AC8721C6A423C00E5B3DA /* XCBuildShellScript.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XCBuildShellScript.h; sourceTree = ""; }; 5D5AC8731C6A423C00E5B3DA /* XCBuildShellScript.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCBuildShellScript.m; sourceTree = ""; }; 5D5AC8741C6A423C00E5B3DA /* XCBuildShellScriptDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XCBuildShellScriptDefinition.h; sourceTree = ""; }; @@ -284,6 +286,7 @@ BA7985135EB5AF8E8386EB89 /* ArchiveProj.zip */, BA798180A5D76D64336BFF65 /* ProjectToEdit.zip */, BA79818F51A7B4CA0077D3AE /* expanz-iOS-SDK.zip */, + 49EE86AF1C95EF8200CBF750 /* PathRelativeToProjectRoot.zip */, ); path = TestProjects; sourceTree = ""; @@ -644,6 +647,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 6BE8FDA31C01C190001EF5B3; productRefGroup = 6BE8FDAE1C01C190001EF5B3 /* Products */; @@ -671,6 +675,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 49EE86B01C95EF8200CBF750 /* PathRelativeToProjectRoot.zip in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -689,7 +694,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#!/bin/bash\necho \"-------------- EXTRACTING TEST RESOURCES --------------\"\n\nrm -fr ~/xcode-editor-test-results\nmkdir -p ~/xcode-editor-test-results\n\nunzip XcodeEditorTests/Resources/TestProjects/expanz-iOS-SDK.zip -d ~/xcode-editor-test-results\nunzip XcodeEditorTests/Resources/TestProjects/ArchiveProj.zip -d ~/xcode-editor-test-results\nunzip XcodeEditorTests/Resources/TestProjects/HelloBoxy.zip -d ~/xcode-editor-test-results\nunzip XcodeEditorTests/Resources/TestProjects/ProjectToEdit.zip -d ~/xcode-editor-test-results\n\nfor f in XcodeEditorTests/Resources/Files/*; do cp $f ~/xcode-editor-test-results; done\n"; + shellScript = "#!/bin/bash\necho \"-------------- EXTRACTING TEST RESOURCES --------------\"\n\nrm -fr ~/xcode-editor-test-results\nmkdir -p ~/xcode-editor-test-results\n\nunzip XcodeEditorTests/Resources/TestProjects/expanz-iOS-SDK.zip -d ~/xcode-editor-test-results\nunzip XcodeEditorTests/Resources/TestProjects/ArchiveProj.zip -d ~/xcode-editor-test-results\nunzip XcodeEditorTests/Resources/TestProjects/HelloBoxy.zip -d ~/xcode-editor-test-results\nunzip XcodeEditorTests/Resources/TestProjects/ProjectToEdit.zip -d ~/xcode-editor-test-results\nunzip XcodeEditorTests/Resources/TestProjects/PathRelativeToProjectRoot.zip -d ~/xcode-editor-test-results\n\nfor f in XcodeEditorTests/Resources/Files/*; do cp $f ~/xcode-editor-test-results; done\n"; }; /* End PBXShellScriptBuildPhase section */ diff --git a/XcodeEditorTests/Resources/TestProjects/PathRelativeToProjectRoot.zip b/XcodeEditorTests/Resources/TestProjects/PathRelativeToProjectRoot.zip new file mode 100644 index 0000000000000000000000000000000000000000..cea81c05fcca38d646995fb7bd1e55dec6504bec GIT binary patch literal 38447 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

ECI)o#>YvJtI`X31hn?}X+A=LFrwk8>b%gJ;uw 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 *files = [target members]; + for (XCSourceFile *file in files) { + NSString *relativePath = [file pathRelativeToProjectRoot]; + XCTAssertNotNil(relativePath); + if ([[relativePath lastPathComponent] isEqualToString:@"FileRelativeToProject.m"]) { + XCTAssertEqualObjects(@"foo/FileRelativeToProject.m", relativePath); + } + if ([[relativePath lastPathComponent] isEqualToString:@"FileRelativeToOwnProject.m"]) { + XCTAssertEqualObjects(@"PathRelativeToProjectRoot/Classes/FileRelativeToOwnProject.m", relativePath); + } + if ([[relativePath lastPathComponent] isEqualToString:@"FileRelativeToGroup.m"]) { + XCTAssertEqualObjects(@"PathRelativeToProjectRoot/Classes/FileRelativeToGroup.m", relativePath); + } + } +} @end \ No newline at end of file