in tools/issue-labeler/src/Hubbup.MikLabelModel/Labeler.cs [432:522]
private bool TakeDiffContentReturnMeaning(string[] contentLines)
{
string curFile = string.Empty;
var refFilesWithAdditions = new Dictionary<string, int>();
int additions = 0, deletions = 0;
bool lookingAtRefDiff = false;
var stat = DiffContentLineReadingStatus.readyToStartOver;
for (int i = 0; i < contentLines.Length; i++)
{
var line = contentLines[i];
switch (stat)
{
case DiffContentLineReadingStatus.readyToStartOver:
if (ContainsRefChanges(line))
{
if (!string.IsNullOrEmpty(curFile) && additions > deletions)
{
refFilesWithAdditions.Add(curFile, additions - deletions);
// reset
additions = 0;
deletions = 0;
}
lookingAtRefDiff = true;
curFile = line.Substring(13, line.IndexOf(@".cs b/") + 3 - 13);
stat = DiffContentLineReadingStatus.expectingIndex;
}
else if (line.StartsWith("diff --git"))
{
lookingAtRefDiff = false;
}
else if (lookingAtRefDiff)
{
if (line.StartsWith("+") && !IsUnwantedDiff(line))
{
additions++;
}
else if (line.StartsWith("-") && !IsUnwantedDiff(line))
{
deletions++;
}
}
break;
case DiffContentLineReadingStatus.expectingIndex:
if (line.StartsWith("index "))
{
stat = DiffContentLineReadingStatus.expectingTripleMinus;
}
break;
case DiffContentLineReadingStatus.expectingTripleMinus:
if (line.StartsWith("--- "))
{
stat = DiffContentLineReadingStatus.expectingTriplePlus;
}
break;
case DiffContentLineReadingStatus.expectingTriplePlus:
if (line.StartsWith("+++ "))
{
stat = DiffContentLineReadingStatus.expectingDoubleAtSign;
}
break;
case DiffContentLineReadingStatus.expectingDoubleAtSign:
if (line.StartsWith("@@ "))
{
stat = DiffContentLineReadingStatus.readyToStartOver;
}
break;
default:
break;
}
}
if (!string.IsNullOrEmpty(curFile) && additions > deletions)
{
refFilesWithAdditions.Add(curFile, additions - deletions);
}
return refFilesWithAdditions.Any();
// given a diff content
// readyToStartOver = true
// additions = 0, deletions = 0
// read all lines
// for each line, if readyToStartOver and starts with diff: set expectingIndex to true
// for each line, if expectingIndex and starts with index: set expectingTripleMinus
// for each line, if expectingTripleMinus and starts ---: set expectingTriplePlus
// for each line, if expectingTriplePlus and starts with +++: set expectingDoubleAtSign
// for each line, if expectingTriplePlus and starts with @@: set readyToStartOver
// for each line, if readyToStartOver and starts with +: additions++ and if starts with - deletions++
// for each line, if readyToStartOver and starts with +: additions++ and if starts with - deletions++
// for each line, if readyToStartOver and starts with diff: ... (already planned for)
//
}