Recette pour fabriquer des emballages de cacao NSDocument jouent bien avec svn?
-
01-10-2019 - |
Question
J'ai un outil qui écrit des documents de type package. Il est mis en œuvre à l'aide NSDocument et remplace les méthodes NSDocument suivantes:
- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
error:(NSError **)outError;
- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper
ofType:(NSString *)typeName
error:(NSError **)outError;
Tout cela est beau, sauf quand je enregistrer un document qui est sous contrôle de version. (Les répertoires .svn ne sont pas conservés, etc.)
Y at-il une bonne recette quelque part pour faire mes documents jouer avec les svn?
La solution
Je suppose que votre code fonctionne en créant un fichier frais wrapper chaque -fileWrapperOfType:error:
de temps est appelé. Ceci est pratique, mais tous les fichiers non pris en compte d'autres qui peuvent exister sur le disque à l'intérieur du paquet.
Ainsi, au lieu, si vous commencez par créer / en utilisant un fichier wrapper qui fait référence au contenu existant sur le disque. Modifier cet emballage pour correspondre à l'état actuel du document et retourner le résultat. Lorsque cet emballage est écrit sur le disque, les fichiers svn doivent être bien entretenus.
Autres conseils
Voici ma solution basée sur la réponse de Mike!
Mes paquets de documents sont des faisceaux, avec la structure hiérarchique habituelle ... Donc, il y a quatre répertoires que je subisse une mutation au cours de sauvegarde:
- La sauvegarde crée un nouveau haut niveau (My.bundle)
- Le répertoire des matières est modifiée (My.bundle / Table des matières)
- Le répertoire des ressources est modifié (My.bundle / Contents / Resources)
- Les ressources localisées sont mis à jour (My.bundle / Contents / Resources / en.lproj)
La recette commence par l'ajout d'un emplacement dictionnaire mutable à votre classe de document pour préserver le contenu de chacun de ces répertoires.
@interface LMDocument : NSDocument {
@private
// All this is for preserving SCM artifacts across saves…
NSMutableDictionary * bundleWrappers;
NSMutableDictionary * contentsWrappers;
NSMutableDictionary * resourcesWrappers;
NSMutableDictionary * localizedWrappers;
}
Lors de la création d'un nouveau document, ces commencent comme des dictionnaires vides.
- (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;
}
Lors de la lecture dans un document existant, les remplacer par des copies mutables du contenu de fileWrapper pertinents.
- (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;
}
enfin , lors de l'enregistrement d'une utilisation de documents les dictionnaires si laborieusement préparé.
- (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;
}
Maintenant, quand un document de package est modifié, l'application conserve tous les fichiers qu'il n'a pas été ajouté au paquet, y compris les artefacts SCM et « autres » Localisations!