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?

Était-ce utile?

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:

  1. La sauvegarde crée un nouveau haut niveau (My.bundle)
  2. Le répertoire des matières est modifiée (My.bundle / Table des matières)
  3. Le répertoire des ressources est modifié (My.bundle / Contents / Resources)
  4. 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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top