diff --git a/bin/git-feature b/bin/git-feature index 7b1e726..207f25f 100755 --- a/bin/git-feature +++ b/bin/git-feature @@ -6,22 +6,30 @@ if [ -z "$branch_prefix" ]; then branch_prefix="feature" fi +branch_separator=$(git config --get git-extras.feature.separator) + +if [ -z "$branch_separator" ]; then + branch_separator="/" +fi + merge_mode="--no-ff" +finish=false declare -a argv while test $# != 0 do case $1 in -a|--alias ) - if [[ -n $2 ]] + if [[ -n $2 ]] && [[ $2 != -- ]] then shift # shift -a|-alias branch_prefix=$1 else - argv+=("$1") # treat tail '-a' as + echo >&2 "option $1 requires a value" + exit 1 fi ;; -r|--remote ) - if [[ -n $2 ]] + if [[ -n $2 ]] && [[ $2 != -- ]] then remote=$2 shift @@ -29,6 +37,16 @@ do remote="origin" fi ;; + -s|--separator ) + if [[ -n $2 ]] && [[ $2 != -- ]] + then + branch_separator=$2 + shift + else + echo >&2 "option $1 requires a value" + exit 1 + fi + ;; --squash ) merge_mode="--squash" ;; @@ -36,6 +54,15 @@ do start_point=$2 shift ;; + -- ) + # terminate argument parsing + shift + argv+=("$@") + break + ;; + finish ) + finish=true + ;; * ) argv+=("$1") ;; @@ -45,21 +72,17 @@ done concatargs() { str=$(IFS='-'; echo "$*") - branch="$branch_prefix"/$str + branch="$branch_prefix$branch_separator$str" } -if test "${argv[0]}" = "finish"; then - test -z "${argv[1]}" && echo "$branch_prefix" " required." 1>&2 && exit 1 - branch="$branch_prefix"/"${argv[1]}" +test -z "${argv[0]}" && echo "$branch_prefix" " required." 1>&2 && exit 1 + +concatargs "${argv[@]}" + +if "${finish}" +then git merge ${merge_mode} "$branch" && git delete-branch "$branch" else - test -z "${argv[0]}" && echo "$branch_prefix" " required." 1>&2 && exit 1 - if test -n "${argv[1]}"; then - concatargs "${argv[@]}" - else - branch="$branch_prefix"/"${argv[0]}" - fi - if [[ -n $remote ]] && [[ -z $start_point ]] then git create-branch -r "$remote" "$branch" diff --git a/man/git-feature.1 b/man/git-feature.1 index 3e477b1..c448ec5 100644 --- a/man/git-feature.1 +++ b/man/git-feature.1 @@ -1,56 +1,85 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "GIT\-FEATURE" "1" "November 2020" "" "Git Extras" +.TH "GIT\-FEATURE" "1" "September 2023" "" "Git Extras" . .SH "NAME" \fBgit\-feature\fR \- Create/Merge feature branch . .SH "SYNOPSIS" -\fBgit\-feature\fR [\-a|\-\-alias branch_prefix] [\-r|\-\-remote [remote_name]] +\fBgit\-feature\fR [\-a|\-\-alias \fIPREFIX\fR] [\-s|\-\-separator \fISEPARATOR\fR] [\-r|\-\-remote [REMOTE_NAME]] [\-\-from START_POINT] \fINAME\fR\.\.\. . -.br -\fBgit\-feature\fR [\-a|\-\-alias branch_prefix] finish [\-\-squash] +.P +\fBgit\-feature\fR [\-a|\-\-alias \fIPREFIX\fR] [\-s|\-\-separator \fISEPARATOR\fR] finish [\-\-squash] \fINAME\fR\.\.\. . .SH "DESCRIPTION" -Create/Merge the given feature branch +Create or merge the given feature branch\. The feature branch name is made from the \fIPREFIX\fR, the \fISEPARATOR\fR, and the \fINAME\fR joined together\. +. +.P +The default \fIPREFIX\fR is \fBfeature\fR and \fISEPARATOR\fR is \fB/\fR, which can be changed (see OPTIONS and GIT CONFIG for details)\. +. +.P +The branch \fINAME\fR may be specified as multiple words which will be joined with \fB\-\fR\. If the branch name contains the word \fBfinish\fR or is another OPTION, \fB\-\-\fR should be passed to stop OPTION parsing\. See the EXAMPLES for details\. . .SH "OPTIONS" -<\-a|\-\-alias branch_prefix> . -.P -use \fBbranch_prefix\fR instead of \fBfeature\fR +.TP +\fB\-a\fR \fIPREFIX\fR, \fB\-\-alias\fR \fIPREFIX\fR: . -.P -<\-r|\-\-remote [remote_name]> +.IP +The branch prefix to use, or \fBfeature\fR if not supplied\. . -.P +.TP +\fB\-s\fR \fISEPARATOR\fR, \fB\-\-separator\fR \fISEPARATOR\fR: +. +.IP +The separator to use for joining the branch prefix and the branch name, or \fB/\fR if not supplied\. +. +.TP +\fB\-r\fR [REMOTE_NAME], \fB\-\-remote\fR [REMOTE_NAME]: +. +.IP Setup a remote tracking branch using \fBremote_name\fR\. If \fBremote_name\fR is not supplied, use \fBorigin\fR by default\. . -.P -<\-\-from [start_point]> +.TP +\fB\-\-from\fR START_POINT: . -.P -Setup a start point when the branch created\. If \fB\-\-from\fR is not supplied, use the current branch by default\. +.IP +Setup a start point when the branch created\. If \fB\-\-from\fR is not supplied, use the current branch by default\. This option will be ignored when \fBfinish\fRing a branch\. . -.P - +.TP +\fBfinish\fR: . -.P +.IP Merge and delete the feature branch\. . -.P -<\-\-squash> +.TP +\fB\-\-squash\fR: . -.P -Run a squash merge\. +.IP +Run a squash merge when \fBfinish\fRing the feature branch\. . -.P - +.TP +\fINAME\fR: . -.P +.IP The name of the feature branch\. . +.SH "GIT CONFIG" +You can configure the default branch prefix and separator via git config options\. +. +.TP +\fBgit\-extras\.feature\.prefix\fR: +. +.IP +$ git config \-\-global add git\-extras\.feature\.prefix "prefix" +. +.TP +\fBgit\-extras\.feature\.separator\fR: +. +.IP +$ git config \-\-global add git\-extras\.feature\.separator "\-" +. .SH "EXAMPLES" . .TP @@ -107,6 +136,54 @@ $ (features/dependencies) git checkout master .br $ git features finish dependencies . +.TP +Use custom branch separator: +. +.IP +$ git feature \-s \- dependencies +. +.br +$ (feature\-dependencies) \.\.\. +. +.br +$ (feature\-dependencies) git checkout master +. +.br +$ git feature \-s \- finish dependencies +. +.TP +Use custom branch prefix and separator from git config with multiple words: +. +.IP +$ git config \-\-global \-\-add git\-extras\.feature\.prefix "features" +. +.br +$ git config \-\-global \-\-add git\-extras\.feature\.separator "\." +. +.br +$ git feature dependency tracking +. +.br +$ (features\.dependency\-tracking) \.\.\. +. +.br +$ (features\.dependency\-tracking) git checkout master +. +.br +$ git feature finish dependency tracking +. +.TP +Use a \fBgit\-feature\fR option flag as part of a branch name: +. +.IP +$ git feature \-\- finish remote +. +.br +\&\.\.\. +. +.br +$ (feature/finish\-remote) git commit \-m "Some changes" +. .SH "AUTHOR" Written by Jesús Espino <\fIjespinog@gmail\.com\fR> . @@ -116,8 +193,11 @@ Modified by Mark Pitman <\fImark\.pitman@gmail\.com\fR> .br Modified by Carlos Prado <\fIcarlos\.prado@cpradog\.com\fR> . +.br +Modified by Austin Ziegler <\fIhalostatue@gmail\.com\fR> +. .SH "REPORTING BUGS" <\fIhttps://github\.com/tj/git\-extras/issues\fR> . .SH "SEE ALSO" -<\fIhttps://github\.com/tj/git\-extras\fR> +<\fIhttps://github\.com/tj/git\-extras\fR>, git\-create\-branch(1), git\-delete\-branch(1) diff --git a/man/git-feature.html b/man/git-feature.html index 36f4052..16a201b 100644 --- a/man/git-feature.html +++ b/man/git-feature.html @@ -57,6 +57,7 @@ SYNOPSIS DESCRIPTION OPTIONS + GIT CONFIG EXAMPLES AUTHOR REPORTING BUGS @@ -76,38 +77,56 @@

