Пример #1
0
 private void Needs(RevObject obj)
 {
     if (obj.Has(COMPLETE))
     {
         return;
     }
     if (!obj.Has(IN_WORK_QUEUE))
     {
         obj.Add(IN_WORK_QUEUE);
         workQueue.AddItem(obj);
     }
 }
Пример #2
0
 /// <exception cref="System.IO.IOException"></exception>
 private bool WantSatisfied(RevObject want)
 {
     if (want.Has(SATISFIED))
     {
         return(true);
     }
     walk.ResetRetain(SAVE);
     walk.MarkStart((RevCommit)want);
     if (oldestTime != 0)
     {
         walk.SetRevFilter(CommitTimeRevFilter.After(oldestTime * 1000L));
     }
     for (; ;)
     {
         RevCommit c = walk.Next();
         if (c == null)
         {
             break;
         }
         if (c.Has(PEER_HAS))
         {
             AddCommonBase(c);
             want.Add(SATISFIED);
             return(true);
         }
     }
     return(false);
 }
Пример #3
0
        /// <exception cref="NGit.Errors.TransportException"></exception>
        private void QueueWants(ICollection <Ref> want)
        {
            HashSet <ObjectId> inWorkQueue = new HashSet <ObjectId>();

            foreach (Ref r in want)
            {
                ObjectId id = r.GetObjectId();
                try
                {
                    RevObject obj = revWalk.ParseAny(id);
                    if (obj.Has(COMPLETE))
                    {
                        continue;
                    }
                    if (inWorkQueue.AddItem(id))
                    {
                        obj.Add(IN_WORK_QUEUE);
                        workQueue.AddItem(obj);
                    }
                }
                catch (MissingObjectException)
                {
                    if (inWorkQueue.AddItem(id))
                    {
                        workQueue.AddItem(id);
                    }
                }
                catch (IOException e)
                {
                    throw new TransportException(MessageFormat.Format(JGitText.Get().cannotRead, id.Name
                                                                      ), e);
                }
            }
        }
Пример #4
0
 private void AddCommonBase(RevObject o)
 {
     if (!o.Has(COMMON))
     {
         o.Add(COMMON);
         commonBase.AddItem(o);
         okToGiveUp = null;
     }
 }
Пример #5
0
        /// <exception cref="System.IO.IOException"></exception>
        private void MarkTreeComplete(RevTree tree)
        {
            if (tree.Has(COMPLETE))
            {
                return;
            }
            tree.Add(COMPLETE);
            treeWalk.Reset(tree);
            while (treeWalk.Next())
            {
                FileMode mode  = treeWalk.GetFileMode(0);
                int      sType = mode.GetObjectType();
                switch (sType)
                {
                case Constants.OBJ_BLOB:
                {
                    treeWalk.GetObjectId(idBuffer, 0);
                    revWalk.LookupAny(idBuffer, sType).Add(COMPLETE);
                    continue;
                    goto case Constants.OBJ_TREE;
                }

                case Constants.OBJ_TREE:
                {
                    treeWalk.GetObjectId(idBuffer, 0);
                    RevObject o = revWalk.LookupAny(idBuffer, sType);
                    if (!o.Has(COMPLETE))
                    {
                        o.Add(COMPLETE);
                        treeWalk.EnterSubtree();
                    }
                    continue;
                    goto default;
                }

                default:
                {
                    if (FileMode.GITLINK.Equals(mode))
                    {
                        continue;
                    }
                    treeWalk.GetObjectId(idBuffer, 0);
                    throw new CorruptObjectException(MessageFormat.Format(JGitText.Get().corruptObjectInvalidMode3
                                                                          , mode, idBuffer.Name, treeWalk.PathString, tree.Name));
                }
                }
            }
        }
