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;
        }
Beispiel #2
0
 public HgFile(HgPath path, HgRevlogEntry entry, byte[] data, HgFileCopyInfo copyInfo)
 {
     Path = path;
     Entry = entry;
     Data = data;
     CopyInfo = copyInfo;
 }