Esempio n. 1
0
 /// <exception cref="System.IO.IOException"></exception>
 protected internal override PackParser.ObjectTypeAndSize SeekDatabase(PackedObjectInfo
                                                                       obj, PackParser.ObjectTypeAndSize info)
 {
     @out.Seek(obj.GetOffset());
     crc.Reset();
     return(ReadObjectHeader(info));
 }
Esempio n. 2
0
        /// <exception cref="System.IO.IOException"></exception>
        protected internal override bool OnAppendBase(int typeCode, byte[] data, PackedObjectInfo
                                                      info)
        {
            info.SetOffset(packEnd);
            byte[] buf = Buffer();
            int    sz  = data.Length;
            int    len = 0;

            buf[len++] = unchecked ((byte)((typeCode << 4) | sz & 15));
            sz         = (int)(((uint)sz) >> 4);
            while (sz > 0)
            {
                buf[len - 1] |= unchecked ((int)(0x80));
                buf[len++]    = unchecked ((byte)(sz & unchecked ((int)(0x7f))));
                sz            = (int)(((uint)sz) >> 7);
            }
            tailDigest.Update(buf, 0, len);
            crc.Reset();
            crc.Update(buf, 0, len);
            @out.Seek(packEnd);
            @out.Write(buf, 0, len);
            packEnd += len;
            if (def == null)
            {
                def = new Deflater(Deflater.DEFAULT_COMPRESSION, false);
            }
            else
            {
                def.Reset();
            }
            def.SetInput(data);
            def.Finish();
            while (!def.IsFinished)
            {
                len = def.Deflate(buf);
                tailDigest.Update(buf, 0, len);
                crc.Update(buf, 0, len);
                @out.Write(buf, 0, len);
                packEnd += len;
            }
            info.SetCRC((int)crc.GetValue());
            return(true);
        }
 public static bool CanStore(PackedObjectInfo objectInfo)
 {
     // We are limited to 4 GB per pack as offset is 32 bit unsigned int.
     //
     return(objectInfo.Offset.UnsignedRightShift(1) < int.MaxValue);
 }
 internal static bool CanStore(PackedObjectInfo oe)
 {
     // We are limited to 4 GB per pack as offset is 32 bit unsigned int.
     //
     return((long)(((ulong)oe.GetOffset()) >> 1) < int.MaxValue);
 }
Esempio n. 5
0
        /// <exception cref="System.IO.IOException"></exception>
        private PackLock RenameAndOpenPack(string lockMessage)
        {
            if (!keepEmpty && GetObjectCount() == 0)
            {
                CleanupTemporaryFiles();
                return(null);
            }
            MessageDigest d = Constants.NewMessageDigest();

            byte[] oeBytes = new byte[Constants.OBJECT_ID_LENGTH];
            for (int i = 0; i < GetObjectCount(); i++)
            {
                PackedObjectInfo oe = GetObject(i);
                oe.CopyRawTo(oeBytes, 0);
                d.Update(oeBytes);
            }
            string   name      = ObjectId.FromRaw(d.Digest()).Name;
            FilePath packDir   = new FilePath(db.GetDirectory(), "pack");
            FilePath finalPack = new FilePath(packDir, "pack-" + name + ".pack");
            FilePath finalIdx  = new FilePath(packDir, "pack-" + name + ".idx");
            PackLock keep      = new PackLock(finalPack, db.GetFS());

            if (!packDir.Exists() && !packDir.Mkdir() && !packDir.Exists())
            {
                // The objects/pack directory isn't present, and we are unable
                // to create it. There is no way to move this pack in.
                //
                CleanupTemporaryFiles();
                throw new IOException(MessageFormat.Format(JGitText.Get().cannotCreateDirectory,
                                                           packDir.GetAbsolutePath()));
            }
            if (finalPack.Exists())
            {
                // If the pack is already present we should never replace it.
                //
                CleanupTemporaryFiles();
                return(null);
            }
            if (lockMessage != null)
            {
                // If we have a reason to create a keep file for this pack, do
                // so, or fail fast and don't put the pack in place.
                //
                try
                {
                    if (!keep.Lock(lockMessage))
                    {
                        throw new LockFailedException(finalPack, MessageFormat.Format(JGitText.Get().cannotLockPackIn
                                                                                      , finalPack));
                    }
                }
                catch (IOException e)
                {
                    CleanupTemporaryFiles();
                    throw;
                }
            }
            if (!tmpPack.RenameTo(finalPack))
            {
                CleanupTemporaryFiles();
                keep.Unlock();
                throw new IOException(MessageFormat.Format(JGitText.Get().cannotMovePackTo, finalPack
                                                           ));
            }
            if (!tmpIdx.RenameTo(finalIdx))
            {
                CleanupTemporaryFiles();
                keep.Unlock();
                if (!finalPack.Delete())
                {
                    finalPack.DeleteOnExit();
                }
                throw new IOException(MessageFormat.Format(JGitText.Get().cannotMoveIndexTo, finalIdx
                                                           ));
            }
            try
            {
                newPack = db.OpenPack(finalPack, finalIdx);
            }
            catch (IOException err)
            {
                keep.Unlock();
                if (finalPack.Exists())
                {
                    FileUtils.Delete(finalPack);
                }
                if (finalIdx.Exists())
                {
                    FileUtils.Delete(finalIdx);
                }
                throw;
            }
            return(lockMessage != null ? keep : null);
        }
Esempio n. 6
0
 /// <exception cref="System.IO.IOException"></exception>
 protected internal override void OnInflatedObjectData(PackedObjectInfo obj, int typeCode
                                                       , byte[] data)
 {
 }
Esempio n. 7
0
 /// <exception cref="System.IO.IOException"></exception>
 protected internal override void OnEndWholeObject(PackedObjectInfo info)
 {
     info.SetCRC((int)crc.GetValue());
 }