Receta para hacer paquetes de cacao NSDocument juegan bien con SVN?
-
01-10-2019 - |
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?
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:
- El ahorro crea un nuevo nivel superior (My.bundle)
- Se cambia el directorio de Contenido (My.bundle / Contents)
- se cambia el directorio de recursos (My.bundle / Contents / Resources)
- 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!