mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
An attempt to make diffing work the way I think it should
Basically, if a rom is a duplicate, it can be a duplicate within a system or source or across system or source, and by hash alone or by all data matching. The four combinations make an enum now and the diff function is the only one that uses them right now. If we're in dedup mode, we want to check hashes only in diff. Otherwise, we want to check against ones that match all information. This needs field testing.
This commit is contained in:
@@ -100,23 +100,40 @@ namespace SabreTools
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a dictionary of all ROMs from the input DATs
|
// Create a dictionary of all ROMs from the input DATs
|
||||||
|
int i = 0;
|
||||||
Dictionary<string, List<RomData>> dict = new Dictionary<string, List<RomData>>();
|
Dictionary<string, List<RomData>> dict = new Dictionary<string, List<RomData>>();
|
||||||
foreach (string input in _inputs)
|
foreach (string input in _inputs)
|
||||||
{
|
{
|
||||||
_logger.User("Adding DAT: " + input);
|
_logger.User("Adding DAT: " + input);
|
||||||
dict = RomManipulation.ParseDict(input, 0, 0, dict, _logger);
|
dict = RomManipulation.ParseDict(input, i, 0, dict, _logger);
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Modify the Dictionary if necessary and output the results
|
// Modify the Dictionary if necessary and output the results
|
||||||
if (_diff || _ad)
|
if (_diff || _ad)
|
||||||
{
|
{
|
||||||
// Get all entries that have only one item in their list
|
// Get all entries that don't have External dupes
|
||||||
Dictionary<string, List<RomData>> diffed = new Dictionary<string, List<RomData>>();
|
Dictionary<string, List<RomData>> diffed = new Dictionary<string, List<RomData>>();
|
||||||
foreach (string key in dict.Keys)
|
foreach (string key in dict.Keys)
|
||||||
{
|
{
|
||||||
if (dict[key].Count == 1)
|
List<RomData> temp = dict[key];
|
||||||
|
temp = RomManipulation.Merge(temp);
|
||||||
|
|
||||||
|
foreach (RomData rom in temp)
|
||||||
{
|
{
|
||||||
diffed.Add(key, dict[key]);
|
if ((_dedup && rom.Dupe != DupeType.InternalHash) || (!_dedup && rom.Dupe != DupeType.InternalAll))
|
||||||
|
{
|
||||||
|
if (diffed.ContainsKey(key))
|
||||||
|
{
|
||||||
|
diffed[key].Add(rom);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
List<RomData> tl = new List<RomData>();
|
||||||
|
tl.Add(rom);
|
||||||
|
diffed.Add(key, tl);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,4 +50,16 @@ namespace SabreTools.Helper
|
|||||||
WARNING,
|
WARNING,
|
||||||
ERROR,
|
ERROR,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines which type of duplicate a file is
|
||||||
|
/// </summary>
|
||||||
|
public enum DupeType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
InternalHash,
|
||||||
|
ExternalHash,
|
||||||
|
InternalAll,
|
||||||
|
ExternalAll,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -628,7 +628,30 @@ namespace SabreTools.Helper
|
|||||||
last.CRC = (last.CRC == "" && rom.CRC != "" ? rom.CRC : last.CRC);
|
last.CRC = (last.CRC == "" && rom.CRC != "" ? rom.CRC : last.CRC);
|
||||||
last.MD5 = (last.MD5 == "" && rom.MD5 != "" ? rom.MD5 : last.MD5);
|
last.MD5 = (last.MD5 == "" && rom.MD5 != "" ? rom.MD5 : last.MD5);
|
||||||
last.SHA1 = (last.SHA1 == "" && rom.SHA1 != "" ? rom.SHA1 : last.SHA1);
|
last.SHA1 = (last.SHA1 == "" && rom.SHA1 != "" ? rom.SHA1 : last.SHA1);
|
||||||
last.Dupe = true;
|
|
||||||
|
// If the duplicate is in the same system and dupe is not already set to External
|
||||||
|
if ((last.SystemID == rom.SystemID || last.SourceID == rom.SourceID) && last.Dupe != DupeType.ExternalHash)
|
||||||
|
{
|
||||||
|
if (last.Game == rom.Game && last.Name == rom.Name)
|
||||||
|
{
|
||||||
|
last.Dupe = DupeType.InternalAll;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last.Dupe = DupeType.InternalHash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (last.Game == rom.Game && last.Name == rom.Name)
|
||||||
|
{
|
||||||
|
last.Dupe = DupeType.ExternalAll;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last.Dupe = DupeType.ExternalHash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
outroms.RemoveAt(outroms.Count - 1);
|
outroms.RemoveAt(outroms.Count - 1);
|
||||||
outroms.Insert(outroms.Count, last);
|
outroms.Insert(outroms.Count, last);
|
||||||
|
|||||||
@@ -18,6 +18,6 @@
|
|||||||
public string CRC;
|
public string CRC;
|
||||||
public string MD5;
|
public string MD5;
|
||||||
public string SHA1;
|
public string SHA1;
|
||||||
public bool Dupe;
|
public DupeType Dupe;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user