From: Nicola Paolucci <npaolucci@atlassian.com>
To: git@vger.kernel.org
Cc: Dave <davidw@realtimegenomics.com>,
"David A . Greene" <greened@obbligato.org>,
Mathias Nyman <mathias.nyman@iki.fi>,
Nicola Paolucci <npaolucci@atlassian.com>
Subject: [PATCH v3 1/3] contrib/subtree: 'add' stores 'git-subtree-repo'
Date: Thu, 10 Mar 2016 10:44:10 +0100 [thread overview]
Message-ID: <1457603052-53963-2-git-send-email-npaolucci@atlassian.com> (raw)
In-Reply-To: <1457603052-53963-1-git-send-email-npaolucci@atlassian.com>
Git-subtree operations 'add' and 'pull', when called with the <repository>
parameter will add this to the commit message:
git-subtree-repo: <repo_url>
Other operations that don't have the <repository> information, like
'merge' or 'add' without <repository> are unchanged. Users with such a
workflow will be on their own with the --message parameter, if they'd
like to record where the subtree came from.
For example:
$ git subtree add --prefix .vim/bundle/fireplace \
https://repo/user/vim-fireplace.git master --squash
Will result in a commit like:
commit ce87dab198fecdff6043d88a26c55d7cd95e8bf9
Author: Bob Marley <bob@mahrley.com>
Date: Tue May 12 13:37:03 2015 +0200
Squashed '.vim/bundle/fireplace/' content from commit b999b09
git-subtree-dir: .vim/bundle/fireplace
git-subtree-split: b999b09cd9d69f359fa5668e81b09dcfde455cca
git-subtree-repo: https://repo/user/vim-fireplace.git
This allows new ways to interact with injected trees, for example
a new command 'git subtree list' becomes possible:
$ git subtree list
.vim/bundle/fireplace https://repo/user/vim-fireplace.git b999b0
Signed-off-by: Mathias Nyman <mathias.nyman@iki.fi>
Signed-off-by: Nicola Paolucci <npaolucci@atlassian.com>
Thanks-to: Aleksi Aalto <aga@iki.fi>
---
contrib/subtree/git-subtree.sh | 73 +++++++++++++++++++++++++-------------
contrib/subtree/t/t7900-subtree.sh | 19 ++++++++++
2 files changed, 68 insertions(+), 24 deletions(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 7a39b30..278699b 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -335,18 +335,21 @@ add_msg()
dir="$1"
latest_old="$2"
latest_new="$3"
+ repo="$4" # optional
if [ -n "$message" ]; then
commit_message="$message"
else
commit_message="Add '$dir/' from commit '$latest_new'"
fi
- cat <<-EOF
- $commit_message
-
- git-subtree-dir: $dir
- git-subtree-mainline: $latest_old
- git-subtree-split: $latest_new
- EOF
+ echo $commit_message
+ echo
+ echo git-subtree-dir: $dir
+ echo git-subtree-mainline: $latest_old
+ echo git-subtree-split: $latest_new
+ if [ -n "$repo" ]; then
+ repo_url=$(get_repository_url "$repo")
+ echo "git-subtree-repo: $repo_url"
+ fi
}
add_squashed_msg()
@@ -382,8 +385,9 @@ squash_msg()
dir="$1"
oldsub="$2"
newsub="$3"
+ repo="$4" # optional
newsub_short=$(git rev-parse --short "$newsub")
-
+
if [ -n "$oldsub" ]; then
oldsub_short=$(git rev-parse --short "$oldsub")
echo "Squashed '$dir/' changes from $oldsub_short..$newsub_short"
@@ -397,6 +401,10 @@ squash_msg()
echo
echo "git-subtree-dir: $dir"
echo "git-subtree-split: $newsub"
+ if [ -n "$repo" ]; then
+ repo_url=$(get_repository_url "$repo")
+ echo "git-subtree-repo: $repo_url"
+ fi
}
toptree_for_commit()
@@ -440,12 +448,13 @@ new_squash_commit()
old="$1"
oldsub="$2"
newsub="$3"
+ repo="$4" # optional
tree=$(toptree_for_commit $newsub) || exit $?
if [ -n "$old" ]; then
- squash_msg "$dir" "$oldsub" "$newsub" |
+ squash_msg "$dir" "$oldsub" "$newsub" "$repo" |
git commit-tree "$tree" -p "$old" || exit $?
else
- squash_msg "$dir" "" "$newsub" |
+ squash_msg "$dir" "" "$newsub" "$repo" |
git commit-tree "$tree" || exit $?
fi
}
@@ -517,6 +526,16 @@ ensure_valid_ref_format()
die "'$1' does not look like a ref"
}
+get_repository_url()
+{
+ repo=$1
+ repo_url=$(git config --get remote.$repo.url)
+ if [ -z "$repo_url" ]; then
+ repo_url=$repo
+ fi
+ echo $repo_url
+}
+
cmd_add()
{
if [ -e "$dir" ]; then
@@ -548,19 +567,18 @@ cmd_add()
cmd_add_repository()
{
echo "git fetch" "$@"
- repository=$1
+ repo=$1
refspec=$2
git fetch "$@" || exit $?
revs=FETCH_HEAD
- set -- $revs
+ set -- $revs $repo
cmd_add_commit "$@"
}
cmd_add_commit()
{
- revs=$(git rev-parse $default --revs-only "$@") || exit $?
- set -- $revs
- rev="$1"
+ rev=$(git rev-parse $default --revs-only "$1") || exit $?
+ repo="${@:2}" # optional
debug "Adding $dir as '$rev'..."
git read-tree --prefix="$dir" $rev || exit $?
@@ -575,12 +593,12 @@ cmd_add_commit()
fi
if [ -n "$squash" ]; then
- rev=$(new_squash_commit "" "" "$rev") || exit $?
+ rev=$(new_squash_commit "" "" "$rev" "$repo") || exit $?
commit=$(add_squashed_msg "$rev" "$dir" |
git commit-tree $tree $headp -p "$rev") || exit $?
else
revp=$(peel_committish "$rev") &&
- commit=$(add_msg "$dir" "$headrev" "$rev" |
+ commit=$(add_msg "$dir" "$headrev" "$rev" "$repo" |
git commit-tree $tree $headp -p "$revp") || exit $?
fi
git reset "$commit" || exit $?
@@ -609,7 +627,8 @@ cmd_split()
else
unrevs="$(find_existing_splits "$dir" "$revs")"
fi
-
+
+ rev="$1"
# We can't restrict rev-list to only $dir here, because some of our
# parents have the $dir contents the root, and those won't match.
# (and rev-list --follow doesn't seem to solve this)
@@ -683,15 +702,20 @@ cmd_split()
cmd_merge()
{
- revs=$(git rev-parse $default --revs-only "$@") || exit $?
+ revs=$(git rev-parse $default --revs-only "$1") || exit $?
ensure_clean
-
set -- $revs
if [ $# -ne 1 ]; then
die "You must provide exactly one revision. Got: '$revs'"
fi
+ do_merge "$@"
+}
+
+do_merge()
+{
rev="$1"
-
+ repo="$2" # optional
+
if [ -n "$squash" ]; then
first_split="$(find_latest_squash "$dir")"
if [ -z "$first_split" ]; then
@@ -704,7 +728,7 @@ cmd_merge()
say "Subtree is already at commit $rev."
exit 0
fi
- new=$(new_squash_commit "$old" "$sub" "$rev") || exit $?
+ new=$(new_squash_commit "$old" "$sub" "$rev" "$repo") || exit $?
debug "New squash commit: $new"
rev="$new"
fi
@@ -730,12 +754,13 @@ cmd_pull()
if [ $# -ne 2 ]; then
die "You must provide <repository> <ref>"
fi
+ repo=$1
ensure_clean
ensure_valid_ref_format "$2"
git fetch "$@" || exit $?
revs=FETCH_HEAD
- set -- $revs
- cmd_merge "$@"
+ set -- $revs $repo
+ do_merge "$@"
}
cmd_push()
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 3bf96a9..ed40e73 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -86,6 +86,11 @@ last_commit_message()
git log --pretty=format:%s -1
}
+squashed_commit_body()
+{
+ git log --pretty=format:%b --numstat HEAD^2
+}
+
subtree_test_count=0
next_test() {
subtree_test_count=$(($subtree_test_count+1))
@@ -176,6 +181,20 @@ test_expect_success 'add subproj as subtree into sub dir/ with --squash and --pr
)
'
+next_test
+test_expect_success 'add --squash stores git-subtree-repo value' '
+ subtree_test_create_repo "$subtree_test_count" &&
+ subtree_test_create_repo "$subtree_test_count/sub proj" &&
+ test_create_commit "$subtree_test_count" main1 &&
+ test_create_commit "$subtree_test_count/sub proj" sub1 &&
+ (
+ cd "$subtree_test_count" &&
+ git fetch ./"sub proj" master &&
+ git subtree add --prefix="sub dir" "./sub proj" HEAD --squash &&
+ check_equal "$(squashed_commit_body | grep git-subtree-repo)" "git-subtree-repo: ./sub proj"
+ )
+'
+
#
# Tests for 'git subtree merge'
#
--
2.7.1
next prev parent reply other threads:[~2016-03-10 9:45 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-10 9:44 [PATCH 0/3] subtree: add 'git-subtree-repo' and list command Nicola Paolucci
2016-03-10 9:44 ` Nicola Paolucci [this message]
2016-03-10 9:44 ` [PATCH 2/3] contrib/subtree: new list command to list subtrees Nicola Paolucci
2016-03-10 9:44 ` [PATCH 3/3] contrib/subtree: list --resolve gets symbolic refs Nicola Paolucci
2016-05-21 22:59 ` [PATCH 0/3] subtree: add 'git-subtree-repo' and list command David A. Greene
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1457603052-53963-2-git-send-email-npaolucci@atlassian.com \
--to=npaolucci@atlassian.com \
--cc=davidw@realtimegenomics.com \
--cc=git@vger.kernel.org \
--cc=greened@obbligato.org \
--cc=mathias.nyman@iki.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).