diff --git a/bin/git-feature b/bin/git-feature index 7b1e726a1..207f25f03 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 3e477b188..c448ec5c4 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 -. -.SH "OPTIONS" -<\-a|\-\-alias branch_prefix> +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 -use \fBbranch_prefix\fR instead of \fBfeature\fR +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 -<\-r|\-\-remote [remote_name]> +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\. . -.P +.SH "OPTIONS" +. +.TP +\fB\-a\fR \fIPREFIX\fR, \fB\-\-alias\fR \fIPREFIX\fR: +. +.IP +The branch prefix to use, or \fBfeature\fR if not supplied\. +. +.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 36f405205..16a201b34 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 @@

NAME

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>

+ +

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

+ +

<-s|--separator branch_separator>

+ +

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

+ +

<-r|--remote [remote_name]>

-

use branch_prefix instead of feature

+

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

-

<-r|--remote [remote_name]>

+

<--from [start_point]>

-

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

+

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

-

<--from [start_point]>

+

<finish>

-

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

+

Merge and delete the feature branch.

-

<finish>

+

<--squash>

-

Merge and delete the feature branch.

+

Run a squash merge.

-

<--squash>

+

<name>

-

Run a squash merge.

+

The name of the feature branch.

-

<name>

+

GIT CONFIG

-

The name of the feature branch.

+

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 @@

EXAMPLES

$ (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 @@

SEE ALSO

  1. -
  2. November 2020
  3. +
  4. September 2023
  5. git-feature(1)
diff --git a/man/git-feature.md b/man/git-feature.md index 8a0137836..ca7372299 100644 --- a/man/git-feature.md +++ b/man/git-feature.md @@ -1,81 +1,121 @@ -git-feature(1) -- Create/Merge feature branch -======================================= +# git-feature(1) -- Create/Merge feature branch ## 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 ] [-s|--separator ] [-r|--remote [REMOTE_NAME]] [--from START_POINT] ... + +`git-feature` [-a|--alias ] [-s|--separator ] finish [--squash] ... ## DESCRIPTION - Create/Merge the given feature branch +Create or merge the given feature branch. The feature branch name is made from the , the , and the joined together. + +The default is `feature` and is `/`, which can be changed (see OPTIONS and GIT CONFIG for details). + +The branch may be specified as multiple words which will be joined with `-`. If the branch name contains the word `finish` or is another OPTION, `--` should be passed to stop OPTION parsing. See the EXAMPLES for details. ## OPTIONS - <-a|--alias branch_prefix> +- `-a` , `--alias` : + + The branch prefix to use, or `feature` if not supplied. + +- `-s` , `--separator` : - use `branch_prefix` instead of `feature` + The separator to use for joining the branch prefix and the branch name, or `/` if not supplied. - <-r|--remote [remote_name]> +- `-r` [REMOTE_NAME], `--remote` [REMOTE_NAME]: Setup a remote tracking branch using `remote_name`. If `remote_name` is not supplied, use `origin` by default. - <--from [start_point]> +- `--from` START_POINT: - Setup a start point when the branch created. If `--from` is not supplied, use the current branch by default. + Setup a start point when the branch created. If `--from` is not supplied, use the current branch by default. This option will be ignored when `finish`ing a branch. - <finish> +- `finish`: Merge and delete the feature branch. - <--squash> +- `--squash`: - Run a squash merge. + Run a squash merge when `finish`ing the feature branch. - <name> +- : The name of the feature branch. +## GIT CONFIG + +You can configure the default branch prefix and separator via git config options. + +- `git-extras.feature.prefix`: + + $ git config --global add git-extras.feature.prefix "prefix" + +- `git-extras.feature.separator`: + + $ git config --global add git-extras.feature.separator "-" + ## EXAMPLES - * Start a new feature: +- Start a new feature: + + $ git feature dependencies + ... + $ (feature/dependencies) git commit -m "Some changes" + +- Finish a feature with --no-ff merge: + + $ (feature/dependencies) git checkout master + $ git feature finish dependencies + +- Finish a feature with --squash merge: + + $ (feature/dependencies) git checkout master + $ git feature finish --squash dependencies + +- Publish a feature upstream: - - $ git feature dependencies - ... - $ (feature/dependencies) git commit -m "Some changes" + $ git feature dependencies -r upstream - * Finish a feature with --no-ff merge: +- Use custom branch prefix: - - $ (feature/dependencies) git checkout master - $ git feature finish dependencies + $ git alias features "feature -a features" + $ git features dependencies + $ (features/dependencies) ... + $ (features/dependencies) git checkout master + $ git features finish dependencies - * Finish a feature with --squash merge: +- Use custom branch separator: - - $ (feature/dependencies) git checkout master - $ git feature finish --squash dependencies + $ git feature -s - dependencies + $ (feature-dependencies) ... + $ (feature-dependencies) git checkout master + $ git feature -s - finish dependencies - * Publish a feature upstream: +- Use custom branch prefix and separator from git config with multiple words: - - $ git feature dependencies -r upstream + $ 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 custom branch prefix: +- Use a `git-feature` option or the `finish` command as part of a branch name: - - $ git alias features "feature -a features" - $ git features dependencies - $ (features/dependencies) ... - $ (features/dependencies) git checkout master - $ git features finish dependencies + $ git feature -- finish remote + ... + $ (feature/finish-remote) git commit -m "Some changes" + $ (feature/finish-remote) git checkout main + $ git feature finish -- finish remote ## AUTHOR Written by Jesús Espino <> 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)