public static HgFileCopyInfo ExtractFileCopyInfo(ref byte[] data) { if(data.Length <= 20 || data[0] != 1 || data[1] != 10) return null; var metablockLength = Array.IndexOf(data, (byte)1, 1) + 1; // +1 for that \10 that goes after \1 we just found var metadataLength = metablockLength - 4; var metadata = new byte[metadataLength]; Buffer.BlockCopy(data, 2, metadata, 0, metadataLength); var metadataText = Encoding.UTF8.GetString(metadata); var metadataValues = metadataText.Split((char)10). Select(s => s.Split(':')). ToDictionary(s => s[0].Trim(), s => s[1].Trim()). DefaultableWith(k => ""); var copyInfo = new HgFileCopyInfo(new HgPath(metadataValues["copy"]), new HgNodeID(metadataValues["copyrev"])); var dt = new byte[data.Length - metablockLength - 1]; Buffer.BlockCopy(data, metablockLength + 1, dt, 0, dt.Length); data = dt; return copyInfo; }
public HgFile(HgPath path, HgRevlogEntry entry, byte[] data, HgFileCopyInfo copyInfo) { Path = path; Entry = entry; Data = data; CopyInfo = copyInfo; }