Skip to content

Instantly share code, notes, and snippets.

@iamssen
Created January 6, 2017 06:07
Show Gist options
  • Save iamssen/95397a25398c3f1fac1cba22afbe6b13 to your computer and use it in GitHub Desktop.
Save iamssen/95397a25398c3f1fac1cba22afbe6b13 to your computer and use it in GitHub Desktop.
fish shell git clone script
# clone
# -r --remote git remote name (default: origin)
# -d --directory working directory name (default: repository name)
# -b --branch git branch name (default: master)
# --depth checkout depth (default: 1)
# -i --include include directory [sparse checkout]
# -x --exclude exclude directory [sparse checkout]
# repository https://github.com/iamssen/{repository}.git
# userid/repository https://github.com/{userid}/{repository}.git
# https://github.com/iamssen/repository.git
# [email protected]/iamssen/repository.git
#
# clone repository
# clone -r upstream -d project iamssen/repository
# clone -i src -i static iamssen/repository
function clone
eval (node $SCRIPTS/clone.set-params.js $argv)
# echo $directory
# echo $baseDirectory
# echo $repositoryUrl
# echo $repositoryName
# echo $sparseMode
# echo $remote
# echo $branch
# echo $depth
mkdir $baseDirectory/$directory
cd $baseDirectory/$directory
git init
git remote add -f $remote $repositoryUrl
if test $sparseMode = "on"
git config core.sparseCheckout true
mv $baseDirectory/sparse-checkout $baseDirectory/$directory/.git/info/
vi $baseDirectory/$directory/.git/info/sparse-checkout
# micro $baseDirectory/$directory/.git/info/sparse-checkout
# nano $baseDirectory/$directory/.git/info/sparse-checkout
end
git pull --depth=$depth $remote $branch
end
/** @type {optimist.Parser} */
const optimist = require('optimist');
const fs = require('fs');
const path = require('path');
const argv = optimist
.alias('r', 'remote')
.default('r', 'origin')
.alias('d', 'directory')
.alias('b', 'branch')
.default('b', 'master')
.default('depth', 1)
.alias('i', 'include')
.alias('x', 'exclude')
.argv;
/** @type {string} */
const repository = argv._.pop();
let repositoryUrl, repositoryName;
if (/^http/.test(repository) || /^git@/.test(repository)) {
repositoryUrl = repository;
repositoryName = /\/([a-zA-Z0-9\-.]+)\.git$/.exec(repository)[1];
} else if (/([a-zA-Z0-9\-.]+)\/([a-zA-Z0-9\-.]+)/.test(repository)) {
const [id, repo] = repository.split('/');
repositoryUrl = `https://github.com/${id}/${repo}.git`
repositoryName = repo;
} else {
repositoryUrl = `https://github.com/iamssen/${repository}.git`
repositoryName = repository;
}
const directory = argv.directory ? argv.directory : repositoryName;
const {remote, branch, depth, include, exclude} = argv;
const baseDirectory = process.cwd();
let sparseMode, sparseContent;
const commands = [
`set directory "${directory}"`,
`set remote "${remote}"`,
`set branch "${branch}"`,
`set depth ${depth}`,
`set baseDirectory "${baseDirectory}"`,
`set repositoryUrl "${repositoryUrl}"`,
`set repositoryName "${repositoryName}"`,
];
if (include && include.length > 0) {
commands.push(`set sparseMode "on"`);
fs.writeFileSync(
path.join(baseDirectory, 'sparse-checkout'),
include.map(x => x + '\n').join('')
);
}
else if (exclude && exclude.length > 0) {
commands.push(`set sparseMode "on"`);
fs.writeFileSync(
path.join(baseDirectory, 'sparse-checkout'),
['/*'].concat(exclude.map(x => '!' + x)).map(x => x + '\n').join('')
);
} else {
commands.push(`set sparseMode "off"`);
}
console.log(commands.map(x => x + ';').join(' '));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment