예제 #1
0
		/// <exception cref="NGit.Errors.TransportException"></exception>
		protected internal override void DoFetch(ProgressMonitor monitor, ICollection<Ref
			> want, ICollection<ObjectId> have)
		{
			VerifyPrerequisites();
			try
			{
				ObjectInserter ins = transport.local.NewObjectInserter();
				try
				{
					PackParser parser = ins.NewPackParser(bin);
					parser.SetAllowThin(true);
					parser.SetObjectChecking(transport.IsCheckFetchedObjects());
					parser.SetLockMessage(lockMessage);
					packLock = parser.Parse(NullProgressMonitor.INSTANCE);
					ins.Flush();
				}
				finally
				{
					ins.Release();
				}
			}
			catch (IOException err)
			{
				Close();
				throw new TransportException(transport.uri, err.Message, err);
			}
			catch (RuntimeException err)
			{
				Close();
				throw new TransportException(transport.uri, err.Message, err);
			}
		}
		/// <exception cref="NGit.Errors.TransportException"></exception>
		protected internal override void DoFetch(ProgressMonitor monitor, ICollection<Ref
			> want, ICollection<ObjectId> have)
		{
			VerifyPrerequisites();
			try
			{
				IndexPack ip = NewIndexPack();
				ip.Index(monitor);
				packLock = ip.RenameAndOpenPack(lockMessage);
			}
			catch (IOException err)
			{
				Close();
				throw new TransportException(transport.uri, err.Message, err);
			}
			catch (RuntimeException err)
			{
				Close();
				throw new TransportException(transport.uri, err.Message, err);
			}
		}
		/// <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 IOException(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;
		}
예제 #4
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);
        }