mirror of
https://github.com/fluxscape/fluxscape.git
synced 2026-01-12 23:32:55 +01:00
Initial commit
Co-Authored-By: Eric Tuvesson <eric.tuvesson@gmail.com> Co-Authored-By: mikaeltellhed <2311083+mikaeltellhed@users.noreply.github.com> Co-Authored-By: kotte <14197736+mrtamagotchi@users.noreply.github.com> Co-Authored-By: Anders Larsson <64838990+anders-topp@users.noreply.github.com> Co-Authored-By: Johan <4934465+joolsus@users.noreply.github.com> Co-Authored-By: Tore Knudsen <18231882+torekndsn@users.noreply.github.com> Co-Authored-By: victoratndl <99176179+victoratndl@users.noreply.github.com>
This commit is contained in:
74
packages/noodl-git/src/core/clone.ts
Normal file
74
packages/noodl-git/src/core/clone.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import { git, GitExecutionOptions, gitNetworkArguments } from './client';
|
||||
import { ICloneProgress } from './models/progress';
|
||||
import { CloneOptions } from './models/clone-options';
|
||||
import { CloneProgressParser, executionOptionsWithProgress } from './progress';
|
||||
import { DEFAULT_BRANCH } from '../constants';
|
||||
import { IGitResult } from './git-error';
|
||||
import { app } from '@electron/remote';
|
||||
import { join } from 'path';
|
||||
|
||||
/**
|
||||
* Clones a repository from a given url into to the specified path.
|
||||
*
|
||||
* @param url - The remote repository URL to clone from
|
||||
*
|
||||
* @param path - The destination path for the cloned repository. If the
|
||||
* path does not exist it will be created. Cloning into an
|
||||
* existing directory is only allowed if the directory is
|
||||
* empty.
|
||||
*
|
||||
* @param options - Options specific to the clone operation, see the
|
||||
* documentation for CloneOptions for more details.
|
||||
*
|
||||
* @param progressCallback - An optional function which will be invoked
|
||||
* with information about the current progress
|
||||
* of the clone operation. When provided this enables
|
||||
* the '--progress' command line flag for
|
||||
* 'git clone'.
|
||||
*
|
||||
*/
|
||||
export async function clone(
|
||||
url: string,
|
||||
path: string,
|
||||
options: CloneOptions,
|
||||
progressCallback?: (progress: ICloneProgress) => void
|
||||
): Promise<IGitResult> {
|
||||
const networkArguments = await gitNetworkArguments(null);
|
||||
const defaultBranch = options.defaultBranch ?? DEFAULT_BRANCH;
|
||||
|
||||
const args = [...networkArguments, '-c', `init.defaultBranch=${defaultBranch}`, 'clone', '--recursive'];
|
||||
|
||||
let opts: GitExecutionOptions = {};
|
||||
|
||||
if (progressCallback) {
|
||||
args.push('--progress');
|
||||
|
||||
const title = `Cloning into ${path}`;
|
||||
const kind = 'clone';
|
||||
|
||||
opts = await executionOptionsWithProgress({ ...opts }, new CloneProgressParser(), (progress) => {
|
||||
const description = progress.kind === 'progress' ? progress.details.text : progress.text;
|
||||
const value = progress.percent;
|
||||
|
||||
progressCallback({ kind, title, description, value });
|
||||
});
|
||||
|
||||
// Initial progress
|
||||
progressCallback({ kind, title, value: 0 });
|
||||
}
|
||||
|
||||
if (options.branch) {
|
||||
args.push('-b', options.branch);
|
||||
} else if (defaultBranch) {
|
||||
args.push('-b', defaultBranch);
|
||||
}
|
||||
|
||||
if (options.singleBranch) {
|
||||
args.push('--single-branch');
|
||||
}
|
||||
|
||||
args.push('--', url, path);
|
||||
|
||||
const cwdPath = join(app.getAppPath(), '..');
|
||||
return await git(args, cwdPath, 'clone', opts);
|
||||
}
|
||||
Reference in New Issue
Block a user