-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Import of Diffly source tree as of 30-09-2009.
- Loading branch information
0 parents
commit 926b10a
Showing
120 changed files
with
15,354 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
// | ||
// AppController.h | ||
// Diffly | ||
// | ||
// Created by Matt Mower on 04/01/2007. | ||
// Copyright 2007 __MyCompanyName__. All rights reserved. | ||
// | ||
|
||
#import <Cocoa/Cocoa.h> | ||
|
||
@class PreferenceController; | ||
|
||
@interface AppController : NSObject { | ||
PreferenceController* preferenceController; | ||
} | ||
|
||
- (IBAction)openWorkingCopy:(id)sender; | ||
- (IBAction)showPreferencePanel:(id)sender; | ||
|
||
- (id)openWorkingCopyDocument:(NSString*)docFolder; | ||
- (NSArray*)openFolderList; | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
// | ||
// AppController.m | ||
// Diffly | ||
// | ||
// Created by Matt Mower on 04/01/2007. | ||
// Copyright 2007 __MyCompanyName__. All rights reserved. | ||
// | ||
|
||
#import "Tsai.h" | ||
|
||
#import "AppController.h" | ||
|
||
#import "PreferenceController.h" | ||
|
||
@implementation AppController | ||
|
||
+ (void)initialize | ||
{ | ||
NSMutableDictionary* defaultValues = [NSMutableDictionary dictionary]; | ||
[defaultValues setObject:@"/usr/local/bin/svn" | ||
forKey:DifflySvnPathKey]; | ||
[defaultValues setObject:@"" | ||
forKey:DifflyStylesheetPathKey]; | ||
[defaultValues setObject:[NSNumber numberWithBool:NO] | ||
forKey:DifflyUseTextMateKey]; | ||
[defaultValues setObject:[NSNumber numberWithBool:NO] | ||
forKey:DifflyOpenLastFoldersKey]; | ||
[defaultValues setObject:[NSNumber numberWithBool:NO] | ||
forKey:DifflyAutoCommitParentFoldersKey]; | ||
[defaultValues setObject:@"Stable" | ||
forKey:DifflyUpdateTypeKey]; | ||
[defaultValues setObject:STABLE_APPCAST_URL | ||
forKey:DifflyUpdateFeedKey]; | ||
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues]; | ||
} | ||
|
||
- (void)awakeFromNib | ||
{ | ||
[[NSApplication sharedApplication] setDelegate:self]; | ||
} | ||
|
||
- (IBAction)openWorkingCopy:(id)sender | ||
{ | ||
NSOpenPanel* browser = [NSOpenPanel openPanel]; | ||
|
||
[browser setCanChooseFiles:NO]; | ||
[browser setCanChooseDirectories:YES]; | ||
[browser setPrompt:@"Choose working copy"]; | ||
[browser setAllowsMultipleSelection:NO]; | ||
if( [browser runModal] != NSCancelButton ) | ||
{ | ||
[self openWorkingCopyDocument:[[browser filenames] objectAtIndex:0]]; | ||
} | ||
} | ||
|
||
- (IBAction)showPreferencePanel:(id)sender | ||
{ | ||
[[PreferenceController sharedPrefsWindowController] showWindow:nil]; | ||
} | ||
|
||
- (void)dealloc | ||
{ | ||
[preferenceController release]; | ||
[super dealloc]; | ||
} | ||
|
||
- (id)openWorkingCopyDocument:(NSString*)docFolder | ||
{ | ||
NSError* error; | ||
NSURL *url = [NSURL fileURLWithPath:docFolder]; | ||
id obj = [[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:url display:YES error:&error]; | ||
if( obj == nil ) | ||
{ | ||
NSLog( @"Cannot open %@ : %@", docFolder, [error localizedDescription] ); | ||
} | ||
return obj; | ||
} | ||
|
||
- (NSArray*)openFolderList | ||
{ | ||
NSArray* documents = [[NSDocumentController sharedDocumentController] documents]; | ||
NSMutableArray* folders = [[[NSMutableArray alloc] initWithCapacity:[documents count]] autorelease]; | ||
|
||
foreach( document, documents ) | ||
{ | ||
[folders addObject:[document fileName]]; | ||
} | ||
|
||
return folders; | ||
} | ||
|
||
// Application delegate methods | ||
|
||
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename | ||
{ | ||
return [self openWorkingCopyDocument:filename] != nil ? YES : NO; | ||
} | ||
|
||
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender | ||
{ | ||
if( !checkForValidSubversion() ) | ||
{ | ||
[[NSAlert alertWithMessageText:@"Diffly has a problem" | ||
defaultButton:nil | ||
alternateButton:nil | ||
otherButton:nil | ||
informativeTextWithFormat:[NSString stringWithFormat:@"Diffly can't find your copy of svn or, if it did, it couldn't run it. Please check your svn path preference.", [[NSUserDefaults standardUserDefaults] objectForKey:DifflySvnPathKey]]] runModal]; | ||
[self showPreferencePanel:self]; | ||
} | ||
else if( [[NSUserDefaults standardUserDefaults] boolForKey:DifflyOpenLastFoldersKey] ) | ||
{ | ||
NSArray* folders = [[NSUserDefaults standardUserDefaults] objectForKey:DifflyLastFolderListKey]; | ||
if( folders != nil ) | ||
{ | ||
foreach( folder, folders ) | ||
{ | ||
NSLog( @"Opening previous folder %@", folder ); | ||
[self openWorkingCopyDocument:folder]; | ||
} | ||
} else { | ||
NSLog( @"No folders to open from the last session." ); | ||
} | ||
} else { | ||
NSLog( @"No preference key: %@", [[NSUserDefaults standardUserDefaults] boolForKey:DifflyOpenLastFoldersKey] ); | ||
} | ||
|
||
return NO; | ||
} | ||
|
||
// When the application terminates, if we're to open our documents next time, we need | ||
// to save a list of the open documents now! | ||
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender | ||
{ | ||
if( [[NSUserDefaults standardUserDefaults] boolForKey:DifflyOpenLastFoldersKey] ) | ||
{ | ||
[[NSUserDefaults standardUserDefaults] setObject:[self openFolderList] forKey:DifflyLastFolderListKey]; | ||
} | ||
else | ||
{ | ||
[[NSUserDefaults standardUserDefaults] removeObjectForKey:DifflyLastFolderListKey]; | ||
} | ||
|
||
return NSTerminateNow; | ||
} | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// | ||
// CommitTask.h | ||
// Diffly | ||
// | ||
// Created by Matt Mower on 08/01/2007. | ||
// Copyright 2007 __MyCompanyName__. All rights reserved. | ||
// | ||
|
||
#import <Cocoa/Cocoa.h> | ||
|
||
#import "NSObject+CommitTask.h" | ||
|
||
|
||
@interface CommitTask : NSObject { | ||
NSTask *task; | ||
NSPipe *stdoutPipe, *stderrPipe; | ||
NSFileHandle *stdoutHandle, *stderrHandle; | ||
|
||
id delegate; | ||
} | ||
|
||
- (id)delegate; | ||
- (void)setDelegate:(id)delegate; | ||
|
||
- (id)initWithCurrentPath:(NSString*)currentPath files:(NSArray*)files message:(NSString*)message; | ||
- (void)commit; | ||
- (NSString*)fileNamesForDiffList:(NSArray*)diffList; | ||
|
||
// NSFileHandle notifications | ||
- (void)taskDataAvailable:(NSNotification*)notification; | ||
- (void)taskCompleted:(NSNotification*)Notification; | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
// | ||
// CommitTask.m | ||
// Diffly | ||
// | ||
// Created by Matt Mower on 08/01/2007. | ||
// Copyright 2007 __MyCompanyName__. All rights reserved. | ||
// | ||
|
||
#import "Tsai.h" | ||
#import "CommitTask.h" | ||
#import "PreferenceController.h" | ||
|
||
#import "NSFileManager+tempFileName.h" | ||
|
||
@implementation CommitTask | ||
|
||
- (id)initWithCurrentPath:(NSString*)currentPath files:(NSArray*)files message:(NSString*)message | ||
{ | ||
self = [super init]; | ||
|
||
// Store the commit message in a temporary file | ||
NSString* messageFileName = [[NSFileManager defaultManager] tempFileNameWithPrefix:@"message"]; | ||
[message writeToFile:messageFileName atomically:NO]; | ||
|
||
// Store files to check in to a temporary file | ||
NSString* targetFileName = [[NSFileManager defaultManager] tempFileNameWithPrefix:@"targets"]; | ||
[[self fileNamesForDiffList:files] writeToFile:targetFileName atomically:NO]; | ||
|
||
NSArray *commitArgs = [NSArray arrayWithObjects:@"ci",@"--non-interactive",@"--file",messageFileName,@"--targets",targetFileName,nil]; | ||
NSLog( @"CommitTask Arguments: %@", commitArgs ); | ||
|
||
task = [[NSTask alloc] init]; | ||
[task setLaunchPath:[[NSUserDefaults standardUserDefaults] objectForKey:DifflySvnPathKey]]; | ||
[task setCurrentDirectoryPath:currentPath]; | ||
[task setArguments:commitArgs]; | ||
|
||
stdoutPipe = [NSPipe pipe]; | ||
[task setStandardOutput:stdoutPipe]; | ||
stdoutHandle = [stdoutPipe fileHandleForReading]; | ||
[stdoutHandle readInBackgroundAndNotify]; | ||
[[NSNotificationCenter defaultCenter] addObserver:self | ||
selector:@selector(taskDataAvailable:) | ||
name:NSFileHandleReadCompletionNotification | ||
object:stdoutHandle]; | ||
|
||
stderrPipe = [NSPipe pipe]; | ||
[task setStandardError:stderrPipe]; | ||
stderrHandle = [stderrPipe fileHandleForReading]; | ||
[stderrHandle readInBackgroundAndNotify]; | ||
[[NSNotificationCenter defaultCenter] addObserver:self | ||
selector:@selector(taskDataAvailable:) | ||
name:NSFileHandleReadCompletionNotification | ||
object:stderrHandle]; | ||
|
||
[[NSNotificationCenter defaultCenter] addObserver:self | ||
selector:@selector(taskCompleted:) | ||
name:NSTaskDidTerminateNotification | ||
object:task]; | ||
|
||
return self; | ||
} | ||
|
||
- (void)dealloc | ||
{ | ||
[[NSNotificationCenter defaultCenter] removeObserver:self]; | ||
[super dealloc]; | ||
} | ||
|
||
- (id)delegate | ||
{ | ||
return delegate; | ||
} | ||
|
||
- (void)setDelegate:(id)theDelegate | ||
{ | ||
delegate = theDelegate; | ||
} | ||
|
||
- (NSString*)fileNamesForDiffList:(NSArray*)diffList | ||
{ | ||
NSMutableString* text = [[NSMutableString alloc] init]; | ||
|
||
foreach( diff, diffList ) | ||
{ | ||
[text appendString:[NSString stringWithFormat:@"%@\n", [diff relativePath]]]; | ||
} | ||
|
||
return text; | ||
} | ||
|
||
- (void)commit | ||
{ | ||
[task launch]; | ||
NSLog( @"CommitTask launched." ); | ||
} | ||
|
||
- (void)taskDataAvailable:(NSNotification*)notification | ||
{ | ||
//NSLog( @"taskDataAvailable: [object=%@]", [notification object] ); | ||
NSData *data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem]; | ||
if( data && [data length] > 0 ) | ||
{ | ||
NSString* text = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; | ||
//NSLog( @"text=[%@]", text ); | ||
|
||
if( [delegate respondsToSelector:@selector(commitMessageArrived:)] ) | ||
{ | ||
[delegate commitMessageArrived:text]; | ||
} | ||
else | ||
{ | ||
NSLog( @"CommitTask delegate (%@) does not respond to selector commitMessageArrived:" ); | ||
} | ||
|
||
// [messageView setString:[[messageView string] stringByAppendingString:text]]; | ||
[[notification object] readInBackgroundAndNotify]; | ||
} | ||
} | ||
|
||
- (void)taskCompleted:(NSNotification*)Notification | ||
{ | ||
// NSLog( @"CommitTask completed." ); | ||
if( [delegate respondsToSelector:@selector(commitHasCompleted)] ) | ||
{ | ||
[delegate commitHasCompleted]; | ||
} | ||
} | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420 | ||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;} | ||
{\colortbl;\red255\green255\blue255;} | ||
\vieww17200\viewh21360\viewkind0 | ||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural | ||
{\field{\*\fldinst{HYPERLINK "http://www.mattmower.com/diffly/"}}{\fldrslt | ||
\f0\fs24 \cf0 Diffly}} is a tool for browsing Subversion working copies and managing the check-in workflow.\ | ||
\ | ||
Acknowledgements:\ | ||
\ | ||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6803\ql\qnatural\pardirnatural | ||
\cf0 I've depended on a lot of help from the folks in #macsb, #macdev, and #webkit as well as the excellent {\field{\*\fldinst{HYPERLINK "http://www.cocoadev.com/"}}{\fldrslt CocoaDev}} tutorial site.\ | ||
\ | ||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural | ||
{\field{\*\fldinst{HYPERLINK "http://www.brockerhoff.net/src/rbs.html"}}{\fldrslt \cf0 RBSplitView}}\ | ||
by Rainer Brockerhoff\ | ||
\ | ||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural | ||
{\field{\*\fldinst{HYPERLINK "http://andymatuschak.org/pages/sparkle"}}{\fldrslt \cf0 Sparkle}}\ | ||
by Andy Matuschak.\ | ||
\ | ||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural | ||
{\field{\*\fldinst{HYPERLINK "http://www.mere-mortal-software.com/blog/details.php?d=2007-03-11"}}{\fldrslt \cf0 DBPrefsWindowController}}\ | ||
by Dave Batton\ | ||
\ | ||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural | ||
{\field{\*\fldinst{HYPERLINK "http://www.cs.queensu.ca/~thurston/ragel/"}}{\fldrslt \cf0 Ragel state machine compiler}}\ | ||
by {\field{\*\fldinst{HYPERLINK "http://www.cs.queensu.ca/home/thurston/"}}{\fldrslt Adrian Thurston}}\ | ||
\ | ||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural | ||
{\field{\*\fldinst{HYPERLINK "http://www.mattballdesign.com/portfolio/"}}{\fldrslt \cf0 Toolbar Icons}}\ | ||
by Matt Ball\ | ||
\ | ||
{\field{\*\fldinst{HYPERLINK "http://macthemes2.net/forum/viewtopic.php?id=16780581"}}{\fldrslt Toolbar Icons}}\ | ||
by Jonas Rask\ | ||
\ | ||
Diffly's icon was designed by Alan Chao of {\field{\*\fldinst{HYPERLINK "%22%2522%2522%2522%2522%252522%252522%252522Diffly%25252520is%25252520a%25252520tool%25252520I%25252520wrote%25252520because%25252520I%25252520was%25252520like%25252520the%25252520context%25252520of%25252520seeing%25252520the%25252520diffs%25252520across%25252520my%25252520entire%25252520project%25252520when%25252520committing%25252520but%25252520I%25252520got%25252520fed%25252520up%25252520with%25252520paging%25252520through%25252520the%25252520output%25252520of%25252520%25252522svn%25252520diff%25252522%25252520and%25252520cribbing%25252520together%25252520a%25252520commit%25252520message.%25252520Diffly%25252520was%25252520also%25252520an%25252520excuse%25252520to%25252520write%25252520my%25252520first%25252520application%25252520using%25252520Cocoa%25252520and%25252520Objective-C.%2525250A%2525250AI've%25252520depended%25252520on%25252520a%25252520lot%25252520of%25252520help%25252520from%25252520the%25252520folks%25252520in%25252520#macsb,%25252520#macdev,%25252520#webkit%25252520who%25252520helped%25252520me%25252520sort%25252520out%25252520a%25252520number%25252520of%25252520beginners%25252520mistakes%25252520with%25252520Cocoa.%25252520I%25252520am%25252520very%25"}}{\fldrslt ACDesigns}}.} |
Oops, something went wrong.