Provided a better way of checking whether master/develop branches need
initialization and a more user-friendly (and more comprehensable) way of
asking the user which branches are the master/develop branch.
diff --git a/git-flow-init b/git-flow-init
index 31be29f..20f41fa 100644
--- a/git-flow-init
+++ b/git-flow-init
@@ -16,36 +16,79 @@
echo "usage: git flow init"
}
+parse_args() {
+ # parse options
+ FLAGS "$@" || exit $?
+ eval set -- "${FLAGS_ARGV}"
+}
+
# Default entry when no SUBACTION is given
cmd_default() {
+ DEFINE_boolean force false 'force setting of gitflow branches, even if already configured' f
+ parse_args "$@"
+
if ! git rev-parse --git-dir >/dev/null 2>&1; then
git init
else
- echo "Will try to incorporate git-flow into your current repo."
+ # TODO: This still fails when running:
+ # git init
+ # git flow init
+
+ # assure that we are not working in a repo with local changes
+ gitflow_require_clean_working_tree
+ fi
+
+ # running git flow init on an already initialized repo is fine
+ if gitflow_is_initialized && ! flag force; then
+ warn "Already initialized for gitflow."
+ warn "To force reinitialization, use: git flow init -f"
+ exit 0
fi
local branch_count
# add a master branch if no such branch exists yet
- # TODO: Distinguish two cases:
- # 1. NO BRANCHES EXIST AT ALL! (fresh repo):
- # allow a name for the branch-to-be-created
- # 2. THERE EXIST SOME BRANCHES
- # master must be based on (or *be*) one of those!
local master_branch
- master_branch=$(git config --get gitflow.branch.master)
- if [ "$master_branch" = "" ]; then
- # first, ask how to create the master branch
- echo
- echo "Which branch should be used for bringing forth production releases?"
- branch_count=$(gitflow_all_branches | wc -l)
- if [ "$branch_count" -gt 0 ]; then
- gitflow_all_branches | sed 's/^.*$/ - &/g'
- echo "You may use an existing branch name, or specify a new one."
+ if gitflow_has_master_configured && ! flag force; then
+ master_branch=$(git config --get gitflow.branch.master)
+ else
+ # Two cases are distinguished:
+ # 1. A fresh git repo (without any branches)
+ # We will create a new master/develop branch for the user
+ # 2. Some branches do already exist
+ # We will disallow creation of new master/develop branches and
+ # rather allow to use existing branches for git-flow.
+ local default_suggestion
+ local should_check_existence
+ branch_count=$(gitflow_local_branches | wc -l)
+ if [ "$branch_count" -eq 0 ]; then
+ echo "No branches exist yet. Base branches must be created now."
+ should_check_existence=NO
+ default_suggestion=master
+ else
+ echo
+ echo "Which branch should be used for bringing forth production releases?"
+ gitflow_local_branches | sed 's/^.*$/ - &/g'
+
+ should_check_existence=YES
+ default_suggestion=
+ for guess in 'production' 'main' 'master'; do
+ if gitflow_local_branch_exists "$guess"; then
+ default_suggestion="$guess"
+ break
+ fi
+ done
fi
- echo "Branch name for production releases: [master] \c"
- read master_branch
- master_branch=${master_branch:-master}
+
+ echo "Branch name for production releases: [$default_suggestion] \c"
+ read answer
+ master_branch=${answer:-$default_suggestion}
+
+ # check existence in case of an already existing repo
+ if [ "$should_check_existence" = "YES" ]; then
+ gitflow_local_branch_exists "$master_branch" || \
+ die "Local branch '$master_branch' does not exist."
+ fi
# store the name of the master branch
git config gitflow.branch.master "$master_branch"
@@ -53,50 +96,77 @@
# add a develop branch if no such branch exists yet
local develop_branch
- develop_branch=$(git config --get gitflow.branch.develop)
- if [ "$develop_branch" = "" ]; then
- # next, ask how to create the develop branch
- echo
- echo "Which branch should be used for developing the \"next release\"?"
- branch_count=$(gitflow_all_branches | grep -v "^${master_branch}\$" | wc -l)
- if [ "$branch_count" -gt 0 ]; then
- gitflow_all_branches | grep -v "^${master_branch}\$" | sed 's/^.*$/ - &/g'
- echo "You may use an existing branch name, or specify a new one."
+ if gitflow_has_develop_configured && ! flag force; then
+ develop_branch=$(git config --get gitflow.branch.develop)
+ else
+ # Again, the same two cases as with the master selection are
+ # considered (fresh repo or repo that contains branches)
+ local default_suggestion
+ local should_check_existence
+ branch_count=$(gitflow_local_branches | grep -v "^${master_branch}\$" | wc -l)
+ if [ "$branch_count" -eq 0 ]; then
+ should_check_existence=NO
+ default_suggestion=develop
+ else
+ echo
+ echo "Which branch should be used for integration of the \"next release\"?"
+ gitflow_local_branches | grep -v "^${master_branch}\$" | sed 's/^.*$/ - &/g'
+
+ should_check_existence=YES
+ default_suggestion=
+ for guess in 'develop' 'int' 'integration' 'master'; do
+ if gitflow_local_branch_exists "$guess"; then
+ default_suggestion="$guess"
+ break
+ fi
+ done
fi
- echo "Branch name for \"next release\" development: [develop] \c"
- read develop_branch
- develop_branch=${develop_branch:-develop}
+
+ echo "Branch name for \"next release\" development: [$default_suggestion] \c"
+ read answer
+ develop_branch=${answer:-$default_suggestion}
+
+ if [ "$master_branch" = "$develop_branch" ]; then
+ die "Production and integration branches should differ."
+ fi
+
+ # check existence in case of an already existing repo
+ if [ "$should_check_existence" = "YES" ]; then
+ gitflow_local_branch_exists "$develop_branch" || \
+ die "Local branch '$develop_branch' does not exist."
+ fi
# store the name of the develop branch
git config gitflow.branch.develop "$develop_branch"
fi
- # create a HEAD now, if it does not exist yet (in a just init'ed repo)
+ # Creation of HEAD
+ # ----------------
+ # We create a HEAD now, if it does not exist yet (in a fresh repo). We need
+ # it to be able to create new branches.
if ! git rev-parse --quiet --verify HEAD >/dev/null 2>&1; then
git symbolic-ref HEAD "refs/heads/$master_branch"
git commit --allow-empty --quiet -m "Initial commit"
fi
- # if the selected master branch exists, it's okay, else create it (base on
- # the currently checked out branch)
- if ! gitflow_branch_exists "$master_branch"; then
- git branch "$master_branch"
+ # Creation of master
+ # ------------------
+ # At this point, there always is a master branch: either it existed already
+ # (and was picked interactively as the production branch) or it has just
+ # been created in a fresh repo
+
+ # Creation of develop
+ # -------------------
+ # The develop branch possibly does not exist yet. This is the case when,
+ # in a git init'ed repo with one or more commits, master was picked as the
+ # default production branch and develop was "created". We should create
+ # the develop branch now in that case (we base it on master, of course)
+ if ! gitflow_local_branch_exists "$develop_branch"; then
+ git branch "$develop_branch" "$master_branch"
fi
- if ! gitflow_branch_exists "$develop_branch"; then
- git branch "$develop_branch" "$master_branch" # base it on the master branch!
- else
- # TODO: this test should be moved up, in the selection of the develop
- # branch! Branches that do not have a merge base with master shouldn't
- # be allowed to pick in the first place!
- gitflow_test_branches_equal "$develop_branch" "$master_branch"
- if [ $? -eq 4 ]; then
- warn "fatal: $develop_branch and $master_branch have no common ancestors."
- die "fatal: $develop_branch cannot be used for development."
- fi
- fi
-
- gitflow_require_clean_working_tree
+ # assert the gitflow repo has been correctly initialized
+ gitflow_is_initialized
# checkout the develop branch to start working
git checkout -q "$develop_branch"