XcodeEditor icon indicating copy to clipboard operation
XcodeEditor copied to clipboard

How to add source (class & header) with specific path ?

Open iziz opened this issue 11 years ago • 12 comments

Is this is possible to add source to group with specific path ?

iziz avatar Feb 12 '14 04:02 iziz

I think not currently, though it should be very simple to support.

jasperblues avatar Feb 12 '14 04:02 jasperblues

I was edited in XCGroup But fail in XCTarget addMember (invalid path) Could you give me some help ?

- (void)addSourceFile:(XCSourceFileDefinition*)sourceFileDefinition withPath:(NSString*)targetPath
{
    [self makeGroupMemberWithName:[sourceFileDefinition sourceFileName] contents:[sourceFileDefinition data]
                             type:[sourceFileDefinition type] fileOperationStyle:[sourceFileDefinition fileOperationStyle]
                         withPath:targetPath];
    [[_project objects] setObject:[self asDictionary] forKey:_key];
}

- (void)makeGroupMemberWithName:(NSString*)name contents:(id)contents type:(XcodeSourceFileType)type
             fileOperationStyle:(XcodeFileOperationStyle)fileOperationStyle
                       withPath:(NSString*)targetPath
{
    NSString* filePath;
    XCSourceFile* currentSourceFile = (XCSourceFile*) [self memberWithDisplayName:name];
    if ((currentSourceFile) == nil)
    {
        NSDictionary* reference = [self makeFileReferenceWithPath:name
                                                             name:nil type:type];
        NSString* fileKey = [[XCKeyBuilder forItemNamed:[NSString stringWithFormat:@"%@/%@", targetPath, name]] build];

        [[_project objects] setObject:reference forKey:fileKey];
        [self addMemberWithKey:fileKey];
    }

    filePath = targetPath;

    BOOL writeFile = NO;
    if (fileOperationStyle == FileOperationStyleOverwrite)
    {
        writeFile = YES;
        [_fileOperationQueue fileWithName:name existsInProjectDirectory:filePath];
    }
    else if (fileOperationStyle == FileOperationStyleAcceptExisting &&
             ![_fileOperationQueue fileWithName:name existsInProjectDirectory:filePath])
    {
        writeFile = YES;
    }

    if (writeFile)
    {
        if ([contents isKindOfClass:[NSString class]])
        {
            [_fileOperationQueue queueTextFile:name inDirectory:filePath withContents:contents];
        }
        else
        {
            [_fileOperationQueue queueDataFile:name inDirectory:filePath withContents:contents];
        }
    }
}

iziz avatar Feb 12 '14 07:02 iziz

There's a different flag for relative vs absolute file paths.

  • Try creating an absolute file in Xcode. . open the project.pbxproj and take a look.

jasperblues avatar Feb 12 '14 07:02 jasperblues

Ah, I did not want to add with absolute path. (sorry didn't mentioned that before) I tried to add with relative path.

Anyways, Thank for your answer.

iziz avatar Feb 12 '14 08:02 iziz

Did you try running all of the tests? There's a sample project that gets unpacked into /tmp

You can observe the updates there by opening that project in Xcode.

  • Currently you can add a source- file by specifying the contents of the file.
  • To use an existing file on the disk, and adding it into the project is not really supported, unless you put the file in the correct place.
  • You could read the file from disk and set it as the argument to XcodeEditor.

jasperblues avatar Feb 12 '14 09:02 jasperblues

Yes. I think it need support for

path = IZIZ/TIimaveView.m; 

or

path = ../IZIZ/TIimaveView.m; 

or

path = II/ZZ/TIimaveView.m; 

instead of

path = TIimaveView.m; 

in

FD88D16718ACA2EE00B74C6D /* TIimaveView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TIimaveView.m; path = IZIZ/TIimaveView.m; sourceTree = "<group>";

iziz avatar Feb 13 '14 07:02 iziz

Its possible to add the source with a specific path, if you create groups as needed as you go. Will this work for you?

jasperblues avatar May 02 '14 02:05 jasperblues

Sorry for late ACK I'm using below with edited XCGroup file

NSString *projectName = @"RestInPeace";
NSString *workingRoot = @(getenv("WORKING_SRC_ROOT"));

unsigned long startPosition = workingRoot.length - projectName.length;

NSRange replacementRange = NSMakeRange(startPosition, projectName.length);
NSString *targetProjectFile = [workingRoot stringByReplacingCharactersInRange:replacementRange
                                                                   withString:TARGET_PROJECT];

XCProject *project = [[XCProject alloc] initWithFilePath:targetProjectFile];
XCGroup *currentTargetGroup = [project groupWithPathFromRoot:targetGroup];

XCSourceFileDefinition *newSourceFile =
    [[XCSourceFileDefinition alloc] initWithName:fileName text:content type:sourceType];

[newSourceFile setFileOperationType:XCFileOperationTypeOverwrite];
[currentTargetGroup addSourceFile:newSourceFile withPath:TARGET_NAME];

if (shouldAddToTarget) {
    XCSourceFile *sourceFile = [project fileWithName:fileName];
    XCTarget *targetObj = [project targetWithName:TARGET_NAME];
    [targetObj addMember:sourceFile];

    XCTarget *targetObjDev = [project targetWithName:TARGET_NAME_DEV];
    [targetObjDev addMember:sourceFile];
}

XCGroup.h

- (void)addSourceFile:(XCSourceFileDefinition*)sourceFileDefinition withPath:(NSString*)pathPrefix;

XCGroup.m

- (void)makeGroupMemberWithName:(NSString*)name contents:(id)contents type:(XcodeSourceFileType)type
             fileOperationStyle:(XCFileOperationType)fileOperationStyle withPath:(NSString*)targetPath
...
- (void)addSourceFile:(XCSourceFileDefinition*)sourceFileDefinition withPath:(NSString*)pathPrefix
{
    [self makeGroupMemberWithName:[sourceFileDefinition sourceFileName] contents:[sourceFileDefinition data]
                             type:[sourceFileDefinition type] fileOperationStyle:[sourceFileDefinition fileOperationType]
                         withPath:targetPath];
    ....
}

iziz avatar May 21 '14 09:05 iziz

You mean its working OK for you now?

What is the edit? Something you went merged into the main XcodeEditor branch?

jasperblues avatar May 21 '14 11:05 jasperblues

Yep! OK I will create merge request~

iziz avatar May 21 '14 16:05 iziz

Ok, glad to hear it's working for you now.

jasperblues avatar May 21 '14 19:05 jasperblues

Hi iziz/jasper,

I am not able to find this api with the parameter withPath, is it available in some other branch?

[group addSourceFile:newSourceFile withPath:TARGET_NAME];

abhisheksaatal avatar Jul 01 '16 07:07 abhisheksaatal