From 73fd547892772114c5e9567b6031caeccd0525f3 Mon Sep 17 00:00:00 2001 From: Anton Strogonoff Date: Mon, 29 Nov 2021 02:56:58 +0100 Subject: [PATCH] chore(download): write downloaded blob to LFS cache --- src/download.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/download.ts b/src/download.ts index e4b5506..8af9436 100644 --- a/src/download.ts +++ b/src/download.ts @@ -1,6 +1,8 @@ +import path from 'path'; +import fsp from 'fs/promises'; import { HttpClient } from 'isomorphic-git/http/node'; -import { bodyToBuffer } from './util'; +import { bodyToBuffer, isWriteable } from './util'; import { Pointer } from './pointers'; @@ -28,7 +30,9 @@ function isValidLFSInfoResponseData(val: Record): val is LFSInfoRes } -/** Downloads a blob corresponding to given LFS pointer. */ +/** + * Downloads, caches and returns a blob corresponding to given LFS pointer. + */ export default async function downloadBlobFromPointer( { http: { request }, headers = {}, url }: DownloadBlobRequset, { info, objectPath }: Pointer, @@ -73,7 +77,15 @@ export default async function downloadBlobFromPointer( headers: dlHeaders, }); - return await bodyToBuffer(lfsObjectBody); + const blob = await bodyToBuffer(lfsObjectBody); + + // Write LFS cache for this object, if cache path is still accessible and unoccupied. + if (await isWriteable(objectPath)) { + await fsp.mkdir(path.dirname(objectPath), { recursive: true }); + await fsp.writeFile(objectPath, blob); + } + + return blob; } else { throw new Error("LFS response didn’t return an expected structure");