وصفة لصنع حزم الكاكاو NSDocument تلعب بشكل جيد مع SVN؟
-
01-10-2019 - |
سؤال
لديّ أداة تكتب مستندات على غرار الحزمة. يتم تنفيذه باستخدام NSDocument ويتجاوز أساليب NSDOCINGUME التالية:
- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
error:(NSError **)outError;
- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper
ofType:(NSString *)typeName
error:(NSError **)outError;
هذا كله جميل ، إلا عندما أقوم بحفظ مستند تحت التحكم في الإصدار. (لا يتم الحفاظ على أدلة .svn ، وما إلى ذلك)
هل هناك وصفة جيدة في مكان ما لجعل مستنداتي تلعب بشكل جيد مع SVN؟
المحلول
أظن أن الرمز الخاص بك يعمل عن طريق إنشاء غلاف ملف جديد في كل مرة -fileWrapperOfType:error:
يسمى. هذا مناسب ، ولكن يتجاهل أي ملفات إضافية قد توجد على القرص داخل الحزمة.
بدلاً من ذلك ، ماذا لو بدأت بإنشاء/استخدام غلاف ملف يشير إلى المحتويات الموجودة على القرص. قم بتعديل هذا الغلاف لمطابقة الحالة الحالية للمستند ، وإرجاع النتيجة. عندما يتم كتابة هذا الغلاف إلى القرص ، يجب الحفاظ على ملفات SVN بشكل صحيح.
نصائح أخرى
هذا هو الحل القائم على إجابة مايك!
حزم المستندات الخاصة بي هي حزم ، مع الهيكل الهرمي المعتاد ... لذلك هناك أربع أدلة أتحورها أثناء الحفظ:
- ينشئ الحفظ مستوى جديد (my.bundle)
- تم تغيير دليل المحتويات (my.bundle/المحتويات)
- تم تغيير دليل الموارد (my.bundle/المحتويات/الموارد)
- يتم تحديث الموارد المترجمة (my.bundle/المحتويات/الموارد/en.lproj)
تبدأ الوصفة بإضافة فتحة قاموس قابلة للتغيير إلى فئة المستند الخاصة بك للحفاظ على محتويات كل من هذه الدلائل.
@interface LMDocument : NSDocument {
@private
// All this is for preserving SCM artifacts across saves…
NSMutableDictionary * bundleWrappers;
NSMutableDictionary * contentsWrappers;
NSMutableDictionary * resourcesWrappers;
NSMutableDictionary * localizedWrappers;
}
عند إنشاء مستند جديد ، تبدأ هذه القواميس الفارغة.
- (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;
}
عند القراءة في وثيقة موجودة ، استبدلها بنسخ قابلة للتغيير من محتويات filewrapper ذات الصلة.
- (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;
}
و أخيرا, ، عند حفظ وثيقة استخدم القواميس التي تم إعدادها بشق الأنفس.
- (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;
}
الآن عندما يتم تحرير مستند الحزمة ، يحتفظ التطبيق بأي ملفات لم يضفها إلى الحزمة ، بما في ذلك قطع أثرية SCM وتوطين "Oneal"!