public IList<PatchFile> GetRebasePatchFiles()
{
var patchFiles = new List<PatchFile>();
var nextFile = GetNextRebasePatch();
int next;
int.TryParse(nextFile, out next);
var files = new string[0];
if (Directory.Exists(GetRebaseDir()))
files = Directory.GetFiles(GetRebaseDir());
foreach (var fullFileName in files)
{
int n;
var file = PathUtil.GetFileName(fullFileName);
if (!int.TryParse(file, out n))
continue;
var patchFile =
new PatchFile
{
Name = file,
FullName = fullFileName,
IsNext = n == next,
IsSkipped = n < next
};
if (File.Exists(GetRebaseDir() + file))
{
string key = null;
string value = "";
foreach (var line in File.ReadLines(GetRebaseDir() + file))
{
var m = HeadersMatch.Match(line);
if (key == null)
{
if (!string.IsNullOrWhiteSpace(line) && !m.Success)
continue;
}
else if (string.IsNullOrWhiteSpace(line) || m.Success)
{
value = DecodeString(value);
switch (key)
{
case "From":
if (value.IndexOf('<') > 0 && value.IndexOf('<') < value.Length)
{
var author = RFC2047Decoder.Parse(value);
patchFile.Author = author.Substring(0, author.IndexOf('<')).Trim();
}
else
patchFile.Author = value;
break;
case "Date":
if (value.IndexOf('+') > 0 && value.IndexOf('<') < value.Length)
patchFile.Date = value.Substring(0, value.IndexOf('+')).Trim();
else
patchFile.Date = value;
break;
case "Subject":
patchFile.Subject = value;
break;
}
}
if (m.Success)
{
key = m.Groups[1].Value;
value = m.Groups[2].Value;
}
else
value = AppendQuotedString(value, line.Trim());
if (string.IsNullOrEmpty(line) ||
!string.IsNullOrEmpty(patchFile.Author) &&
!string.IsNullOrEmpty(patchFile.Date) &&
!string.IsNullOrEmpty(patchFile.Subject))
break;
}
}
patchFiles.Add(patchFile);
}
return patchFiles;
}