@deliverymanager/gitsync
Version:
Synchronize multiple git repos recursively
266 lines (180 loc) • 7.55 kB
Markdown
# Git Sync
## Clones all repositories, public or private, of a specified user or organization.
## Credentials are required, they are present in a file named .gitsync.json place in the home folder.
### Installation:
```
~$ sudo npm install -g @deliverymanager/gitsync
```
### Usage:
#### For pull:
```
~$ gitsync --pull
```
--------------------------------------------------------------------------------
#### For clone:
```
~$ gitsync --clone
```
--------------------------------------------------------------------------------
#### For both:
```
~$ gitsync --all
```
##### Or:
```
~$ gitsync -a
```
--------------------------------------------------------------------------------
#### To (re)initialize credentials:
```
~$ gitsync --init
```
--------------------------------------------------------------------------------
#### To checkout to stable branches (production/prod):
```
~$ gitsync --checkout
```
--------------------------------------------------------------------------------
##### The description is used to determine the exact path to which the repository will be cloned.
##### If the description is not a valid path, a warning appears.
### Examples:
Repository description: `path/to/folder` -> Will clone the repository in `./path/to/folder/<repository name>`
Repository description: `Some description` -> Will show a warning and __not__ clone
### Authentication:
#### The following file, .gitsync.json, must be placed in the home folder and is required for authentication with the GitHub API:
#### For only public repositories:
```
{
"user": <github username>,
"user_agent": <github user_agent>,
"sync_account": <account from which to sync>,
"org": <true/false> // whether the sync_account is an organization
}
```
#### For private repositories as well:
```
{
"user": <github username>,
"user_agent": <github user_agent>,
"sync_account": <account from which to sync>,
"org": <true/false> // whether the sync_account is an organization,
"at": <github API access token>
}
```
#### To run the tests as well, the file must look like this:
```
{
"user": <github username>,
"at": <github API access token>,
"test_repo_1": {
"name": <repo name>,
"full_name": <repo full name>,
"local_path": <local path to which the repo will be cloned>
},
"test_repo_2": {
"name": <repo name>,
"full_name": <repo full name>,
"local_path": <local path to which the repo will be cloned>
},
"user_agent": <github user_agent>,
"sync_account": <account from which to sync>,
"org": <true/false> // whether the sync_account is an organization
}
```
#### You can place the file yourself or you could run `~$ gitsync --init` which will prompt for user name and Github API access token.
```
~$ gitsync --init
```
#### If you try to use the script without the `.gitsync.json` file present in the home folder, you will be prompted to initialize it, and execution will continue after the file is created.
#### _Note_: You could omit the access token. The script will still work but _only_ for public repositories.
# API Reference
---
## Clone
### init_cred
Initializes/updates git credentials
<a name="exp_module_src/clone/lib/init_cred--module.exports"></a>
### module.exports([cred]) ⇒ <code>Promise</code> ⏏
**Kind**: Exported function
**Returns**: <code>Promise</code> - Resolves to the the output of fs.writeFile or to message: 'Credentials not updated'
| Param | Type | Default | Description |
| --- | --- | --- | --- |
| [cred] | <code>object</code> | <code>{}</code> | Credentials to keep Reads file with credentials, prompts for creation if not found and for update if found. Creates/Updates credentials. |
### get_all_repos_names
Gets all user's or org's repos names
<a name="exp_module_src/clone/lib/get_all_repos_names--module.exports"></a>
### module.exports(name, org, user, at) ⇒ <code>repos</code> ⏏
**Kind**: Exported function
**Returns**: <code>repos</code> - Mapped to have attributes name, full_name, local_path
| Param | Type | Description |
| --- | --- | --- |
| name | <code>string</code> | Github username |
| org | <code>boolean</code> | Whether the account belongs to an organization |
| user | <code>string</code> | User-Agent Header |
| at | <code>string</code> | Github authentication token |
### is_path_valid
Checks for validity of path, must be string and satisfy
<a name="exp_module_src/clone/lib/is_path_valid--module.exports"></a>
### module.exports(path) ⇒ <code>boolean</code> ⏏
**Kind**: Exported function
**Returns**: <code>boolean</code> - Whether path is valid
| Param | Type | Description |
| --- | --- | --- |
| path | <code>string</code> | Path under which to clone a repo |
### clone_repo
Clones a repo in path specified if path is valid. Else, clones to cwd
<a name="exp_module_src/clone/lib/clone_repo--module.exports"></a>
### module.exports(repo, at) ⇒ <code>Promise</code> ⏏
**Kind**: Exported function
**Returns**: <code>Promise</code> - Resolves to the path under which the repo was cloned
| Param | Type | Description |
| --- | --- | --- |
| repo | <code>object</code> | Repository info |
| repo.name | <code>string</code> | |
| repo.full_name | <code>string</code> | |
| repo.local_path | <code>string</code> | local path to which the repo will be cloned |
| at | <code>string</code> | Github authentication token |
---
## Pull
### get_existing_repos
Finds all repository folder paths under cwd. Used to update repos status
<a name="exp_module_src/pull/lib/get_existing_repos--module.exports"></a>
### module.exports() ⇒ <code>Array.<string></code> ⏏
**Kind**: Exported function
**Returns**: <code>Array.<string></code> - The repository folder paths under cwd
### get_status
Updates refs for cwd
<a name="exp_module_src/pull/lib/get_status--module.exports"></a>
### module.exports(path) ⇒ <code>string</code> ⏏
**Kind**: Exported function
**Returns**: <code>string</code> - Repo status: diverged, fast-forward, up-to-date
| Param | Type | Description |
| --- | --- | --- |
| path | <code>string</code> | The absolute path to use as an cwd with exec |
### pull_all
Pulls all branches for repo
<a name="exp_module_src/pull/lib/pull_all--module.exports"></a>
### module.exports(path) ⇒ <code>string</code> ⏏
**Kind**: Exported function
**Returns**: <code>string</code> - Success message
| Param | Type | Description |
| --- | --- | --- |
| path | <code>string</code> | The absolute path to use as an cwd with exec |
### get_all_branches
Returns all repo branches
<a name="exp_module_src/pull/lib/get_all_branches--module.exports"></a>
### module.exports(path) ⇒ <code>Array.<string></code> ⏏
**Kind**: Exported function
**Returns**: <code>Array.<string></code> - The branch names
| Param | Type | Description |
| --- | --- | --- |
| path | <code>string</code> | The absolute path to use as an cwd with exec |
### track_missing_branches
Creates local branches production and branches with prodv prefix, if not found
<a name="exp_module_src/pull/lib/track_missing_branches--module.exports"></a>
### module.exports(path, branches) ⇒ <code>Array.<string></code> ⏏
**Kind**: Exported function
**Returns**: <code>Array.<string></code> - The branches that were added
| Param | Type | Description |
| --- | --- | --- |
| path | <code>string</code> | The absolute path to use as an cwd with exec |
| branches | <code>Array.<string></code> | All repo branches |