/// <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)); }
/// <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); }
/// <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); }
/// <exception cref="System.IO.IOException"></exception> protected internal override void OnInflatedObjectData(PackedObjectInfo obj, int typeCode , byte[] data) { }
/// <exception cref="System.IO.IOException"></exception> protected internal override void OnEndWholeObject(PackedObjectInfo info) { info.SetCRC((int)crc.GetValue()); }