Пример #6
0
 // We probably just do not have this object locally.
 /// <exception cref="System.IO.IOException"></exception>
 private void MarkCommon(RevObject obj, PacketLineIn.AckNackResult anr)
 {
     if (statelessRPC && anr == PacketLineIn.AckNackResult.ACK_COMMON && !obj.Has(STATE
                                                                                  ))
     {
         StringBuilder s;
         s = new StringBuilder(6 + Constants.OBJECT_ID_STRING_LENGTH);
         s.Append("have ");
         //$NON-NLS-1$
         s.Append(obj.Name);
         s.Append('\n');
         pckState.WriteString(s.ToString());
         obj.Add(STATE);
     }
     obj.Add(COMMON);
     if (obj is RevCommit)
     {
         ((RevCommit)obj).Carry(COMMON);
     }
 }
Пример #7
0
        /// <exception cref="System.IO.IOException"></exception>
        private void SendPack()
        {
            bool sideband = options.Contains(OPTION_SIDE_BAND) || options.Contains(OPTION_SIDE_BAND_64K
                                                                                   );
            ProgressMonitor      pm      = NullProgressMonitor.INSTANCE;
            OutputStream         packOut = rawOut;
            SideBandOutputStream msgOut  = null;

            if (sideband)
            {
                int bufsz = SideBandOutputStream.SMALL_BUF;
                if (options.Contains(OPTION_SIDE_BAND_64K))
                {
                    bufsz = SideBandOutputStream.MAX_BUF;
                }
                packOut = new SideBandOutputStream(SideBandOutputStream.CH_DATA, bufsz, rawOut);
                if (!options.Contains(OPTION_NO_PROGRESS))
                {
                    msgOut = new SideBandOutputStream(SideBandOutputStream.CH_PROGRESS, bufsz, rawOut
                                                      );
                    pm = new SideBandProgressMonitor(msgOut);
                }
            }
            PackConfig cfg = packConfig;

            if (cfg == null)
            {
                cfg = new PackConfig(db);
            }
            PackWriter pw = new PackWriter(cfg, walk.GetObjectReader());

            try
            {
                pw.SetUseCachedPacks(true);
                pw.SetReuseDeltaCommits(true);
                pw.SetDeltaBaseAsOffset(options.Contains(OPTION_OFS_DELTA));
                pw.SetThin(options.Contains(OPTION_THIN_PACK));
                pw.SetReuseValidatingObjects(false);
                if (commonBase.IsEmpty())
                {
                    ICollection <ObjectId> tagTargets = new HashSet <ObjectId>();
                    foreach (Ref @ref in refs.Values)
                    {
                        if (@ref.GetPeeledObjectId() != null)
                        {
                            tagTargets.AddItem(@ref.GetPeeledObjectId());
                        }
                        else
                        {
                            if (@ref.GetObjectId() == null)
                            {
                                continue;
                            }
                            else
                            {
                                if (@ref.GetName().StartsWith(Constants.R_HEADS))
                                {
                                    tagTargets.AddItem(@ref.GetObjectId());
                                }
                            }
                        }
                    }
                    pw.SetTagTargets(tagTargets);
                }
                RevWalk rw = walk;
                if (wantAll.IsEmpty())
                {
                    pw.PreparePack(pm, wantIds, commonBase);
                }
                else
                {
                    walk.Reset();
                    ObjectWalk ow = walk.ToObjectWalkWithSameObjects();
                    pw.PreparePack(pm, ow, wantAll, commonBase);
                    rw = ow;
                }
                if (options.Contains(OPTION_INCLUDE_TAG))
                {
                    foreach (Ref vref in refs.Values)
                    {
                        Ref      @ref     = vref;
                        ObjectId objectId = @ref.GetObjectId();
                        // If the object was already requested, skip it.
                        if (wantAll.IsEmpty())
                        {
                            if (wantIds.Contains(objectId))
                            {
                                continue;
                            }
                        }
                        else
                        {
                            RevObject obj = rw.LookupOrNull(objectId);
                            if (obj != null && obj.Has(WANT))
                            {
                                continue;
                            }
                        }
                        if ([email protected]())
                        {
                            @ref = db.Peel(@ref);
                        }
                        ObjectId peeledId = @ref.GetPeeledObjectId();
                        if (peeledId == null)
                        {
                            continue;
                        }
                        objectId = @ref.GetObjectId();
                        if (pw.WillInclude(peeledId) && !pw.WillInclude(objectId))
                        {
                            pw.AddObject(rw.ParseAny(objectId));
                        }
                    }
                }
                pw.WritePack(pm, NullProgressMonitor.INSTANCE, packOut);
                statistics = pw.GetStatistics();
                if (msgOut != null)
                {
                    string msg = pw.GetStatistics().GetMessage() + '\n';
                    msgOut.Write(Constants.Encode(msg));
                    msgOut.Flush();
                }
            }
            finally
            {
                pw.Release();
            }
            if (sideband)
            {
                pckOut.End();
            }
            if (logger != null && statistics != null)
            {
                logger.OnPackStatistics(statistics);
            }
        }
