Pregunta

Tengo una herramienta que escribe documentos de estilo paquete. Se implementa mediante NSDocument y anula los siguientes métodos: NSDocument

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
                              error:(NSError **)outError;

- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper
                    ofType:(NSString *)typeName
                     error:(NSError **)outError;

Esto es todo muy agradable, excepto cuando guarda un documento que está bajo control de versiones. (Los directorios .svn no se conservan, etc.)

¿Hay algún lugar una buena receta para hacer mis documentos juega bien con SVN?

¿Fue útil?

Solución

Estoy adivinando el código funciona mediante la creación de un archivo contenedor fresca cada vez que se llama -fileWrapperOfType:error:. Esto es conveniente, pero desatiende los archivos adicionales que puedan existir en el disco dentro del paquete.

Así que en vez, lo que si se inicia mediante la creación / utilizando un derivador de archivos que se refiere al contenido existente en el disco. Modificar ese envoltorio para que coincida con el estado actual del documento, y devolver el resultado. Cuando ese envoltorio se escribe en el disco, archivos de SVN deben ser mantenidos adecuadamente.

Otros consejos

Aquí está mi solución basada en la respuesta de Mike!

Mis paquetes de documentos son paquetes, con la estructura jerárquica de costumbre ... Así que hay cuatro directorios que mutar durante ahorra:

  1. El ahorro crea un nuevo nivel superior (My.bundle)
  2. Se cambia el directorio de Contenido (My.bundle / Contents)
  3. se cambia el directorio de recursos (My.bundle / Contents / Resources)
  4. se actualizan los recursos localizados (My.bundle / Contents / Resources / en.lproj)

Las recetas se inicia con la adición de una ranura mutable diccionario para la clase de documento para conservar el contenido de cada uno de estos directorios.

@interface LMDocument : NSDocument {
@private
    // All this is for preserving SCM artifacts across saves…
    NSMutableDictionary * bundleWrappers;
    NSMutableDictionary * contentsWrappers;
    NSMutableDictionary * resourcesWrappers;
    NSMutableDictionary * localizedWrappers;
}

Cuando se crea un nuevo documento, éstas empiezan como diccionarios vacías.

- (id)init;
{
    if ((self = [super init]) != nil) {
        bundleWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
        contentsWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
        resourcesWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
        localizedWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
    }
    return self;
}

Cuando se lee en un documento existente, reemplazar estos con copias mutables de los contenidos fileWrapper pertinentes.

- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper
                     ofType:(NSString *)typeName
                      error:(NSError **)outError;
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    bundleWrappers = [[fileWrapper fileWrappers] mutableCopy];
    contentsWrappers = [[[bundleWrappers objectForKey:@"Contents"] fileWrappers] mutableCopy];
    resourcesWrappers = [[[contentsWrappers objectForKey:@"Resources"] fileWrappers] mutableCopy];
    localizedWrappers = [[[resourcesWrappers objectForKey:@"en.lproj"] fileWrappers] mutableCopy];
    NSFileWrapper * infoPlistWrapper = [contentsWrappers objectForKey:@"Info.plist"];
    [contentsWrappers removeObjectForKey:@"Info.plist"]; // Replaced during save…
    // …
    NSMutableDictionary * localizedWrappersCopy = [localizedWrappers mutableCopy];
    [localizedWrappers enumerateKeysAndObjectsUsingBlock:^(id key,
                                                           id obj,
                                                           BOOL * stop)
     {
         if (mumble) { // If it's a file that will be replaced during save…
             [localizedWrappersCopy removeObjectForKey:key]; // Replaced during save…
             // …
         }
     }];
    localizedWrappers = localizedWrappersCopy;
    [pool drain];
    return YES;
}

y fin , al guardar un documento de uso de los diccionarios preparado con tanto esfuerzo.

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
                               error:(NSError **)outError;
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSFileWrapper * localizedWrapper =
    [[NSFileWrapper alloc] initDirectoryWithFileWrappers:localizedWrappers];
    [resourcesWrappers setObject:localizedWrapper
                          forKey:@"en.lproj"];
    NSFileWrapper * resourcesWrapper =
    [[NSFileWrapper alloc] initDirectoryWithFileWrappers:resourcesWrappers];
    [contentsWrappers setObject:resourcesWrapper
                         forKey:@"Resources"];
    NSFileWrapper * contentsWrapper =
    [[NSFileWrapper alloc] initDirectoryWithFileWrappers:contentsWrappers];
    // …
    for (id item in mumble) {
        NSString * filename = [item filename];
        NSData * data = [item data];
        [localizedWrapper addRegularFileWithContents:data
                                   preferredFilename:filename];
    }
    [contentsWrapper addRegularFileWithContents:[self infoPlistData]
                              preferredFilename:@"Info.plist"];
    [pool drain];
    [bundleWrappers setObject:contentsWrapper
                       forKey:@"Contents"];
    NSFileWrapper * bundleWrapper =
    [[[NSFileWrapper alloc] initDirectoryWithFileWrappers:bundleWrappers] autorelease];
    return bundleWrapper;
}

Ahora, cuando se edita un documento conjunto, la aplicación conserva los archivos que no agregaron al paquete, incluyendo artefactos SCM y "otros" localizaciones!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top