Compare commits

..

14 Commits

Author SHA1 Message Date
b46d1e19a7 2.0.3 2022-07-31 15:16:06 +02:00
c8d173807d fix(core): update 2022-07-31 15:16:06 +02:00
5944c7e96f 2.0.2 2022-07-31 15:14:19 +02:00
39ea160fdf fix(core): update 2022-07-31 15:14:18 +02:00
91ca5e53f1 2.0.1 2021-10-22 01:42:42 +02:00
778267bb36 fix(core): update 2021-10-22 01:42:42 +02:00
61407e4854 2.0.0 2021-10-21 19:09:14 +02:00
2771413723 BREAKING CHANGE(dependencies): switch to isomorphic git 2021-10-21 19:09:14 +02:00
b83752a98a 1.0.18 2020-08-15 14:17:09 +00:00
48f71ed1c2 fix(core): update 2020-08-15 14:17:08 +00:00
54ed2f97b8 1.0.17 2020-08-15 13:53:02 +00:00
92198a75c9 fix(core): update 2020-08-15 13:53:02 +00:00
f82a34b1ea 1.0.16 2020-08-15 13:51:39 +00:00
c3b68fa0fc fix(core): update 2020-08-15 13:51:38 +00:00
12 changed files with 12167 additions and 10114 deletions

View File