Пример #8
0
        /// <exception cref="System.IO.IOException"></exception>
        private ObjectId ProcessHaveLines(IList <ObjectId> peerHas, ObjectId last)
        {
            if (peerHas.IsEmpty())
            {
                return(last);
            }
            IList <ObjectId>   toParse    = peerHas;
            HashSet <ObjectId> peerHasSet = null;
            bool needMissing = false;

            if (wantAll.IsEmpty() && !wantIds.IsEmpty())
            {
                // We have not yet parsed the want list. Parse it now.
                peerHasSet = new HashSet <ObjectId>(peerHas);
                int cnt = wantIds.Count + peerHasSet.Count;
                toParse = new AList <ObjectId>(cnt);
                Sharpen.Collections.AddAll(toParse, wantIds);
                Sharpen.Collections.AddAll(toParse, peerHasSet);
                needMissing = true;
            }
            AsyncRevObjectQueue q = walk.ParseAny(toParse.AsIterable(), needMissing);

            try
            {
                for (; ;)
                {
                    RevObject obj;
                    try
                    {
                        obj = q.Next();
                    }
                    catch (MissingObjectException notFound)
                    {
                        ObjectId id = notFound.GetObjectId();
                        if (wantIds.Contains(id))
                        {
                            string msg = MessageFormat.Format(JGitText.Get().wantNotValid, id.Name);
                            pckOut.WriteString("ERR " + msg);
                            throw new PackProtocolException(msg, notFound);
                        }
                        continue;
                    }
                    if (obj == null)
                    {
                        break;
                    }
                    // If the object is still found in wantIds, the want
                    // list wasn't parsed earlier, and was done in this batch.
                    //
                    if (wantIds.Remove(obj))
                    {
                        if (!advertised.Contains(obj))
                        {
                            string msg = MessageFormat.Format(JGitText.Get().wantNotValid, obj.Name);
                            pckOut.WriteString("ERR " + msg);
                            throw new PackProtocolException(msg);
                        }
                        if (!obj.Has(WANT))
                        {
                            obj.Add(WANT);
                            wantAll.AddItem(obj);
                        }
                        if (!(obj is RevCommit))
                        {
                            obj.Add(SATISFIED);
                        }
                        if (obj is RevTag)
                        {
                            RevObject target = walk.Peel(obj);
                            if (target is RevCommit)
                            {
                                if (!target.Has(WANT))
                                {
                                    target.Add(WANT);
                                    wantAll.AddItem(target);
                                }
                            }
                        }
                        if (!peerHasSet.Contains(obj))
                        {
                            continue;
                        }
                    }
                    last = obj;
                    if (obj is RevCommit)
                    {
                        RevCommit c = (RevCommit)obj;
                        if (oldestTime == 0 || c.CommitTime < oldestTime)
                        {
                            oldestTime = c.CommitTime;
                        }
                    }
                    if (obj.Has(PEER_HAS))
                    {
                        continue;
                    }
                    obj.Add(PEER_HAS);
                    if (obj is RevCommit)
                    {
                        ((RevCommit)obj).Carry(PEER_HAS);
                    }
                    AddCommonBase(obj);
                    switch (multiAck)
                    {
                    case BasePackFetchConnection.MultiAck.OFF:
                    {
                        // If both sides have the same object; let the client know.
                        //
                        if (commonBase.Count == 1)
                        {
                            pckOut.WriteString("ACK " + obj.Name + "\n");
                        }
                        break;
                    }

                    case BasePackFetchConnection.MultiAck.CONTINUE:
                    {
                        pckOut.WriteString("ACK " + obj.Name + " continue\n");
                        break;
                    }

                    case BasePackFetchConnection.MultiAck.DETAILED:
                    {
                        pckOut.WriteString("ACK " + obj.Name + " common\n");
                        break;
                    }
                    }
                }
            }
            finally
            {
                q.Release();
            }
            // If we don't have one of the objects but we're also willing to
            // create a pack at this point, let the client know so it stops
            // telling us about its history.
            //
            bool didOkToGiveUp = false;

            for (int i = peerHas.Count - 1; i >= 0; i--)
            {
                ObjectId id = peerHas[i];
                if (walk.LookupOrNull(id) == null)
                {
                    didOkToGiveUp = true;
                    if (OkToGiveUp())
                    {
                        switch (multiAck)
                        {
                        case BasePackFetchConnection.MultiAck.OFF:
                        {
                            break;
                        }

                        case BasePackFetchConnection.MultiAck.CONTINUE:
                        {
                            pckOut.WriteString("ACK " + id.Name + " continue\n");
                            break;
                        }

                        case BasePackFetchConnection.MultiAck.DETAILED:
                        {
                            pckOut.WriteString("ACK " + id.Name + " ready\n");
                            break;
                        }
                        }
                    }
                    break;
                }
            }
            if (multiAck == BasePackFetchConnection.MultiAck.DETAILED && !didOkToGiveUp && OkToGiveUp
                    ())
            {
                ObjectId id = peerHas[peerHas.Count - 1];
                pckOut.WriteString("ACK " + id.Name + " ready\n");
            }
            peerHas.Clear();
            return(last);
        }
