RED=$BAD
YELLOW=$WARN
-commit_category="$(pwd | awk -F/ '{ print $(NF-1) }')"
-commit_package="$(pwd | awk -F/ '{ print $NF }')"
-current_svn_status=( )
+commit_path=
+
+current_git_status=( )
cwd_is_ebuild_dir=0
items_added=( )
-items_conflicted=( )
items_deleted=( )
-items_ignored=( )
-items_missing=( )
items_modified=( )
-items_not_modified=( )
items_not_version_controlled=( )
-items_obstructed=( )
-items_replaced=( )
-items_used_by_externals=( )
-num_new_dirs=0
opt_changelog=0
opt_noformat=0
opt_norepoman=0
-opt_noupdate=0
+opt_local=0
opt_quiet=0
opt_verbose=0
changelog_append() {
if [[ $opt_changelog == 1 ]] ; then
- get_current_svn_status
- if [[ "${current_svn_status[*]}" =~ "ChangeLog" ]] ; then
+ get_current_git_status
+ if [[ "${current_git_status[*]}" =~ "ChangeLog" ]] ; then
echo "!!! Error: Only one ChangeLog entry should be made per commit, and you have"
echo "!!! already modified your ChangeLog locally since your last commit. To keep the"
echo "!!! pre-existing modifications please run sunrise-commit again without the -c"
echo "!!! option. To discard the pre-existing modifications run:"
- echo "!!! svn revert ChangeLog"
+ echo "!!! git reset HEAD ChangeLog ; git checkout ChangeLog"
echo "!!!"
echo -n "!!! "
echo -n "${BOLD}Are you SURE you want to append to ChangeLog?${NORMAL} [${GREEN}No${NORMAL}/${RED}Yes${NORMAL}] "
esac
fi
ebegin "Appending/creating ChangeLog"
-# [ -e $(dirname $0)/echangelog ] && ec="$(dirname $0)/echangelog" || ec="echangelog"
-# $ec "$*"
echangelog "$*"
eend $?
fi
if [[ $cwd_is_ebuild_dir == 1 ]] ; then
ebegin "Digesting ebuilds"
for i in *.ebuild ; do
- ebuild $i digest
+ ebuild "$i" manifest
+ break
done
eend $?
fi
}
-# Sort current changed items into arrays based on symbols in `svn status`
+# Sort current changed items into arrays based on symbols in `git status`
# output. For now we're only concerned with the symbols in the first column of
-# the output. See `svn help status` for symbol definitions.
+# the output. See `git help status` for symbol definitions.
#
# Returns with exit status 1 if the current dir isn't under version control.
-get_current_svn_status() {
+get_current_git_status() {
local IFS_SAVED="$IFS"
- local item column_1 #column_2 column_3 column_4 column_5 column_6
+ local item column_1 column_2
IFS=$'\n'
- current_svn_status=( )
+ current_git_status=( )
items_added=( )
- items_conflicted=( )
items_deleted=( )
- items_ignored=( )
- items_missing=( )
items_modified=( )
- items_not_modified=( )
items_not_version_controlled=( )
- items_obstructed=( )
- items_replaced=( )
- items_used_by_externals=( )
- for line in $(svn status 2>&1) ; do
- [[ "$line" =~ "is not a working copy" ]] && return 1
- current_svn_status[${#current_svn_status[*]}]=$line
+ items2_deleted=( )
+ items2_modified=( )
+ for line in $(git status --porcelain -uall 2>&1) ; do
+ [[ "$line" =~ "Not a git repository" ]] && return 1
+ current_git_status+=( "$line" )
column_1=${line:0:1}
- #column_2=${line:1:1}
- #column_3=${line:2:1}
- #column_4=${line:3:1}
- #column_5=${line:4:1}
- #column_6=${line:5:1}
- item=${line:7}
+ column_2=${line:1:1}
+ item=${line:3}
+
+ # Use the first item in the commit message
+ if [[ -z $commit_path ]]; then
+ case "$item" in
+ *-*/*/*)
+ commit_path=$(awk -F/ '{ print $1 "/" $2 }' <<<"$item") ;;
+ *)
+ # Not a package; use full path
+ commit_path=$item ;;
+ esac
+ fi
+
case $column_1 in
- ' ') items_not_modified[${#items_not_modified[*]}]=$item ;;
- A) items_added[${#items_added[*]}]=$item ;;
- C) items_conflicted[${#items_conflicted[*]}]=$item ;;
- D) items_deleted[${#items_deleted[*]}]=$item ;;
- I) items_ignored[${#items_ignored[*]}]=$item ;;
- M) items_modified[${#items_modified[*]}]=$item ;;
- R) items_replaced[${#items_replaced[*]}]=$item ;;
- X) items_used_by_externals[${#items_used_by_externals[*]}]=$item ;;
- !) items_missing[${#items_missing[*]}]=$item ;;
- ?) items_not_version_controlled[${#items_not_version_controlled[*]}]=$item ;;
- ~) items_obstructed[${#items_obstructed[*]}]=$item ;;
+ A) items_added+=( "$item" ) ;;
+ D) items_deleted+=( "$item" ) ;;
+ M) items_modified+=( "$item" ) ;;
+ R) case $column_2 in
+ D) items2_deleted+=( "$item" ) ;;
+ M) items2_modified+=( "$(echo "${item}" | cut -d ' ' -f3 )" ) ;;
+ esac ;;
+ "?") items_not_version_controlled+=( "$item" ) ;;
+ esac
+ case $column_1 in
+ ' '|A|D|M)
+ case $column_2 in
+ D) items2_deleted+=( "$item" ) ;;
+ M) items2_modified+=( "$item" ) ;;
+ esac ;;
esac
done
IFS="$IFS_SAVED"
if [[ $opt_norepoman == 0 ]] ; then
if [[ $cwd_is_ebuild_dir == 1 ]] ; then
ebegin "Running repoman"
- export PORTDIR_OVERLAY="$(dirname $(dirname $(pwd)))"
+ export PORTDIR_OVERLAY="$(dirname "$(dirname "$(pwd)")")"
repoman
eend $?
fi
fi
}
-svn_add() {
+git_add() {
local num_unversioned_dirs=0
- while ! get_current_svn_status ; do
+ while ! [[ -e .git ]] ; do
(( num_unversioned_dirs++ ))
- pushd .. >/dev/null
+ pushd .. >/dev/null 2>&1
+ if [[ $? == 1 ]] ; then
+ (( num_unversioned_dirs-- ))
+ cd .. 2>/dev/null
+ fi
done
+ get_current_git_status
+
ebegin "Adding local changes to working copy"
if [[ ${#items_not_version_controlled[*]} > 0 ]] ; then
if [[ $opt_verbose == 1 ]] ; then
- svn add ${items_not_version_controlled[@]} || set $?
+ git add -v -- "${items_not_version_controlled[@]}" || set $?
else
- svn add -q ${items_not_version_controlled[@]} || set $?
+ git add -- "${items_not_version_controlled[@]}" || set $?
fi
fi
- eend ${1:-0}
- num_new_dirs=$num_unversioned_dirs
+ if [[ ${#items2_modified[*]} > 0 ]] ; then
+ if [[ $opt_verbose == 1 ]] ; then
+ git add -v -- "${items2_modified[@]}" || set $?
+ else
+ git add -- "${items2_modified[@]}" || set $?
+ fi
+ fi
+
+ if [[ ${#items2_deleted[*]} > 0 ]] ; then
+ git rm -- "${items2_deleted[@]}" || set $?
+ fi
+ eend ${1:-0}
for (( i=num_unversioned_dirs ; i > 0 ; i-- )) ; do
popd >/dev/null
return ${1:-0}
}
-svn_commit() {
+git_commit() {
local commit_message="$*"
- get_current_svn_status
- if [[ ${#current_svn_status[*]} == 0 ]] ; then
+ get_current_git_status
+ if [[ ${#current_git_status[*]} == 0 ]] ; then
echo "!!! Error: No working copy changes found in current directory. Aborting commit."
exit 1
fi
if [[ $opt_noformat == 0 ]] ; then
- if [[ $cwd_is_ebuild_dir == 1 ]] ; then
- commit_message="${commit_category}/${commit_package}: ${commit_message}"
- else
- commit_message="${commit_package}/${current_svn_status[0]:7}: ${commit_message}"
- fi
+ commit_message="${commit_path}: ${commit_message}"
fi
- for (( i=num_new_dirs ; i > 0 ; i-- )) ; do
- cd ..
- done
-
echo
echo "${DARKGREEN}The following local changes will be committed to the repository:${NORMAL}"
echo
- get_current_svn_status
- for item in "${current_svn_status[@]}" ; do
+ get_current_git_status
+ for item in "${current_git_status[@]}" ; do
echo "$item"
done
fi
ebegin "Committing working copy to repository"
- svn commit -m "$commit_message"
+ git commit -m "$commit_message"
eend $?
}
-svn_up() {
- if [[ $opt_noupdate == 0 ]] ; then
- for (( i=num_new_dirs ; i > 0 ; i-- )) ; do
- pushd .. >/dev/null
- done
+git_up() {
+ if [[ $opt_local == 0 ]] ; then
ebegin "Updating working copy to latest version from repository"
if [[ $opt_verbose == 1 ]] ; then
- svn update || set $?
+ git pull --rebase -v origin master || set $?
else
- svn update -q || set $?
+ git pull --rebase origin master || set $?
fi
eend ${1:-0}
- for (( i=num_new_dirs ; i > 0 ; i-- )) ; do
- popd >/dev/null
- done
+ get_current_git_status
+ fi
+ return ${1:-0}
+}
- get_current_svn_status
- if [[ ${#items_conflicted[*]} > 0 ]] ; then
- echo "!!! Error: Some local items have changes that conflict with the repository."
- echo "!!! Please contact the most recent committer(s) of these items and resolve the"
- echo "!!! conflicts manually before running sunrise-commit again:"
- for item in "${items_conflicted[@]}" ; do
- echo "!!!"
- echo "!!! item: ${item}"
- echo "!!! committer: $(svn info ${item} | sed -rn 's/Last Changed Author\: (.*)$/\1/p')"
- done
- exit 1
+git_push() {
+ if [[ $opt_local == 0 ]] ; then
+ ebegin "Pushing commit"
+
+ if [[ $opt_verbose == 1 ]] ; then
+ git push -v || set $?
+ else
+ git push || set $?
fi
+ eend $?
fi
- return ${1:-0}
}
usage() {
${BOLD}--help, -h${NORMAL} Show help
${BOLD}--noformat, -m${NORMAL} Disable automatic formatting of ${BLUE}message${NORMAL}
${BOLD}--norepoman, -p${NORMAL} Skip repoman check
- ${BOLD}--noupdate, -d${NORMAL} Don't update from repository before committing
+ ${BOLD}--local, -l${NORMAL} Don't pull/push, keep commits local
${BOLD}--quiet, -q${NORMAL} Don't ask for confirmation
${BOLD}--verbose, -v${NORMAL} Show detailed information during commit
opt_norepoman=1
shift ;;
- --noupdate|-d)
- opt_noupdate=1
+ --local|-l)
+ opt_local=1
shift ;;
--quiet|-q)
exit 1
fi
-[[ "$(ls)" =~ \.ebuild ]] && cwd_is_ebuild_dir=1
-
-pushd . >/dev/null
-while [[ "$(echo `svn status 2>&1`)" =~ "A.+? \." ]] ; do
- (( num_new_dirs++ ))
- cd ..
-done
-popd >/dev/null
-
-svn_up || exit $?
+(shopt -s nullglob; f=(*.ebuild); [[ ${#f[*]} -ne 0 ]] ) && cwd_is_ebuild_dir=1
[[ $cwd_is_ebuild_dir == 1 && ! -e metadata.xml ]] && cp ../../skel.metadata.xml metadata.xml >/dev/null 2>&1
-svn_add || exit $?
+git_add || exit $?
changelog_append "$*" || exit $?
create_digests || exit $?
-svn_add || exit $?
+git_add || exit $?
repoman_check || exit $?
-svn_commit "$*" || exit $?
+git_commit "$*" || exit $?
+git_up || exit $?
+git_push || exit $?