Skip to content

Instantly share code, notes, and snippets.

@vgaltes
Created December 13, 2015 11:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save vgaltes/30c32ab135375558c266 to your computer and use it in GitHub Desktop.
Save vgaltes/30c32ab135375558c266 to your computer and use it in GitHub Desktop.
Final solution
#r "../packages/FSharp.Data.2.2.5/lib/net40/FSharp.Data.dll"
open System
open System.IO
open FSharp.Data
[<Literal>]
let lineBreak = "\r\n"
type CommitInfo = {Hash : string; Author : string; TimeStamp : DateTime; Message : string}
type CommittedFile = {LinesAdded: int option; LinesDeleted: int option; FileName: string}
type Commit = {CommitInfo: CommitInfo; Files: CommittedFile[]}
let filePath =Path.Combine(__SOURCE_DIRECTORY__, "..\..\Data\sfa-log.log") //sfa-log2.log //commitedTogether
let file = File.ReadAllText(filePath)
type CommitInfoCsv = CsvProvider<"Hash,Author,Date,Message", HasHeaders = false, Schema = "Hash,Author,Date(date),Message">
type CommitLineCsv = CsvProvider<"LinesAdded\tLinesDeleted\tFile", HasHeaders = false, Schema = "LinesAdded(int option),LinesDeleted(int option),FileName">
let commits = file.Split([|lineBreak + lineBreak|], StringSplitOptions.RemoveEmptyEntries)
let extractCommitInfo (commit:string) =
let isCommitInfoLine (line: string) =
line.StartsWith("[")
let extractCommitedFilesInfo c =
let commitFileLine = CommitLineCsv.Parse(c).Rows |> Seq.head
{LinesAdded = commitFileLine.LinesAdded; LinesDeleted = commitFileLine.LinesDeleted; FileName = commitFileLine.FileName}
let commitLines = commit.Split([|lineBreak|], StringSplitOptions.RemoveEmptyEntries)
let commitInfoLine = commitLines |> Array.takeWhile(isCommitInfoLine) |> Array.last
let fileLines = commitLines |> Array.skipWhile(isCommitInfoLine)
let infoRow = CommitInfoCsv.Parse(commitInfoLine).Rows |> Seq.head
let commitInfo = {Hash = infoRow.Hash; Author = infoRow.Author; TimeStamp = infoRow.Date; Message = infoRow.Message}
let fileRows = fileLines |> Array.map extractCommitedFilesInfo
{CommitInfo = commitInfo; Files = fileRows}
let totalCommits =
commits
|> Array.map extractCommitInfo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment