code: func NewDiskCache(fetcher blob.Fetcher) (*DiskCache, error) {
  	cacheDir := filepath.Join(osutil.CacheDir(), "blobs")
  	if !osutil.DirExists(cacheDir) {
  		if err := os.Mkdir(cacheDir, 0700); err != nil {
  			log.Printf("Warning: failed to make %s: %v; using tempdir instead", cacheDir, err)
  			cacheDir, err = ioutil.TempDir("", "camlicache")
  			if err != nil {
  				return nil, err
  			}
  		}
  	}
  	// TODO: max disk size, keep LRU of access, smarter cleaning, etc
  	// TODO: use diskpacked instead? harder to clean, though.
  	diskcache, err := localdisk.New(cacheDir)
  	if err != nil {
  		return nil, err
  	}
  	dc := &DiskCache{
  		CachingFetcher: NewCachingFetcher(diskcache, fetcher),
  		Root:           cacheDir,
  	}
  	return dc, nil
  }
docs: // NewDiskCache returns a new DiskCache from a Fetcher, which
  // is usually the pkg/client HTTP client (which typically has much
  // higher latency and lower bandwidth than local disk).