From: Herman van Rink <rink@xxxxxxxxxxx> Signed-off-by: Paul Campbell <pcampbell@xxxxxxxxxxx> Conflicts: contrib/subtree/.gitignore contrib/subtree/git-subtree.sh contrib/subtree/test.sh --- It's a nasty formatting only patch and I won't be surprised or too dissappiointed if this doesn't make it. Or are the rules for this more lax for contrib? How else can contrib be brought in-line with coding standards? contrib/subtree/git-subtree.sh | 213 +++++++++++++++++++++-------------------- 1 file changed, 109 insertions(+), 104 deletions(-) diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index 3582a55..263ea9f 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -92,7 +92,7 @@ while [ $# -gt 0 ]; do -b) branch="$1"; shift ;; -P) prefix="$1"; shift ;; -m) message="$1"; shift ;; - -f|--force) force=1 ;; + -f|--force) force=1 ;; --no-prefix) prefix= ;; --onto) onto="$1"; shift ;; --no-onto) onto= ;; @@ -123,8 +123,10 @@ if [ -z "$prefix" -a "$command" != "pull-all" -a "$command" != "push-all" -a "$c fi case "$command" in - pull-all);; - push-all);; + pull-all);; + push-all);; + list);; + prune);; add) [ -e "$prefix" ] && die "prefix '$prefix' already exists." ;; *) [ -e "$prefix" ] || @@ -541,14 +543,14 @@ cmd_add_repository() revs=FETCH_HEAD set -- $revs cmd_add_commit "$@" - - # now add it to our list of repos - git config -f .gittrees --unset subtree.$dir.url - git config -f .gittrees --add subtree.$dir.url $repository - git config -f .gittrees --unset subtree.$dir.path - git config -f .gittrees --add subtree.$dir.path $dir - git config -f .gittrees --unset subtree.$dir.branch - git config -f .gittrees --add subtree.$dir.branch $refspec + + # now add it to our list of repos + git config -f .gittrees --unset subtree.$dir.url + git config -f .gittrees --add subtree.$dir.url $repository + git config -f .gittrees --unset subtree.$dir.path + git config -f .gittrees --add subtree.$dir.path $dir + git config -f .gittrees --unset subtree.$dir.branch + git config -f .gittrees --add subtree.$dir.branch $refspec } cmd_add_commit() @@ -721,89 +723,91 @@ cmd_merge() cmd_pull() { - if [ $# -gt 2 ]; then - die "You should provide either <refspec> or <repository> <refspec>" + if [ $# -gt 2 ]; then + die "You should provide either <refspec> or <repository> <refspec>" fi if [ -e "$dir" ]; then - ensure_clean - if [ $# -eq 1 ]; then - repository=$(git config -f .gittrees subtree.$prefix.url) - refspec=$1 - elif [ $# -eq 2 ]; then - repository=$1 - refspec=$2 - else - repository=$(git config -f .gittrees subtree.$prefix.url) - refspec=$(git config -f .gittrees subtree.$prefix.branch) - fi - git fetch $repository $refspec || exit $? - echo "git fetch using: " $repository $refspec - revs=FETCH_HEAD - set -- $revs - cmd_merge "$@" + ensure_clean + if [ $# -eq 1 ]; then + repository=$(git config -f .gittrees subtree.$prefix.url) + refspec=$1 + elif [ $# -eq 2 ]; then + repository=$1 + refspec=$2 + else + repository=$(git config -f .gittrees subtree.$prefix.url) + refspec=$(git config -f .gittrees subtree.$prefix.branch) + fi + git fetch $repository $refspec || exit $? + echo "git fetch using: " $repository $refspec + revs=FETCH_HEAD + set -- $revs + cmd_merge "$@" else - die "'$dir' must already exist. Try 'git subtree add'." + die "'$dir' must already exist. Try 'git subtree add'." fi } -cmd_diff() -{ - if [ -e "$dir" ]; then - if [ $# -eq 1 ]; then - repository=$(git config -f .gittrees subtree.$prefix.url) - refspec=$1 - elif [ $# -eq 2 ]; then - repository=$1 - refspec=$2 - else - repository=$(git config -f .gittrees subtree.$prefix.url) - refspec=$(git config -f .gittrees subtree.$prefix.branch) - fi - # this is ugly, but I don't know of a better way to do it. My git-fu is weak. - # git diff-tree expects a treeish, but I have only a repository and branch name. - # I don't know how to turn that into a treeish without creating a remote. - # Please change this if you know a better way! - tmp_remote=__diff-tmp - git remote rm $tmp_remote > /dev/null 2>&1 - git remote add -t $refspec $tmp_remote $repository > /dev/null - # we fetch as a separate step so we can pass -q (quiet), which isn't an option for "git remote" - # could this instead be "git fetch -q $repository $refspec" and leave aside creating the remote? - # Still need a treeish for the diff-tree command... - git fetch -q $tmp_remote - git diff-tree -p refs/remotes/$tmp_remote/$refspec - git remote rm $tmp_remote > /dev/null 2>&1 - else - die "Cannot resolve directory '$dir'. Please point to an existing subtree directory to diff. Try 'git subtree add' to add a subtree." - fi +cmd_diff() +{ + if [ -e "$dir" ]; then + if [ $# -eq 1 ]; then + repository=$(git config -f .gittrees subtree.$prefix.url) + refspec=$1 + elif [ $# -eq 2 ]; then + repository=$1 + refspec=$2 + else + repository=$(git config -f .gittrees subtree.$prefix.url) + refspec=$(git config -f .gittrees subtree.$prefix.branch) + fi + # this is ugly, but I don't know of a better way to do it. My git-fu is weak. + # git diff-tree expects a treeish, but I have only a repository and branch name. + # I don't know how to turn that into a treeish without creating a remote. + # Please change this if you know a better way! + tmp_remote=__diff-tmp + git remote rm $tmp_remote > /dev/null 2>&1 + git remote add -t $refspec $tmp_remote $repository > /dev/null + # we fetch as a separate step so we can pass -q (quiet), which isn't an option for "git remote" + # could this instead be "git fetch -q $repository $refspec" and leave aside creating the remote? + # Still need a treeish for the diff-tree command... + git fetch -q $tmp_remote + git diff-tree -p refs/remotes/$tmp_remote/$refspec + git remote rm $tmp_remote > /dev/null 2>&1 + else + die "Cannot resolve directory '$dir'. Please point to an existing subtree directory to diff. Try 'git subtree add' to add a subtree." + fi } cmd_push() { if [ $# -gt 2 ]; then - die "You shold provide either <refspec> or <repository> <refspec>" + die "You shold provide either <refspec> or <repository> <refspec>" fi if [ -e "$dir" ]; then - if [ $# -eq 1 ]; then - repository=$(git config -f .gittrees subtree.$prefix.url) - refspec=$1 - elif [ $# -eq 2 ]; then - repository=$1 - refspec=$2 - else - repository=$(git config -f .gittrees subtree.$prefix.url) - refspec=$(git config -f .gittrees subtree.$prefix.branch) - fi - push_opts= - if [ "$force" == "1" ]; then - push_opts="$push_opts --force" - fi - echo "git push using: " $repository $refspec - rev=$(git subtree split --prefix=$prefix) - if [ -n "$rev" ]; then - git push $push_opts $repository $rev:refs/heads/$refspec - else - die "Couldn't push, 'git subtree split' failed." - fi + if [ $# -eq 1 ]; then + repository=$(git config -f .gittrees subtree.$prefix.url) + refspec=$1 + elif [ $# -eq 2 ]; then + repository=$1 + refspec=$2 + else + repository=$(git config -f .gittrees subtree.$prefix.url) + refspec=$(git config -f .gittrees subtree.$prefix.branch) + fi + + push_opts= + if [ "$force" == "1" ]; then + push_opts="$push_opts --force" + fi + + echo "git push using: " $repository $refspec + rev=$(git subtree split --prefix=$prefix) + if [ -n "$rev" ]; then + git push $push_opts $repository $rev:refs/heads/$refspec + else + die "Couldn't push, 'git subtree split' failed." + fi else die "'$dir' must already exist. Try 'git subtree add'." fi @@ -831,6 +835,7 @@ cmd_from-submodule() git commit -m "Remove '$prefix/' submodule" # subtree add from submodule repo. + # TODO: Could be determin HEAD to be a specific branch cmd_add_repository $tmp_repo HEAD # Update .gittrees with the original repo url @@ -841,46 +846,46 @@ cmd_from-submodule() rm -rf $tmp_repo } -subtree_list() +subtree_list() { - git config -f .gittrees -l | grep subtree | grep path | grep -o '=.*' | grep -o '[^=].*' | - while read path; do - repository=$(git config -f .gittrees subtree.$path.url) - refspec=$(git config -f .gittrees subtree.$path.branch) - echo " $path (merged from $repository branch $refspec) " - done + git config -f .gittrees -l | grep subtree | grep path | grep -o '=.*' | grep -o '[^=].*' | + while read path; do + repository=$(git config -f .gittrees subtree.$path.url) + refspec=$(git config -f .gittrees subtree.$path.branch) + echo " $path (merged from $repository branch $refspec) " + done } cmd_list() { - subtree_list + subtree_list } cmd_prune() { - git config -f .gittrees -l | grep subtree | grep path | grep -o '=.*' | grep -o '[^=].*' | - while read path; do - if [ ! -e "$path" ]; then - echo "pruning $path" - git config -f .gittrees --remove-section subtree.$path - fi - done + git config -f .gittrees -l | grep subtree | grep path | grep -o '=.*' | grep -o '[^=].*' | + while read path; do + if [ ! -e "$path" ]; then + echo "pruning $path" + git config -f .gittrees --remove-section subtree.$path + fi + done } cmd_pull-all() { - git config -f .gittrees -l | grep subtree | grep path | grep -o '=.*' | grep -o '[^=].*' | - while read path; do - git subtree pull -P $path master || exit $? - done + git config -f .gittrees -l | grep subtree | grep path | grep -o '=.*' | grep -o '[^=].*' | + while read path; do + git subtree pull -P $path $(git config -f .gittrees subtree.$path.url) $(git config -f .gittrees subtree.$path.branch) || exit $? + done } cmd_push-all() { - git config -f .gittrees -l | grep subtree | grep path | grep -o '=.*' | grep -o '[^=].*' | - while read path; do - git subtree push -P $path master || exit $? - done + git config -f .gittrees -l | grep subtree | grep path | grep -o '=.*' | grep -o '[^=].*' | + while read path; do + git subtree push -P $path $(git config -f .gittrees subtree.$path.url) $(git config -f .gittrees subtree.$path.branch) || exit $? + done } "cmd_$command" "$@" -- 1.8.2.rc1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html