Frage

Ich habe ein Tool, das Paket-Stil Dokumente schreibt. Es ist mit NSDocument implementiert und überschreibt die folgenden NSDocument Methoden:

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

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

Das ist alles sehr schön, außer wenn ich speichere ein Dokument, das unter Versionskontrolle ist. (Die .svn Verzeichnisse nicht beibehalten werden, usw.)

Gibt es ein gutes Rezept irgendwo meine Dokumente für die Herstellung mit SVN spielt gut?

War es hilfreich?

Lösung

Ich bin Ihr Code erraten funktioniert, indem eine neue Datei erstellt Wrapper jedes Mal -fileWrapperOfType:error: genannt wird. Dies ist praktisch, aber missachtet zusätzliche Dateien, die auf der Festplatte im Innern der Verpackung vorhanden sind.

Also statt, was ist, wenn Sie mit dem Erstellen von / mit einem Wrapper für Dateien starten, die auf den vorhandenen Inhalt auf der Festplatte bezieht. Ändern Sie diese Wrapper des Dokuments aktuellen Stand zu entsprechen, und geben das Ergebnis. Wenn das Wrapper geschrieben wird auf der Festplatte, sollten svn Dateien ordnungsgemäß gewartet werden.

Andere Tipps

Hier ist meine Lösung auf Basis von Mike Antwort!

Meine Dokumentenpakete sind Bündel, mit der üblichen hierarchischen Struktur ... So gibt es vier Verzeichnisse, dass ich mutieren während speichert:

  1. Die speichern erstellt eine neue Top-Level (My.bundle)
  2. Der Inhalt Verzeichnis geändert wird (My.bundle / Contents)
  3. Die Ressourcen-Verzeichnis geändert wird (My.bundle / Contents / Resources)
  4. Die lokalisierten Ressourcen werden aktualisiert (My.bundle / Contents / Resources / en.lproj)

Das Rezept beginnt mit einem wandelbaren Wörterbuch Schlitz in der Dokumentklasse Hinzufügen den Inhalt jedes dieser Verzeichnisse zu erhalten.

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

Wenn Sie ein neues Dokument zu erstellen, diese als leerer Wörterbücher beginnen.

- (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;
}

Wenn in einem vorhandenen Dokument zu lesen, ersetzen Sie diese mit wandelbaren Kopien der relevanten fileWrapper Inhalte.

- (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;
}

und schließlich , wenn ein Dokument Verwendung Speichern der Wörterbücher so sorgfältig vorbereitet.

- (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;
}

Wenn nun ein Paket Dokument bearbeitet wird, behält die Anwendung alle Dateien, die es nicht auf das Bündel nicht hinzugefügt hat, einschließlich SCM Artefakte und „anderen“ Lokalisierungen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top