private void SendPack()
{
bool thin = _options.Contains(OptionThinPack);
bool progress = !_options.Contains(OptionNoProgress);
bool sideband = _options.Contains(OptionSideBand) || _options.Contains(OptionSideBand64K);
ProgressMonitor pm = NullProgressMonitor.Instance;
Stream packOut = _rawOut;
if (sideband)
{
int bufsz = SideBandOutputStream.SMALL_BUF;
if (_options.Contains(OptionSideBand64K))
{
bufsz = SideBandOutputStream.MAX_BUF;
}
bufsz -= SideBandOutputStream.HDR_SIZE;
packOut = new BufferedStream(new SideBandOutputStream(SideBandOutputStream.CH_DATA, _pckOut), bufsz);
if (progress)
pm = new SideBandProgressMonitor(_pckOut);
}
var pw = new PackWriter(_db, pm, new NullProgressMonitor())
{
DeltaBaseAsOffset = _options.Contains(OptionOfsDelta),
Thin = thin
};
pw.preparePack(_wantAll, _commonBase);
if (_options.Contains(OptionIncludeTag))
{
foreach (Ref r in _refs.Values)
{
RevObject o;
try
{
o = _walk.parseAny(r.ObjectId);
}
catch (IOException)
{
continue;
}
RevTag t = (o as RevTag);
if (o.has(WANT) || (t == null)) continue;
if (!pw.willInclude(t) && pw.willInclude(t.getObject()))
pw.addObject(t);
}
}
pw.writePack(packOut);
if (sideband)
{
packOut.Flush();
_pckOut.End();
}
else
{
_rawOut.Flush();
}
}