SYNOPSIS

-

git-feature [-a|--alias branch_prefix] [-r|--remote [remote_name]] <name>
-git-feature [-a|--alias branch_prefix] finish [--squash] <name>

+

git-feature [-a|--alias branch_prefix] [-s|--separator branch_separator] [-r|--remote [remote_name]] <name>
+git-feature [-a|--alias branch_prefix] [-s|--separator branch_separator] finish [--squash] <name>

DESCRIPTION

-

Create/Merge the given feature branch

+

Create/Merge the given feature branch.

+ +

The branch name may be specified as multiple words which will be joined with - characters. If any word should start with a -, the name should be preceded by --, which will signal that option parsing should be ignored.

OPTIONS

-

<-a|--alias branch_prefix>

+

<-a|--alias branch_prefix>

-

use branch_prefix instead of feature

+

The branch prefix to use, or feature if not supplied.

-

<-r|--remote [remote_name]>

+

<-s|--separator branch_separator>

-

Setup a remote tracking branch using remote_name. If remote_name is not supplied, use origin by default.

+

The separator to use for joining the branch prefix and the branch name, or / if not supplied.

-

<--from [start_point]>

+

<-r|--remote [remote_name]>

-

Setup a start point when the branch created. If --from is not supplied, use the current branch by default.

