Bari.Core.Build.Cache.FileBuildCache.Contains C# (CSharp) Method

Contains() public method

Checks if the cache contains stored outputs for a given builder with a given dependency fingerprint

If IBuildCache.Restore will be also called, the cache must be locked first using the IBuildCache.LockForBuilder method.

public Contains ( BuildKey builder, IDependencyFingerprint fingerprint ) : bool
builder BuildKey Builder key
fingerprint IDependencyFingerprint Current dependency fingerprint
return bool
        public bool Contains(BuildKey builder, IDependencyFingerprint fingerprint)
        {
            var lck = GetOrCreateLock(builder);
            lck.EnterReadLock();
            try
            {
                var dirName = GetCacheDirectoryName(builder);
                if (cacheRoot.Value.ChildDirectories.Contains(dirName))
                {
                    var cacheDir = cacheRoot.Value.GetChildDirectory(dirName);
                    if (cacheDir.Files.Contains(DepsFileName))
                    {
                        using (var depsStream = cacheDir.ReadBinaryFile(DepsFileName))
                        using (var memStream = new MemoryStream())
                        {
                            fingerprint.Save(protocolSerializer, memStream);

                            if (depsStream.Length != memStream.Length)
                                return false;

                            var buf1 = memStream.ToArray();
                            var buf2 = new byte[depsStream.Length];
                            depsStream.Read(buf2, 0, (int) depsStream.Length);

                            for (int i = 0; i < buf1.Length; i++)
                                if (buf1[i] != buf2[i])
                                    return false;

                            return true;
                        }
                    }
                }

                return false;
            }
            finally
            {
                lck.ExitReadLock();
            }
        }