|
|
|
|
@ -8,37 +8,15 @@ namespace Volo.Docs.GitHub.Documents
|
|
|
|
|
{
|
|
|
|
|
public class GithubPatchAnalyzer : DomainService, IGithubPatchAnalyzer
|
|
|
|
|
{
|
|
|
|
|
private const string OldChangeStart = "\\n-";
|
|
|
|
|
private const string NewChangeStart = "\\n+";
|
|
|
|
|
|
|
|
|
|
public bool HasPatchSignificantChanges(string patch)
|
|
|
|
|
{
|
|
|
|
|
var changes = GetChanges(patch);
|
|
|
|
|
|
|
|
|
|
var mergedChanges = MergeChanges(changes);
|
|
|
|
|
|
|
|
|
|
if (IsChangeSignificant(mergedChanges))
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
return IsChangesSignificant(changes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private CommitChanges MergeChanges(List<CommitChanges> changes)
|
|
|
|
|
{
|
|
|
|
|
var mergedChanges = new CommitChanges();
|
|
|
|
|
|
|
|
|
|
foreach (var commitChanges in changes)
|
|
|
|
|
{
|
|
|
|
|
mergedChanges.NewLines.AddRange(commitChanges.NewLines);
|
|
|
|
|
mergedChanges.OldLines.AddRange(commitChanges.OldLines);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mergedChanges;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool IsChangeSignificant(CommitChanges change)
|
|
|
|
|
private bool IsChangesSignificant(CommitChanges change)
|
|
|
|
|
{
|
|
|
|
|
if (CompareLineCount(change))
|
|
|
|
|
{
|
|
|
|
|
@ -58,26 +36,9 @@ namespace Volo.Docs.GitHub.Documents
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool CompareWords(CommitChanges change)
|
|
|
|
|
{
|
|
|
|
|
var wordsInNewLines = GetDistinctWordsFromLineList(change.NewLines);
|
|
|
|
|
var wordsInOldLines = GetDistinctWordsFromLineList(change.OldLines);
|
|
|
|
|
|
|
|
|
|
var differentWordsInNewLines = wordsInNewLines.Except(wordsInOldLines).Count();
|
|
|
|
|
var differentWordsInOldLines = wordsInOldLines.Except(wordsInNewLines).Count();
|
|
|
|
|
|
|
|
|
|
return differentWordsInNewLines + differentWordsInOldLines > 10;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<string> GetDistinctWordsFromLineList(List<string> lines)
|
|
|
|
|
{
|
|
|
|
|
return string.Join(" ", lines).Split(" ").Where(s => !string.IsNullOrWhiteSpace(s))
|
|
|
|
|
.Select(TrimAndRemovePunctuation).Distinct().ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static bool CompareLineCount(CommitChanges change)
|
|
|
|
|
{
|
|
|
|
|
return Math.Abs(change.NewLines.Count - change.OldLines.Count) > 3;
|
|
|
|
|
return Math.Abs(change.NewLines.Count - change.OldLines.Count) >= 3;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static bool CompareWordCount(CommitChanges change)
|
|
|
|
|
@ -87,10 +48,21 @@ namespace Volo.Docs.GitHub.Documents
|
|
|
|
|
var wordCountInOldLines =
|
|
|
|
|
string.Join(" ", change.OldLines).Split(" ").Count(s => !string.IsNullOrWhiteSpace(s));
|
|
|
|
|
|
|
|
|
|
return Math.Abs(wordCountInNewLines - wordCountInOldLines) > 15;
|
|
|
|
|
return Math.Abs(wordCountInNewLines - wordCountInOldLines) >= 15;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool CompareWords(CommitChanges change)
|
|
|
|
|
{
|
|
|
|
|
var wordsInNewLines = GetDistinctWordsFromLineList(change.NewLines);
|
|
|
|
|
var wordsInOldLines = GetDistinctWordsFromLineList(change.OldLines);
|
|
|
|
|
|
|
|
|
|
var differentWordsInNewLines = wordsInNewLines.Except(wordsInOldLines).Count();
|
|
|
|
|
var differentWordsInOldLines = wordsInOldLines.Except(wordsInNewLines).Count();
|
|
|
|
|
|
|
|
|
|
return differentWordsInNewLines + differentWordsInOldLines >= 10;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<CommitChanges> GetChanges(string patch)
|
|
|
|
|
private CommitChanges GetChanges(string patch)
|
|
|
|
|
{
|
|
|
|
|
var changes = new List<CommitChanges>();
|
|
|
|
|
var pathSplited = patch.Split("@@");
|
|
|
|
|
@ -107,7 +79,25 @@ namespace Volo.Docs.GitHub.Documents
|
|
|
|
|
changes.Add(commitChange);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return changes;
|
|
|
|
|
return MergeChanges(changes);
|
|
|
|
|
}
|
|
|
|
|
private CommitChanges MergeChanges(List<CommitChanges> changes)
|
|
|
|
|
{
|
|
|
|
|
var mergedChanges = new CommitChanges();
|
|
|
|
|
|
|
|
|
|
foreach (var commitChanges in changes)
|
|
|
|
|
{
|
|
|
|
|
mergedChanges.NewLines.AddRange(commitChanges.NewLines);
|
|
|
|
|
mergedChanges.OldLines.AddRange(commitChanges.OldLines);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mergedChanges;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<string> GetDistinctWordsFromLineList(List<string> lines)
|
|
|
|
|
{
|
|
|
|
|
return string.Join(" ", lines).Split(" ").Where(s => !string.IsNullOrWhiteSpace(s))
|
|
|
|
|
.Select(TrimAndRemovePunctuation).Distinct().ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string TrimAndRemovePunctuation(string str)
|
|
|
|
|
|