@ -1,9 +1,4 @@
{ {
"npmts": {
"mode": "default",
"codecov": true,
"coverageTreshold": 71
},
"npmci": { "npmci": {
"npmGlobalTools": [], "npmGlobalTools": [],
"npmAccessLevel": "public" "npmAccessLevel": "public"

22213
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,13 @@
{ {
"name": "@pushrocks/smartgit", "name": "@pushrocks/smartgit",
"version": "1.0.15", "version": "2.0.3",
"description": "smart wrapper for nodegit", "description": "smart wrapper for nodegit",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts", "typings": "dist_ts/index.d.ts",
"type": "module",
"scripts": { "scripts": {
"test": "(tstest test/)", "test": "(tstest test/)",
"build": "(tsbuild)" "build": "(tsbuild --web)"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -24,21 +25,19 @@
}, },
"homepage": "https://gitlab.com/pushrocks/smartgit", "homepage": "https://gitlab.com/pushrocks/smartgit",
"dependencies": { "dependencies": {
"@pushrocks/smartfile": "^8.0.0", "@pushrocks/smartenv": "^5.0.2",
"@pushrocks/smartpath": "^4.0.3", "@pushrocks/smartfile": "^10.0.4",
"@pushrocks/smartpromise": "^3.0.6", "@pushrocks/smartpath": "^5.0.5",
"@pushrocks/smartshell": "^2.0.26", "@pushrocks/smartpromise": "^3.1.7",
"@pushrocks/smartstring": "^3.0.18", "@pushrocks/smartshell": "^2.0.30",
"@types/minimatch": "^3.0.3", "@pushrocks/smartstring": "^4.0.2",
"@types/nodegit": "^0.26.7", "@types/minimatch": "^3.0.5",
"nodegit": "^0.27.0" "isomorphic-git": "^1.19.1"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.25", "@gitzone/tsbuild": "^2.1.63",
"@gitzone/tstest": "^1.0.44", "@gitzone/tstest": "^1.0.72",
"@pushrocks/tapbundle": "^3.2.9", "@pushrocks/tapbundle": "^5.0.4"
"tslint": "^6.1.3",
"tslint-config-prettier": "^1.18.0"
}, },
"private": false, "private": false,
"files": [ "files": [

88
readme.md Normal file
View File

@ -0,0 +1,88 @@
# @pushrocks/smartgit
smart wrapper for nodegit
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartgit)
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartgit)
* [github.com (source mirror)](https://github.com/pushrocks/smartgit)
* [docs (typedoc)](https://pushrocks.gitlab.io/smartgit/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/pushrocks/smartgit/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/pushrocks/smartgit/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@pushrocks/smartgit)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/pushrocks/smartgit)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@pushrocks/smartgit)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@pushrocks/smartgit)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@pushrocks/smartgit)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
We recommend the use of TypeScript for best in class intellisense
```javascript
// import smartgit:
import { GitRepo } from 'smartgit';
// Initialize smartgit:
// -- note: there are 3 ways to initialize smartgit
// -- -- 1. with a existing Git repo
// -- -- 2. with a cloned Git repo
// -- -- 3. with a new Git repo
// -- 1. existing Git Repo:
let myExistingGitRepo = new GitRepo('/path/to/existing/git/repo/');
// -- 2. cloned Git Repo:
let myClonedGitRepo: GitRepo;
smartgit.createRepoFromClone('git@github.com:username/reponame.git').then((gitRepo) => {
// non blocking
myClonedGitRepo = gitRepo;
});
// -- 3. new Git Repo
let myNewGitRepo: GitRepo;
smartgit
.createRepoFromInit('/path/to/new/folder') // smartgit will create any new folder, be careful
.then((gitRepo) => {
// non blocking
myNewGitRepo = gitRepo;
});
// Using smartgit instance
// -- most used actions
// -- all actions return promises, so make sure to use promise chaining for any dependent tasks
myExistingGitRepo.addAll(); // returns promise, stages all changed files
myExistingGitRepo.add(['relative/path/to/file.txt', 'another/file2.txt']); // returns promise, stages specific files
myExistingGitRepo.commit('my commit message'); // returns promise, commits staged files
myExistingGitRepo
.status() // returns promise
.then((status) => {
// Use TypeScript for status type information
});
myExistingGitRepo.check(); // returns promise, checks repo health
myExistingGitRepo.remoteAdd('git@github.com:username/reponame.git');
```
Tip: use [smartssh](https://npmjs.com/smartssh) to setup your SSH environment
[![npm](https://push.rocks/assets/repo-header.svg)](https://push.rocks)
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -1,12 +1,26 @@
import { tap, expect } from '@pushrocks/tapbundle'; import { tap, expect } from '@pushrocks/tapbundle';
import * as smartgit from '../ts/index'; import * as smartgit from '../ts/index.js';
import * as smartpath from '@pushrocks/smartpath';
const __dirname = smartpath.get.dirnameFromImportMetaUrl(import.meta.url);
import * as path from 'path'; import * as path from 'path';
let testSmartgitInstance: smartgit.Smartgit;
const testRepoDir = path.join(__dirname, '../.nogit/testrepo'); const testRepoDir = path.join(__dirname, '../.nogit/testrepo');
const testRepoDirSmartfile = path.join(__dirname, '../.nogit/pushrocks_smartfile')
tap.test('should create a valid smartgit instance', async () => {
testSmartgitInstance = new smartgit.Smartgit();
await testSmartgitInstance.init();
expect(testSmartgitInstance).toBeInstanceOf(smartgit.Smartgit);
})
tap.test('should create a new repo at .nogit', async () => { tap.test('should create a new repo at .nogit', async () => {
const gitRepo = await smartgit.GitRepo.fromCreatingRepoInDir(testRepoDir); const gitRepo = await testSmartgitInstance.createRepoByOpen(testRepoDir);
});
tap.test('should clone a repo', async () => {
const gitRepo = await testSmartgitInstance.createRepoByClone('https://gitlab.com/pushrocks/smartfile.git', testRepoDirSmartfile);
}); });
tap.start(); tap.start();

8
ts/00_commitinfo_data.ts Normal file
View File

@ -0,0 +1,8 @@
/**
* autocreated commitinfo by @pushrocks/commitinfo
*/
export const commitinfo = {
name: '@pushrocks/smartgit',
version: '2.0.3',
description: 'smart wrapper for nodegit'
}

View File

@ -1,3 +1,2 @@
import plugins = require('./smartgit.plugins'); export * from './smartgit.classes.gitrepo.js';
export * from './smartgit.classes.smartgit.js';
export * from './smartgit.classes.gitrepo';

View File

@ -1,4 +1,6 @@
import * as plugins from './smartgit.plugins'; import * as plugins from './smartgit.plugins.js';
import { Smartgit } from './smartgit.classes.smartgit.js';
/** /**
* class GitRepo allows access to git directories from node * class GitRepo allows access to git directories from node
@ -8,39 +10,61 @@ export class GitRepo {
/** /**
* creates a new GitRepo Instance after cloning a project * creates a new GitRepo Instance after cloning a project
*/ */
public static async fromCloningIntoDir(fromArg: string, toArg: string): Promise<GitRepo> { public static async fromCloningIntoDir(
smartgitRefArg: Smartgit,
fromArg: string,
toArg: string
): Promise<GitRepo> {
const dirArg = plugins.path.resolve(toArg); const dirArg = plugins.path.resolve(toArg);
const ngRespository = await plugins.nodegit.Clone.clone(fromArg, toArg, { await plugins.isomorphicGit.clone({
bare: 0, dir: toArg,
checkoutBranch: 'master', fs: smartgitRefArg.envDeps.fs,
http: smartgitRefArg.envDeps.http,
url: fromArg,
}); });
return new GitRepo(ngRespository); return new GitRepo(smartgitRefArg, toArg);
} }
public static async fromCreatingRepoInDir(dirArg: string): Promise<GitRepo> { public static async fromCreatingRepoInDir(
smartgitRefArg: Smartgit,
dirArg: string
): Promise<GitRepo> {
dirArg = plugins.path.resolve(dirArg); dirArg = plugins.path.resolve(dirArg);
const ngRepository = await plugins.nodegit.Repository.init(dirArg, 0); await plugins.isomorphicGit.init({
return new GitRepo(ngRepository); dir: dirArg,
fs: smartgitRefArg.envDeps.fs,
});
return new GitRepo(smartgitRefArg, dirArg);
} }
public static async fromOpeningRepoDir(dirArg: string) { public static async fromOpeningRepoDir(smartgitRefArg: Smartgit, dirArg: string) {
dirArg = plugins.path.resolve(dirArg); dirArg = plugins.path.resolve(dirArg);
const ngRepository = await plugins.nodegit.Repository.open(dirArg); return new GitRepo(smartgitRefArg, dirArg);
return new GitRepo(ngRepository);
} }
// INSTANCE // INSTANCE
public nodegitRepo: plugins.nodegit.Repository; public smartgitRef: Smartgit;
public repoDir: string;
constructor(nodegitRepoArg: plugins.nodegit.Repository) { constructor(smartgitRefArg: Smartgit, repoDirArg: string) {
this.nodegitRepo = nodegitRepoArg; this.smartgitRef = smartgitRefArg;
this.repoDir = repoDirArg;
} }
/** /**
* lists remotes * lists remotes
*/ */
public async listRemotes(): Promise<plugins.nodegit.Remote[]> { public async listRemotes(): Promise<
return this.nodegitRepo.getRemotes(); {
remote: string;
url: string;
}[]
> {
const remotes = await plugins.isomorphicGit.listRemotes({
fs: this.smartgitRef.envDeps.fs,
dir: this.repoDir,
});
return remotes;
} }
/** /**
@ -49,31 +73,42 @@ export class GitRepo {
* @param remoteUrlArg * @param remoteUrlArg
*/ */
public async ensureRemote(remoteNameArg: string, remoteUrlArg: string): Promise<void> { public async ensureRemote(remoteNameArg: string, remoteUrlArg: string): Promise<void> {
const existingUrl = await this.getUrlForRemote(remoteNameArg); const remotes = await this.listRemotes();
if (existingUrl === remoteUrlArg) { const existingRemote =
remotes.find((itemArg) => itemArg.remote === remoteNameArg);
if (existingRemote) {
if (existingRemote.url !== remoteUrlArg) {
await plugins.isomorphicGit.deleteRemote({
remote: remoteNameArg,
fs: this.smartgitRef.envDeps.fs,
dir: this.repoDir
})
} else {
return; return;
};
} }
if (existingUrl) { await plugins.isomorphicGit.addRemote({
await plugins.nodegit.Remote.delete(this.nodegitRepo, remoteNameArg); remote: remoteNameArg,
} fs: this.smartgitRef.envDeps.fs,
await plugins.nodegit.Remote.create(this.nodegitRepo, remoteNameArg, remoteUrlArg); url: remoteUrlArg
})
} }
/** /**
* gets the url for a specific remote * gets the url for a specific remote
*/ */
public async getUrlForRemote(remoteName: string): Promise<string> { public async getUrlForRemote(remoteName: string): Promise<string> {
const ngRemote = await this.nodegitRepo.getRemote(remoteName); const remotes = await this.listRemotes();
if (ngRemote) { const existingRemote = remotes.find(remoteArg => remoteArg.remote === remoteName);
return ngRemote.url(); return existingRemote?.url;
} else {
return null;
}
} }
public async pushBranchToRemote(branchName: string, remoteName: string) { public async pushBranchToRemote(branchName: string, remoteName: string) {
await this.nodegitRepo.checkoutBranch(branchName); await plugins.isomorphicGit.push({
const ngRemote = await this.nodegitRepo.getRemote(remoteName); fs: this.smartgitRef.envDeps.fs,
ngRemote.push([branchName]); http: this.smartgitRef.envDeps.http,
ref: branchName,
remote: remoteName
})
} }
} }

View File

@ -0,0 +1,38 @@
import * as plugins from './smartgit.plugins.js';
import { GitRepo } from './smartgit.classes.gitrepo.js';
export class Smartgit {
public smartenvInstance = new plugins.smartenv.Smartenv();
public envDeps: {
fs: any;
http: any;
} = {
fs: null,
http: null
}
constructor() {};
public async init() {
if (this.smartenvInstance.isNode) {
this.envDeps.fs = await this.smartenvInstance.getSafeNodeModule('fs');
this.envDeps.http = await this.smartenvInstance.getSafeNodeModule('isomorphic-git/http/node/index.js');
} else {
throw new Error('currently only node.js is supported.')
}
};
public async createRepoByClone(fromUrlArg: string, toDirArg: string) {
const repo = await GitRepo.fromCloningIntoDir(this, fromUrlArg, toDirArg)
};
public async createRepoByInit(dirArg: string) {
const repo = await GitRepo.fromCreatingRepoInDir(this, dirArg);
return repo;
};
public async createRepoByOpen(dirArg: string) {
const repo = await GitRepo.fromOpeningRepoDir(this, dirArg);
return repo;
}
}

View File

@ -3,14 +3,15 @@ import * as path from 'path';
export { path }; export { path };
import * as smartenv from '@pushrocks/smartenv';
import * as smartfile from '@pushrocks/smartfile'; import * as smartfile from '@pushrocks/smartfile';
import * as smartpath from '@pushrocks/smartpath'; import * as smartpath from '@pushrocks/smartpath';
import * as smartpromise from '@pushrocks/smartpromise'; import * as smartpromise from '@pushrocks/smartpromise';
import * as smartstring from '@pushrocks/smartstring'; import * as smartstring from '@pushrocks/smartstring';
export { smartfile, smartpath, smartpromise, smartstring }; export { smartenv, smartfile, smartpath, smartpromise, smartstring };
// third party // third party
import nodegit from 'nodegit'; import isomorphicGit from 'isomorphic-git';
export { nodegit }; export { isomorphicGit };

10
tsconfig.json Normal file
View File

@ -0,0 +1,10 @@
{
"compilerOptions": {
"experimentalDecorators": true,
"useDefineForClassFields": false,
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "nodenext",
"esModuleInterop": true
}
}

View File

@ -1,17 +0,0 @@
{
"extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
}