Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Florian Tham
2017-02-03 12:10:06 +01:00
7 changed files with 195 additions and 179 deletions

View File

@@ -2,77 +2,82 @@
## Please post an issue if you would like to help out. ## Please post an issue if you would like to help out.
# SCM Breeze [![TravisCI](https://secure.travis-ci.org/ndbroadbent/scm_breeze.png?branch=master)](http://travis-ci.org/ndbroadbent/scm_breeze) ---
# SCM Breeze [![TravisCI](https://secure.travis-ci.org/scmbreeze/scm_breeze.png?branch=master)](http://travis-ci.org/scmbreeze/scm_breeze)
> Streamline your SCM workflow. > Streamline your SCM workflow.
**SCM Breeze** is a set of shell scripts (for `bash` and `zsh`) that enhance your interaction with git. It integrates with your shell to give you numbered file shortcuts, **SCM Breeze** is a set of shell scripts (for `bash` and `zsh`) that enhance
a repository index with tab completion, and many other useful features. your interaction with git. It integrates with your shell to give you numbered
file shortcuts, a repository index with tab completion, and many other useful
features.
<hr/> ![SCM Breeze Example Gif](http://i.imgur.com/3fD8cpo.gif)
- [SCM Breeze](#scm-breeze-)
- [Demos](#demos) - [Installation](#installation)
- [Usage](#usage)
- [File Shortcuts](#file-shortcuts) - [File Shortcuts](#file-shortcuts)
- [Git Status Shortcuts:](#git-status-shortcuts)
- ['ls' shortcuts:](#ls-shortcuts)
- [Other shortcuts](#other-shortcuts)
- [Keyboard bindings](#keyboard-bindings) - [Keyboard bindings](#keyboard-bindings)
- [Repository Index](#repository-index) - [Repository Index](#repository-index)
- [Linking External Project Design Directories](#linking-external-project-design-directories) - [Linking External Project Design Directories](#linking-external-project-design-directories)
- [1) Create and configure a root design directory](#1-create-and-configure-a-root-design-directory)
- [2) Initialize design directories for your projects](#2-initialize-design-directories-for-your-projects)
- [3) Link existing design directories into your projects](#3-link-existing-design-directories-into-your-projects)
- [Contributing tools / scripts](#contributing-tools--scripts)
- [Installation](#installation)
- [Updating](#updating)
- [Uninstall](#uninstall)
- [Configuration](#configuration) - [Configuration](#configuration)
- [1) Configure and use the provided SCM Breeze aliases](#1-configure-and-use-the-provided-scm-breeze-aliases) - [Updating](#updating)
- [2) Use your own aliases](#2-use-your-own-aliases) - [Uninstalling](#uninstalling)
- [Notes about Tab Completion for Aliases](#notes-about-tab-completion-for-aliases) - [Notes about Tab Completion for Aliases](#notes-about-tab-completion-for-aliases)
- [Bash](#bash)
- [Zsh](#zsh)
- [Contributing](#contributing) - [Contributing](#contributing)
<hr/>
## Demos ## Installation
Adding a range of files, and pressing `Ctrl+X, C` to commit: ```bash
git clone git://github.com/scmbreeze/scm_breeze.git ~/.scm_breeze
~/.scm_breeze/install.sh
source ~/.bashrc # or source ~/.zshrc
```
<center><img src="http://i.imgur.com/3fD8cpo.gif" title="SCM Breeze Example Gif" /></center> The install script creates required default configs and adds the following line
to your `.bashrc` or `.zshrc`:
<br/> `[ -s "$HOME/.scm_breeze/scm_breeze.sh" ] && source "$HOME/.scm_breeze/scm_breeze.sh"`
<center><a href="http://www.youtube.com/watch?v=iKdp6uBfrvc" target="_blank"><img src="http://i.imgur.com/l7aGG.png"></a></center> **Note:** SCM Breeze performs much faster if you have ruby installed.
<hr/>
## File Shortcuts
SCM Breeze makes it really easy to work with changed files, and groups of changed files.
Whenever you view your SCM status, each modified path is stored in a numbered environment variable.
You can configure the variable prefix, which is 'e' by default.
### Git Status Shortcuts: ## Usage
<center><a href="http://www.youtube.com/watch?v=iKdp6uBfrvc"
target="_blank"><img src="http://i.imgur.com/l7aGG.png"></a></center>
### File Shortcuts
SCM Breeze makes it really easy to work with changed files, and groups of
changed files. Whenever you view your SCM status, each modified path is stored
in a numbered environment variable. You can configure the variable prefix,
which is 'e' by default.
#### Git Status Shortcuts:
<div class="centered"> <div class="centered">
<img src="http://madebynathan.com/images/posts/2011/10/status_with_shortcuts-resized-post.png" width="590" alt="Git Status With Shortcuts" /> <img src="http://madebynathan.com/images/posts/2011/10/status_with_shortcuts-resized-post.png" width="590" alt="Git Status With Shortcuts" />
</div> </div>
<br/> <br/>
### 'ls' shortcuts:
#### 'ls' shortcuts:
<div class="centered"> <div class="centered">
<img src="http://i.imgur.com/72GE1.png" alt="Ls With Shortcuts" /> <img src="http://i.imgur.com/72GE1.png" alt="Ls With Shortcuts" />
</div> </div>
<br/> <br/>
These numbers (or ranges of numbers) can be used with any SCM or system command. These numbers (or ranges of numbers) can be used with any SCM or system
command.
For example, if `ga` was your alias for `git add`, instead of typing something like: For example, if `ga` was your alias for `git add`, instead of typing something
like:
```bash ```bash
$ ga assets/git_breeze/config* assets/git_breeze/install.sh $ ga assets/git_breeze/config* assets/git_breeze/install.sh
@@ -84,8 +89,8 @@ You can type this instead:
$ ga $e2 $e3 $e11 $ ga $e2 $e3 $e11
``` ```
But SCM Breeze aliases `ga` to the `git_add_shortcuts` function, But SCM Breeze aliases `ga` to the `git_add_shortcuts` function, which is smart
which is smart enough to expand integers and ranges, so all you need to type is: enough to expand integers and ranges, so all you need to type is:
```bash ```bash
$ ga 2 3 11 $ ga 2 3 11
@@ -97,8 +102,8 @@ And if you want to add all unstaged changes (files 1 to 10):
$ ga 1-10 $ ga 1-10
``` ```
(Note that `ga` will also remove deleted files, unlike the standard `git add` command. (Note that `ga` will also remove deleted files, unlike the standard `git add`
This behaviour can be turned off if you don't like it.) command. This behaviour can be turned off if you don't like it.)
You can also diff, reset or checkout a file by typing: You can also diff, reset or checkout a file by typing:
@@ -110,8 +115,8 @@ $ gco 5
``` ```
You can use these shortcuts with system commands by passing your command through `exec_scmb_expand_args` You can use these shortcuts with system commands by passing your command
(default alias is 'ge'): through `exec_scmb_expand_args` (default alias is 'ge'):
```bash ```bash
@@ -125,19 +130,21 @@ $ ge echo 1-3
``` ```
### Other shortcuts #### Other shortcuts
SCM Breeze adds a number of aliases to your shell. Use `list_aliases` to view all the aliases and their corresponding commands. SCM Breeze adds a number of aliases to your shell. Use `list_aliases` to view
You can filter aliases by adding a search string: `list_aliases git log` all the aliases and their corresponding commands. You can filter aliases by
adding a search string: `list_aliases git log`
There's also a `git_aliases` command, which just shows aliases for `git` commands. You can also pass in additional filters, e.g. `git_aliases log`. There's also a `git_aliases` command, which just shows aliases for `git`
commands. You can also pass in additional filters, e.g. `git_aliases log`.
## Keyboard bindings ### Keyboard bindings
Some of my most common git commands are `git add` and `git commit`, so I wanted these Some of my most common git commands are `git add` and `git commit`, so I wanted
to be as streamlined as possible. One way of speeding up commonly used commands is by binding them to these to be as streamlined as possible. One way of speeding up commonly used
keyboard shortcuts. commands is by binding them to keyboard shortcuts.
Here are the default key bindings: Here are the default key bindings:
@@ -145,14 +152,13 @@ Here are the default key bindings:
* `CTRL`+`x` `SPACE` => `git_commit_all` - commit everything * `CTRL`+`x` `SPACE` => `git_commit_all` - commit everything
The commit shortcuts use the `git_commit_prompt` function, which gives a simple prompt like this: The commit shortcuts use the `git_commit_prompt` function, which gives a simple
prompt like this:
<div class="centered"> <div class="centered"> <img
<img src="http://madebynathan.com/images/posts/2011/10/git_commit_all-resized-post.png" alt="Git Commit All" /> src="http://madebynathan.com/images/posts/2011/10/git_commit_all-resized-post.png"
</div> alt="Git Commit All" /> </div> <br/> (When using bash, this commit prompt gives
<br/> you access to your bash history via the arrow keys.) <br/>
(When using bash, this commit prompt gives you access to your bash history via the arrow keys.)
<br/>
And if you really want to speed up your workflow, you can type this: And if you really want to speed up your workflow, you can type this:
@@ -168,23 +174,26 @@ This sends the `HOME` key, followed by `git_add_and_commit`:
<br/> <br/>
## Repository Index ### Repository Index
The second feature is a repository index for all of your projects and submodules. The second feature is a repository index for all of your projects and
This gives you super-fast switching between your project directories, with tab completion, submodules. This gives you super-fast switching between your project
and it can even tab-complete down to project subdirectories. directories, with tab completion, and it can even tab-complete down to project
This means that you can keep your projects organized in subfolders, subdirectories. This means that you can keep your projects organized in
but switch between them as easily as if they were all in one folder. subfolders, but switch between them as easily as if they were all in one
folder.
It's similar to [autojump](https://github.com/joelthelion/autojump), but it doesn't need to 'learn' anything, It's similar to [autojump](https://github.com/joelthelion/autojump), but it
and it can do SCM-specific stuff like: doesn't need to 'learn' anything, and it can do SCM-specific stuff like:
* Running a command for all of your repos (useful if you ever need to update a lot of remote URLs) * Running a command for all of your repos (useful if you ever need to update a
lot of remote URLs)
* Update all of your repositories via a cron task * Update all of your repositories via a cron task
The default alias for `git_index` is 'c', which might stand for 'code' The default alias for `git_index` is 'c', which might stand for 'code'
You will first need to configure your repository directory, and then build the index: You will first need to configure your repository directory, and then build the
index:
```bash ```bash
$ c --rebuild $ c --rebuild
@@ -192,10 +201,12 @@ $ c --rebuild
# => ===== Indexed 64 repos in /home/ndbroadbent/code/.git_index # => ===== Indexed 64 repos in /home/ndbroadbent/code/.git_index
``` ```
Then you'll be able to switch between your projects, or show the list of indexed repos. Then you'll be able to switch between your projects, or show the list of
indexed repos.
To switch to a project directory, you don't need to type the full project name. For example, To switch to a project directory, you don't need to type the full project name.
to switch to the `capistrano` project, you could type any of the following: For example, to switch to the `capistrano` project, you could type any of the
following:
```bash ```bash
$ c capistrano $ c capistrano
@@ -214,19 +225,20 @@ $ c capistrano/lib/
# => cd ~/code/gems/capistrano/lib # => cd ~/code/gems/capistrano/lib
``` ```
Or if you want to go to a subdirectory within the `~/code` directory, prefix the first argument with a `/`: Or if you want to go to a subdirectory within the `~/code` directory, prefix
the first argument with a `/`:
```bash ```bash
~ $ c /gems ~ $ c /gems
~/code/gems $ ~/code/gems $
``` ```
## Linking External Project Design Directories ### Linking External Project Design Directories
When you're creating logos or icons for a project that uses `git`, When you're creating logos or icons for a project that uses `git`, have you
have you ever wondered where you should store those `.psd` or `.xcf` files? ever wondered where you should store those `.psd` or `.xcf` files? Do you
Do you commit all of your raw design files, or does it put you off that any changes to those files commit all of your raw design files, or does it put you off that any changes to
will bloat your repository? those files will bloat your repository?
Here were my goals when I set out to find a solution: Here were my goals when I set out to find a solution:
@@ -235,166 +247,164 @@ Here were my goals when I set out to find a solution:
* The design directory needed to be synchronized across all of my machines * The design directory needed to be synchronized across all of my machines
The simplest way for me to synchronize files was via my Dropbox account. The simplest way for me to synchronize files was via my Dropbox account.
However, if you work with a larger team, you could set up a shared design directory on one However, if you work with a larger team, you could set up a shared design
of your servers and synchronize it with `rsync`. directory on one of your servers and synchronize it with `rsync`.
### 1) Create and configure a root design directory #### 1) Create and configure a root design directory
I created my root design directory at `~/Dropbox/Design`. I created my root design directory at `~/Dropbox/Design`.
After you've created your root design directory, edit `~/.scmbrc` and set `root_design_dir` After you've created your root design directory, edit `~/.scmbrc` and set
to the directory you just created. `root_design_dir` to the directory you just created. You can also configure
You can also configure the design directory that's created in each of your projects the design directory that's created in each of your projects (default:
(default: `design_assets`), as well as the subdirectories you would like to use. `design_assets`), as well as the subdirectories you would like to use. The
The default base subdirectories are: Images, Backgrounds, Logos, Icons, Mockups, and Screenshots. default base subdirectories are: Images, Backgrounds, Logos, Icons, Mockups,
and Screenshots.
After you have changed these settings, remember to run `source ~/.bashrc` or `source ~/.zshrc`. After you have changed these settings, remember to run `source ~/.bashrc` or
`source ~/.zshrc`.
### 2) Initialize design directories for your projects #### 2) Initialize design directories for your projects
To set up the design directories and symlinks, go to a project's directory and run: To set up the design directories and symlinks, go to a project's directory and
run:
```bash ```bash
design init design init
``` ```
If your root directory is `~/Dropbox/Design`, directories will be created at If your root directory is `~/Dropbox/Design`, directories will be created at
`~/Dropbox/Design/projects/my_project/Backgrounds`, `~/Dropbox/Design/projects/my_project/Icons`, etc. `~/Dropbox/Design/projects/my_project/Backgrounds`,
`~/Dropbox/Design/projects/my_project/Icons`, etc.
It will then symlink the project from your root design directory into your project's design directory, It will then symlink the project from your root design directory into your
so you end up with: project's design directory, so you end up with:
* `my_project/design_assets` -> `~/Dropbox/Design/projects/my_project` * `my_project/design_assets` -> `~/Dropbox/Design/projects/my_project`
It also adds this directory to `.git/info/exclude` so that git ignores it. It also adds this directory to `.git/info/exclude` so that git ignores it.
If you use the git repository index, If you use the git repository index, you can run the following batch command to
you can run the following batch command to set up these directories for all of your git repos at once: set up these directories for all of your git repos at once:
```bash ```bash
git_index --batch-cmd design init git_index --batch-cmd design init
``` ```
If you want to remove any empty design directories, run: If you want to remove any empty design directories, run:
```bash ```bash
design trim design trim
``` ```
And if you want to remove all of a project's design directories, even if they contain files: And if you want to remove all of a project's design directories, even if they
contain files:
```bash ```bash
design rm design rm
``` ```
### 3) Link existing design directories into your projects #### 3) Link existing design directories into your projects
If you've set up your design directories on one machine, you'll want them If you've set up your design directories on one machine, you'll want them to be
to be synchronized across all of your other development machines. synchronized across all of your other development machines.
Just run the following command on your other machines after you've configured the root design directory: Just run the following command on your other machines after you've configured
the root design directory:
```bash ```bash
design link design link
``` ```
This uses your git index to figure out where to create the symlinks. This uses your git index to figure out where to create the symlinks. If you
If you don't use the git index, the same outcome could be achieved by running 'design init' don't use the git index, the same outcome could be achieved by running 'design
for each of the projects. init' for each of the projects.
## Configuration
## Contributing tools / scripts SCM Breeze is configured via automatically installed `~/.*.scmbrc` files. To
change git configuration, edit `~/.git.scmbrc`.
If you have any awesome SCM scripts lurking in your `.bashrc` or `.zshrc`, Each feature is modular, so you are free to ignore the parts you don't want to
please feel free to send me a pull request. use. Just comment out the relevant line in `~/.scm_breeze/scm_breeze.sh`.
It would be cool to make this project into an [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) for SCMs.
**Note:** After changing any settings, you will need to run `source ~/.bashrc`
(or `source ~/.zshrc`)
I know we grow attached to the aliases we use every day, so I've made the alias
system completely customizable. You have two options when it comes to aliases:
# Installation ### 1) Configure and use the provided SCM Breeze aliases
```bash Just tweak the aliases in `~/.git.scmbrc`. You can also change or remove any
git clone git://github.com/ndbroadbent/scm_breeze.git ~/.scm_breeze keyboard shortcuts. These aliases also come with tab completion. For example,
~/.scm_breeze/install.sh you can type `gco <tab>` to tab complete your list of branches.
source ~/.bashrc # or source ~/.zshrc
```
The install script creates required default configs and adds the following line to your `.bashrc` or `.zshrc`:
`[ -s "$HOME/.scm_breeze/scm_breeze.sh" ] && source "$HOME/.scm_breeze/scm_breeze.sh"`
**Note:** SCM Breeze performs much faster if you have ruby installed.
# Updating ### 2) Use your own aliases
Please run `update_scm_breeze` to fetch the latest code. This will update SCM Breeze from Github, In your `git.scmbrc` config file, just set the `git_setup_aliases` option to
and will create or patch your `~/.*.scmbrc` config files if any new settings are added. `no`. Your existing git aliases will then be used, and you will still be able
to use the numeric shortcuts feature. SCM Breeze creates a function to wrap
the 'git' command, which expands numeric arguments, and uses `hub` if
available.
# Uninstall A few aliases will still be defined for the central SCM Breeze features, such
as `gs` for the extended `git status`, and `ga` for the `git add` function.
If you already have an alias like `alias gco="git checkout"`, you can now type
`gco 1` to checkout the first file in the output of SCM Breeze's `git status`.
## Notes about Tab Completion for Aliases
### Bash
If you use your own aliases, SCM Breeze will **not** set up bash tab completion
for your aliases. You will need to set that up yourself.
### Zsh
You just need to set the option: `setopt no_complete_aliases` (oh-my-zsh sets
this by default). Zsh will then expand aliases like `gb` to `git branch`, and
use the completion for that.
## Updating
Please run `update_scm_breeze` to fetch the latest code. This will update SCM
Breeze from Github, and will create or patch your `~/.*.scmbrc` config files if
any new settings are added.
## Uninstalling
```bash ```bash
~/.scm_breeze/uninstall.sh ~/.scm_breeze/uninstall.sh
``` ```
The uninstall script removes the following line from your `.bashrc` or `.zshrc`: The uninstall script removes the following line from your `.bashrc` or
`.zshrc`:
`[ -s "$HOME/.scm_breeze/scm_breeze.sh" ] && source "$HOME/.scm_breeze/scm_breeze.sh"` `[ -s "$HOME/.scm_breeze/scm_breeze.sh" ] && source "$HOME/.scm_breeze/scm_breeze.sh"`
# Configuration
SCM Breeze is configured via automatically installed `~/.*.scmbrc` files. ## Contributing
To change git configuration, edit `~/.git.scmbrc`.
Each feature is modular, so you are free to ignore the parts you don't want to use. SCM Breeze lives on Github at
Just comment out the relevant line in `~/.scm_breeze/scm_breeze.sh`. [`scmbreeze/scm_breeze`](https://github.com/scmbreeze/scm_breeze)
**Note:** After changing any settings, you will need to run `source ~/.bashrc` (or `source ~/.zshrc`)
I know we grow attached to the aliases we use every day, so I've made the alias system completely customizable.
You have two options when it comes to aliases:
### 1) Configure and use the provided SCM Breeze aliases
Just tweak the aliases in `~/.git.scmbrc`. You can also change or remove any keyboard shortcuts.
These aliases also come with tab completion. For example, you can type `gco <tab>` to tab complete your list of branches.
### 2) Use your own aliases
In your `git.scmbrc` config file, just set the `git_setup_aliases` option to `no`.
Your existing git aliases will then be used, and you will still be able to use the numeric shortcuts feature.
SCM Breeze creates a function to wrap the 'git' command, which expands numeric arguments, and uses `hub` if available.
A few aliases will still be defined for the central SCM Breeze features, such as `gs` for the extended `git status`,
and `ga` for the `git add` function.
If you already have an alias like `alias gco="git checkout"`,
you can now type `gco 1` to checkout the first file in the output of SCM Breeze's `git status`.
# Notes about Tab Completion for Aliases
### Bash
If you use your own aliases, SCM Breeze will **not** set up bash tab completion for your aliases.
You will need to set that up yourself.
### Zsh
You just need to set the option: `setopt no_complete_aliases` (oh-my-zsh sets this by default).
Zsh will then expand aliases like `gb` to `git branch`, and use the completion for that.
# Contributing
SCM Breeze lives on Github at [https://github.com/ndbroadbent/scm_breeze](https://github.com/ndbroadbent/scm_breeze)
Please feel free to fork and send pull requests, especially if you would like to build these features
for Mercurial, SVN, etc.
If you have any awesome SCM scripts lurking in your `.bashrc` or `.zshrc`,
please feel free to send me a pull request. It would be cool to make this
project into an [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) for
SCMs.
***Enjoy!*** ***Enjoy!***

View File

View File

@@ -22,14 +22,15 @@
@project_root = File.exist?(".git") ? Dir.pwd : `\git rev-parse --show-toplevel 2> /dev/null`.strip @project_root = File.exist?(".git") ? Dir.pwd : `\git rev-parse --show-toplevel 2> /dev/null`.strip
@git_status = `\git status --porcelain 2> /dev/null` @git_status = `\git status --porcelain -b 2> /dev/null`
git_branch = `\git branch -v 2> /dev/null` git_status_lines = @git_status.split("\n")
@branch = git_branch[/^\* (\(no branch\)|[^ ]*)/, 1] git_branch = git_status_lines[0]
@ahead = git_branch[/^\* [^ ]* *[^ ]* *\[ahead ?(\d+).*\]/, 1] @branch = git_branch[/^## (?:Initial commit on )?([^ \.]+)/, 1]
@behind = git_branch[/^\* [^ ]* *[^ ]* *\[.*behind ?(\d+)\]/, 1] @ahead = git_branch[/\[ahead ?(\d+).*\]/, 1]
@behind = git_branch[/\[.*behind ?(\d+)\]/, 1]
@changes = @git_status.split("\n") @changes = git_status_lines[1..-1]
# Exit if too many changes # Exit if too many changes
exit if @changes.size > ENV["gs_max_changes"].to_i exit if @changes.size > ENV["gs_max_changes"].to_i

View File

@@ -166,7 +166,12 @@ git_clear_vars() {
local i local i
for (( i=1; i<=$gs_max_changes; i++ )); do for (( i=1; i<=$gs_max_changes; i++ )); do
# Stop clearing after first empty var # Stop clearing after first empty var
if [[ -z "$(eval echo "\${$git_env_char$i:-}")" ]]; then break; fi local env_var_i=${git_env_char}${i}
if [[ -z "$(eval echo "\${$env_var_i:-}")" ]]; then
break
else
unset $env_var_i
fi
done done
} }

View File

View File

View File

@@ -3,5 +3,5 @@
# Remove line from bashrc and zshrc if present. # Remove line from bashrc and zshrc if present.
for rc in bashrc zshrc; do for rc in bashrc zshrc; do
sed -i '/scm_breeze/d' "$HOME/.$rc" sed -i '/scm_breeze/d' "$HOME/.$rc"
printf "== Removed SCM Breeze from '$HOME/.$rc'\n" printf "Removed SCM Breeze from %s\n" "$HOME/.$rc"
done done