mirror of
https://github.com/arsenetar/dupeguru.git
synced 2026-01-25 16:11:39 +00:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75239d6a64 | ||
|
|
09082955a3 | ||
|
|
6a6f2d51aa | ||
|
|
7b0d3ea8ac | ||
|
|
1c88b6bb26 | ||
|
|
e5e8e5d908 | ||
|
|
92fadd26b7 | ||
|
|
45d783ac43 | ||
|
|
ea9e76e7ae | ||
|
|
28426c0e91 | ||
|
|
3a9f51b600 | ||
|
|
f1b4db368e | ||
|
|
95efac187b | ||
|
|
6770d22438 | ||
|
|
4ce97613c4 |
2
.hgtags
2
.hgtags
@@ -36,3 +36,5 @@ b07ac1398703dd358912c1f3d20bd995633db9fe pe1.11.0
|
|||||||
22239f94589baf2a9fad2123045b8a718dbd68f5 se2.12.2
|
22239f94589baf2a9fad2123045b8a718dbd68f5 se2.12.2
|
||||||
f9cae82a0752191276b24ffb2cc4e4a8afb5d754 me5.10.2
|
f9cae82a0752191276b24ffb2cc4e4a8afb5d754 me5.10.2
|
||||||
154c8cb6f018d446d88fa099490c900906e86386 pe1.11.2
|
154c8cb6f018d446d88fa099490c900906e86386 pe1.11.2
|
||||||
|
ca93352ce35184853ad9fcb881935a43a8b1e249 me5.10.3
|
||||||
|
44f6ff67066c083f79daa18a9d2f1ab909e0a62e me5.10.4
|
||||||
|
|||||||
5
README
5
README
@@ -13,7 +13,6 @@ There are also other sub-folder that comes from external repositories (automatic
|
|||||||
with svn:externals):
|
with svn:externals):
|
||||||
|
|
||||||
- hscommon: A collection of helpers used across HS applications.
|
- hscommon: A collection of helpers used across HS applications.
|
||||||
- hsgui: Cross-toolkit GUI-related helper classes.
|
|
||||||
- cocoalib: A collection of helpers used across Cocoa UI codebases of HS applications.
|
- cocoalib: A collection of helpers used across Cocoa UI codebases of HS applications.
|
||||||
- qtlib: A collection of helpers used across Qt UI codebases of HS applications.
|
- qtlib: A collection of helpers used across Qt UI codebases of HS applications.
|
||||||
|
|
||||||
@@ -28,11 +27,11 @@ General dependencies
|
|||||||
- Python 3.1 (http://www.python.org)
|
- Python 3.1 (http://www.python.org)
|
||||||
- Send2Trash3k (http://hg.hardcoded.net/send2trash)
|
- Send2Trash3k (http://hg.hardcoded.net/send2trash)
|
||||||
- hsutil3k (http://hg.hardcoded.net/hsutil)
|
- hsutil3k (http://hg.hardcoded.net/hsutil)
|
||||||
- hsaudiotag3k (for ME) (http://hg.hardcoded.net/hsaudiotag)
|
- hsaudiotag3k 1.1.0 (for ME) (http://hg.hardcoded.net/hsaudiotag)
|
||||||
- jobprogress (http://hg.hardcoded.net/jobprogress)
|
- jobprogress (http://hg.hardcoded.net/jobprogress)
|
||||||
- Markdown, to generate help files. (http://pypi.python.org/pypi/Markdown)
|
- Markdown, to generate help files. (http://pypi.python.org/pypi/Markdown)
|
||||||
- PyYaml, for help files and the build system. (http://pyyaml.org/)
|
- PyYaml, for help files and the build system. (http://pyyaml.org/)
|
||||||
- py.test, to run unit tests. (http://codespeak.net/py/dist/test/)
|
- pytest 2.0.0, to run unit tests. (http://pytest.org/)
|
||||||
|
|
||||||
OS X prerequisites
|
OS X prerequisites
|
||||||
-----
|
-----
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ http://www.hardcoded.net/licenses/bsd_license
|
|||||||
#import "ResultWindow.h"
|
#import "ResultWindow.h"
|
||||||
#import "DetailsPanel.h"
|
#import "DetailsPanel.h"
|
||||||
#import "DirectoryPanel.h"
|
#import "DirectoryPanel.h"
|
||||||
|
#import "HSAboutBox.h"
|
||||||
|
|
||||||
@interface AppDelegateBase : NSObject
|
@interface AppDelegateBase : NSObject
|
||||||
{
|
{
|
||||||
@@ -21,6 +22,7 @@ http://www.hardcoded.net/licenses/bsd_license
|
|||||||
|
|
||||||
DirectoryPanel *_directoryPanel;
|
DirectoryPanel *_directoryPanel;
|
||||||
DetailsPanel *_detailsPanel;
|
DetailsPanel *_detailsPanel;
|
||||||
|
HSAboutBox *_aboutBox;
|
||||||
BOOL _savedResults;
|
BOOL _savedResults;
|
||||||
}
|
}
|
||||||
- (PyDupeGuruBase *)py;
|
- (PyDupeGuruBase *)py;
|
||||||
@@ -28,4 +30,6 @@ http://www.hardcoded.net/licenses/bsd_license
|
|||||||
- (DirectoryPanel *)directoryPanel;
|
- (DirectoryPanel *)directoryPanel;
|
||||||
- (DetailsPanel *)detailsPanel;
|
- (DetailsPanel *)detailsPanel;
|
||||||
- (void)saveResults;
|
- (void)saveResults;
|
||||||
|
|
||||||
|
- (IBAction)showAboutBox:(id)sender;
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -40,6 +40,14 @@ http://www.hardcoded.net/licenses/bsd_license
|
|||||||
_savedResults = YES;
|
_savedResults = YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (IBAction)showAboutBox:(id)sender
|
||||||
|
{
|
||||||
|
if (_aboutBox == nil) {
|
||||||
|
_aboutBox = [[HSAboutBox alloc] initWithApp:py];
|
||||||
|
}
|
||||||
|
[[_aboutBox window] makeKeyAndOrderFront:sender];
|
||||||
|
}
|
||||||
|
|
||||||
/* Delegate */
|
/* Delegate */
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
|
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
|
||||||
<data>
|
<data>
|
||||||
<int key="IBDocument.SystemTarget">1050</int>
|
<int key="IBDocument.SystemTarget">1050</int>
|
||||||
<string key="IBDocument.SystemVersion">10F569</string>
|
<string key="IBDocument.SystemVersion">10H574</string>
|
||||||
<string key="IBDocument.InterfaceBuilderVersion">788</string>
|
<string key="IBDocument.InterfaceBuilderVersion">823</string>
|
||||||
<string key="IBDocument.AppKitVersion">1038.29</string>
|
<string key="IBDocument.AppKitVersion">1038.35</string>
|
||||||
<string key="IBDocument.HIToolboxVersion">461.00</string>
|
<string key="IBDocument.HIToolboxVersion">461.00</string>
|
||||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="NS.object.0">788</string>
|
<string key="NS.object.0">823</string>
|
||||||
</object>
|
</object>
|
||||||
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
|
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
|
||||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||||
@@ -20,13 +20,8 @@
|
|||||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
</object>
|
</object>
|
||||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
|
||||||
<object class="NSArray" key="dict.sortedKeys" id="0">
|
<integer value="1" key="NS.object.0"/>
|
||||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
|
||||||
</object>
|
|
||||||
<object class="NSMutableArray" key="dict.values">
|
|
||||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
|
||||||
</object>
|
|
||||||
</object>
|
</object>
|
||||||
<object class="NSMutableArray" key="IBDocument.RootObjects" id="248533267">
|
<object class="NSMutableArray" key="IBDocument.RootObjects" id="248533267">
|
||||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||||
@@ -83,11 +78,9 @@
|
|||||||
<string key="NSToolbarItemPaletteLabel">Power Marker</string>
|
<string key="NSToolbarItemPaletteLabel">Power Marker</string>
|
||||||
<nil key="NSToolbarItemToolTip"/>
|
<nil key="NSToolbarItemToolTip"/>
|
||||||
<object class="NSSegmentedControl" key="NSToolbarItemView" id="35398541">
|
<object class="NSSegmentedControl" key="NSToolbarItemView" id="35398541">
|
||||||
<reference key="NSNextResponder"/>
|
<nil key="NSNextResponder"/>
|
||||||
<int key="NSvFlags">256</int>
|
<int key="NSvFlags">256</int>
|
||||||
<string key="NSFrame">{{7, 14}, {67, 25}}</string>
|
<string key="NSFrame">{{7, 14}, {67, 25}}</string>
|
||||||
<reference key="NSSuperview"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
<bool key="NSEnabled">YES</bool>
|
||||||
<object class="NSSegmentedCell" key="NSCell" id="431579725">
|
<object class="NSSegmentedCell" key="NSCell" id="431579725">
|
||||||
<int key="NSCellFlags">67239424</int>
|
<int key="NSCellFlags">67239424</int>
|
||||||
@@ -179,11 +172,9 @@
|
|||||||
<string key="NSToolbarItemPaletteLabel">Filter</string>
|
<string key="NSToolbarItemPaletteLabel">Filter</string>
|
||||||
<nil key="NSToolbarItemToolTip"/>
|
<nil key="NSToolbarItemToolTip"/>
|
||||||
<object class="NSSearchField" key="NSToolbarItemView" id="1013657232">
|
<object class="NSSearchField" key="NSToolbarItemView" id="1013657232">
|
||||||
<reference key="NSNextResponder"/>
|
<nil key="NSNextResponder"/>
|
||||||
<int key="NSvFlags">258</int>
|
<int key="NSvFlags">258</int>
|
||||||
<string key="NSFrame">{{0, 14}, {81, 22}}</string>
|
<string key="NSFrame">{{0, 14}, {81, 22}}</string>
|
||||||
<reference key="NSSuperview"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
<bool key="NSEnabled">YES</bool>
|
||||||
<object class="NSSearchFieldCell" key="NSCell" id="484816507">
|
<object class="NSSearchFieldCell" key="NSCell" id="484816507">
|
||||||
<int key="NSCellFlags">343014976</int>
|
<int key="NSCellFlags">343014976</int>
|
||||||
@@ -325,11 +316,9 @@
|
|||||||
<string key="NSToolbarItemPaletteLabel">Action</string>
|
<string key="NSToolbarItemPaletteLabel">Action</string>
|
||||||
<nil key="NSToolbarItemToolTip"/>
|
<nil key="NSToolbarItemToolTip"/>
|
||||||
<object class="NSPopUpButton" key="NSToolbarItemView" id="165812138">
|
<object class="NSPopUpButton" key="NSToolbarItemView" id="165812138">
|
||||||
<reference key="NSNextResponder"/>
|
<nil key="NSNextResponder"/>
|
||||||
<int key="NSvFlags">256</int>
|
<int key="NSvFlags">256</int>
|
||||||
<string key="NSFrame">{{1, 14}, {40, 25}}</string>
|
<string key="NSFrame">{{1, 14}, {40, 25}}</string>
|
||||||
<reference key="NSSuperview"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
<bool key="NSEnabled">YES</bool>
|
||||||
<object class="NSPopUpButtonCell" key="NSCell" id="436420677">
|
<object class="NSPopUpButtonCell" key="NSCell" id="436420677">
|
||||||
<int key="NSCellFlags">-2076049856</int>
|
<int key="NSCellFlags">-2076049856</int>
|
||||||
@@ -541,11 +530,9 @@
|
|||||||
<string key="NSToolbarItemPaletteLabel">Delta Values</string>
|
<string key="NSToolbarItemPaletteLabel">Delta Values</string>
|
||||||
<nil key="NSToolbarItemToolTip"/>
|
<nil key="NSToolbarItemToolTip"/>
|
||||||
<object class="NSSegmentedControl" key="NSToolbarItemView" id="311230297">
|
<object class="NSSegmentedControl" key="NSToolbarItemView" id="311230297">
|
||||||
<reference key="NSNextResponder"/>
|
<nil key="NSNextResponder"/>
|
||||||
<int key="NSvFlags">256</int>
|
<int key="NSvFlags">256</int>
|
||||||
<string key="NSFrame">{{4, 14}, {67, 25}}</string>
|
<string key="NSFrame">{{4, 14}, {67, 25}}</string>
|
||||||
<reference key="NSSuperview"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
<bool key="NSEnabled">YES</bool>
|
||||||
<object class="NSSegmentedCell" key="NSCell" id="211272396">
|
<object class="NSSegmentedCell" key="NSCell" id="211272396">
|
||||||
<int key="NSCellFlags">67239424</int>
|
<int key="NSCellFlags">67239424</int>
|
||||||
@@ -688,7 +675,9 @@
|
|||||||
<reference ref="729141644"/>
|
<reference ref="729141644"/>
|
||||||
<reference ref="764949265"/>
|
<reference ref="764949265"/>
|
||||||
</object>
|
</object>
|
||||||
<reference key="NSToolbarIBSelectableItems" ref="0"/>
|
<object class="NSArray" key="NSToolbarIBSelectableItems" id="0">
|
||||||
|
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||||
|
</object>
|
||||||
</object>
|
</object>
|
||||||
<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
|
<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
|
||||||
<string key="NSWindowContentMinSize">{340, 340}</string>
|
<string key="NSWindowContentMinSize">{340, 340}</string>
|
||||||
@@ -1652,14 +1641,6 @@
|
|||||||
</object>
|
</object>
|
||||||
<int key="connectionID">139</int>
|
<int key="connectionID">139</int>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBConnectionRecord">
|
|
||||||
<object class="IBActionConnection" key="connection">
|
|
||||||
<string key="label">orderFrontStandardAboutPanel:</string>
|
|
||||||
<reference key="source" ref="77446904"/>
|
|
||||||
<reference key="destination" ref="436112936"/>
|
|
||||||
</object>
|
|
||||||
<int key="connectionID">142</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBConnectionRecord">
|
<object class="IBConnectionRecord">
|
||||||
<object class="IBActionConnection" key="connection">
|
<object class="IBActionConnection" key="connection">
|
||||||
<string key="label">hideOtherApplications:</string>
|
<string key="label">hideOtherApplications:</string>
|
||||||
@@ -2284,6 +2265,14 @@
|
|||||||
</object>
|
</object>
|
||||||
<int key="connectionID">1231</int>
|
<int key="connectionID">1231</int>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="IBConnectionRecord">
|
||||||
|
<object class="IBActionConnection" key="connection">
|
||||||
|
<string key="label">showAboutBox:</string>
|
||||||
|
<reference key="source" ref="91622651"/>
|
||||||
|
<reference key="destination" ref="436112936"/>
|
||||||
|
</object>
|
||||||
|
<int key="connectionID">1232</int>
|
||||||
|
</object>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||||
<object class="NSArray" key="orderedObjects">
|
<object class="NSArray" key="orderedObjects">
|
||||||
@@ -3689,7 +3678,7 @@
|
|||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
<nil key="sourceID"/>
|
<nil key="sourceID"/>
|
||||||
<int key="maxID">1231</int>
|
<int key="maxID">1232</int>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||||
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
|
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||||
@@ -3795,6 +3784,17 @@
|
|||||||
<object class="IBPartialClassDescription">
|
<object class="IBPartialClassDescription">
|
||||||
<string key="className">AppDelegateBase</string>
|
<string key="className">AppDelegateBase</string>
|
||||||
<string key="superclassName">NSObject</string>
|
<string key="superclassName">NSObject</string>
|
||||||
|
<object class="NSMutableDictionary" key="actions">
|
||||||
|
<string key="NS.key.0">showAboutBox:</string>
|
||||||
|
<string key="NS.object.0">id</string>
|
||||||
|
</object>
|
||||||
|
<object class="NSMutableDictionary" key="actionInfosByName">
|
||||||
|
<string key="NS.key.0">showAboutBox:</string>
|
||||||
|
<object class="IBActionInfo" key="NS.object.0">
|
||||||
|
<string key="name">showAboutBox:</string>
|
||||||
|
<string key="candidateClassName">id</string>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
<object class="NSMutableDictionary" key="outlets">
|
<object class="NSMutableDictionary" key="outlets">
|
||||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||||
<object class="NSArray" key="dict.sortedKeys">
|
<object class="NSArray" key="dict.sortedKeys">
|
||||||
@@ -3887,7 +3887,7 @@
|
|||||||
</object>
|
</object>
|
||||||
<object class="IBPartialClassDescription">
|
<object class="IBPartialClassDescription">
|
||||||
<string key="className">PyApp</string>
|
<string key="className">PyApp</string>
|
||||||
<string key="superclassName">PyRegistrable</string>
|
<string key="superclassName">PyFairware</string>
|
||||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
<string key="majorKey">IBProjectSource</string>
|
<string key="majorKey">IBProjectSource</string>
|
||||||
<string key="minorKey">../PyApp.h</string>
|
<string key="minorKey">../PyApp.h</string>
|
||||||
@@ -3895,7 +3895,7 @@
|
|||||||
</object>
|
</object>
|
||||||
<object class="IBPartialClassDescription">
|
<object class="IBPartialClassDescription">
|
||||||
<string key="className">PyApp</string>
|
<string key="className">PyApp</string>
|
||||||
<string key="superclassName">PyRegistrable</string>
|
<string key="superclassName">PyFairware</string>
|
||||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
<string key="majorKey">IBUserSource</string>
|
<string key="majorKey">IBUserSource</string>
|
||||||
<string key="minorKey"/>
|
<string key="minorKey"/>
|
||||||
@@ -3925,6 +3925,14 @@
|
|||||||
<string key="minorKey">../base/PyDupeGuru.h</string>
|
<string key="minorKey">../base/PyDupeGuru.h</string>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="IBPartialClassDescription">
|
||||||
|
<string key="className">PyFairware</string>
|
||||||
|
<string key="superclassName">NSObject</string>
|
||||||
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
|
<string key="majorKey">IBProjectSource</string>
|
||||||
|
<string key="minorKey">../PyFairware.h</string>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
<object class="IBPartialClassDescription">
|
<object class="IBPartialClassDescription">
|
||||||
<string key="className">RecentDirectories</string>
|
<string key="className">RecentDirectories</string>
|
||||||
<string key="superclassName">NSObject</string>
|
<string key="superclassName">NSObject</string>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>hsft</string>
|
<string>hsft</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>5.10.3</string>
|
<string>5.10.4</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
<string>MainMenu</string>
|
<string>MainMenu</string>
|
||||||
<key>NSPrincipalClass</key>
|
<key>NSPrincipalClass</key>
|
||||||
|
|||||||
@@ -43,6 +43,8 @@
|
|||||||
CE49DEF60FDFEB810098617B /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */; };
|
CE49DEF60FDFEB810098617B /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */; };
|
||||||
CE4B59C81119919700C06C9E /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4B59C51119919700C06C9E /* ErrorReportWindow.xib */; };
|
CE4B59C81119919700C06C9E /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4B59C51119919700C06C9E /* ErrorReportWindow.xib */; };
|
||||||
CE4B59C91119919700C06C9E /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4B59C61119919700C06C9E /* progress.xib */; };
|
CE4B59C91119919700C06C9E /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4B59C61119919700C06C9E /* progress.xib */; };
|
||||||
|
CE4F934612CCA9470067A3AE /* about.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4F934512CCA9470067A3AE /* about.xib */; };
|
||||||
|
CE4F934912CCA96C0067A3AE /* HSAboutBox.m in Sources */ = {isa = PBXBuildFile; fileRef = CE4F934812CCA96C0067A3AE /* HSAboutBox.m */; };
|
||||||
CE515DF30FC6C12E00EC695D /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE10FC6C12E00EC695D /* Dialogs.m */; };
|
CE515DF30FC6C12E00EC695D /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE10FC6C12E00EC695D /* Dialogs.m */; };
|
||||||
CE515DF40FC6C12E00EC695D /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE30FC6C12E00EC695D /* HSErrorReportWindow.m */; };
|
CE515DF40FC6C12E00EC695D /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE30FC6C12E00EC695D /* HSErrorReportWindow.m */; };
|
||||||
CE515DF60FC6C12E00EC695D /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE70FC6C12E00EC695D /* ProgressController.m */; };
|
CE515DF60FC6C12E00EC695D /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE70FC6C12E00EC695D /* ProgressController.m */; };
|
||||||
@@ -130,6 +132,9 @@
|
|||||||
CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE4B59C51119919700C06C9E /* ErrorReportWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ErrorReportWindow.xib; sourceTree = "<group>"; };
|
CE4B59C51119919700C06C9E /* ErrorReportWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ErrorReportWindow.xib; sourceTree = "<group>"; };
|
||||||
CE4B59C61119919700C06C9E /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = "<group>"; };
|
CE4B59C61119919700C06C9E /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = "<group>"; };
|
||||||
|
CE4F934512CCA9470067A3AE /* about.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = about.xib; path = ../../cocoalib/xib/about.xib; sourceTree = SOURCE_ROOT; };
|
||||||
|
CE4F934712CCA96C0067A3AE /* HSAboutBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSAboutBox.h; path = ../../cocoalib/HSAboutBox.h; sourceTree = SOURCE_ROOT; };
|
||||||
|
CE4F934812CCA96C0067A3AE /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE00FC6C12E00EC695D /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = ../../cocoalib/Dialogs.h; sourceTree = SOURCE_ROOT; };
|
CE515DE00FC6C12E00EC695D /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = ../../cocoalib/Dialogs.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE10FC6C12E00EC695D /* Dialogs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Dialogs.m; path = ../../cocoalib/Dialogs.m; sourceTree = SOURCE_ROOT; };
|
CE515DE10FC6C12E00EC695D /* Dialogs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Dialogs.m; path = ../../cocoalib/Dialogs.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE20FC6C12E00EC695D /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = ../../cocoalib/HSErrorReportWindow.h; sourceTree = SOURCE_ROOT; };
|
CE515DE20FC6C12E00EC695D /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = ../../cocoalib/HSErrorReportWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
@@ -347,6 +352,7 @@
|
|||||||
CE4B59C41119919700C06C9E /* xib */ = {
|
CE4B59C41119919700C06C9E /* xib */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
CE4F934512CCA9470067A3AE /* about.xib */,
|
||||||
CE74A12512537F2E008A8DF0 /* FairwareReminder.xib */,
|
CE74A12512537F2E008A8DF0 /* FairwareReminder.xib */,
|
||||||
CE4B59C51119919700C06C9E /* ErrorReportWindow.xib */,
|
CE4B59C51119919700C06C9E /* ErrorReportWindow.xib */,
|
||||||
CE4B59C61119919700C06C9E /* progress.xib */,
|
CE4B59C61119919700C06C9E /* progress.xib */,
|
||||||
@@ -370,6 +376,8 @@
|
|||||||
CE74A12112537F06008A8DF0 /* HSFairwareReminder.h */,
|
CE74A12112537F06008A8DF0 /* HSFairwareReminder.h */,
|
||||||
CE74A12212537F06008A8DF0 /* HSFairwareReminder.m */,
|
CE74A12212537F06008A8DF0 /* HSFairwareReminder.m */,
|
||||||
CE74A12312537F06008A8DF0 /* PyFairware.h */,
|
CE74A12312537F06008A8DF0 /* PyFairware.h */,
|
||||||
|
CE4F934712CCA96C0067A3AE /* HSAboutBox.h */,
|
||||||
|
CE4F934812CCA96C0067A3AE /* HSAboutBox.m */,
|
||||||
CE003CB911242D00004B0AA7 /* NSEventAdditions.h */,
|
CE003CB911242D00004B0AA7 /* NSEventAdditions.h */,
|
||||||
CE003CBA11242D00004B0AA7 /* NSEventAdditions.m */,
|
CE003CBA11242D00004B0AA7 /* NSEventAdditions.m */,
|
||||||
CE515DE60FC6C12E00EC695D /* ProgressController.h */,
|
CE515DE60FC6C12E00EC695D /* ProgressController.h */,
|
||||||
@@ -455,6 +463,7 @@
|
|||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */;
|
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */;
|
||||||
compatibilityVersion = "Xcode 3.0";
|
compatibilityVersion = "Xcode 3.0";
|
||||||
|
developmentRegion = English;
|
||||||
hasScannedForEncodings = 1;
|
hasScannedForEncodings = 1;
|
||||||
knownRegions = (
|
knownRegions = (
|
||||||
English,
|
English,
|
||||||
@@ -492,6 +501,7 @@
|
|||||||
CE4B59C91119919700C06C9E /* progress.xib in Resources */,
|
CE4B59C91119919700C06C9E /* progress.xib in Resources */,
|
||||||
CE0A0C061175A24800DCA3C6 /* ProblemDialog.xib in Resources */,
|
CE0A0C061175A24800DCA3C6 /* ProblemDialog.xib in Resources */,
|
||||||
CE74A12712537F2E008A8DF0 /* FairwareReminder.xib in Resources */,
|
CE74A12712537F2E008A8DF0 /* FairwareReminder.xib in Resources */,
|
||||||
|
CE4F934612CCA9470067A3AE /* about.xib in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -531,6 +541,7 @@
|
|||||||
CEB14D29124DFC2800FA7481 /* ResultTable.m in Sources */,
|
CEB14D29124DFC2800FA7481 /* ResultTable.m in Sources */,
|
||||||
CE578303124DFC660004769C /* HSTableView.m in Sources */,
|
CE578303124DFC660004769C /* HSTableView.m in Sources */,
|
||||||
CE74A12412537F06008A8DF0 /* HSFairwareReminder.m in Sources */,
|
CE74A12412537F06008A8DF0 /* HSFairwareReminder.m in Sources */,
|
||||||
|
CE4F934912CCA96C0067A3AE /* HSAboutBox.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>hsft</string>
|
<string>hsft</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1.11.2</string>
|
<string>1.11.3</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
<string>MainMenu</string>
|
<string>MainMenu</string>
|
||||||
<key>NSPrincipalClass</key>
|
<key>NSPrincipalClass</key>
|
||||||
|
|||||||
@@ -63,13 +63,16 @@ http://www.hardcoded.net/licenses/bsd_license
|
|||||||
[_py setIgnoreHardlinkMatches:n2b([ud objectForKey:@"ignoreHardlinkMatches"])];
|
[_py setIgnoreHardlinkMatches:n2b([ud objectForKey:@"ignoreHardlinkMatches"])];
|
||||||
[_py setMatchScaled:[ud objectForKey:@"matchScaled"]];
|
[_py setMatchScaled:[ud objectForKey:@"matchScaled"]];
|
||||||
int r = n2i([py doScan]);
|
int r = n2i([py doScan]);
|
||||||
if (r != 0)
|
if (r != 0) {
|
||||||
[[ProgressController mainProgressController] hide];
|
[[ProgressController mainProgressController] hide];
|
||||||
if (r == 3)
|
}
|
||||||
{
|
if (r == 3) {
|
||||||
[Dialogs showMessage:@"The selected directories contain no scannable file."];
|
[Dialogs showMessage:@"The selected directories contain no scannable file."];
|
||||||
[app toggleDirectories:nil];
|
[app toggleDirectories:nil];
|
||||||
}
|
}
|
||||||
|
if (r == 4) {
|
||||||
|
[Dialogs showMessage:@"The iPhoto application couldn't be found."];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)toggleDirectories:(id)sender
|
- (IBAction)toggleDirectories:(id)sender
|
||||||
|
|||||||
@@ -51,6 +51,8 @@
|
|||||||
CE9EA75C1122C96C008CD2BC /* NSTableViewAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA7551122C96C008CD2BC /* NSTableViewAdditions.m */; };
|
CE9EA75C1122C96C008CD2BC /* NSTableViewAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA7551122C96C008CD2BC /* NSTableViewAdditions.m */; };
|
||||||
CE9EA7721122CA0B008CD2BC /* DirectoryOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA7701122CA0B008CD2BC /* DirectoryOutline.m */; };
|
CE9EA7721122CA0B008CD2BC /* DirectoryOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA7701122CA0B008CD2BC /* DirectoryOutline.m */; };
|
||||||
CEBAE4270FDA97E000B7887D /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */; };
|
CEBAE4270FDA97E000B7887D /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */; };
|
||||||
|
CEC9DB4712CCAA6B003102F0 /* about.xib in Resources */ = {isa = PBXBuildFile; fileRef = CEC9DB4612CCAA6B003102F0 /* about.xib */; };
|
||||||
|
CEC9DB4C12CCAA7D003102F0 /* HSAboutBox.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC9DB4B12CCAA7D003102F0 /* HSAboutBox.m */; };
|
||||||
CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CECA899A09DB132E00A3D774 /* DetailsPanel.h */; };
|
CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CECA899A09DB132E00A3D774 /* DetailsPanel.h */; };
|
||||||
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CECA899B09DB132E00A3D774 /* DetailsPanel.m */; };
|
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CECA899B09DB132E00A3D774 /* DetailsPanel.m */; };
|
||||||
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; };
|
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; };
|
||||||
@@ -165,6 +167,9 @@
|
|||||||
CE9EA7711122CA0B008CD2BC /* PyDirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDirectoryOutline.h; path = ../base/PyDirectoryOutline.h; sourceTree = SOURCE_ROOT; };
|
CE9EA7711122CA0B008CD2BC /* PyDirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDirectoryOutline.h; path = ../base/PyDirectoryOutline.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEBAE4230FDA97E000B7887D /* BRSingleLineFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSingleLineFormatter.h; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.h; sourceTree = SOURCE_ROOT; };
|
CEBAE4230FDA97E000B7887D /* BRSingleLineFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSingleLineFormatter.h; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
||||||
|
CEC9DB4612CCAA6B003102F0 /* about.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = about.xib; path = ../../cocoalib/xib/about.xib; sourceTree = SOURCE_ROOT; };
|
||||||
|
CEC9DB4A12CCAA7D003102F0 /* HSAboutBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSAboutBox.h; path = ../../cocoalib/HSAboutBox.h; sourceTree = SOURCE_ROOT; };
|
||||||
|
CEC9DB4B12CCAA7D003102F0 /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; };
|
||||||
CECA899A09DB132E00A3D774 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DetailsPanel.h; sourceTree = "<group>"; };
|
CECA899A09DB132E00A3D774 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DetailsPanel.h; sourceTree = "<group>"; };
|
||||||
CECA899B09DB132E00A3D774 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DetailsPanel.m; sourceTree = "<group>"; };
|
CECA899B09DB132E00A3D774 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DetailsPanel.m; sourceTree = "<group>"; };
|
||||||
CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = "<group>"; };
|
CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = "<group>"; };
|
||||||
@@ -297,6 +302,7 @@
|
|||||||
CE7AC9141119911200D02F6C /* xib */ = {
|
CE7AC9141119911200D02F6C /* xib */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
CEC9DB4612CCAA6B003102F0 /* about.xib */,
|
||||||
CE1EB5FF12537FB90034AABB /* FairwareReminder.xib */,
|
CE1EB5FF12537FB90034AABB /* FairwareReminder.xib */,
|
||||||
CE7AC9151119911200D02F6C /* ErrorReportWindow.xib */,
|
CE7AC9151119911200D02F6C /* ErrorReportWindow.xib */,
|
||||||
CE7AC9161119911200D02F6C /* progress.xib */,
|
CE7AC9161119911200D02F6C /* progress.xib */,
|
||||||
@@ -326,6 +332,8 @@
|
|||||||
CE1EB5FB12537F9D0034AABB /* HSFairwareReminder.h */,
|
CE1EB5FB12537F9D0034AABB /* HSFairwareReminder.h */,
|
||||||
CE1EB5FC12537F9D0034AABB /* HSFairwareReminder.m */,
|
CE1EB5FC12537F9D0034AABB /* HSFairwareReminder.m */,
|
||||||
CE1EB5FD12537F9D0034AABB /* PyFairware.h */,
|
CE1EB5FD12537F9D0034AABB /* PyFairware.h */,
|
||||||
|
CEC9DB4A12CCAA7D003102F0 /* HSAboutBox.h */,
|
||||||
|
CEC9DB4B12CCAA7D003102F0 /* HSAboutBox.m */,
|
||||||
CE80DB210FC192D60086DCA6 /* ProgressController.h */,
|
CE80DB210FC192D60086DCA6 /* ProgressController.h */,
|
||||||
CE80DB220FC192D60086DCA6 /* ProgressController.m */,
|
CE80DB220FC192D60086DCA6 /* ProgressController.m */,
|
||||||
CE80DB230FC192D60086DCA6 /* PyApp.h */,
|
CE80DB230FC192D60086DCA6 /* PyApp.h */,
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */;
|
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */;
|
||||||
compatibilityVersion = "Xcode 3.0";
|
compatibilityVersion = "Xcode 3.0";
|
||||||
|
developmentRegion = English;
|
||||||
hasScannedForEncodings = 1;
|
hasScannedForEncodings = 1;
|
||||||
knownRegions = (
|
knownRegions = (
|
||||||
English,
|
English,
|
||||||
@@ -500,6 +509,7 @@
|
|||||||
CE7AC9191119911200D02F6C /* progress.xib in Resources */,
|
CE7AC9191119911200D02F6C /* progress.xib in Resources */,
|
||||||
CE0C2AC81177021600BC749F /* ProblemDialog.xib in Resources */,
|
CE0C2AC81177021600BC749F /* ProblemDialog.xib in Resources */,
|
||||||
CE1EB60112537FB90034AABB /* FairwareReminder.xib in Resources */,
|
CE1EB60112537FB90034AABB /* FairwareReminder.xib in Resources */,
|
||||||
|
CEC9DB4712CCAA6B003102F0 /* about.xib in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -542,6 +552,7 @@
|
|||||||
CEF12A7E124DFD400087B51D /* HSTableView.m in Sources */,
|
CEF12A7E124DFD400087B51D /* HSTableView.m in Sources */,
|
||||||
CEF12A84124DFD620087B51D /* ResultTable.m in Sources */,
|
CEF12A84124DFD620087B51D /* ResultTable.m in Sources */,
|
||||||
CE1EB5FE12537F9D0034AABB /* HSFairwareReminder.m in Sources */,
|
CE1EB5FE12537F9D0034AABB /* HSFairwareReminder.m in Sources */,
|
||||||
|
CEC9DB4C12CCAA7D003102F0 /* HSAboutBox.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
CE073F6309CAE1A3005C1D2F /* dupeguru_help in Resources */ = {isa = PBXBuildFile; fileRef = CE073F5409CAE1A3005C1D2F /* dupeguru_help */; };
|
CE073F6309CAE1A3005C1D2F /* dupeguru_help in Resources */ = {isa = PBXBuildFile; fileRef = CE073F5409CAE1A3005C1D2F /* dupeguru_help */; };
|
||||||
CE19BC6311199231007CCEB0 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6011199231007CCEB0 /* ErrorReportWindow.xib */; };
|
CE19BC6311199231007CCEB0 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6011199231007CCEB0 /* ErrorReportWindow.xib */; };
|
||||||
CE19BC6411199231007CCEB0 /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6111199231007CCEB0 /* progress.xib */; };
|
CE19BC6411199231007CCEB0 /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6111199231007CCEB0 /* progress.xib */; };
|
||||||
|
CE27D3C112CCA42500859E67 /* about.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE27D3C012CCA42500859E67 /* about.xib */; };
|
||||||
|
CE27D3C412CCA43800859E67 /* HSAboutBox.m in Sources */ = {isa = PBXBuildFile; fileRef = CE27D3C312CCA43800859E67 /* HSAboutBox.m */; };
|
||||||
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; };
|
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; };
|
||||||
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; };
|
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; };
|
||||||
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */ = {isa = PBXBuildFile; fileRef = CE381CF509915304003581CE /* dg_cocoa.plugin */; };
|
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */ = {isa = PBXBuildFile; fileRef = CE381CF509915304003581CE /* dg_cocoa.plugin */; };
|
||||||
@@ -79,6 +81,9 @@
|
|||||||
CE073F5409CAE1A3005C1D2F /* dupeguru_help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dupeguru_help; path = ../../help_se/dupeguru_help; sourceTree = "<group>"; };
|
CE073F5409CAE1A3005C1D2F /* dupeguru_help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dupeguru_help; path = ../../help_se/dupeguru_help; sourceTree = "<group>"; };
|
||||||
CE19BC6011199231007CCEB0 /* ErrorReportWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ErrorReportWindow.xib; sourceTree = "<group>"; };
|
CE19BC6011199231007CCEB0 /* ErrorReportWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ErrorReportWindow.xib; sourceTree = "<group>"; };
|
||||||
CE19BC6111199231007CCEB0 /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = "<group>"; };
|
CE19BC6111199231007CCEB0 /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = "<group>"; };
|
||||||
|
CE27D3C012CCA42500859E67 /* about.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = about.xib; path = ../../cocoalib/xib/about.xib; sourceTree = SOURCE_ROOT; };
|
||||||
|
CE27D3C212CCA43800859E67 /* HSAboutBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSAboutBox.h; path = ../../cocoalib/HSAboutBox.h; sourceTree = SOURCE_ROOT; };
|
||||||
|
CE27D3C312CCA43800859E67 /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9409914ACE003581CE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
CE381C9409914ACE003581CE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9509914ACE003581CE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
CE381C9509914ACE003581CE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9A09914ADF003581CE /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
CE381C9A09914ADF003581CE /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
@@ -252,6 +257,7 @@
|
|||||||
CE19BC5F11199231007CCEB0 /* xib */ = {
|
CE19BC5F11199231007CCEB0 /* xib */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
CE27D3C012CCA42500859E67 /* about.xib */,
|
||||||
CE79638412536C94008D405B /* FairwareReminder.xib */,
|
CE79638412536C94008D405B /* FairwareReminder.xib */,
|
||||||
CE19BC6011199231007CCEB0 /* ErrorReportWindow.xib */,
|
CE19BC6011199231007CCEB0 /* ErrorReportWindow.xib */,
|
||||||
CE19BC6111199231007CCEB0 /* progress.xib */,
|
CE19BC6111199231007CCEB0 /* progress.xib */,
|
||||||
@@ -351,6 +357,8 @@
|
|||||||
CE79638A12536F4E008D405B /* HSFairwareReminder.h */,
|
CE79638A12536F4E008D405B /* HSFairwareReminder.h */,
|
||||||
CE79638B12536F4E008D405B /* HSFairwareReminder.m */,
|
CE79638B12536F4E008D405B /* HSFairwareReminder.m */,
|
||||||
CE79638212536C6E008D405B /* PyFairware.h */,
|
CE79638212536C6E008D405B /* PyFairware.h */,
|
||||||
|
CE27D3C212CCA43800859E67 /* HSAboutBox.h */,
|
||||||
|
CE27D3C312CCA43800859E67 /* HSAboutBox.m */,
|
||||||
CEFC7F900FC9517500CD5728 /* ProgressController.h */,
|
CEFC7F900FC9517500CD5728 /* ProgressController.h */,
|
||||||
CEFC7F910FC9517500CD5728 /* ProgressController.m */,
|
CEFC7F910FC9517500CD5728 /* ProgressController.m */,
|
||||||
CEFC7F920FC9517500CD5728 /* PyApp.h */,
|
CEFC7F920FC9517500CD5728 /* PyApp.h */,
|
||||||
@@ -426,6 +434,7 @@
|
|||||||
};
|
};
|
||||||
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */;
|
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */;
|
||||||
compatibilityVersion = "Xcode 3.0";
|
compatibilityVersion = "Xcode 3.0";
|
||||||
|
developmentRegion = English;
|
||||||
hasScannedForEncodings = 1;
|
hasScannedForEncodings = 1;
|
||||||
knownRegions = (
|
knownRegions = (
|
||||||
English,
|
English,
|
||||||
@@ -463,6 +472,7 @@
|
|||||||
CE19BC6411199231007CCEB0 /* progress.xib in Resources */,
|
CE19BC6411199231007CCEB0 /* progress.xib in Resources */,
|
||||||
CE647E591173026F006D28BA /* ProblemDialog.xib in Resources */,
|
CE647E591173026F006D28BA /* ProblemDialog.xib in Resources */,
|
||||||
CE79638612536C94008D405B /* FairwareReminder.xib in Resources */,
|
CE79638612536C94008D405B /* FairwareReminder.xib in Resources */,
|
||||||
|
CE27D3C112CCA42500859E67 /* about.xib in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -501,6 +511,7 @@
|
|||||||
CE6DD4E7124CA3070089A48D /* ResultTable.m in Sources */,
|
CE6DD4E7124CA3070089A48D /* ResultTable.m in Sources */,
|
||||||
CE6DD547124CAF1F0089A48D /* HSTableView.m in Sources */,
|
CE6DD547124CAF1F0089A48D /* HSTableView.m in Sources */,
|
||||||
CE79638C12536F4E008D405B /* HSFairwareReminder.m in Sources */,
|
CE79638C12536F4E008D405B /* HSFairwareReminder.m in Sources */,
|
||||||
|
CE27D3C412CCA43800859E67 /* HSAboutBox.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -113,7 +113,11 @@ class DupeGuru(RegistrableApplication, Broadcaster):
|
|||||||
seen_inodes = set()
|
seen_inodes = set()
|
||||||
result = []
|
result = []
|
||||||
for file in files:
|
for file in files:
|
||||||
|
try:
|
||||||
inode = io.stat(file.path).st_ino
|
inode = io.stat(file.path).st_ino
|
||||||
|
except OSError:
|
||||||
|
# The file was probably deleted or something
|
||||||
|
continue
|
||||||
if inode not in seen_inodes:
|
if inode not in seen_inodes:
|
||||||
seen_inodes.add(inode)
|
seen_inodes.add(inode)
|
||||||
result.append(file)
|
result.append(file)
|
||||||
@@ -349,6 +353,7 @@ class DupeGuru(RegistrableApplication, Broadcaster):
|
|||||||
if not self.directories.has_any_file():
|
if not self.directories.has_any_file():
|
||||||
raise NoScannableFileError()
|
raise NoScannableFileError()
|
||||||
self.results.groups = []
|
self.results.groups = []
|
||||||
|
self.notify('results_changed')
|
||||||
self._start_job(JOB_SCAN, do)
|
self._start_job(JOB_SCAN, do)
|
||||||
|
|
||||||
def toggle_selected_mark_state(self):
|
def toggle_selected_mark_state(self):
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
# http://www.hardcoded.net/licenses/bsd_license
|
# http://www.hardcoded.net/licenses/bsd_license
|
||||||
|
|
||||||
from hsgui.tree import Tree, Node
|
from hscommon.gui.tree import Tree, Node
|
||||||
|
|
||||||
from ..directories import STATE_NORMAL, STATE_REFERENCE, STATE_EXCLUDED
|
from ..directories import STATE_NORMAL, STATE_REFERENCE, STATE_EXCLUDED
|
||||||
from .base import GUIObject
|
from .base import GUIObject
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
# http://www.hardcoded.net/licenses/bsd_license
|
# http://www.hardcoded.net/licenses/bsd_license
|
||||||
|
|
||||||
from hscommon.notify import Listener
|
from hscommon.notify import Listener
|
||||||
from hsgui.table import GUITable, Row
|
from hscommon.gui.table import GUITable, Row
|
||||||
|
|
||||||
class ProblemTable(GUITable, Listener):
|
class ProblemTable(GUITable, Listener):
|
||||||
def __init__(self, view, problem_dialog):
|
def __init__(self, view, problem_dialog):
|
||||||
@@ -31,7 +31,6 @@ class ProblemTable(GUITable, Listener):
|
|||||||
#--- Event handlers
|
#--- Event handlers
|
||||||
def problems_changed(self):
|
def problems_changed(self):
|
||||||
self.refresh()
|
self.refresh()
|
||||||
self.view.refresh()
|
|
||||||
|
|
||||||
|
|
||||||
class ProblemRow(Row):
|
class ProblemRow(Row):
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
from operator import attrgetter
|
from operator import attrgetter
|
||||||
|
|
||||||
from hsgui.table import GUITable, Row
|
from hscommon.gui.table import GUITable, Row
|
||||||
|
|
||||||
from .base import GUIObject
|
from .base import GUIObject
|
||||||
|
|
||||||
@@ -87,7 +87,6 @@ class ResultTable(GUIObject, GUITable):
|
|||||||
|
|
||||||
def _refresh_with_view(self):
|
def _refresh_with_view(self):
|
||||||
self.refresh()
|
self.refresh()
|
||||||
self.view.refresh()
|
|
||||||
self.view.show_selected_row()
|
self.view.show_selected_row()
|
||||||
|
|
||||||
#--- Public
|
#--- Public
|
||||||
@@ -139,7 +138,6 @@ class ResultTable(GUIObject, GUITable):
|
|||||||
return
|
return
|
||||||
self._delta_values = value
|
self._delta_values = value
|
||||||
self.refresh()
|
self.refresh()
|
||||||
self.view.refresh()
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def selected_dupe_count(self):
|
def selected_dupe_count(self):
|
||||||
@@ -156,7 +154,7 @@ class ResultTable(GUIObject, GUITable):
|
|||||||
# What we want to to here is that instead of restoring selected *dupes* after refresh, we
|
# What we want to to here is that instead of restoring selected *dupes* after refresh, we
|
||||||
# restore selected *paths*.
|
# restore selected *paths*.
|
||||||
indexes = self.selected_indexes
|
indexes = self.selected_indexes
|
||||||
self.refresh()
|
self.refresh(refresh_view=False)
|
||||||
self.select(indexes)
|
self.select(indexes)
|
||||||
self.view.refresh()
|
self.view.refresh()
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ from hsutil import io
|
|||||||
from hsutil.path import Path
|
from hsutil.path import Path
|
||||||
from hsutil.decorators import log_calls
|
from hsutil.decorators import log_calls
|
||||||
import hsutil.files
|
import hsutil.files
|
||||||
from jobprogress.job import nulljob
|
from hscommon.testutil import CallLogger
|
||||||
|
from jobprogress.job import nulljob, Job, JobCancelled
|
||||||
|
|
||||||
from . import data
|
from . import data
|
||||||
from .results_test import GetTestGroups
|
from .results_test import GetTestGroups
|
||||||
@@ -27,29 +28,21 @@ from ..gui.result_table import ResultTable
|
|||||||
from ..scanner import ScanType
|
from ..scanner import ScanType
|
||||||
|
|
||||||
class DupeGuru(DupeGuruBase):
|
class DupeGuru(DupeGuruBase):
|
||||||
|
JOB = nulljob
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
DupeGuruBase.__init__(self, data, '/tmp')
|
DupeGuruBase.__init__(self, data, '/tmp')
|
||||||
|
|
||||||
def _start_job(self, jobid, func, *args):
|
def _start_job(self, jobid, func, *args):
|
||||||
func(nulljob, *args)
|
try:
|
||||||
|
func(self.JOB, *args)
|
||||||
|
except JobCancelled:
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
class CallLogger(object):
|
def add_fake_files_to_directories(directories, files):
|
||||||
"""This is a dummy object that logs all calls made to it.
|
directories.get_files = lambda: iter(files)
|
||||||
|
directories._dirs.append('this is just so Scan() doesnt return 3')
|
||||||
It is used to simulate the GUI layer.
|
|
||||||
"""
|
|
||||||
def __init__(self):
|
|
||||||
self.calls = []
|
|
||||||
|
|
||||||
def __getattr__(self, func_name):
|
|
||||||
def func(*args, **kw):
|
|
||||||
self.calls.append(func_name)
|
|
||||||
return func
|
|
||||||
|
|
||||||
def clear_calls(self):
|
|
||||||
del self.calls[:]
|
|
||||||
|
|
||||||
|
|
||||||
class TCDupeGuru(TestCase):
|
class TCDupeGuru(TestCase):
|
||||||
cls_tested_module = app
|
cls_tested_module = app
|
||||||
@@ -119,8 +112,7 @@ class TCDupeGuru(TestCase):
|
|||||||
f1, f2 = [FakeFile('foo') for i in range(2)]
|
f1, f2 = [FakeFile('foo') for i in range(2)]
|
||||||
f1.is_ref, f2.is_ref = (False, False)
|
f1.is_ref, f2.is_ref = (False, False)
|
||||||
assert not (bool(f1) and bool(f2))
|
assert not (bool(f1) and bool(f2))
|
||||||
app.directories.get_files = lambda: iter([f1, f2])
|
add_fake_files_to_directories(app.directories, [f1, f2])
|
||||||
app.directories._dirs.append('this is just so Scan() doesnt return 3')
|
|
||||||
app.start_scanning() # no exception
|
app.start_scanning() # no exception
|
||||||
|
|
||||||
def test_ignore_hardlink_matches(self):
|
def test_ignore_hardlink_matches(self):
|
||||||
@@ -190,44 +182,6 @@ class TCDupeGuruWithResults(TestCase):
|
|||||||
io.mkdir(tmppath + 'bar')
|
io.mkdir(tmppath + 'bar')
|
||||||
self.app.directories.add_path(tmppath)
|
self.app.directories.add_path(tmppath)
|
||||||
|
|
||||||
def check_gui_calls(self, gui, expected, verify_order=False):
|
|
||||||
"""Checks that the expected calls have been made to 'gui', then clears the log.
|
|
||||||
|
|
||||||
`expected` is an iterable of strings representing method names.
|
|
||||||
If `verify_order` is True, the order of the calls matters.
|
|
||||||
"""
|
|
||||||
if verify_order:
|
|
||||||
eq_(gui.calls, expected)
|
|
||||||
else:
|
|
||||||
eq_(set(gui.calls), set(expected))
|
|
||||||
gui.clear_calls()
|
|
||||||
|
|
||||||
def check_gui_calls_partial(self, gui, expected=None, not_expected=None):
|
|
||||||
"""Checks that the expected calls have been made to 'gui', then clears the log.
|
|
||||||
|
|
||||||
`expected` is an iterable of strings representing method names. Order doesn't matter.
|
|
||||||
Moreover, if calls have been made that are not in expected, no failure occur.
|
|
||||||
`not_expected` can be used for a more explicit check (rather than calling `check_gui_calls`
|
|
||||||
with an empty `expected`) to assert that calls have *not* been made.
|
|
||||||
"""
|
|
||||||
calls = set(gui.calls)
|
|
||||||
if expected is not None:
|
|
||||||
expected = set(expected)
|
|
||||||
not_called = expected - calls
|
|
||||||
assert not not_called, "These calls haven't been made: {0}".format(not_called)
|
|
||||||
if not_expected is not None:
|
|
||||||
not_expected = set(not_expected)
|
|
||||||
called = not_expected & calls
|
|
||||||
assert not called, "These calls shouldn't have been made: {0}".format(called)
|
|
||||||
gui.clear_calls()
|
|
||||||
|
|
||||||
def clear_gui_calls(self):
|
|
||||||
for attr in dir(self):
|
|
||||||
if attr.endswith('_gui'):
|
|
||||||
gui = getattr(self, attr)
|
|
||||||
if hasattr(gui, 'calls'): # We might have test methods ending with '_gui'
|
|
||||||
gui.clear_calls()
|
|
||||||
|
|
||||||
def test_GetObjects(self):
|
def test_GetObjects(self):
|
||||||
objects = self.objects
|
objects = self.objects
|
||||||
groups = self.groups
|
groups = self.groups
|
||||||
@@ -287,8 +241,6 @@ class TCDupeGuruWithResults(TestCase):
|
|||||||
|
|
||||||
def test_selected_powermarker_node_paths(self):
|
def test_selected_powermarker_node_paths(self):
|
||||||
# app.selected_dupes is correctly converted into paths
|
# app.selected_dupes is correctly converted into paths
|
||||||
app = self.app
|
|
||||||
objects = self.objects
|
|
||||||
self.rtable.power_marker = True
|
self.rtable.power_marker = True
|
||||||
self.rtable.select([0, 1, 2])
|
self.rtable.select([0, 1, 2])
|
||||||
self.rtable.power_marker = False
|
self.rtable.power_marker = False
|
||||||
@@ -297,7 +249,6 @@ class TCDupeGuruWithResults(TestCase):
|
|||||||
def test_selected_powermarker_node_paths_after_deletion(self):
|
def test_selected_powermarker_node_paths_after_deletion(self):
|
||||||
# cases where the selected dupes aren't there are correctly handled
|
# cases where the selected dupes aren't there are correctly handled
|
||||||
app = self.app
|
app = self.app
|
||||||
objects = self.objects
|
|
||||||
self.rtable.power_marker = True
|
self.rtable.power_marker = True
|
||||||
self.rtable.select([0, 1, 2])
|
self.rtable.select([0, 1, 2])
|
||||||
app.remove_selected()
|
app.remove_selected()
|
||||||
@@ -331,10 +282,10 @@ class TCDupeGuruWithResults(TestCase):
|
|||||||
def test_refreshDetailsWithSelected(self):
|
def test_refreshDetailsWithSelected(self):
|
||||||
self.rtable.select([1, 4])
|
self.rtable.select([1, 4])
|
||||||
eq_(self.dpanel.row(0), ('Filename', 'bar bleh', 'foo bar'))
|
eq_(self.dpanel.row(0), ('Filename', 'bar bleh', 'foo bar'))
|
||||||
self.check_gui_calls(self.dpanel_gui, ['refresh'])
|
self.dpanel_gui.check_gui_calls(['refresh'])
|
||||||
self.rtable.select([])
|
self.rtable.select([])
|
||||||
eq_(self.dpanel.row(0), ('Filename', '---', '---'))
|
eq_(self.dpanel.row(0), ('Filename', '---', '---'))
|
||||||
self.check_gui_calls(self.dpanel_gui, ['refresh'])
|
self.dpanel_gui.check_gui_calls(['refresh'])
|
||||||
|
|
||||||
def test_makeSelectedReference(self):
|
def test_makeSelectedReference(self):
|
||||||
app = self.app
|
app = self.app
|
||||||
@@ -413,6 +364,14 @@ class TCDupeGuruWithResults(TestCase):
|
|||||||
self.rtable.select([4])
|
self.rtable.select([4])
|
||||||
app.add_selected_to_ignore_list()
|
app.add_selected_to_ignore_list()
|
||||||
|
|
||||||
|
def test_cancel_scan_with_previous_results(self):
|
||||||
|
# When doing a scan with results being present prior to the scan, correctly invalidate the
|
||||||
|
# results table.
|
||||||
|
app = self.app
|
||||||
|
app.JOB = Job(1, lambda *args, **kw: False) # Cancels the task
|
||||||
|
add_fake_files_to_directories(app.directories, self.objects) # We want the scan to at least start
|
||||||
|
app.start_scanning() # will be cancelled immediately
|
||||||
|
eq_(len(self.rtable), 0)
|
||||||
|
|
||||||
class TCDupeGuru_renameSelected(TestCase):
|
class TCDupeGuru_renameSelected(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Created By: Virgil Dupras
|
|
||||||
# Created On: 2010-07-11
|
|
||||||
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
|
||||||
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
|
|
||||||
# which should be included with this package. The terms are also available at
|
|
||||||
# http://www.hardcoded.net/licenses/bsd_license
|
|
||||||
|
|
||||||
# This unit is required to make tests work with py.test. When running
|
|
||||||
|
|
||||||
import py
|
|
||||||
|
|
||||||
def get_testunit(item):
|
|
||||||
if hasattr(item, 'obj'):
|
|
||||||
testunit = py.builtin._getimself(item.obj)
|
|
||||||
if hasattr(testunit, 'global_setup'):
|
|
||||||
return testunit
|
|
||||||
|
|
||||||
def pytest_runtest_setup(item):
|
|
||||||
testunit = get_testunit(item)
|
|
||||||
if testunit is not None:
|
|
||||||
testunit.global_setup()
|
|
||||||
|
|
||||||
def pytest_runtest_teardown(item):
|
|
||||||
testunit = get_testunit(item)
|
|
||||||
if testunit is not None:
|
|
||||||
testunit.global_teardown()
|
|
||||||
@@ -28,7 +28,7 @@ class DupeGuruME(DupeGuruBase):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
DupeGuruBase.__init__(self, data, 'dupeGuru Music Edition')
|
DupeGuruBase.__init__(self, data, 'dupeGuru Music Edition')
|
||||||
self.scanner = scanner.ScannerME()
|
self.scanner = scanner.ScannerME()
|
||||||
self.directories.fileclasses = [fs.Mp3File, fs.Mp4File, fs.WmaFile, fs.OggFile, fs.FlacFile, fs.AiffFile]
|
self.directories.fileclasses = [fs.MusicFile]
|
||||||
self.dead_tracks = []
|
self.dead_tracks = []
|
||||||
|
|
||||||
def remove_dead_tracks(self):
|
def remove_dead_tracks(self):
|
||||||
|
|||||||
165
core_me/fs.py
165
core_me/fs.py
@@ -1,4 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2009-10-23
|
# Created On: 2009-10-23
|
||||||
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
@@ -7,12 +6,12 @@
|
|||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
# http://www.hardcoded.net/licenses/bsd_license
|
# http://www.hardcoded.net/licenses/bsd_license
|
||||||
|
|
||||||
from hsaudiotag import mpeg, wma, mp4, ogg, flac, aiff
|
from hsaudiotag import auto
|
||||||
from hsutil.str import get_file_ext
|
from hsutil.str import get_file_ext
|
||||||
from core import fs
|
from core import fs
|
||||||
|
|
||||||
TAG_FIELDS = ['audiosize', 'duration', 'bitrate', 'samplerate', 'title', 'artist',
|
TAG_FIELDS = {'audiosize', 'duration', 'bitrate', 'samplerate', 'title', 'artist',
|
||||||
'album', 'genre', 'year', 'track', 'comment']
|
'album', 'genre', 'year', 'track', 'comment'}
|
||||||
|
|
||||||
class MusicFile(fs.File):
|
class MusicFile(fs.File):
|
||||||
INITIAL_INFO = fs.File.INITIAL_INFO.copy()
|
INITIAL_INFO = fs.File.INITIAL_INFO.copy()
|
||||||
@@ -29,154 +28,30 @@ class MusicFile(fs.File):
|
|||||||
'year' : '',
|
'year' : '',
|
||||||
'track' : 0,
|
'track' : 0,
|
||||||
})
|
})
|
||||||
HANDLED_EXTS = set()
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def can_handle(cls, path):
|
def can_handle(cls, path):
|
||||||
if not fs.File.can_handle(path):
|
if not fs.File.can_handle(path):
|
||||||
return False
|
return False
|
||||||
return get_file_ext(path[-1]) in cls.HANDLED_EXTS
|
return get_file_ext(path[-1]) in auto.EXT2CLASS
|
||||||
|
|
||||||
|
|
||||||
class Mp3File(MusicFile):
|
|
||||||
HANDLED_EXTS = set(['mp3'])
|
|
||||||
def _read_info(self, field):
|
def _read_info(self, field):
|
||||||
if field == 'md5partial':
|
if field == 'md5partial':
|
||||||
fileinfo = mpeg.Mpeg(str(self.path))
|
f = auto.File(str(self.path))
|
||||||
self._md5partial_offset = fileinfo.audio_offset
|
self._md5partial_offset = f.audio_offset
|
||||||
self._md5partial_size = fileinfo.audio_size
|
self._md5partial_size = f.audio_size
|
||||||
MusicFile._read_info(self, field)
|
fs.File._read_info(self, field)
|
||||||
if field in TAG_FIELDS:
|
if field in TAG_FIELDS:
|
||||||
fileinfo = mpeg.Mpeg(str(self.path))
|
f = auto.File(str(self.path))
|
||||||
self.audiosize = fileinfo.audio_size
|
self.audiosize = f.audio_size
|
||||||
self.bitrate = fileinfo.bitrate
|
self.bitrate = f.bitrate
|
||||||
self.duration = fileinfo.duration
|
self.duration = f.duration
|
||||||
self.samplerate = fileinfo.sample_rate
|
self.samplerate = f.sample_rate
|
||||||
i1 = fileinfo.id3v1
|
self.artist = f.artist
|
||||||
# id3v1, even when non-existant, gives empty values. not id3v2. if id3v2 don't exist,
|
self.album = f.album
|
||||||
# just replace it with id3v1
|
self.title = f.title
|
||||||
i2 = fileinfo.id3v2
|
self.genre = f.genre
|
||||||
if not i2.exists:
|
self.comment = f.comment
|
||||||
i2 = i1
|
self.year = f.year
|
||||||
self.artist = i2.artist or i1.artist
|
self.track = f.track
|
||||||
self.album = i2.album or i1.album
|
|
||||||
self.title = i2.title or i1.title
|
|
||||||
self.genre = i2.genre or i1.genre
|
|
||||||
self.comment = i2.comment or i1.comment
|
|
||||||
self.year = i2.year or i1.year
|
|
||||||
self.track = i2.track or i1.track
|
|
||||||
|
|
||||||
class WmaFile(MusicFile):
|
|
||||||
HANDLED_EXTS = set(['wma'])
|
|
||||||
def _read_info(self, field):
|
|
||||||
if field == 'md5partial':
|
|
||||||
dec = wma.WMADecoder(str(self.path))
|
|
||||||
self._md5partial_offset = dec.audio_offset
|
|
||||||
self._md5partial_size = dec.audio_size
|
|
||||||
MusicFile._read_info(self, field)
|
|
||||||
if field in TAG_FIELDS:
|
|
||||||
dec = wma.WMADecoder(str(self.path))
|
|
||||||
self.audiosize = dec.audio_size
|
|
||||||
self.bitrate = dec.bitrate
|
|
||||||
self.duration = dec.duration
|
|
||||||
self.samplerate = dec.sample_rate
|
|
||||||
self.artist = dec.artist
|
|
||||||
self.album = dec.album
|
|
||||||
self.title = dec.title
|
|
||||||
self.genre = dec.genre
|
|
||||||
self.comment = dec.comment
|
|
||||||
self.year = dec.year
|
|
||||||
self.track = dec.track
|
|
||||||
|
|
||||||
class Mp4File(MusicFile):
|
|
||||||
HANDLED_EXTS = set(['m4a', 'm4p'])
|
|
||||||
def _read_info(self, field):
|
|
||||||
if field == 'md5partial':
|
|
||||||
dec = mp4.File(str(self.path))
|
|
||||||
self._md5partial_offset = dec.audio_offset
|
|
||||||
self._md5partial_size = dec.audio_size
|
|
||||||
dec.close()
|
|
||||||
MusicFile._read_info(self, field)
|
|
||||||
if field in TAG_FIELDS:
|
|
||||||
dec = mp4.File(str(self.path))
|
|
||||||
self.audiosize = dec.audio_size
|
|
||||||
self.bitrate = dec.bitrate
|
|
||||||
self.duration = dec.duration
|
|
||||||
self.samplerate = dec.sample_rate
|
|
||||||
self.artist = dec.artist
|
|
||||||
self.album = dec.album
|
|
||||||
self.title = dec.title
|
|
||||||
self.genre = dec.genre
|
|
||||||
self.comment = dec.comment
|
|
||||||
self.year = dec.year
|
|
||||||
self.track = dec.track
|
|
||||||
dec.close()
|
|
||||||
|
|
||||||
class OggFile(MusicFile):
|
|
||||||
HANDLED_EXTS = set(['ogg'])
|
|
||||||
def _read_info(self, field):
|
|
||||||
if field == 'md5partial':
|
|
||||||
dec = ogg.Vorbis(str(self.path))
|
|
||||||
self._md5partial_offset = dec.audio_offset
|
|
||||||
self._md5partial_size = dec.audio_size
|
|
||||||
MusicFile._read_info(self, field)
|
|
||||||
if field in TAG_FIELDS:
|
|
||||||
dec = ogg.Vorbis(str(self.path))
|
|
||||||
self.audiosize = dec.audio_size
|
|
||||||
self.bitrate = dec.bitrate
|
|
||||||
self.duration = dec.duration
|
|
||||||
self.samplerate = dec.sample_rate
|
|
||||||
self.artist = dec.artist
|
|
||||||
self.album = dec.album
|
|
||||||
self.title = dec.title
|
|
||||||
self.genre = dec.genre
|
|
||||||
self.comment = dec.comment
|
|
||||||
self.year = dec.year
|
|
||||||
self.track = dec.track
|
|
||||||
|
|
||||||
class FlacFile(MusicFile):
|
|
||||||
HANDLED_EXTS = set(['flac'])
|
|
||||||
def _read_info(self, field):
|
|
||||||
if field == 'md5partial':
|
|
||||||
dec = flac.FLAC(str(self.path))
|
|
||||||
self._md5partial_offset = dec.audio_offset
|
|
||||||
self._md5partial_size = dec.audio_size
|
|
||||||
MusicFile._read_info(self, field)
|
|
||||||
if field in TAG_FIELDS:
|
|
||||||
dec = flac.FLAC(str(self.path))
|
|
||||||
self.audiosize = dec.audio_size
|
|
||||||
self.bitrate = dec.bitrate
|
|
||||||
self.duration = dec.duration
|
|
||||||
self.samplerate = dec.sample_rate
|
|
||||||
self.artist = dec.artist
|
|
||||||
self.album = dec.album
|
|
||||||
self.title = dec.title
|
|
||||||
self.genre = dec.genre
|
|
||||||
self.comment = dec.comment
|
|
||||||
self.year = dec.year
|
|
||||||
self.track = dec.track
|
|
||||||
|
|
||||||
class AiffFile(MusicFile):
|
|
||||||
HANDLED_EXTS = set(['aif', 'aiff', 'aifc'])
|
|
||||||
def _read_info(self, field):
|
|
||||||
if field == 'md5partial':
|
|
||||||
dec = aiff.File(str(self.path))
|
|
||||||
self._md5partial_offset = dec.audio_offset
|
|
||||||
self._md5partial_size = dec.audio_size
|
|
||||||
MusicFile._read_info(self, field)
|
|
||||||
if field in TAG_FIELDS:
|
|
||||||
dec = aiff.File(str(self.path))
|
|
||||||
self.audiosize = dec.audio_size
|
|
||||||
self.bitrate = dec.bitrate
|
|
||||||
self.duration = dec.duration
|
|
||||||
self.samplerate = dec.sample_rate
|
|
||||||
tag = dec.tag
|
|
||||||
if tag is not None:
|
|
||||||
self.artist = tag.artist
|
|
||||||
self.album = tag.album
|
|
||||||
self.title = tag.title
|
|
||||||
self.genre = tag.genre
|
|
||||||
self.comment = tag.comment
|
|
||||||
self.year = tag.year
|
|
||||||
self.track = tag.track
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Created By: Virgil Dupras
|
|
||||||
# Created On: 2010-07-11
|
|
||||||
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
|
||||||
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
|
|
||||||
# which should be included with this package. The terms are also available at
|
|
||||||
# http://www.hardcoded.net/licenses/bsd_license
|
|
||||||
|
|
||||||
# This unit is required to make tests work with py.test. When running
|
|
||||||
|
|
||||||
import py
|
|
||||||
|
|
||||||
def get_testunit(item):
|
|
||||||
if hasattr(item, 'obj'):
|
|
||||||
testunit = py.builtin._getimself(item.obj)
|
|
||||||
if hasattr(testunit, 'global_setup'):
|
|
||||||
return testunit
|
|
||||||
|
|
||||||
def pytest_runtest_setup(item):
|
|
||||||
testunit = get_testunit(item)
|
|
||||||
if testunit is not None:
|
|
||||||
testunit.global_setup()
|
|
||||||
|
|
||||||
def pytest_runtest_teardown(item):
|
|
||||||
testunit = get_testunit(item)
|
|
||||||
if testunit is not None:
|
|
||||||
testunit.global_teardown()
|
|
||||||
@@ -11,7 +11,7 @@ import plistlib
|
|||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from appscript import app, k, CommandError
|
from appscript import app, k, CommandError, ApplicationNotFoundError
|
||||||
|
|
||||||
from hsutil import io
|
from hsutil import io
|
||||||
from hsutil.str import get_file_ext, remove_invalid_xml
|
from hsutil.str import get_file_ext, remove_invalid_xml
|
||||||
@@ -24,12 +24,14 @@ from core import app_cocoa, directories
|
|||||||
from . import data, _block_osx
|
from . import data, _block_osx
|
||||||
from .scanner import ScannerPE
|
from .scanner import ScannerPE
|
||||||
|
|
||||||
|
IPHOTO_PATH = Path('iPhoto Library')
|
||||||
|
|
||||||
class Photo(fs.File):
|
class Photo(fs.File):
|
||||||
INITIAL_INFO = fs.File.INITIAL_INFO.copy()
|
INITIAL_INFO = fs.File.INITIAL_INFO.copy()
|
||||||
INITIAL_INFO.update({
|
INITIAL_INFO.update({
|
||||||
'dimensions': (0,0),
|
'dimensions': (0,0),
|
||||||
})
|
})
|
||||||
HANDLED_EXTS = set(['png', 'jpg', 'jpeg', 'gif', 'psd', 'bmp', 'tiff', 'tif', 'nef', 'cr2'])
|
HANDLED_EXTS = {'png', 'jpg', 'jpeg', 'gif', 'psd', 'bmp', 'tiff', 'tif', 'nef', 'cr2'}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def can_handle(cls, path):
|
def can_handle(cls, path):
|
||||||
@@ -97,7 +99,7 @@ class Directories(directories.Directories):
|
|||||||
self.iphoto_libpath = None
|
self.iphoto_libpath = None
|
||||||
|
|
||||||
def _get_files(self, from_path):
|
def _get_files(self, from_path):
|
||||||
if from_path == Path('iPhoto Library'):
|
if from_path == IPHOTO_PATH:
|
||||||
if self.iphoto_libpath is None:
|
if self.iphoto_libpath is None:
|
||||||
return []
|
return []
|
||||||
is_ref = self.get_state(from_path) == directories.STATE_REFERENCE
|
is_ref = self.get_state(from_path) == directories.STATE_REFERENCE
|
||||||
@@ -110,23 +112,26 @@ class Directories(directories.Directories):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_subfolders(path):
|
def get_subfolders(path):
|
||||||
if path == Path('iPhoto Library'):
|
if path == IPHOTO_PATH:
|
||||||
return []
|
return []
|
||||||
else:
|
else:
|
||||||
return directories.Directories.get_subfolders(path)
|
return directories.Directories.get_subfolders(path)
|
||||||
|
|
||||||
def add_path(self, path):
|
def add_path(self, path):
|
||||||
if path == Path('iPhoto Library'):
|
if path == IPHOTO_PATH:
|
||||||
if path not in self:
|
if path not in self:
|
||||||
self._dirs.append(path)
|
self._dirs.append(path)
|
||||||
else:
|
else:
|
||||||
directories.Directories.add_path(self, path)
|
directories.Directories.add_path(self, path)
|
||||||
|
|
||||||
|
def has_iphoto_path(self):
|
||||||
|
return any(path == IPHOTO_PATH for path in self._dirs)
|
||||||
|
|
||||||
def has_any_file(self):
|
def has_any_file(self):
|
||||||
# If we don't do that, it causes a hangup in the GUI when we click Start Scanning because
|
# If we don't do that, it causes a hangup in the GUI when we click Start Scanning because
|
||||||
# checking if there's any file to scan involves reading the whole library. If we have the
|
# checking if there's any file to scan involves reading the whole library. If we have the
|
||||||
# iPhoto library, we assume we have at least one file.
|
# iPhoto library, we assume we have at least one file.
|
||||||
if any(path == Path('iPhoto Library') for path in self._dirs):
|
if self.has_iphoto_path():
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return directories.Directories.has_any_file(self)
|
return directories.Directories.has_any_file(self)
|
||||||
@@ -158,7 +163,7 @@ class DupeGuruPE(app_cocoa.DupeGuru):
|
|||||||
self.path2iphoto[str(photo.image_path(timeout=0))] = photo
|
self.path2iphoto[str(photo.image_path(timeout=0))] = photo
|
||||||
except CommandError:
|
except CommandError:
|
||||||
pass
|
pass
|
||||||
except (CommandError, RuntimeError):
|
except (CommandError, RuntimeError, ApplicationNotFoundError):
|
||||||
pass
|
pass
|
||||||
j.start_job(self.results.mark_count, "Sending dupes to the Trash")
|
j.start_job(self.results.mark_count, "Sending dupes to the Trash")
|
||||||
self.results.perform_on_marked(op, True)
|
self.results.perform_on_marked(op, True)
|
||||||
@@ -203,3 +208,12 @@ class DupeGuruPE(app_cocoa.DupeGuru):
|
|||||||
return None
|
return None
|
||||||
return ref.path
|
return ref.path
|
||||||
|
|
||||||
|
def start_scanning(self):
|
||||||
|
result = app_cocoa.DupeGuru.start_scanning(self)
|
||||||
|
if self.directories.has_iphoto_path():
|
||||||
|
try:
|
||||||
|
app('iPhoto')
|
||||||
|
except ApplicationNotFoundError:
|
||||||
|
return 4
|
||||||
|
return result
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Created By: Virgil Dupras
|
|
||||||
# Created On: 2010-07-11
|
|
||||||
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
|
||||||
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
|
|
||||||
# which should be included with this package. The terms are also available at
|
|
||||||
# http://www.hardcoded.net/licenses/bsd_license
|
|
||||||
|
|
||||||
# This unit is required to make tests work with py.test. When running
|
|
||||||
|
|
||||||
import py
|
|
||||||
|
|
||||||
def get_testunit(item):
|
|
||||||
if hasattr(item, 'obj'):
|
|
||||||
testunit = py.builtin._getimself(item.obj)
|
|
||||||
if hasattr(testunit, 'global_setup'):
|
|
||||||
return testunit
|
|
||||||
|
|
||||||
def pytest_runtest_setup(item):
|
|
||||||
testunit = get_testunit(item)
|
|
||||||
if testunit is not None:
|
|
||||||
testunit.global_setup()
|
|
||||||
|
|
||||||
def pytest_runtest_teardown(item):
|
|
||||||
testunit = get_testunit(item)
|
|
||||||
if testunit is not None:
|
|
||||||
testunit.global_teardown()
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Created By: Virgil Dupras
|
|
||||||
# Created On: 2010-07-11
|
|
||||||
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
|
||||||
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
|
|
||||||
# which should be included with this package. The terms are also available at
|
|
||||||
# http://www.hardcoded.net/licenses/bsd_license
|
|
||||||
|
|
||||||
# This unit is required to make tests work with py.test. When running
|
|
||||||
|
|
||||||
import py
|
|
||||||
|
|
||||||
def get_testunit(item):
|
|
||||||
if hasattr(item, 'obj'):
|
|
||||||
testunit = py.builtin._getimself(item.obj)
|
|
||||||
if hasattr(testunit, 'global_setup'):
|
|
||||||
return testunit
|
|
||||||
|
|
||||||
def pytest_runtest_setup(item):
|
|
||||||
testunit = get_testunit(item)
|
|
||||||
if testunit is not None:
|
|
||||||
testunit.global_setup()
|
|
||||||
|
|
||||||
def pytest_runtest_teardown(item):
|
|
||||||
testunit = get_testunit(item)
|
|
||||||
if testunit is not None:
|
|
||||||
testunit.global_teardown()
|
|
||||||
@@ -1,3 +1,10 @@
|
|||||||
|
- date: 2010-12-30
|
||||||
|
version: 5.10.4
|
||||||
|
description: |
|
||||||
|
* Fixed bug causing results to be corrupted after a scan cancellation. (#120)
|
||||||
|
* Fixed crash when fetching Fairware unpaid hours. (#121)
|
||||||
|
* Fixed crash when replacing files with hardlinks. (#122)
|
||||||
|
* Fixed crash when reading malformed aiff files. (#123)
|
||||||
- date: 2010-11-21
|
- date: 2010-11-21
|
||||||
version: 5.10.3
|
version: 5.10.3
|
||||||
description: |
|
description: |
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
|
- date: 2010-12-31
|
||||||
|
version: 1.11.3
|
||||||
|
description: |
|
||||||
|
* Fixed bug causing results to be corrupted after a scan cancellation. (#120)
|
||||||
|
* Fixed crash when fetching Fairware unpaid hours. (#121)
|
||||||
|
* Fixed crash when replacing files with hardlinks. (#122)
|
||||||
|
* Fixed crash when iPhoto can't be found. (#125)
|
||||||
- date: 2010-10-07
|
- date: 2010-10-07
|
||||||
version: 1.11.2
|
version: 1.11.2
|
||||||
description: |
|
description: |
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ def package_debian(edition):
|
|||||||
os.makedirs(destpath)
|
os.makedirs(destpath)
|
||||||
os.makedirs(srcpath)
|
os.makedirs(srcpath)
|
||||||
shutil.copy('run.py', op.join(srcpath, 'run.py'))
|
shutil.copy('run.py', op.join(srcpath, 'run.py'))
|
||||||
packages = ['hscommon', 'hsgui', 'core', ed('core_{0}'), 'qtlib', 'qt', 'hsutil', 'send2trash', 'jobprogress']
|
packages = ['hscommon', 'core', ed('core_{0}'), 'qtlib', 'qt', 'hsutil', 'send2trash', 'jobprogress']
|
||||||
if edition == 'me':
|
if edition == 'me':
|
||||||
packages.append('hsaudiotag')
|
packages.append('hsaudiotag')
|
||||||
copy_packages(packages, srcpath)
|
copy_packages(packages, srcpath)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class DupeGuru(DupeGuruBase):
|
|||||||
EDITION = 'me'
|
EDITION = 'me'
|
||||||
LOGO_NAME = 'logo_me'
|
LOGO_NAME = 'logo_me'
|
||||||
NAME = 'dupeGuru Music Edition'
|
NAME = 'dupeGuru Music Edition'
|
||||||
VERSION = '5.10.3'
|
VERSION = '5.10.4'
|
||||||
DELTA_COLUMNS = frozenset([2, 3, 4, 5, 7])
|
DELTA_COLUMNS = frozenset([2, 3, 4, 5, 7])
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -25,7 +25,7 @@ class DupeGuru(DupeGuruBase):
|
|||||||
|
|
||||||
def _setup(self):
|
def _setup(self):
|
||||||
self.scanner = scanner.ScannerME()
|
self.scanner = scanner.ScannerME()
|
||||||
self.directories.fileclasses = [fs.Mp3File, fs.Mp4File, fs.WmaFile, fs.OggFile, fs.FlacFile, fs.AiffFile]
|
self.directories.fileclasses = [fs.MusicFile]
|
||||||
DupeGuruBase._setup(self)
|
DupeGuruBase._setup(self)
|
||||||
|
|
||||||
def _update_options(self):
|
def _update_options(self):
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ class DupeGuru(DupeGuruBase):
|
|||||||
EDITION = 'pe'
|
EDITION = 'pe'
|
||||||
LOGO_NAME = 'logo_pe'
|
LOGO_NAME = 'logo_pe'
|
||||||
NAME = 'dupeGuru Picture Edition'
|
NAME = 'dupeGuru Picture Edition'
|
||||||
VERSION = '1.11.2'
|
VERSION = '1.11.3'
|
||||||
DELTA_COLUMNS = frozenset([2, 5])
|
DELTA_COLUMNS = frozenset([2, 5])
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user