Ricetta per fare pacchetti di cacao NSDocument giocare bene con svn?
-
01-10-2019 - |
Domanda
Ho uno strumento che scrive i documenti pacchetto di stile. E 'implementato usando NSDocument e sovrascrive i seguenti metodi NSDocument:
- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
error:(NSError **)outError;
- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper
ofType:(NSString *)typeName
error:(NSError **)outError;
Questo è tutto molto bello, tranne quando ho salvare un documento che è sotto il controllo di versione. (Le directory .svn non vengono mantenuti, ecc.)
C'è una qualche buona ricetta per fare i miei documenti giocare bene con svn?
Soluzione
sto cercando di indovinare il codice funziona creando un file fresco involucro ogni -fileWrapperOfType:error:
volta che viene chiamato. Questo è comodo, ma con deroghe eventuali file aggiuntivi che possono esistere sul disco all'interno della confezione.
Così, invece, che cosa succede se si inizia con la creazione / usando un wrapper di file che si riferisce ai contenuti presenti sul disco. Modificare che wrapper per corrispondere stato attuale del documento, e restituire il risultato. Quando questo involucro viene scritto su disco, i file svn devono essere adeguatamente mantenuti.
Altri suggerimenti
Ecco la mia soluzione basata sulla risposta di Mike!
I miei pacchetti di documenti sono fasci, con la solita struttura gerarchica ... Quindi ci sono quattro directory che mutano durante la salva:
- Il salvataggio crea un nuovo top-level (My.bundle)
- La directory di contenuto viene modificato (My.bundle / Contents)
- La directory delle risorse viene modificata (My.bundle / Contents / Resources)
- Le risorse localizzate vengono aggiornati (My.bundle / Contents / Resources / en.lproj)
La ricetta inizia con l'aggiunta di uno slot dizionario mutabile alla classe di documento per preservare il contenuto di ciascuna di queste directory.
@interface LMDocument : NSDocument {
@private
// All this is for preserving SCM artifacts across saves…
NSMutableDictionary * bundleWrappers;
NSMutableDictionary * contentsWrappers;
NSMutableDictionary * resourcesWrappers;
NSMutableDictionary * localizedWrappers;
}
Quando si crea un nuovo documento, questi iniziano come dizionari vuote.
- (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;
}
Quando si legge in un documento esistente, sostituire questi con copie mutevoli dei contenuti fileWrapper rilevanti.
- (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;
}
e , infine, , quando si salva un documento uso dei dizionari tanto faticosamente preparato.
- (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;
}
Ora, quando un documento viene modificato il pacchetto, l'applicazione conserva tutti i file che non hanno aggiunto al fascio, tra cui manufatti SCM e "altri" localizzazioni!