Skip to content

Commit

Permalink
Import of Diffly source tree as of 30-09-2009.
Browse files Browse the repository at this point in the history
  • Loading branch information
mmower committed Sep 30, 2009
0 parents commit 926b10a
Show file tree
Hide file tree
Showing 120 changed files with 15,354 additions and 0 deletions.
23 changes: 23 additions & 0 deletions AppController.h
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
146 changes: 146 additions & 0 deletions AppController.m
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
33 changes: 33 additions & 0 deletions CommitTask.h
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
129 changes: 129 additions & 0 deletions CommitTask.m
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
37 changes: 37 additions & 0 deletions Credits.rtf
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}}.}
Loading

0 comments on commit 926b10a

Please sign in to comment.