Пример #9
0
        /// <exception cref="System.IO.IOException"></exception>
        private void SendPack()
        {
            bool sideband = options.Contains(OPTION_SIDE_BAND) || options.Contains(OPTION_SIDE_BAND_64K
                                                                                   );

            if (!biDirectionalPipe)
            {
                // Ensure the request was fully consumed. Any remaining input must
                // be a protocol error. If we aren't at EOF the implementation is broken.
                int eof = rawIn.Read();
                if (0 <= eof)
                {
                    throw new CorruptObjectException(MessageFormat.Format(JGitText.Get().expectedEOFReceived
                                                                          , "\\x" + Sharpen.Extensions.ToHexString(eof)));
                }
            }
            ProgressMonitor      pm      = NullProgressMonitor.INSTANCE;
            OutputStream         packOut = rawOut;
            SideBandOutputStream msgOut  = null;

            if (sideband)
            {
                int bufsz = SideBandOutputStream.SMALL_BUF;
                if (options.Contains(OPTION_SIDE_BAND_64K))
                {
                    bufsz = SideBandOutputStream.MAX_BUF;
                }
                packOut = new SideBandOutputStream(SideBandOutputStream.CH_DATA, bufsz, rawOut);
                if (!options.Contains(OPTION_NO_PROGRESS))
                {
                    msgOut = new SideBandOutputStream(SideBandOutputStream.CH_PROGRESS, bufsz, rawOut
                                                      );
                    pm = new SideBandProgressMonitor(msgOut);
                }
            }
            try
            {
                if (wantAll.IsEmpty())
                {
                    preUploadHook.OnSendPack(this, wantIds, commonBase);
                }
                else
                {
                    preUploadHook.OnSendPack(this, wantAll, commonBase);
                }
            }
            catch (UploadPackMayNotContinueException noPack)
            {
                if (sideband && noPack.Message != null)
                {
                    noPack.SetOutput();
                    SideBandOutputStream err = new SideBandOutputStream(SideBandOutputStream.CH_ERROR
                                                                        , SideBandOutputStream.SMALL_BUF, rawOut);
                    err.Write(Constants.Encode(noPack.Message));
                    err.Flush();
                }
                throw;
            }
            PackConfig cfg = packConfig;

            if (cfg == null)
            {
                cfg = new PackConfig(db);
            }
            PackWriter pw = new PackWriter(cfg, walk.GetObjectReader());

            try
            {
                pw.SetUseCachedPacks(true);
                pw.SetReuseDeltaCommits(true);
                pw.SetDeltaBaseAsOffset(options.Contains(OPTION_OFS_DELTA));
                pw.SetThin(options.Contains(OPTION_THIN_PACK));
                pw.SetReuseValidatingObjects(false);
                if (commonBase.IsEmpty())
                {
                    ICollection <ObjectId> tagTargets = new HashSet <ObjectId>();
                    foreach (Ref @ref in refs.Values)
                    {
                        if (@ref.GetPeeledObjectId() != null)
                        {
                            tagTargets.AddItem(@ref.GetPeeledObjectId());
                        }
                        else
                        {
                            if (@ref.GetObjectId() == null)
                            {
                                continue;
                            }
                            else
                            {
                                if (@ref.GetName().StartsWith(Constants.R_HEADS))
                                {
                                    tagTargets.AddItem(@ref.GetObjectId());
                                }
                            }
                        }
                    }
                    pw.SetTagTargets(tagTargets);
                }
                RevWalk rw = walk;
                if (wantAll.IsEmpty())
                {
                    pw.PreparePack(pm, wantIds, commonBase);
                }
                else
                {
                    walk.Reset();
                    ObjectWalk ow = walk.ToObjectWalkWithSameObjects();
                    pw.PreparePack(pm, ow, wantAll, commonBase);
                    rw = ow;
                }
                if (options.Contains(OPTION_INCLUDE_TAG))
                {
                    foreach (Ref vref in refs.Values)
                    {
                        Ref      @ref     = vref;
                        ObjectId objectId = @ref.GetObjectId();
                        // If the object was already requested, skip it.
                        if (wantAll.IsEmpty())
                        {
                            if (wantIds.Contains(objectId))
                            {
                                continue;
                            }
                        }
                        else
                        {
                            RevObject obj = rw.LookupOrNull(objectId);
                            if (obj != null && obj.Has(WANT))
                            {
                                continue;
                            }
                        }
                        if ([email protected]())
                        {
                            @ref = db.Peel(@ref);
                        }
                        ObjectId peeledId = @ref.GetPeeledObjectId();
                        if (peeledId == null)
                        {
                            continue;
                        }
                        objectId = @ref.GetObjectId();
                        if (pw.WillInclude(peeledId) && !pw.WillInclude(objectId))
                        {
                            pw.AddObject(rw.ParseAny(objectId));
                        }
                    }
                }
                pw.WritePack(pm, NullProgressMonitor.INSTANCE, packOut);
                statistics = pw.GetStatistics();
                if (msgOut != null)
                {
                    string msg = pw.GetStatistics().GetMessage() + '\n';
                    msgOut.Write(Constants.Encode(msg));
                    msgOut.Flush();
                }
            }
            finally
            {
                pw.Release();
            }
            if (sideband)
            {
                pckOut.End();
            }
            if (logger != null && statistics != null)
            {
                logger.OnPackStatistics(statistics);
            }
        }