{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "hudson.model.Cause$UserIdCause",
          "shortDescription" : "Started by user sarbian",
          "userId" : "sarbian",
          "userName" : "sarbian"
        }
      ]
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "origin/master" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 53,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "aa022badeb26e22a85b71f631f019190b617fb8a",
            "branch" : [
              {
                "SHA1" : "aa022badeb26e22a85b71f631f019190b617fb8a",
                "name" : "origin/master"
              }
            ]
          },
          "revision" : {
            "SHA1" : "aa022badeb26e22a85b71f631f019190b617fb8a",
            "branch" : [
              {
                "SHA1" : "aa022badeb26e22a85b71f631f019190b617fb8a",
                "name" : "origin/master"
              }
            ]
          }
        },
        "refs/remotes/origin/master" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 151,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "3d85ddca5fcf62e81e21904fcb04364039081bbf",
            "branch" : [
              {
                "SHA1" : "3d85ddca5fcf62e81e21904fcb04364039081bbf",
                "name" : "refs/remotes/origin/master"
              }
            ]
          },
          "revision" : {
            "SHA1" : "3d85ddca5fcf62e81e21904fcb04364039081bbf",
            "branch" : [
              {
                "SHA1" : "3d85ddca5fcf62e81e21904fcb04364039081bbf",
                "name" : "refs/remotes/origin/master"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "3d85ddca5fcf62e81e21904fcb04364039081bbf",
        "branch" : [
          {
            "SHA1" : "3d85ddca5fcf62e81e21904fcb04364039081bbf",
            "name" : "refs/remotes/origin/master"
          }
        ]
      },
      "remoteUrls" : [
        "https://github.com/sarbian/ModuleManager.git"
      ],
      "scmName" : ""
    },
    {
      "_class" : "hudson.plugins.git.GitTagAction"
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    {
      "displayPath" : "ModuleManager-4.0.3.zip",
      "fileName" : "ModuleManager-4.0.3.zip",
      "relativePath" : "ModuleManager-4.0.3.zip"
    },
    {
      "displayPath" : "ModuleManager.4.0.3.dll",
      "fileName" : "ModuleManager.4.0.3.dll",
      "relativePath" : "ModuleManager.4.0.3.dll"
    }
  ],
  "building" : False,
  "description" : None,
  "displayName" : "#151",
  "duration" : 27403,
  "estimatedDuration" : 4997,
  "executor" : None,
  "fullDisplayName" : "ModuleManager #151",
  "id" : "151",
  "inProgress" : False,
  "keepLog" : False,
  "number" : 151,
  "queueId" : 14,
  "result" : "SUCCESS",
  "timestamp" : 1565132679359,
  "url" : "https://ksp.sarbian.com/jenkins/user/454857+lamont-granquist/my-views/view/all/job/ModuleManager/151/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/ModuleManagerTests.csproj",
          "ModuleManager/Collections/KeyValueCache.cs",
          "ModuleManagerTests/Collections/KeyValueCacheTest.cs",
          "ModuleManager/ModuleManager.csproj"
        ],
        "commitId" : "918b0a24de7f604b31a058395e4e2709c7dc8ede",
        "timestamp" : 1555720424000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "add thread-safe KeyValueCache\u000a",
        "date" : "2019-04-19 17:33:44 -0700",
        "id" : "918b0a24de7f604b31a058395e4e2709c7dc8ede",
        "msg" : "add thread-safe KeyValueCache",
        "paths" : [
          {
            "editType" : "add",
            "file" : "ModuleManager/Collections/KeyValueCache.cs"
          },
          {
            "editType" : "add",
            "file" : "ModuleManagerTests/Collections/KeyValueCacheTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModuleManager.csproj"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/ModuleManagerTests.csproj"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/MMPatchLoader.cs"
        ],
        "commitId" : "6e6a465c4a04578772eb989b9f2132b3dd4b4d56",
        "timestamp" : 1555720443000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "use new KeyValueCache class as regex cache\u000aMakes it thread safe - doesn't matter in production but might matter in\u000atests which can be run in parallel\u000a",
        "date" : "2019-04-19 17:34:03 -0700",
        "id" : "6e6a465c4a04578772eb989b9f2132b3dd4b4d56",
        "msg" : "use new KeyValueCache class as regex cache",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/MMPatchLoader.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/ModuleManagerTests.csproj",
          "ModuleManagerTests/ProtoUrlConfigTest.cs"
        ],
        "commitId" : "a0c1dfc2c7342c8ee1010bee9a3019a3d4eb2b31",
        "timestamp" : 1555720605000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "add test for ProtoUrlConfig\u000a",
        "date" : "2019-04-19 17:36:45 -0700",
        "id" : "a0c1dfc2c7342c8ee1010bee9a3019a3d4eb2b31",
        "msg" : "add test for ProtoUrlConfig",
        "paths" : [
          {
            "editType" : "add",
            "file" : "ModuleManagerTests/ProtoUrlConfigTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/ModuleManagerTests.csproj"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/ProtoUrlConfig.cs",
          "ModuleManagerTests/ProtoUrlConfigTest.cs"
        ],
        "commitId" : "72717253e9d96fa05a9ca19603b8dbbe3964c444",
        "timestamp" : 1555730110000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Add name value to applying patch messages\u000aMakes debugging patches easier, since multiple root nodes can save the\u000asame url\u000aResolves #143\u000a",
        "date" : "2019-04-19 20:15:10 -0700",
        "id" : "72717253e9d96fa05a9ca19603b8dbbe3964c444",
        "msg" : "Add name value to applying patch messages",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/ProtoUrlConfig.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/ProtoUrlConfigTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/Logging/StreamLogger.cs",
          "ModuleManagerTests/Logging/StreamLoggerTest.cs"
        ],
        "commitId" : "cfaac6aa5031db26d8d84216f5e6885314a10306",
        "timestamp" : 1556598315000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Fix StreamLogger ignoring messages\u000aResolves #145\u000a",
        "date" : "2019-04-29 21:25:15 -0700",
        "id" : "cfaac6aa5031db26d8d84216f5e6885314a10306",
        "msg" : "Fix StreamLogger ignoring messages",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/StreamLogger.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/StreamLoggerTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/Logging/ILogMessage.cs",
          "ModuleManager/Logging/QueueLogger.cs",
          "ModuleManagerTests/Patches/EditPatchTest.cs",
          "ModuleManagerTests/Extensions/IBasicLoggerExtensionsTest.cs",
          "ModuleManagerTests/Logging/UnityLoggerTest.cs",
          "ModuleManagerTests/InGameTestRunnerTest.cs",
          "ModuleManagerTests/MMPatchLoaderTest.cs",
          "ModuleManagerTests/Progress/PatchProgressTest.cs",
          "ModuleManager/Logging/IBasicLogger.cs",
          "ModuleManager/Logging/StreamLogger.cs",
          "ModuleManagerTests/Logging/QueueLoggerTest.cs",
          "ModuleManagerTests/Logging/ModLoggerTest.cs",
          "ModuleManager/Logging/QueueLogRunner.cs",
          "ModuleManagerTests/Logging/NormalMessageTest.cs",
          "ModuleManagerTests/Logging/LogMessageTest.cs",
          "ModuleManagerTests/Logging/StreamLoggerTest.cs",
          "ModuleManager/Logging/ModLogger.cs",
          "ModuleManagerTests/ModuleManagerTests.csproj",
          "ModuleManager/Logging/ExceptionMessage.cs",
          "ModuleManager/Logging/UnityLogger.cs",
          "ModuleManager/Logging/NormalMessage.cs",
          "ModuleManager/Extensions/IBasicLoggerExtensions.cs",
          "ModuleManager/Logging/LogSplitter.cs",
          "ModuleManagerTests/Logging/LogSplitterTest.cs",
          "ModuleManagerTests/PatchApplierTest.cs",
          "ModuleManagerTests/Logging/ExceptionMessageTest.cs",
          "ModuleManager/ModuleManager.csproj",
          "ModuleManager/Logging/LogMessage.cs",
          "ModuleManagerTests/LoggingAssertionHelpers.cs",
          "ModuleManagerTests/Logging/QueueLogRunnerTest.cs"
        ],
        "commitId" : "d4d0fb78126ad4979c7df55f47dd4e9fc1e55b9b",
        "timestamp" : 1556609078000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Redo logging interface\u000a* Convert exceptions to strings rather than keeping a separate interface\u000afor exceptions everywhere\u000a* Log messages know how to convert themselves to log strings\u000a* Simplified interface (including assertions) provided by extension\u000amethods\u000a",
        "date" : "2019-04-30 00:24:38 -0700",
        "id" : "d4d0fb78126ad4979c7df55f47dd4e9fc1e55b9b",
        "msg" : "Redo logging interface",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/QueueLogRunner.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/IBasicLogger.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModuleManager.csproj"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/ModuleManagerTests.csproj"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Extensions/IBasicLoggerExtensions.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Patches/EditPatchTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Extensions/IBasicLoggerExtensionsTest.cs"
          },
          {
            "editType" : "delete",
            "file" : "ModuleManager/Logging/NormalMessage.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/StreamLogger.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/MMPatchLoaderTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/LogSplitter.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/UnityLogger.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/QueueLogRunnerTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/StreamLoggerTest.cs"
          },
          {
            "editType" : "delete",
            "file" : "ModuleManagerTests/Logging/NormalMessageTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/ModLoggerTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/UnityLoggerTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/QueueLoggerTest.cs"
          },
          {
            "editType" : "add",
            "file" : "ModuleManagerTests/Logging/LogMessageTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/PatchApplierTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/ILogMessage.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/QueueLogger.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Progress/PatchProgressTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/LogSplitterTest.cs"
          },
          {
            "editType" : "add",
            "file" : "ModuleManager/Logging/LogMessage.cs"
          },
          {
            "editType" : "delete",
            "file" : "ModuleManagerTests/Logging/ExceptionMessageTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/ModLogger.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/InGameTestRunnerTest.cs"
          },
          {
            "editType" : "add",
            "file" : "ModuleManagerTests/LoggingAssertionHelpers.cs"
          },
          {
            "editType" : "delete",
            "file" : "ModuleManager/Logging/ExceptionMessage.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/Logging/LogMessage.cs",
          "ModuleManagerTests/Logging/LogMessageTest.cs",
          "ModuleManager/Logging/ModLogger.cs"
        ],
        "commitId" : "fc74f1fcda46031eb9b3139c7a56830b6728d01d",
        "timestamp" : 1556609559000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Initialize LogMessage from old LogMessage\u000awith new message\u000aonly uses LogType from old message for now but more coming\u000a",
        "date" : "2019-04-30 00:32:39 -0700",
        "id" : "fc74f1fcda46031eb9b3139c7a56830b6728d01d",
        "msg" : "Initialize LogMessage from old LogMessage",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/LogMessage.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/ModLogger.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/LogMessageTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/MMPatchLoader.cs",
          "ModuleManagerTests/Logging/LogMessageTest.cs",
          "ModuleManager/Logging/LogMessage.cs",
          "ModuleManager/MMPatchRunner.cs"
        ],
        "commitId" : "07afe29d79f4260bbc6a3e6f517535ebc6afbba9",
        "timestamp" : 1556686516000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Don't put date on every log message\u000aInstead put it once at the top of the log\u000a",
        "date" : "2019-04-30 21:55:16 -0700",
        "id" : "07afe29d79f4260bbc6a3e6f517535ebc6afbba9",
        "msg" : "Don't put date on every log message",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/MMPatchRunner.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/LogMessageTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/LogMessage.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/MMPatchLoader.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/Logging/ModLoggerTest.cs",
          "ModuleManager/Logging/ILogMessage.cs",
          "ModuleManager/Logging/LogMessage.cs",
          "ModuleManagerTests/Logging/LogMessageTest.cs"
        ],
        "commitId" : "0a2c842ae3b141416b4a176f0fdb5fc1df438760",
        "timestamp" : 1556686772000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Initialize timestamp with log message\u000aSo if it takes some time to actually get to the log it will display the\u000aoriginating timestamp rather than the timestamp it was logged at\u000a",
        "date" : "2019-04-30 21:59:32 -0700",
        "id" : "0a2c842ae3b141416b4a176f0fdb5fc1df438760",
        "msg" : "Initialize timestamp with log message",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/LogMessage.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/LogMessageTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/ILogMessage.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/ModLoggerTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/Logging/ModLoggerTest.cs",
          "ModuleManager/ModuleManager.cs",
          "ModuleManager/Logging/ModLogger.cs",
          "ModuleManagerTests/Logging/PrefixLoggerTest.cs",
          "ModuleManagerTests/ModuleManagerTests.csproj",
          "ModuleManager/PostPatchLoader.cs",
          "ModuleManager/Logging/PrefixLogger.cs",
          "ModuleManager/ModuleManager.csproj"
        ],
        "commitId" : "a8bcad2adbb10413dd8b3175a0b61ef44390533c",
        "timestamp" : 1556686825000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "ModLogger -> PrefixLogger\u000aExplains what it does better\u000a",
        "date" : "2019-04-30 22:00:25 -0700",
        "id" : "a8bcad2adbb10413dd8b3175a0b61ef44390533c",
        "msg" : "ModLogger -> PrefixLogger",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModuleManager.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/PostPatchLoader.cs"
          },
          {
            "editType" : "delete",
            "file" : "ModuleManager/Logging/ModLogger.cs"
          },
          {
            "editType" : "add",
            "file" : "ModuleManager/Logging/PrefixLogger.cs"
          },
          {
            "editType" : "delete",
            "file" : "ModuleManagerTests/Logging/ModLoggerTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModuleManager.csproj"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/ModuleManagerTests.csproj"
          },
          {
            "editType" : "add",
            "file" : "ModuleManagerTests/Logging/PrefixLoggerTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/Progress/PatchProgress.cs"
        ],
        "commitId" : "5711994c101b86891f9403a5c08c47492665810d",
        "timestamp" : 1557089742000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Unnecessary using\u000a",
        "date" : "2019-05-05 13:55:42 -0700",
        "id" : "5711994c101b86891f9403a5c08c47492665810d",
        "msg" : "Unnecessary using",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Progress/PatchProgress.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/Patches/PatchCompilerTest.cs"
        ],
        "commitId" : "3650d6927de303a7be7b27fdf4d0a144ee496737",
        "timestamp" : 1557089888000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Use better assertion\u000a",
        "date" : "2019-05-05 13:58:08 -0700",
        "id" : "3650d6927de303a7be7b27fdf4d0a144ee496737",
        "msg" : "Use better assertion",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Patches/PatchCompilerTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/Logging/StreamLogger.cs",
          "ModuleManager/Collections/MessageQueue.cs"
        ],
        "commitId" : "5f7071d88369e69beb0e2fc5a74d1a8d3305c159",
        "timestamp" : 1557090388000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Mark disposables as sealed\u000aMicrosoft seems to recommend this\u000a",
        "date" : "2019-05-05 14:06:28 -0700",
        "id" : "5f7071d88369e69beb0e2fc5a74d1a8d3305c159",
        "msg" : "Mark disposables as sealed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Collections/MessageQueue.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Logging/StreamLogger.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/ModListGenerator.cs"
        ],
        "commitId" : "28bd925fbe75663c34b67d0bad6c012e01135602",
        "timestamp" : 1557090397000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Another unnecessary using\u000a",
        "date" : "2019-05-05 14:06:37 -0700",
        "id" : "28bd925fbe75663c34b67d0bad6c012e01135602",
        "msg" : "Another unnecessary using",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModListGenerator.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/Extensions/UrlDirExtensions.cs",
          "ModuleManagerTests/ModuleManagerTests.csproj",
          "ModuleManager/MMPatchLoader.cs",
          "ModuleManagerTests/Extensions/UrlDirExtensionsTest.cs",
          "ModuleManager/ModuleManager.csproj"
        ],
        "commitId" : "5e5314e2d73e4ec237684793ec8975c2a2bc84ca",
        "timestamp" : 1557120575000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Use custom code to lookup file by url\u000aShould be less gc-happy and potentially faster, though this step rarely\u000atakes any signicant amount of time.\u000aAllows extensions to be specified optionally.\u000aDoesn't support <ksp_root>/Parts or <ksp_root>/Internals but probably a\u000abunch of assumptions in ModuleManager about that too.\u000a",
        "date" : "2019-05-05 22:29:35 -0700",
        "id" : "5e5314e2d73e4ec237684793ec8975c2a2bc84ca",
        "msg" : "Use custom code to lookup file by url",
        "paths" : [
          {
            "editType" : "add",
            "file" : "ModuleManager/Extensions/UrlDirExtensions.cs"
          },
          {
            "editType" : "add",
            "file" : "ModuleManagerTests/Extensions/UrlDirExtensionsTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/ModuleManagerTests.csproj"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModuleManager.csproj"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/MMPatchLoader.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/MMPatchLoader.cs",
          "ModuleManagerTests/Extensions/UrlFileExtensionsTest.cs",
          "ModuleManager/ModuleManager.cs",
          "ModuleManagerTests/ModuleManagerTests.csproj",
          "ModuleManager/Extensions/UrlFileExtensions.cs",
          "ModuleManager/Progress/PatchProgress.cs",
          "ModuleManager/ModuleManager.csproj"
        ],
        "commitId" : "ae0d7a7c50df234e141909eedb2ceb6c5de6f3d2",
        "timestamp" : 1557121702000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Put extension on cache URLs\u000aMakes trailing spaces not break things\u000aResolves #121\u000a",
        "date" : "2019-05-05 22:48:22 -0700",
        "id" : "ae0d7a7c50df234e141909eedb2ceb6c5de6f3d2",
        "msg" : "Put extension on cache URLs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Progress/PatchProgress.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModuleManager.cs"
          },
          {
            "editType" : "add",
            "file" : "ModuleManager/Extensions/UrlFileExtensions.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/ModuleManagerTests.csproj"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/MMPatchLoader.cs"
          },
          {
            "editType" : "add",
            "file" : "ModuleManagerTests/Extensions/UrlFileExtensionsTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModuleManager.csproj"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/ModuleManagerTests.csproj",
          "ModuleManager/ModuleManager.csproj"
        ],
        "commitId" : "69ab085da68e4ed3c80f444f0a04bfa65e6171f5",
        "timestamp" : 1558992904000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
          "fullName" : "joeydwong"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Alphabetize .csproj files\u000a",
        "date" : "2019-05-27 14:35:04 -0700",
        "id" : "69ab085da68e4ed3c80f444f0a04bfa65e6171f5",
        "msg" : "Alphabetize .csproj files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModuleManager.csproj"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/ModuleManagerTests.csproj"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/ModuleManagerTests.csproj",
          "ModuleManagerTests/Extensions/ByteArrayExtensionsTest.cs",
          "ModuleManager/Utils/FileUtils.cs",
          "ModuleManager/ModuleManager.csproj",
          "ModuleManager/Extensions/ByteArrayExtensions.cs"
        ],
        "commitId" : "e1bed9419ca20a15e04ba24e8bfe7e69563259e4",
        "timestamp" : 1559286931000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "improve file sha generator\u000a* Actually dispose the sha when we're done\u000a* Use a better way of converting bytes to hex strings (hopefully less\u000agc)\u000a* Test byte array to hex string conversion\u000a",
        "date" : "2019-05-31 00:15:31 -0700",
        "id" : "e1bed9419ca20a15e04ba24e8bfe7e69563259e4",
        "msg" : "improve file sha generator",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Utils/FileUtils.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/ModuleManagerTests.csproj"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/ModuleManager.csproj"
          },
          {
            "editType" : "add",
            "file" : "ModuleManager/Extensions/ByteArrayExtensions.cs"
          },
          {
            "editType" : "add",
            "file" : "ModuleManagerTests/Extensions/ByteArrayExtensionsTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "TestUtils/UrlBuilder.cs",
          "TestUtilsTests/UrlBuilderTest.cs"
        ],
        "commitId" : "a27cb3df58b5b2218cfff2b0027959ce7332864f",
        "timestamp" : 1559286932000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Convert UrlBuilder cfg test to theory\u000aallows more inline data to be added\u000a",
        "date" : "2019-05-31 00:15:32 -0700",
        "id" : "a27cb3df58b5b2218cfff2b0027959ce7332864f",
        "msg" : "Convert UrlBuilder cfg test to theory",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "TestUtilsTests/UrlBuilderTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "TestUtils/UrlBuilder.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "TestUtils/UrlBuilder.cs",
          "TestUtilsTests/UrlBuilderTest.cs"
        ],
        "commitId" : "3d8594dd855febd0024a0ac876ad7e8ce03d2848",
        "timestamp" : 1559286933000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Set FileType based on common types\u000aMakes checking against them easier\u000a",
        "date" : "2019-05-31 00:15:33 -0700",
        "id" : "3d8594dd855febd0024a0ac876ad7e8ce03d2848",
        "msg" : "Set FileType based on common types",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "TestUtilsTests/UrlBuilderTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "TestUtils/UrlBuilder.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/Logging/StreamLoggerTest.cs"
        ],
        "commitId" : "eb3db605b24f56af6e4da5a17a8dbf3b9795292e",
        "timestamp" : 1559288013000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "unnecessary using\u000a",
        "date" : "2019-05-31 00:33:33 -0700",
        "id" : "eb3db605b24f56af6e4da5a17a8dbf3b9795292e",
        "msg" : "unnecessary using",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/StreamLoggerTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/Logging/StreamLoggerTest.cs"
        ],
        "commitId" : "9795e3656b9e73a7ed1622d2b832002ad9b70d38",
        "timestamp" : 1559288453000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "make StreamLoggerTest.TestLog work on \\n platforms\u000aline breaks are shorter which causes an extra null character to exist at\u000athe end of the string, meaning that the default Trim() wasn't removing\u000athat and the newline\u000a",
        "date" : "2019-05-31 00:40:53 -0700",
        "id" : "9795e3656b9e73a7ed1622d2b832002ad9b70d38",
        "msg" : "make StreamLoggerTest.TestLog work on \\n platforms",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Logging/StreamLoggerTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "TestUtilsTests/TestConfigNodeTest.cs"
        ],
        "commitId" : "9311cfb45507323f3f56f315dbda61f5034a31b0",
        "timestamp" : 1561614957000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Improve TestConfigNodeTest\u000aStrictly assert the structure of the node\u000a",
        "date" : "2019-06-26 22:55:57 -0700",
        "id" : "9311cfb45507323f3f56f315dbda61f5034a31b0",
        "msg" : "Improve TestConfigNodeTest",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "TestUtilsTests/TestConfigNodeTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "TestUtils/TestConfigNode.cs"
        ],
        "commitId" : "ee5995f6196cfe58f2f646b1f8f8f847b32b9f0d",
        "timestamp" : 1561615106000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Remove redundant parent class\u000a",
        "date" : "2019-06-26 22:58:26 -0700",
        "id" : "ee5995f6196cfe58f2f646b1f8f8f847b32b9f0d",
        "msg" : "Remove redundant parent class",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "TestUtils/TestConfigNode.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "TestUtils/TestConfigNode.cs",
          "TestUtilsTests/TestConfigNodeTest.cs"
        ],
        "commitId" : "3e4a9f998ecd40118e07bce7c655da6fb15a8442",
        "timestamp" : 1561615407000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Fix TestConfigNode's handling of escaped chars\u000aKSP removes these automatically, so we want to avoid that by\u000aconstructing the Value ourselves\u000a",
        "date" : "2019-06-26 23:03:27 -0700",
        "id" : "3e4a9f998ecd40118e07bce7c655da6fb15a8442",
        "msg" : "Fix TestConfigNode's handling of escaped chars",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "TestUtils/TestConfigNode.cs"
          },
          {
            "editType" : "edit",
            "file" : "TestUtilsTests/TestConfigNodeTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs"
        ],
        "commitId" : "8e5c29ad0983157c88116085d4745e125941a416",
        "timestamp" : 1561616281000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Clean up test a bit\u000aUse AssertValue method Use AssertEmpty rather than asserting count zero\u000a",
        "date" : "2019-06-26 23:18:01 -0700",
        "id" : "8e5c29ad0983157c88116085d4745e125941a416",
        "msg" : "Clean up test a bit",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs",
          "ModuleManager/Extensions/ConfigNodeExtensions.cs"
        ],
        "commitId" : "0feef88557d938ee16b889ba5685db307be2c798",
        "timestamp" : 1561618409000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Fix DeepCopy handling of escaped values\u000aKSP removes these in AddValue, we can circumvent that by constructing\u000athe Value ourselves\u000a",
        "date" : "2019-06-26 23:53:29 -0700",
        "id" : "0feef88557d938ee16b889ba5685db307be2c798",
        "msg" : "Fix DeepCopy handling of escaped values",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Extensions/ConfigNodeExtensions.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs",
          "ModuleManager/MMPatchLoader.cs",
          "ModuleManagerTests/MMPatchLoaderTest.cs",
          "ModuleManager/Extensions/ConfigNodeExtensions.cs"
        ],
        "commitId" : "96201a72d6c1037c95dc7f98da8177c25ee867f0",
        "timestamp" : 1561620237000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Fix ModifyNode handling of escaped characters\u000anew AddValueSafe method to handle this\u000ause safe ShallowCopyFrom rather than ConfigNode's CopyTo as recursion is\u000anot necessary and it handles escaped characters correctly\u000a",
        "date" : "2019-06-27 00:23:57 -0700",
        "id" : "96201a72d6c1037c95dc7f98da8177c25ee867f0",
        "msg" : "Fix ModifyNode handling of escaped characters",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/MMPatchLoader.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/MMPatchLoaderTest.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManager/Extensions/ConfigNodeExtensions.cs"
          },
          {
            "editType" : "edit",
            "file" : "ModuleManagerTests/Extensions/ConfigNodeExtensionsTest.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/MMPatchLoader.cs"
        ],
        "commitId" : "f2fba86ce98bcba5ab13b7d3ce6c6fd7e51e74ea",
        "timestamp" : 1561621217000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
          "fullName" : "blowfishpro"
        },
        "authorEmail" : "joeydwong@gmail.com",
        "comment" : "Ensure tabs and newlines don't break cache\u000aExplicitly escape \\n and \\t which the localizer unescapes when game\u000adatabase is initially loaded\u000a",
        "date" : "2019-06-27 00:40:17 -0700",
        "id" : "f2fba86ce98bcba5ab13b7d3ce6c6fd7e51e74ea",
        "msg" : "Ensure tabs and newlines don't break cache",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/MMPatchLoader.cs"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "ModuleManager/Properties/AssemblyInfo.cs"
        ],
        "commitId" : "3d85ddca5fcf62e81e21904fcb04364039081bbf",
        "timestamp" : 1565132603000,
        "author" : {
          "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/sarbian",
          "fullName" : "sarbian"
        },
        "authorEmail" : "sebastien.gaggini@gmail.com",
        "comment" : "v4.0.3\u000a",
        "date" : "2019-08-07 01:03:23 +0200",
        "id" : "3d85ddca5fcf62e81e21904fcb04364039081bbf",
        "msg" : "v4.0.3",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "ModuleManager/Properties/AssemblyInfo.cs"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/sarbian",
      "fullName" : "sarbian"
    },
    {
      "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/blowfishpro",
      "fullName" : "blowfishpro"
    },
    {
      "absoluteUrl" : "https://ksp.sarbian.com/jenkins/user/joeydwong",
      "fullName" : "joeydwong"
    }
  ]
}