usage() {
  echo "usage: git now rebase [<base-branch>]"
  echo "       git now rebase --push|-p [--remote|-r <remote>] [<base-branch>]"
}


cmd_default() {
  parse_args "$@"

  WORKING_BRANCH=$(git_current_branch)
  INITIAL_COMMIT=$(git_now_initial_commit)

  if [ -n "$BASE_BRANCH" ]; then
    COMMON_ANCESTOR_COMMIT=`git merge-base ${BASE_BRANCH} ${WORKING_BRANCH}`
    FIRST_NOW_COMMIT=$(git_now_first_commit $COMMON_ANCESTOR_COMMIT)

    if [ "$FIRST_NOW_COMMIT" != "$INITIAL_COMMIT" ]; then
      git rebase -i ${FIRST_NOW_COMMIT}^
    else
      git checkout ${FIRST_NOW_COMMIT}
      git commit --amend
      git rebase --onto HEAD ${FIRST_NOW_COMMIT} ${WORKING_BRANCH}
    fi
  else
    FIRST_NOW_COMMIT=$(git_now_first_commit)

    if [ "$FIRST_NOW_COMMIT" != "$INITIAL_COMMIT" ]; then
      git rebase -i ${FIRST_NOW_COMMIT}^
    else
      git checkout ${FIRST_NOW_COMMIT}
      git commit --amend
      git rebase --onto HEAD ${FIRST_NOW_COMMIT} ${WORKING_BRANCH}
    fi
  fi

  if flag push; then
    _cmd_push $WORKING_BRANCH $REMOTE
  fi
}

cmd_help() {
  usage
  exit 0
}

parse_args() {
  # parse options
  DEFINE_boolean 'push' false 'push to remote repository finally' 'p'
  DEFINE_string 'remote' '' 'remote branch name to --set-upstream' 'r'
  FLAGS "$@" || exit $?
  eval set -- "${FLAGS_ARGV}"

  # read arguments into global variables
  BASE_BRANCH=$1
  REMOTE=$FLAGS_remote
}

_cmd_push() {
  local branch=$1
  local remote=$2
  if [ -n "$remote" ]; then
    git push --set-upstream ${remote} ${branch}
  else
    git push
  fi
}

