refactor(populateCache): support onProgress; don’t read remote URL from Git config
This commit is contained in:
parent
6d43595383
commit
d22df35cfc
1 changed files with 45 additions and 37 deletions
|
@ -1,7 +1,7 @@
|
|||
import fs from 'fs';
|
||||
|
||||
import git from 'isomorphic-git';
|
||||
import http from 'isomorphic-git/http/node';
|
||||
import http, { GitProgressEvent } from 'isomorphic-git/http/node';
|
||||
|
||||
import { isVacantAndWriteable, pointsToLFS } from './util';
|
||||
import downloadBlobFromPointer from './download';
|
||||
|
@ -11,6 +11,9 @@ import { readPointer } from "./pointers";
|
|||
const SYMLINK_MODE = 40960;
|
||||
|
||||
|
||||
type ProgressHandler = (progress: GitProgressEvent) => void
|
||||
|
||||
|
||||
/**
|
||||
* Populates LFS cache for each repository object that is an LFS pointer.
|
||||
*
|
||||
|
@ -18,26 +21,30 @@ const SYMLINK_MODE = 40960;
|
|||
*
|
||||
* NOTE: If LFS cache path, as extracted from the pointer,
|
||||
* is not writeable at the time of download start,
|
||||
* the object will be silently skipped;
|
||||
* if LFS cache path is not writeable at the time download completes,
|
||||
* an error will be thrown.
|
||||
* the object will be silently skipped.
|
||||
*
|
||||
* NOTE: This function skips objects silently in case of errors.
|
||||
*
|
||||
* NOTE: onProgress currently doesn’t report loaded/total values accurately.
|
||||
*/
|
||||
export default async function populateCache(workDir: string, ref: string = 'HEAD') {
|
||||
const remoteURL = await git.getConfig({
|
||||
fs,
|
||||
dir: workDir,
|
||||
path: 'remote.origin.url',
|
||||
});
|
||||
if (remoteURL) {
|
||||
export default async function populateCache(
|
||||
workDir: string,
|
||||
remoteURL: string,
|
||||
ref: string = 'HEAD',
|
||||
onProgress?: ProgressHandler,
|
||||
) {
|
||||
await git.walk({
|
||||
fs,
|
||||
dir: workDir,
|
||||
trees: [git.TREE({ ref })],
|
||||
map: async function lfsDownloadingWalker(filepath, entries) {
|
||||
|
||||
if (entries === null || entries[0] === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
onProgress?.({ phase: `skimming: ${filepath}`, loaded: 5, total: 10 });
|
||||
|
||||
const [entry] = entries;
|
||||
const entryType = await entry.type();
|
||||
|
||||
|
@ -52,6 +59,7 @@ export default async function populateCache(workDir: string, ref: string = 'HEAD
|
|||
const buff = Buffer.from(content.buffer);
|
||||
|
||||
if (pointsToLFS(buff)) {
|
||||
|
||||
const pointer = readPointer({ dir: workDir, content: buff });
|
||||
|
||||
// Don’t even start the download if LFS cache path is not accessible,
|
||||
|
@ -59,6 +67,7 @@ export default async function populateCache(workDir: string, ref: string = 'HEAD
|
|||
if (await isVacantAndWriteable(pointer.objectPath) === false)
|
||||
return;
|
||||
|
||||
onProgress?.({ phase: `downloading: ${filepath}`, loaded: 5, total: 10 });
|
||||
|
||||
await downloadBlobFromPointer({ http, url: remoteURL }, pointer);
|
||||
|
||||
|
@ -68,5 +77,4 @@ export default async function populateCache(workDir: string, ref: string = 'HEAD
|
|||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue