public void Add(HgRevlogEntry revlogEntry)
        {
            var node = new HgRevlogGraphNode(revlogEntry.NodeID, revlogEntry.Revision);
            
            //
            // We only link back to Root when both parents are Null
            if(revlogEntry.FirstParentRevisionNodeID == HgNodeID.Null && revlogEntry.SecondParentRevisionNodeID == HgNodeID.Null)
            {
                node.FirstParent = Root;
                Root.Children.Add(node);
            } // if
            else
            {
                node.FirstParent = nodes[revlogEntry.FirstParentRevisionNodeID.Long]; // First parent is always there
                node.SecondParenet = 
                    revlogEntry.SecondParentRevisionNodeID == HgNodeID.Null ?
                        null :
                        nodes[revlogEntry.SecondParentRevisionNodeID.Long];
                
                node.FirstParent.Children.Add(node);
                if(node.SecondParenet != null)
                    node.SecondParenet.Children.Add(node);
            } // else

            nodes[node.NodeID.Long] = node;
        }
示例#2
0
 public HgFile(HgPath path, HgRevlogEntry entry, byte[] data, HgFileCopyInfo copyInfo)
 {
     Path = path;
     Entry = entry;
     Data = data;
     CopyInfo = copyInfo;
 }
示例#3
0
        internal virtual void Add(HgRevlogEntry hgRevlogEntry)
        {
            entries.Add(hgRevlogEntry);
            nodeCache[hgRevlogEntry.NodeID] = hgRevlogEntry.Revision;

            //nodeCache[hgRevlogEntry.NodeID] = hgRevlogEntry;
            //revisionCache[hgRevlogEntry.Revision] = hgRevlogEntry;
        }
        private HgRevlogEntry GetRevlogEntry(HgRevlogEntry revlogEntry)
        {
            var revlogEntryData = standinRevlogReader.ReadRevlogEntry(revlogEntry.NodeID);
            var data = revlogEntryData.Data;

            HgFileCopyInfo.ExtractFileCopyInfo(ref data);

            //
            // Apparently, entries in standins end with \n, so we explicitly limit to 40 bytes
            HgNodeID nodeID;
            if(HgNodeID.TryParse(Encoding.ASCII.GetString(data, 0, 40), out nodeID))
            {
                var lfPath = Path.Combine(storeBasePath, @"..\largefiles", nodeID.Long);
                var lf = new FileInfo(lfPath);
                if(lf.Exists)
                {
                    revlogEntry = new HgRevlogEntry(revlogEntry.Revision, revlogEntry.NodeID, revlogEntry.Offset,
                        revlogEntry.Flags, revlogEntry.CompressedLength, (uint)lf.Length, revlogEntry.BaseRevision, revlogEntry.LinkRevision,
                        revlogEntry.FirstParentRevision, revlogEntry.FirstParentRevisionNodeID, revlogEntry.SecondParentRevision, revlogEntry.SecondParentRevisionNodeID);
                } // if
            } // if
            
            return revlogEntry;
        }
 public HgRevlogEntryData(HgRevlogEntry entry, byte[] data)
 {
     Entry = entry;
     Data = data;
 }
        public void WriteRevlogEntryDataRaw(HgNodeID revlogEntryNodeID, uint linkRevision, HgNodeID firstParentNodeID, HgNodeID secondParentNodeID, byte[] data,
            ref ulong offset, uint baseRevision, uint uncompressedLength, out uint compressedLength, IBinaryWriter indexBinaryWriter, IBinaryWriter dataBinaryWriter)
        {
            if(!File.Exists(revlog.IndexPath))
            {
                //
                // We need to decide whether we want inline data initially
                // No, it's not you who decides.
                // revlog.InlineData = data.Length < MaxInlineFileSize;
                WriteRevlog();
            } // if

            var tip = revlog.Entries.Count > 0 ? revlog.Entries[revlog.Entries.Count - 1] : null;
            if(tip != null && baseRevision < tip.BaseRevision)
            {
                throw new Exception("invalid base revision");
            } // if

            byte[] revlogEntryData = data;
            /*ulong offset = 0;
            uint baseRevision = 0;*/
            
            if(revlog.GetEntry(revlogEntryNodeID) != null)
            {
                compressedLength = 0;
                return;
            } // if

            var revlogEntryDataTuple = GetPotentiallyCompressedData(revlogEntryData, 0, revlogEntryData.Length);

            //var uncompressedLength = (uint)data.Length;
            compressedLength = (uint)(revlogEntryDataTuple.Item2.Length + (revlogEntryDataTuple.Item1 == null ? 0 : 1));
           
            var firstParentRevlogEntry = revlog.GetEntry(firstParentNodeID);
            var secondParentRevlogEntry = revlog.GetEntry(secondParentNodeID);

            var firstParentRevision = firstParentRevlogEntry == null ? uint.MaxValue : firstParentRevlogEntry.Revision;
            var secondParentRevision = secondParentRevlogEntry == null ? uint.MaxValue : secondParentRevlogEntry.Revision;

            var revlogEntry = new HgRevlogEntry((uint)revlog.Entries.Count, revlogEntryNodeID, offset, 0, 
                compressedLength, uncompressedLength, baseRevision, linkRevision, 
                firstParentRevision, firstParentNodeID, secondParentRevision, secondParentNodeID);

            revlog.Add(revlogEntry);

            log.Debug("writing revlog entry {0} for changeset r{1}", revlogEntryNodeID.Short, linkRevision);

            /*using(var fileStream = fileSystem.OpenWrite(revlog.IndexPath))
            {
                fileStream.Seek(fileStream.Length, SeekOrigin.Begin);

                using(var binaryWriter = new BigEndianBinaryWriter(fileStream))
                {*/
                    if(offset >= 0 && revlogEntry.Revision > 0)
                    {
                        var offsetBuffer = new byte[6];
                        Buffer.BlockCopy(BitConverter.GetBytes(IPAddress.HostToNetworkOrder((long)offset)), 2, offsetBuffer, 0, 6);
                        
                        indexBinaryWriter.Write(offsetBuffer);
                    } // if
                        
                    indexBinaryWriter.Write(revlogEntry.Flags);
                    indexBinaryWriter.Write(revlogEntry.CompressedLength);
                    indexBinaryWriter.Write(revlogEntry.UncompressedLength);
                    indexBinaryWriter.Write(revlogEntry.BaseRevision);
                    indexBinaryWriter.Write(revlogEntry.LinkRevision);
                    indexBinaryWriter.Write(revlogEntry.FirstParentRevision);
                    indexBinaryWriter.Write(revlogEntry.SecondParentRevision);

                    //
                    // Writing NodeID (20 bytes) and 12 more bytes (see HgRevlogReader)
                    indexBinaryWriter.Write(revlogEntry.NodeID.NodeID);
                    indexBinaryWriter.Write(new byte[12]);

                    if(revlog.InlineData)
                    {
                        if(revlogEntryDataTuple.Item1 != null)
                            indexBinaryWriter.Write(revlogEntryDataTuple.Item1.Value);
                        indexBinaryWriter.Write(revlogEntryDataTuple.Item2);
                    } // if
               /* } // using
            } // using

            if(!revlog.InlineData && uncompressedLength > 0)
            {
                using(var fileStream = fileSystem.OpenOrCreateWrite(revlog.DataPath))
                {
                    fileStream.Seek(fileStream.Length, SeekOrigin.Begin);

                    using(var binaryWriter = new BigEndianBinaryWriter(fileStream))*/
                    else
                    {
                        if(revlogEntryDataTuple.Item1 != null)
                            dataBinaryWriter.Write(revlogEntryDataTuple.Item1.Value);
                        dataBinaryWriter.Write(revlogEntryDataTuple.Item2);
                    /*} // using
                } // using*/
            } // if

            offset += compressedLength;
        }
 internal override void Add(HgRevlogEntry hgRevlogEntry)
 {
     standinRevlog.Add(hgRevlogEntry);
 }