+

Setup a remote tracking branch using remote_name. If remote_name is not supplied, use origin by default.

-

<finish>

+

<--from [start_point]>

-

Merge and delete the feature branch.

+

Setup a start point when the branch created. If --from is not supplied, use the current branch by default.

-

<--squash>

+

<finish>

-

Run a squash merge.

+

Merge and delete the feature branch.

-

<name>

+

<--squash>

-

The name of the feature branch.

+

Run a squash merge.

+ +

<name>

+ +

The name of the feature branch.

+ +

GIT CONFIG

+ +

You can configure the default branch prefix and separator via git config options.

+ +

$ git config --global add git-extras.feature.prefix "branch_prefix"

+ +

The default branch_prefix is feature.

+ +

$ git config --global add git-extras.feature.separator "-"

+ +

The default branch_separator is /.

EXAMPLES

@@ -135,14 +154,34 @@ $ git features dependencies
$ (features/dependencies) ...
$ (features/dependencies) git checkout master
$ git features finish dependencies

+
Use custom branch separator:

+ +

$ git feature -s - dependencies
+$ (feature-dependencies) ...
+$ (feature-dependencies) git checkout master
+$ git feature -s - finish dependencies

+
Use custom branch prefix and separator from git config with multiple words:

+ +

$ git config --global --add git-extras.feature.prefix "features"
+$ git config --global --add git-extras.feature.separator "."
+$ git feature dependency tracking
+$ (features.dependency-tracking) ...
+$ (features.dependency-tracking) git checkout master
+$ git feature finish dependency tracking

+
Use a git-feature option flag as part of a branch name:

+ +

$ git feature -- --remote
+...
+$ (feature/--remote) git commit -m "Some changes"

AUTHOR

-

Written by Jesús Espino <jespinog@gmail.com>
-Modified by Mark Pitman <mark.pitman@gmail.com>
-Modified by Carlos Prado <carlos.prado@cpradog.com>

+

Written by Jesús Espino <jespinog@gmail.com>
+Modified by Mark Pitman <mark.pitman@gmail.com>
+Modified by Carlos Prado <carlos.prado@cpradog.com>
+Modified by Austin Ziegler <halostatue@gmail.com>

REPORTING BUGS

@@ -155,7 +194,7 @@ Modified by Carlos Prado <> Modified by Mark Pitman <> -Modified by Carlos Prado <> +Modified by Carlos Prado <> +Modified by Austin Ziegler <> ## REPORTING BUGS @@ -83,4 +123,4 @@ Modified by Carlos Prado <> ## SEE ALSO -<> +<>, git-create-branch(1), git-delete-branch(1)