* Re: [PATCH v3 0/8] Hiding refs
From: Jonathan Nieder @ 2013-02-05 8:33 UTC (permalink / raw)
To: Michael Haggerty; +Cc: Junio C Hamano, git, Jeff King, Shawn Pearce
In-Reply-To: <5110BD18.3080608@alum.mit.edu>
Hi Michael,
Michael Haggerty wrote:
> I would again like to express my discomfort about this feature, which is
> already listed as "will merge to next". Frankly, I have the feeling
> that this feature is being steamrolled in before a community consensus
> has been reached and indeed before many valid points raised by other
> members of the community have even been addressed. For example:
In $dayjob I work with Gerrit, so I think I can start to answer some
of these questions.
> * I didn't see a response to Peff's convincing arguments that this
> should be a client-side feature rather than a server-side feature [1].
The client can't control the size of the ref advertisement. That is
the main motivation if I understood correctly.
> * I didn't see an answer to Duy's question [2] about what is different
> between the proposed feature and gitnamespaces.
Namespaces are more complicated and don't sit well in existing setups
involving git repositories whose refs are not namespaced.
> * I didn't see a response to my worries that this feature could be
> abused [3].
Can you elaborate? Do you mean that through social engineering an
attacker would convince the server admin to store secrets using a
hidden ref and enable the upload-archive service?
That does sound like a reasonable concern. Perhaps the documentation
should be updated along these lines
transfer.hiderefs::
String(s) `upload-pack` and `receive-pack` use to decide
which refs to omit from their initial advertisement. Use
more than one transfer.hiderefs configuration variables to
specify multiple prefix strings. A ref that are under the
hierarchies listed on the value of this variable is excluded,
and is hidden from `git ls-remote`, `git fetch`, `git push :`,
etc. An attempt to update or delete a hidden ref by `git push`
is rejected, and an attempt to fetch a hidden ref by `git fetch`
will fail.
+
This setting does not currently affect the `upload-archive` service.
until someone interested implements the same for upload-archive.
> I also think that the feature is poorly designed. For example:
That's another reasonable concern. It's very hard to get a design
correct right away, which is presumably part of the motivation of
getting this into the hands of interested users who can give feedback
on it. What would potentially be worth blocking even that is concerns
about the wire protocol, since it is hard to take back mistakes there.
> * Why should a repository have exactly one setting for what refs should
> be hidden? Wouldn't it make more sense to allow multiple "views" to be
> defined?:
How do I request a different view of the repository at
/path/to/repo.git over the network? How can we make the common case
of only one view easy to achieve? Isn't the multiple-views case
exactly what gitnamespaces is for?
[...]
> * Is it enough to support only reference exclusion (as opposed to
> exclusion and inclusion rules)?
The motivating example is turning off advertisement of the
refs/changes hierarchy. If and when more complicated cases come up,
that would presumably be the time to support more complicated
configuration.
[...]
> * Why should this feature only be available remotely?
It is about transport. Ref namespaces have their own set of use cases
and are a distinct feature.
Hoping that clarifies,
Jonathan
^ permalink raw reply
* Re: [PATCH v3 0/8] Hiding refs
From: Michael Haggerty @ 2013-02-05 8:04 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Jeff King, Shawn Pearce
In-Reply-To: <1359571542-19852-1-git-send-email-gitster@pobox.com>
On 01/30/2013 07:45 PM, Junio C Hamano wrote:
> The third round.
>
> - Multi-valued variable transfer.hiderefs lists prefixes of ref
> hierarchies to be hidden from the requests coming over the
> network.
>
> - A configuration optionally allows uploadpack to accept fetch
> requests for an object at the tip of a hidden ref.
>
> Elsewhere, we discussed "delaying ref advertisement" (aka "expand
> refs"), but it is an orthogonal feature and this "hiding refs
> completely from advertisement" series does not attempt to address.
>
> Patch #2 (simplify request validation), #4 (clarify the codeflow),
> and #5 (use struct ref) are new. The are all long overdue clean-ups
> for these codepaths.
>
> The last patch is an illustration why it wouldn't make sense to
> optionally allow pushing into hidden refs, and not meant to be part
> of the series proper.
>
> For those who missed it, earlier rounds are at:
>
> http://thread.gmane.org/gmane.comp.version-control.git/213951
> http://thread.gmane.org/gmane.comp.version-control.git/214888
I would again like to express my discomfort about this feature, which is
already listed as "will merge to next". Frankly, I have the feeling
that this feature is being steamrolled in before a community consensus
has been reached and indeed before many valid points raised by other
members of the community have even been addressed. For example:
* I didn't see a response to Peff's convincing arguments that this
should be a client-side feature rather than a server-side feature [1].
* I didn't see an answer to Duy's question [2] about what is different
between the proposed feature and gitnamespaces.
* I didn't see a response to my worries that this feature could be
abused [3].
I also think that the feature is poorly designed. For example:
* Why should a repository have exactly one setting for what refs should
be hidden? Wouldn't it make more sense to allow multiple "views" to be
defined?:
[view "official"]
hiderefs = refs/pull
hiderefs = refs/heads/??/*
[view "pu"]
hiderefs = refs/pull
[view "current"]
hiderefs = refs/tags/releases
with the view perhaps selected via a server-side environment variable?
This would allow multiple views to be published via different URLs but
referring to the same git repository.
* Is it enough to support only reference exclusion (as opposed to
exclusion and inclusion rules)? Is it enough to support only reference
selection by hierarchy (for example, how would you hide contributed
branches from your repo)? Can your configuration scheme be expanded in
a backwards-compatible way if these or other extensions are added later?
* Why should this feature only be available remotely? It would be handy
to clone everything but usually only see some subset of references in my
daily work: "GIT_VIEW=official gitk --all &". Or to hide some remote
branches most of the time without having to remove them from my repo:
[view "brief"]
refs = refs
refs = !refs/remotes
refs = refs/remotes/origin
refs = refs/remotes/my-boss
I think there are still more questions than answers about this feature
and FWIW vote -1 on merging it to next at this time.
Michael
[1] http://article.gmane.org/gmane.comp.version-control.git/214168
[2] http://article.gmane.org/gmane.comp.version-control.git/214070
[3] http://article.gmane.org/gmane.comp.version-control.git/213957
--
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
^ permalink raw reply
* [PATCH] Get correct column with for options in command usage
From: Jiang Xin @ 2013-02-05 7:40 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git List, Jiang Xin
Command usage would not align well if command options are translated,
especially to CJK. Call utf8_strwidth in function usage_argh, so that
the caller will get correct column width.
Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
---
parse-options.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/parse-options.c b/parse-options.c
index 67e98..ca0e6 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -473,7 +473,7 @@ int parse_options(int argc, const char **argv, const char *prefix,
static int usage_argh(const struct option *opts, FILE *outfile)
{
- const char *s;
+ const char *s, *p;
int literal = (opts->flags & PARSE_OPT_LITERAL_ARGHELP) || !opts->argh;
if (opts->flags & PARSE_OPT_OPTARG)
if (opts->long_name)
@@ -482,7 +482,9 @@ static int usage_argh(const struct option *opts, FILE *outfile)
s = literal ? "[%s]" : "[<%s>]";
else
s = literal ? " %s" : " <%s>";
- return fprintf(outfile, s, opts->argh ? _(opts->argh) : _("..."));
+ p = opts->argh ? _(opts->argh) : _("...");
+ fprintf(outfile, s, p);
+ return utf8_strwidth(p) + strlen(s) - 2;
}
#define USAGE_OPTS_WIDTH 24
--
1.8.1.1.367.g57acac9.dirty
^ permalink raw reply
* Re: [PATCH v3] status: show the branch name if possible in in-progress info
From: Jonathan Nieder @ 2013-02-05 6:38 UTC (permalink / raw)
To: Nguyễn Thái Ngọc Duy; +Cc: git, Matthieu Moy, Junio C Hamano
In-Reply-To: <1359870807-22817-1-git-send-email-pclouds@gmail.com>
Nguyễn Thái Ngọc Duy wrote:
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Missing description. Stealing from the link you sent:
The typical use-case is starting a rebase, do something else, come back
the day after, run "git status" or make a new commit and wonder what
in the world's going on. Which branch is being rebased is probably the
most useful tidbit to help, but the target may help too.
Ideally, I would have loved to see "rebasing master on origin/master",
but the target ref name is not stored during rebase, so this patch
writes "rebasing master on a78c8c98b" as a half-measure to remind
future users of that potential improvement.
Signed-off-by: <...>
^ permalink raw reply
* On (re)packing
From: Junio C Hamano @ 2013-02-05 6:35 UTC (permalink / raw)
To: peff, spearce; +Cc: git
Just a random thought...
"git pack-objects" runs "rev-list --objects" to obtain three
different kinds of information about objects:
* Reachability. Objects that appear in the output of rev-list are
relevant, and those that do not are not;
* Recency, aka closeness in the time dimension. Objects that
appear in the output of rev-list close together appear in the
history nearby (a commit and its parents, a commit and its tree,
a tree and its subtree and blob);
* Paths, aka closeness in the space dimension. Trees and blobs are
labelled with paths they are first discovered at.
All of these are necessary for reasonable packing. We choose only
the reachable objects to pack. We place objects close in the time
dimension together in the output pack stream. And we delta objects
close in the space dimension against each other.
Now, we are planning to use object reachability bitmap to speed up
the object enumeration phase of repacking. This primarily gives us
the reachability information. Placing objects that are packed close
in existing packs close to each other in the output stream hopefully
may give us good enough approximation of the recency order. And
reusing the delta will keep good existing delta if both deltified
object and its delta base object are included in the output.
What should happen when we repack two or more packs? Placing an
object that appears near the beginning of one pack close to another
object that appears near the beginning of the other pack would
probably not make much sense, so the natural extension of emulating
recency order by pack offset would be to place all objects from one
pack together (in their original in-pack offset orde) and then
objects from the other pack together.
More problematic is how to coalesce one delta chain from one pack
with another delta chain from the other pack. Without having the
path information, we cannot efficiently do this. Especially if we
are to repack 50 small packs into one, it would be desirable if we
can avoid packing 50 similar objects in their undeltified form.
Assuming that we would want some extra information, in addition to
the bitmaps, to help repacking, and also with the recent "commit
metadata" topic in mind, lets do a back-of-the-envelope enumeration
of what we would want. Here is a list off the top of my head.
* commits
99.9% of all commits have no more than two parents. Assuming that
we keep this information per-pack, and we will not be packing more
than 2^32 objects in a pack, we can represent up to two parent
commits by two int32s to represent their position in the table of
SHA-1's in the .idx file. Also we can store another uint32 for
the commit timestamp (compute the timestamp of the oldest commit
in the pack and store it as uint64, and represent the commmit
timestamp of each commit with uint32 (we can represent a pack that
spans 68 years with this scheme). Give up storing metainformation
for any commit whose information cannot fit this scheme (e.g. an
octopus, or a commit with timestamp way out of line).
That costs 12 bytes per commit (plus 8-byte for the oldest
timestamp in the pack).
* tags
The timestamp can be expressed with a uint32 in the same way as
commit's timestamp, and the tagged object can be expressed with a
uint32 in the same way as commit's parent. Two uint32s
* trees and blobs
The name hash value is uint32.
If we have other information that are needed for trees and blobs
that fit in two more uint32s, then we can just build a table of
12-byte entries for all objects in the pack.
Otherwise, we would need a way to have separate table that can be
quickly accessed, going from an object name to either 3 uint32 tuple
(if it is a commit), 2 uint32 tuple (if it is a tag), or a uint32
(others).
Whether we can do a table with uniform entry size or split tables,
once we locate an entry, we can find out the object number in the
SHA-1 table the object refers to (e.g. parents, or tagged) so I do
not think it is a good idea to express object pointer with an
abbreviated SHA-1. But if we have to build commit-only table, we
may need to use a table with 16-byte entry size, that has 8
hexdigits (i.e. 4-bytes) abbreviated object name of a commit,
followed by the 12 byte commit metainformation, and sort it by the
abbreviated object name. With the same scheme, another table for
trees and blobs will cost 4-bytes for abbreviated object name as key
and 4-bytes for name-hash payload. That sounds a bit too wasteful
to my taste.
^ permalink raw reply
* Re: [PATCH 13/13] contrib/subtree: Remove --annotate
From: Junio C Hamano @ 2013-02-05 5:17 UTC (permalink / raw)
To: David A. Greene
Cc: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani,
"David A. Greene <greened
In-Reply-To: <1360037173-23291-14-git-send-email-greened@obbligato.org>
"David A. Greene" <greened@obbligato.org> writes:
> From: "David A. Greene" <greened@obbligato.org>
>
> Remove --annotate. This obviates the need for an --unannotate
> command. We really want a more generalized commit message rewrite
> mechanism.
That may be a good goal as the end result, but wouldn't it be a bit
unhelpful to remove these before adding such a "more generalized"
mechanism to replace them?
^ permalink raw reply
* Re: [PATCH 12/13] contrib/subtree: Handle '--prefix' argument with a slash appended
From: Junio C Hamano @ 2013-02-05 5:16 UTC (permalink / raw)
To: David A. Greene
Cc: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani,
"David A. Greene <greened
In-Reply-To: <1360037173-23291-13-git-send-email-greened@obbligato.org>
"David A. Greene" <greened@obbligato.org> writes:
> From: Techlive Zheng <techlivezheng@gmail.com>
>
> 'git subtree merge' will fail if the argument of '--prefix' has a slash
> appended.
>
> Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
> Signed-off-by: David A. Greene <greened@obbligato.org>
> ---
> contrib/subtree/git-subtree.sh | 2 +-
> contrib/subtree/t/t7900-subtree.sh | 19 +++++++++++++++++++
> 2 files changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
> index c72af95..0493e47 100755
> --- a/contrib/subtree/git-subtree.sh
> +++ b/contrib/subtree/git-subtree.sh
> @@ -82,7 +82,7 @@ while [ $# -gt 0 ]; do
> --annotate) annotate="$1"; shift ;;
> --no-annotate) annotate= ;;
> -b) branch="$1"; shift ;;
> - -P) prefix="$1"; shift ;;
> + -P) prefix="${1%/}"; shift ;;
While it may not be a bad change per-se, I have to wonder if it is
worth special casing "--prefix=foo/", that should have been spelled
as "--prefix=foo", while still failing misspelling like "--prefix=foo//"
and possibly other forms, perhaps "--prefix=foo//bar/baz"?
^ permalink raw reply
* Re: [PATCH 11/13] contrib/subtree: Make each test self-contained
From: Junio C Hamano @ 2013-02-05 5:13 UTC (permalink / raw)
To: David A. Greene
Cc: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani,
"David A. Greene <greened
In-Reply-To: <1360037173-23291-12-git-send-email-greened@obbligato.org>
"David A. Greene" <greened@obbligato.org> writes:
> +test_create_commit() (
> + repo=$1
> + commit=$2
> + cd "$repo"
> + mkdir -p "$(dirname "$commit")"
> + echo "$commit" > "$commit"
Style.
> + git add "$commit"
> + git commit -m "$commit"
> +)
Very nice, but don't we want to check for possible errors in any of
the above commands?
> last_commit_message()
> {
> git log --pretty=format:%s -1
> }
>
> +#
> +# Tests for 'git subtree add'
> +#
>
> -test_expect_success 'fetch subproj history' '
> - git fetch ./subproj sub1 &&
> - git branch sub1 FETCH_HEAD
> -'
>
> test_expect_success 'no pull from non-existant subtree' '
> - test_must_fail git subtree pull --prefix=subdir ./subproj sub1
> + test_create_repo "$test_count" &&
> + test_create_repo "$test_count/subproj" &&
> + test_create_commit "$test_count" main1 &&
> + test_create_commit "$test_count/subproj" sub1 &&
> + (
> + cd "$test_count" &&
> + git fetch ./subproj master &&
> + test_must_fail git subtree pull --prefix=subdir ./subproj master
> + )
> '
The goal of making each tests indenendent is a very good one, but
we'd really prefer not to see $test_count which is an implementation
detail of the test framework to be used like this. It will make it
unnecessarily harder to improve the test framework (e.g. it may want
to stop using the $test_count variable).
This is not limited to this variable, but all other $test_anything
variable. Earlier I wanted to update the definition of test_tick
which happens to be decimal number of seconds since epoch, but some
tests were comparing it with the raw values read from cat-file output
for a commit object, and it was really painful.
^ permalink raw reply
* Re: [PATCH 10/13] contrib/subtree: Code cleaning and refactoring
From: Junio C Hamano @ 2013-02-05 5:01 UTC (permalink / raw)
To: David A. Greene
Cc: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani,
"David A. Greene <greened
In-Reply-To: <1360037173-23291-11-git-send-email-greened@obbligato.org>
"David A. Greene" <greened@obbligato.org> writes:
> From: Techlive Zheng <techlivezheng@gmail.com>
>
> Mostly prepare for the later tests refactoring.
>
> Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
> Signed-off-by: David A. Greene <greened@obbligato.org>
> ---
> contrib/subtree/t/t7900-subtree.sh | 270 ++++++++++++++++++------------------
> 1 file changed, 136 insertions(+), 134 deletions(-)
>
> diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
> index e6bcd50..9cfaaf9 100755
> --- a/contrib/subtree/t/t7900-subtree.sh
> +++ b/contrib/subtree/t/t7900-subtree.sh
> @@ -4,7 +4,7 @@
> #
> test_description='Basic porcelain support for subtrees
>
> -This test verifies the basic operation of the merge, pull, add
> +This test verifies the basic operation of the add, pull, merge
> and split subcommands of git subtree.
> '
>
> @@ -18,19 +18,6 @@ create()
> git add "$1"
> }
>
> -
> -check_equal()
> -{
> - test_debug 'echo'
> - test_debug "echo \"check a:\" \"{$1}\""
> - test_debug "echo \" b:\" \"{$2}\""
> - if [ "$1" = "$2" ]; then
> - return 0
> - else
> - return 1
> - fi
> -}
> -
> fixnl()
> {
> t=""
> @@ -55,6 +42,42 @@ undo()
> git reset --hard HEAD~
> }
>
> +test_equal()
> +{
> + test_debug 'echo'
> + test_debug "echo \"check a:\" \"{$1}\""
> + test_debug "echo \" b:\" \"{$2}\""
> + if [ "$1" = "$2" ]; then
> + return 0
> + else
> + return 1
> + fi
> +}
Why is the above improvement? It does not seem to be fixing shell
script style to conform to the CodingGuidelines; the only thing I
can see it change is the name of the heper function.
Additional helper functions introduced by this patch seem to
introduce even more style violations.
This may be a tangent, but I would have expected "we expect these
two things to be the same, but help me debug the situation when then
differ" to be written more like this:
test_equal () {
if test "x$1" = "x$2"
then
return 0
else
test_debug "echo" ...
return 1
fi
}
> +# Make sure no patch changes more than one file.
> +# The original set of commits changed only one file each.
> +# A multi-file change would imply that we pruned commits
> +# too aggressively.
> +join_commits()
> +{
> + commit=
> + all=
> + while read x y; do
> + if [ -z "$x" ]; then
> + continue
> + elif [ "$x" = "commit:" ]; then
> + if [ -n "$commit" ]; then
> + echo "$commit $all"
> + all=
> + fi
> + commit="$y"
> + else
> + all="$all $y"
> + fi
> + done
> + echo "$commit $all"
> +}
Swapped location in the file and renamed the function? Doing
anything else?
This only reads from
git log --pretty="format:commit: %H"
so I am not sure how $all is ever relevant.
Doesn't it always see "$x=commit:" with "$y=<commit object name>"?
> last_commit_message()
> {
> git log --pretty=format:%s -1
> @@ -97,7 +120,7 @@ test_expect_success 'add main4' '
> create main4 &&
> git commit -m "main4" &&
> git branch -m master mainline &&
> - git branch subdir
> + git branch init
> '
>
> test_expect_success 'fetch subproj history' '
> @@ -105,40 +128,43 @@ test_expect_success 'fetch subproj history' '
> git branch sub1 FETCH_HEAD
> '
>
> -test_expect_success 'no subtree exists in main tree' '
> - test_must_fail git subtree merge --prefix=subdir sub1
> -'
> -
> test_expect_success 'no pull from non-existant subtree' '
> test_must_fail git subtree pull --prefix=subdir ./subproj sub1
> '
>
v> -test_expect_success 'check if --message works for add' '
> - git subtree add --prefix=subdir --message="Added subproject" sub1 &&
> - check_equal ''"$(last_commit_message)"'' "Added subproject" &&
> +test_expect_success 'no merge from non-existant subtree' '
s/tant/tent/
The remainder of the patch not snipped for others.
> + test_must_fail git subtree merge --prefix=subdir FETCH_HEAD
> +'
> +
> +test_expect_success 'add subproj as subtree into subdir/ with --prefix' '
> + git subtree add --prefix=subdir FETCH_HEAD &&
> + test_equal "$(last_commit_message)" "Add '\''subdir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''" &&
> undo
> '
>
> -test_expect_success 'check if --message works as -m and --prefix as -P' '
> - git subtree add -P subdir -m "Added subproject using git subtree" sub1 &&
> - check_equal ''"$(last_commit_message)"'' "Added subproject using git subtree" &&
> +test_expect_success 'add subproj as subtree into subdir/ with --prefix and --message' '
> + git subtree add --prefix=subdir --message="Added subproject" FETCH_HEAD &&
> + test_equal "$(last_commit_message)" "Added subproject" &&
> undo
> '
>
> -test_expect_success 'check if --message works with squash too' '
> - git subtree add -P subdir -m "Added subproject with squash" --squash sub1 &&
> - check_equal ''"$(last_commit_message)"'' "Added subproject with squash" &&
> +test_expect_success 'add subproj as subtree into subdir/ with --prefix as -P and --message as -m' '
> + git subtree add -P subdir -m "Added subproject" FETCH_HEAD &&
> + test_equal "$(last_commit_message)" "Added subproject" &&
> undo
> '
>
> -test_expect_success 'add subproj to mainline' '
> - git subtree add --prefix=subdir/ FETCH_HEAD &&
> - check_equal ''"$(last_commit_message)"'' "Add '"'subdir/'"' from commit '"'"'''"$(git rev-parse sub1)"'''"'"'"
> +test_expect_success 'add subproj as subtree into subdir/ with --squash and --prefix and --message' '
> + git subtree add --prefix=subdir --message="Added subproject with squash" --squash FETCH_HEAD &&
> + test_equal "$(last_commit_message)" "Added subproject with squash" &&
> + undo
> '
>
> -# this shouldn't actually do anything, since FETCH_HEAD is already a parent
> -test_expect_success 'merge fetched subproj' '
> - git merge -m "merge -s -ours" -s ours FETCH_HEAD
> +test_expect_success 'merge the added subproj again, should do nothing' '
> + git subtree add --prefix=subdir FETCH_HEAD &&
> + # this shouldn not actually do anything, since FETCH_HEAD
> + # is already a parent
> + git merge -s ours -m "merge -s -ours" FETCH_HEAD
> '
>
> test_expect_success 'add main-sub5' '
> @@ -161,25 +187,30 @@ test_expect_success 'fetch new subproj history' '
> git branch sub2 FETCH_HEAD
> '
>
> -test_expect_success 'check if --message works for merge' '
> - git subtree merge --prefix=subdir -m "Merged changes from subproject" sub2 &&
> - check_equal ''"$(last_commit_message)"'' "Merged changes from subproject" &&
> +test_expect_success 'merge new subproj history into subdir/ with --prefix' '
> + git subtree merge --prefix=subdir FETCH_HEAD &&
> + test_equal "$(last_commit_message)" "Merge commit '\''$(git rev-parse FETCH_HEAD)'\'' into mainline" &&
> undo
> '
>
> -test_expect_success 'check if --message for merge works with squash too' '
> - git subtree merge --prefix subdir -m "Merged changes from subproject using squash" --squash sub2 &&
> - check_equal ''"$(last_commit_message)"'' "Merged changes from subproject using squash" &&
> +test_expect_success 'merge new subproj history into subdir/ with --prefix and --message' '
> + git subtree merge --prefix=subdir --message="Merged changes from subproject" FETCH_HEAD &&
> + test_equal "$(last_commit_message)" "Merged changes from subproject" &&
> undo
> '
>
> -test_expect_success 'merge new subproj history into subdir' '
> +test_expect_success 'merge new subproj history into subdir/ with --squash and --prefix and --message' '
> + git subtree merge --prefix=subdir --message="Merged changes from subproject using squash" --squash FETCH_HEAD &&
> + test_equal "$(last_commit_message)" "Merged changes from subproject using squash" &&
> + undo
> +'
> +
> +test_expect_success 'merge new subproj history into subdir/' '
> git subtree merge --prefix=subdir FETCH_HEAD &&
> - git branch pre-split &&
> - check_equal ''"$(last_commit_message)"'' "Merge commit '"'"'"$(git rev-parse sub2)"'"'"' into mainline"
> + git branch pre-split
> '
>
> -test_expect_success 'Check that prefix argument is required for split' '
> +test_expect_success 'split requires option --prefix' '
> echo "You must provide the --prefix option." > expected &&
> test_must_fail git subtree split > actual 2>&1 &&
> test_debug "echo -n expected: " &&
> @@ -190,59 +221,56 @@ test_expect_success 'Check that prefix argument is required for split' '
> rm -f expected actual
> '
>
> -test_expect_success 'Check that the <prefix> exists for a split' '
> - echo "'"'"'non-existent-directory'"'"'" does not exist\; use "'"'"'git subtree add'"'"'" > expected &&
> +test_expect_success 'split requires path given by option --prefix must exist' '
> + echo "'\''non-existent-directory'\'' does not exist; use '\''git subtree add'\''" > expected &&
> test_must_fail git subtree split --prefix=non-existent-directory > actual 2>&1 &&
> test_debug "echo -n expected: " &&
> test_debug "cat expected" &&
> test_debug "echo -n actual: " &&
> test_debug "cat actual" &&
> - test_cmp expected actual
> -# rm -f expected actual
> + test_cmp expected actual &&
> + rm -f expected actual
> '
>
> -test_expect_success 'check if --message works for split+rejoin' '
> - spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
> - git branch spl1 "$spl1" &&
> - check_equal ''"$(last_commit_message)"'' "Split & rejoin" &&
> - undo
> -'
> +test_expect_success 'split subdir/ with --rejoin' '
> + spl1=$(git subtree split --prefix=subdir --annotate="*") &&
> + git branch spl1 "$spl1" &&
> + git subtree split --prefix=subdir --annotate="*" --rejoin &&
> + test_equal "$(last_commit_message)" "Split '\''subdir/'\'' into commit '\''$spl1'\''" &&
> + undo
> + '
>
> -test_expect_success 'check split with --branch' '
> - spl1=$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin) &&
> - undo &&
> - git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --branch splitbr1 &&
> - check_equal ''"$(git rev-parse splitbr1)"'' "$spl1"
> +test_expect_success 'split subdir/ with --rejoin and --message' '
> + git subtree split --prefix=subdir --message="Split & rejoin" --annotate="*" --rejoin &&
> + test_equal "$(last_commit_message)" "Split & rejoin" &&
> + undo
> '
>
> -test_expect_success 'check hash of split' '
> - spl1=$(git subtree split --prefix subdir) &&
> - undo &&
> - git subtree split --prefix subdir --branch splitbr1test &&
> - check_equal ''"$(git rev-parse splitbr1test)"'' "$spl1"
> - git checkout splitbr1test &&
> - new_hash=$(git rev-parse HEAD~2) &&
> - git checkout mainline &&
> - check_equal ''"$new_hash"'' "$subdir_hash"
> -'
> +test_expect_success 'split subdir/ with --branch' '
> + spl1=$(git subtree split --prefix=subdir --message="Split & rejoin" --annotate="*" --rejoin) &&
> + undo &&
> + git subtree split --prefix=subdir --annotate="*" --branch splitbr1 &&
> + test_equal "$(git rev-parse splitbr1)" "$spl1"
> + '
>
> -test_expect_success 'check split with --branch for an existing branch' '
> - spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
> +test_expect_success 'split subdir/ with --branch for an existing branch' '
> + spl1=$(git subtree split --prefix=subdir --annotate="*" --message="Split & rejoin" --rejoin) &&
> undo &&
> git branch splitbr2 sub1 &&
> - git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --branch splitbr2 &&
> - check_equal ''"$(git rev-parse splitbr2)"'' "$spl1"
> + git subtree split --prefix=subdir --annotate="*" --branch splitbr2 &&
> + test_equal "$(git rev-parse splitbr2)" "$spl1"
> '
>
> -test_expect_success 'check split with --branch for an incompatible branch' '
> - test_must_fail git subtree split --prefix subdir --onto FETCH_HEAD --branch subdir
> +test_expect_success 'split subdir/ with --branch for an incompatible branch' '
> + test_must_fail git subtree split --prefix=subdir --branch init
> '
>
> -test_expect_success 'check split+rejoin' '
> - spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
> +test_expect_success 'check --unannotate' '
> + spl1=$(git subtree split --unannotate="subproj:" --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin) &&
> undo &&
> - git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --rejoin &&
> - check_equal ''"$(last_commit_message)"'' "Split '"'"'subdir/'"'"' into commit '"'"'"$spl1"'"'"'"
> + git subtree split --unannotate="subproj:" --prefix subdir --onto FETCH_HEAD --branch splitunann &&
> + test_equal "$(git rev-parse splitunann)" "$spl1" &&
> + test_equal "$(git log splitunann | grep subproj)" ""
> '
>
> test_expect_success 'add main-sub8' '
> @@ -268,8 +296,8 @@ test_expect_success 'add sub9' '
> cd ..
>
> test_expect_success 'split for sub8' '
> - split2=''"$(git subtree split --annotate='"'*'"' --prefix subdir/ --rejoin)"''
> - git branch split2 "$split2"
> + spl2=$(git subtree split --prefix=subdir/ --annotate="*" --rejoin) &&
> + git branch spl2 "$spl2"
> '
>
> test_expect_success 'add main-sub10' '
> @@ -278,7 +306,7 @@ test_expect_success 'add main-sub10' '
> '
>
> test_expect_success 'split for sub10' '
> - spl3=''"$(git subtree split --annotate='"'*'"' --prefix subdir --rejoin)"'' &&
> + spl3=$(git subtree split --prefix=subdir --annotate="*" --rejoin) &&
> git branch spl3 "$spl3"
> '
>
> @@ -299,13 +327,13 @@ chks="sub1 sub2 sub3 sub9"
> chks_sub=$(echo $chks | multiline | sed 's,^,subdir/,' | fixnl)
>
> test_expect_success 'make sure exactly the right set of files ends up in the subproj' '
> - subfiles=''"$(git ls-files | fixnl)"'' &&
> - check_equal "$subfiles" "$chkms $chks"
> + subfiles=$(git ls-files | fixnl) &&
> + test_equal "$subfiles" "$chkms $chks"
> '
>
> -test_expect_success 'make sure the subproj history *only* contains commits that affect the subdir' '
> - allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | fixnl)"'' &&
> - check_equal "$allchanges" "$chkms $chks"
> +test_expect_success 'make sure the subproj *only* contains commits that affect the subdir' '
> + allchanges=$(git log --name-only --pretty=format:"" | sort | fixnl) &&
> + test_equal "$allchanges" "$chkms $chks"
> '
>
> # Back to mainline
> @@ -318,25 +346,25 @@ test_expect_success 'pull from subproj' '
> '
>
> test_expect_success 'make sure exactly the right set of files ends up in the mainline' '
> - mainfiles=''"$(git ls-files | fixnl)"'' &&
> - check_equal "$mainfiles" "$chkm $chkms_sub $chks_sub"
> + mainfiles=$(git ls-files | fixnl) &&
> + test_equal "$mainfiles" "$chkm $chkms_sub $chks_sub"
> '
>
> test_expect_success 'make sure each filename changed exactly once in the entire history' '
> # main-sub?? and /subdir/main-sub?? both change, because those are the
> # changes that were split into their own history. And subdir/sub?? never
> # change, since they were *only* changed in the subtree branch.
> - allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | fixnl)"'' &&
> - check_equal "$allchanges" ''"$(echo $chkms $chkm $chks $chkms_sub | multiline | sort | fixnl)"''
> + allchanges=$(git log --name-only --pretty=format:"" | sort | fixnl) &&
> + test_equal "$allchanges" "$(echo $chkms $chkm $chks $chkms_sub | multiline | sort | fixnl)"
> '
>
> test_expect_success 'make sure the --rejoin commits never make it into subproj' '
> - check_equal ''"$(git log --pretty=format:'"'%s'"' HEAD^2 | grep -i split)"'' ""
> + test_equal "$(git log --pretty=format:"%s" HEAD^2 | grep -i split)" ""
> '
>
> test_expect_success 'make sure no "git subtree" tagged commits make it into subproj' '
> # They are meaningless to subproj since one side of the merge refers to the mainline
> - check_equal ''"$(git log --pretty=format:'"'%s%n%b'"' HEAD^2 | grep "git-subtree.*:")"'' ""
> + test_equal "$(git log --pretty=format:"%s%n%b" HEAD^2 | grep "git-subtree.*:")" ""
> '
>
> # prepare second pair of repositories
> @@ -374,7 +402,7 @@ cd ../main
> test_expect_success 'add sub as subdir in main' '
> git fetch ../sub master &&
> git branch sub2 FETCH_HEAD &&
> - git subtree add --prefix subdir sub2
> + git subtree add --prefix=subdir sub2
> '
>
> cd ../sub
> @@ -389,7 +417,7 @@ cd ../main
> test_expect_success 'merge from sub' '
> git fetch ../sub master &&
> git branch sub3 FETCH_HEAD &&
> - git subtree merge --prefix subdir sub3
> + git subtree merge --prefix=subdir sub3
> '
>
> test_expect_success 'add main-sub4' '
> @@ -398,7 +426,7 @@ test_expect_success 'add main-sub4' '
> '
>
> test_expect_success 'split for main-sub4 without --onto' '
> - git subtree split --prefix subdir --branch mainsub4
> + git subtree split --prefix=subdir --branch mainsub4
> '
>
> # at this point, the new commit parent should be sub3 if it is not,
> @@ -407,7 +435,7 @@ test_expect_success 'split for main-sub4 without --onto' '
> # itself)
>
> test_expect_success 'check that the commit parent is sub3' '
> - check_equal ''"$(git log --pretty=format:%P -1 mainsub4)"'' ''"$(git rev-parse sub3)"''
> + test_equal "$(git log --pretty=format:%P -1 mainsub4)" "$(git rev-parse sub3)"
> '
>
> test_expect_success 'add main-sub5' '
> @@ -420,49 +448,23 @@ test_expect_success 'split for main-sub5 without --onto' '
> # also test that we still can split out an entirely new subtree
> # if the parent of the first commit in the tree is not empty,
> # then the new subtree has accidently been attached to something
> - git subtree split --prefix subdir2 --branch mainsub5 &&
> - check_equal ''"$(git log --pretty=format:%P -1 mainsub5)"'' ""
> + git subtree split --prefix=subdir2 --branch mainsub5 &&
> + test_equal "$(git log --pretty=format:%P -1 mainsub5)" ""
> '
>
> -# make sure no patch changes more than one file. The original set of commits
> -# changed only one file each. A multi-file change would imply that we pruned
> -# commits too aggressively.
> -joincommits()
> -{
> - commit=
> - all=
> - while read x y; do
> - #echo "{$x}" >&2
> - if [ -z "$x" ]; then
> - continue
> - elif [ "$x" = "commit:" ]; then
> - if [ -n "$commit" ]; then
> - echo "$commit $all"
> - all=
> - fi
> - commit="$y"
> - else
> - all="$all $y"
> - fi
> - done
> - echo "$commit $all"
> -}
> -
> test_expect_success 'verify one file change per commit' '
> x= &&
> - list=''"$(git log --pretty=format:'"'commit: %H'"' | joincommits)"'' &&
> -# test_debug "echo HERE" &&
> -# test_debug "echo ''"$list"''" &&
> - (git log --pretty=format:'"'commit: %H'"' | joincommits |
> - ( while read commit a b; do
> - test_debug "echo Verifying commit "''"$commit"''
> - test_debug "echo a: "''"$a"''
> - test_debug "echo b: "''"$b"''
> - check_equal "$b" ""
> + git log --pretty=format:"commit: %H" | join_commits |
> + (
> + while read commit a b; do
> + test_debug "echo Verifying commit $commit"
> + test_debug "echo a: $a"
> + test_debug "echo b: $b"
> + test_equal "$b" ""
> x=1
> done
> - check_equal "$x" 1
> - ))
> + test_equal "$x" 1
> + )
> '
>
> test_done
^ permalink raw reply
* Re: [PATCH 07/13] contrib/subtree: Fix whitespaces
From: Junio C Hamano @ 2013-02-05 4:42 UTC (permalink / raw)
To: David A. Greene
Cc: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani,
"David A. Greene <greened
In-Reply-To: <1360037173-23291-8-git-send-email-greened@obbligato.org>
"David A. Greene" <greened@obbligato.org> writes:
> From: Techlive Zheng <techlivezheng@gmail.com>
>
> Previous code does not fulfill Git's whitespace policy.
>
> Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
> Signed-off-by: David A. Greene <greened@obbligato.org>
> ---
This does not seem to apply; I hand-tweaked it to make it apply, but
the reindentation of t/t7900 does not look correct.
> diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
> index 3f17f55..e6a3702 100755
> --- a/contrib/subtree/t/t7900-subtree.sh
> +++ b/contrib/subtree/t/t7900-subtree.sh
> @@ -23,7 +23,7 @@ check_equal()
> {
> test_debug 'echo'
> test_debug "echo \"check a:\" \"{$1}\""
> - test_debug "echo \" b:\" \"{$2}\""
> + test_debug "echo \" b:\" \"{$2}\""
> if [ "$1" = "$2" ]; then
> return 0
> else
> @@ -61,17 +61,17 @@ last_commit_message()
> }
>
> test_expect_success 'init subproj' '
> - test_create_repo subproj
> + test_create_repo subproj
Perhaps this was originally done with an editor whose tabwidth was
set to 4? It gives too much indentation when standard tabwidth of 8
is used.
^ permalink raw reply
* Re: [PATCH 01/13] contrib/subtree: Remove Test Number Comments
From: Junio C Hamano @ 2013-02-05 4:39 UTC (permalink / raw)
To: David A. Greene
Cc: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani,
"David A. Greene <greened
In-Reply-To: <1360037173-23291-2-git-send-email-greened@obbligato.org>
Thanks.
This is minor but I'd prefer to see that Subject lines Not To Do
Title Case (please see "git log --oneline --no-merges -20 master"
and imitate them for uniformity).
I'll tweak them while queuing so this alone is not a reason for
having to resend.
Thanks.
^ permalink raw reply
* [PATCH 11/13] contrib/subtree: Make each test self-contained
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/t/t7900-subtree.sh | 871 +++++++++++++++++++++++++-----------
1 file changed, 613 insertions(+), 258 deletions(-)
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 9cfaaf9..769b116 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -12,12 +12,6 @@ export TEST_DIRECTORY=$(pwd)/../../../t
. ../../../t/test-lib.sh
-create()
-{
- echo "$1" >"$1"
- git add "$1"
-}
-
fixnl()
{
t=""
@@ -37,11 +31,6 @@ multiline()
done
}
-undo()
-{
- git reset --hard HEAD~
-}
-
test_equal()
{
test_debug 'echo'
@@ -78,381 +67,746 @@ join_commits()
echo "$commit $all"
}
+test_create_commit() (
+ repo=$1
+ commit=$2
+ cd "$repo"
+ mkdir -p "$(dirname "$commit")"
+ echo "$commit" > "$commit"
+ git add "$commit"
+ git commit -m "$commit"
+)
+
last_commit_message()
{
git log --pretty=format:%s -1
}
-test_expect_success 'init subproj' '
- test_create_repo subproj
-'
-
-# To the subproject!
-cd subproj
-
-test_expect_success 'add sub1' '
- create sub1 &&
- git commit -m "sub1" &&
- git branch sub1 &&
- git branch -m master subproj
-'
-
-# Save this hash for testing later.
-
-subdir_hash=`git rev-parse HEAD`
-
-test_expect_success 'add sub2' '
- create sub2 &&
- git commit -m "sub2" &&
- git branch sub2
-'
-
-test_expect_success 'add sub3' '
- create sub3 &&
- git commit -m "sub3" &&
- git branch sub3
-'
-
-# Back to mainline
-cd ..
-
-test_expect_success 'add main4' '
- create main4 &&
- git commit -m "main4" &&
- git branch -m master mainline &&
- git branch init
-'
+#
+# Tests for 'git subtree add'
+#
-test_expect_success 'fetch subproj history' '
- git fetch ./subproj sub1 &&
- git branch sub1 FETCH_HEAD
-'
test_expect_success 'no pull from non-existant subtree' '
- test_must_fail git subtree pull --prefix=subdir ./subproj sub1
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ test_must_fail git subtree pull --prefix=subdir ./subproj master
+ )
'
test_expect_success 'no merge from non-existant subtree' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
test_must_fail git subtree merge --prefix=subdir FETCH_HEAD
+ )
'
test_expect_success 'add subproj as subtree into subdir/ with --prefix' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
git subtree add --prefix=subdir FETCH_HEAD &&
- test_equal "$(last_commit_message)" "Add '\''subdir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''" &&
- undo
+ test_equal "$(last_commit_message)" "Add '\''subdir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''"
+ )
'
test_expect_success 'add subproj as subtree into subdir/ with --prefix and --message' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
git subtree add --prefix=subdir --message="Added subproject" FETCH_HEAD &&
- test_equal "$(last_commit_message)" "Added subproject" &&
- undo
+ test_equal "$(last_commit_message)" "Added subproject"
+ )
'
test_expect_success 'add subproj as subtree into subdir/ with --prefix as -P and --message as -m' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
git subtree add -P subdir -m "Added subproject" FETCH_HEAD &&
- test_equal "$(last_commit_message)" "Added subproject" &&
- undo
+ test_equal "$(last_commit_message)" "Added subproject"
+ )
'
test_expect_success 'add subproj as subtree into subdir/ with --squash and --prefix and --message' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
git subtree add --prefix=subdir --message="Added subproject with squash" --squash FETCH_HEAD &&
- test_equal "$(last_commit_message)" "Added subproject with squash" &&
- undo
+ test_equal "$(last_commit_message)" "Added subproject with squash"
+ )
'
test_expect_success 'merge the added subproj again, should do nothing' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
git subtree add --prefix=subdir FETCH_HEAD &&
# this shouldn not actually do anything, since FETCH_HEAD
# is already a parent
git merge -s ours -m "merge -s -ours" FETCH_HEAD
+ )
'
-test_expect_success 'add main-sub5' '
- create subdir/main-sub5 &&
- git commit -m "subproj: main-sub5"
-'
-
-test_expect_success 'add main6' '
- create main6 &&
- git commit -m "main6 boring"
-'
-
-test_expect_success 'add main-sub7' '
- create subdir/main-sub7 &&
- git commit -m "subproj: main-sub7"
-'
-
-test_expect_success 'fetch new subproj history' '
- git fetch ./subproj sub2 &&
- git branch sub2 FETCH_HEAD
-'
+#
+# Tests for 'git subtree merge'
+#
test_expect_success 'merge new subproj history into subdir/ with --prefix' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- test_equal "$(last_commit_message)" "Merge commit '\''$(git rev-parse FETCH_HEAD)'\'' into mainline" &&
- undo
+ test_equal "$(last_commit_message)" "Merge commit '\''$(git rev-parse FETCH_HEAD)'\''"
+ )
'
test_expect_success 'merge new subproj history into subdir/ with --prefix and --message' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
git subtree merge --prefix=subdir --message="Merged changes from subproject" FETCH_HEAD &&
- test_equal "$(last_commit_message)" "Merged changes from subproject" &&
- undo
+ test_equal "$(last_commit_message)" "Merged changes from subproject"
+ )
'
test_expect_success 'merge new subproj history into subdir/ with --squash and --prefix and --message' '
+ test_create_repo "$test_count/subproj" &&
+ test_create_repo "$test_count" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
git subtree merge --prefix=subdir --message="Merged changes from subproject using squash" --squash FETCH_HEAD &&
- test_equal "$(last_commit_message)" "Merged changes from subproject using squash" &&
- undo
+ test_equal "$(last_commit_message)" "Merged changes from subproject using squash"
+ )
'
-test_expect_success 'merge new subproj history into subdir/' '
- git subtree merge --prefix=subdir FETCH_HEAD &&
- git branch pre-split
-'
+#
+# Tests for 'git subtree split'
+#
test_expect_success 'split requires option --prefix' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD &&
echo "You must provide the --prefix option." > expected &&
test_must_fail git subtree split > actual 2>&1 &&
test_debug "echo -n expected: " &&
test_debug "cat expected" &&
test_debug "echo -n actual: " &&
test_debug "cat actual" &&
- test_cmp expected actual &&
- rm -f expected actual
+ test_cmp expected actual
+ )
'
test_expect_success 'split requires path given by option --prefix must exist' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD &&
echo "'\''non-existent-directory'\'' does not exist; use '\''git subtree add'\''" > expected &&
test_must_fail git subtree split --prefix=non-existent-directory > actual 2>&1 &&
test_debug "echo -n expected: " &&
test_debug "cat expected" &&
test_debug "echo -n actual: " &&
test_debug "cat actual" &&
- test_cmp expected actual &&
- rm -f expected actual
+ test_cmp expected actual
+ )
'
test_expect_success 'split subdir/ with --rejoin' '
- spl1=$(git subtree split --prefix=subdir --annotate="*") &&
- git branch spl1 "$spl1" &&
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ split_hash=$(git subtree split --prefix=subdir --annotate="*") &&
git subtree split --prefix=subdir --annotate="*" --rejoin &&
- test_equal "$(last_commit_message)" "Split '\''subdir/'\'' into commit '\''$spl1'\''" &&
- undo
+ test_equal "$(last_commit_message)" "Split '\''subdir/'\'' into commit '\''$split_hash'\''"
+ )
'
test_expect_success 'split subdir/ with --rejoin and --message' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
git subtree split --prefix=subdir --message="Split & rejoin" --annotate="*" --rejoin &&
- test_equal "$(last_commit_message)" "Split & rejoin" &&
- undo
+ test_equal "$(last_commit_message)" "Split & rejoin"
+ )
'
test_expect_success 'split subdir/ with --branch' '
- spl1=$(git subtree split --prefix=subdir --message="Split & rejoin" --annotate="*" --rejoin) &&
- undo &&
- git subtree split --prefix=subdir --annotate="*" --branch splitbr1 &&
- test_equal "$(git rev-parse splitbr1)" "$spl1"
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ split_hash=$(git subtree split --prefix=subdir --annotate="*") &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br &&
+ test_equal "$(git rev-parse subproj-br)" "$split_hash"
+ )
'
test_expect_success 'split subdir/ with --branch for an existing branch' '
- spl1=$(git subtree split --prefix=subdir --annotate="*" --message="Split & rejoin" --rejoin) &&
- undo &&
- git branch splitbr2 sub1 &&
- git subtree split --prefix=subdir --annotate="*" --branch splitbr2 &&
- test_equal "$(git rev-parse splitbr2)" "$spl1"
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git branch subproj-br FETCH_HEAD &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ split_hash=$(git subtree split --prefix=subdir --annotate="*") &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br &&
+ test_equal "$(git rev-parse subproj-br)" "$split_hash"
+ )
'
test_expect_success 'split subdir/ with --branch for an incompatible branch' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git branch init HEAD &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
test_must_fail git subtree split --prefix=subdir --branch init
+ )
'
-test_expect_success 'check --unannotate' '
- spl1=$(git subtree split --unannotate="subproj:" --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin) &&
- undo &&
- git subtree split --unannotate="subproj:" --prefix subdir --onto FETCH_HEAD --branch splitunann &&
- test_equal "$(git rev-parse splitunann)" "$spl1" &&
- test_equal "$(git log splitunann | grep subproj)" ""
-'
-
-test_expect_success 'add main-sub8' '
- create subdir/main-sub8 &&
- git commit -m "main-sub8"
-'
-
-# To the subproject!
-cd ./subproj
-
-test_expect_success 'merge split into subproj' '
- git fetch .. spl1 &&
- git branch spl1 FETCH_HEAD &&
- git merge FETCH_HEAD
-'
-
-test_expect_success 'add sub9' '
- create sub9 &&
- git commit -m "sub9"
-'
-
-# Back to mainline
-cd ..
-
-test_expect_success 'split for sub8' '
- spl2=$(git subtree split --prefix=subdir/ --annotate="*" --rejoin) &&
- git branch spl2 "$spl2"
-'
-
-test_expect_success 'add main-sub10' '
- create subdir/main-sub10 &&
- git commit -m "main-sub10"
-'
-
-test_expect_success 'split for sub10' '
- spl3=$(git subtree split --prefix=subdir --annotate="*" --rejoin) &&
- git branch spl3 "$spl3"
-'
-
-# To the subproject!
-cd ./subproj
-
-test_expect_success 'merge split into subproj' '
- git fetch .. spl3 &&
- git branch spl3 FETCH_HEAD &&
- git merge FETCH_HEAD &&
- git branch subproj-merge-spl3
-'
-
-chkm="main4 main6"
-chkms="main-sub10 main-sub5 main-sub7 main-sub8"
-chkms_sub=$(echo $chkms | multiline | sed 's,^,subdir/,' | fixnl)
-chks="sub1 sub2 sub3 sub9"
-chks_sub=$(echo $chks | multiline | sed 's,^,subdir/,' | fixnl)
+#
+# Validity checking
+#
test_expect_success 'make sure exactly the right set of files ends up in the subproj' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count/subproj" sub3 &&
+ test_create_commit "$test_count" subdir/main-sub3 &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD &&
+
+ chks="sub1 sub2 sub3 sub4" &&
+ chks_sub=$(echo $chks | multiline | sed '\''s,^,subdir/,'\'' | fixnl) &&
+ chkms="main-sub1 main-sub2 main-sub3 main-sub4" &&
+ chkms_sub=$(echo $chkms | multiline | sed '\''s,^,subdir/,'\'' | fixnl) &&
+
subfiles=$(git ls-files | fixnl) &&
test_equal "$subfiles" "$chkms $chks"
+ )
'
test_expect_success 'make sure the subproj *only* contains commits that affect the subdir' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count/subproj" sub3 &&
+ test_create_commit "$test_count" subdir/main-sub3 &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD &&
+
+ chks="sub1 sub2 sub3 sub4" &&
+ chks_sub=$(echo $chks | multiline | sed '\''s,^,subdir/,'\'' | fixnl) &&
+ chkms="main-sub1 main-sub2 main-sub3 main-sub4" &&
+ chkms_sub=$(echo $chkms | multiline | sed '\''s,^,subdir/,'\'' | fixnl) &&
+
allchanges=$(git log --name-only --pretty=format:"" | sort | fixnl) &&
test_equal "$allchanges" "$chkms $chks"
-'
-
-# Back to mainline
-cd ..
-
-test_expect_success 'pull from subproj' '
- git fetch ./subproj subproj-merge-spl3 &&
- git branch subproj-merge-spl3 FETCH_HEAD &&
- git subtree pull --prefix=subdir ./subproj subproj-merge-spl3
+ )
'
test_expect_success 'make sure exactly the right set of files ends up in the mainline' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count/subproj" sub3 &&
+ test_create_commit "$test_count" subdir/main-sub3 &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ (
+ cd "$test_count" &&
+ git subtree pull --prefix=subdir ./subproj master &&
+
+ chkm="main1 main2" &&
+ chks="sub1 sub2 sub3 sub4" &&
+ chks_sub=$(echo $chks | multiline | sed '\''s,^,subdir/,'\'' | fixnl) &&
+ chkms="main-sub1 main-sub2 main-sub3 main-sub4" &&
+ chkms_sub=$(echo $chkms | multiline | sed '\''s,^,subdir/,'\'' | fixnl) &&
mainfiles=$(git ls-files | fixnl) &&
test_equal "$mainfiles" "$chkm $chkms_sub $chks_sub"
+ )
'
test_expect_success 'make sure each filename changed exactly once in the entire history' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count/subproj" sub3 &&
+ test_create_commit "$test_count" subdir/main-sub3 &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ (
+ cd "$test_count" &&
+ git subtree pull --prefix=subdir ./subproj master &&
+
+ chkm="main1 main2" &&
+ chks="sub1 sub2 sub3 sub4" &&
+ chks_sub=$(echo $chks | multiline | sed '\''s,^,subdir/,'\'' | fixnl) &&
+ chkms="main-sub1 main-sub2 main-sub3 main-sub4" &&
+ chkms_sub=$(echo $chkms | multiline | sed '\''s,^,subdir/,'\'' | fixnl) &&
+
# main-sub?? and /subdir/main-sub?? both change, because those are the
# changes that were split into their own history. And subdir/sub?? never
# change, since they were *only* changed in the subtree branch.
allchanges=$(git log --name-only --pretty=format:"" | sort | fixnl) &&
test_equal "$allchanges" "$(echo $chkms $chkm $chks $chkms_sub | multiline | sort | fixnl)"
+ )
'
test_expect_success 'make sure the --rejoin commits never make it into subproj' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count/subproj" sub3 &&
+ test_create_commit "$test_count" subdir/main-sub3 &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ (
+ cd "$test_count" &&
+ git subtree pull --prefix=subdir ./subproj master &&
+
test_equal "$(git log --pretty=format:"%s" HEAD^2 | grep -i split)" ""
+ )
'
test_expect_success 'make sure no "git subtree" tagged commits make it into subproj' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ test_create_commit "$test_count" main2 &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ test_create_commit "$test_count" subdir/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count/subproj" sub3 &&
+ test_create_commit "$test_count" subdir/main-sub3 &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub4 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ ) &&
+ (
+ cd "$test_count/subproj" &&
+ git fetch .. subproj-br && git merge FETCH_HEAD
+ ) &&
+ (
+ cd "$test_count" &&
+ git subtree pull --prefix=subdir ./subproj master &&
+
# They are meaningless to subproj since one side of the merge refers to the mainline
test_equal "$(git log --pretty=format:"%s%n%b" HEAD^2 | grep "git-subtree.*:")" ""
+ )
'
-# prepare second pair of repositories
-mkdir test2
-cd test2
-
-test_expect_success 'init main' '
- test_create_repo main
-'
-
-cd main
-
-test_expect_success 'add main1' '
- create main1 &&
- git commit -m "main1"
-'
-
-cd ..
-
-test_expect_success 'init sub' '
- test_create_repo sub
-'
-
-cd sub
-
-test_expect_success 'add sub2' '
- create sub2 &&
- git commit -m "sub2"
-'
-
-cd ../main
-
-# check if split can find proper base without --onto
-
-test_expect_success 'add sub as subdir in main' '
- git fetch ../sub master &&
- git branch sub2 FETCH_HEAD &&
- git subtree add --prefix=subdir sub2
-'
-
-cd ../sub
-
-test_expect_success 'add sub3' '
- create sub3 &&
- git commit -m "sub3"
-'
-
-cd ../main
-
-test_expect_success 'merge from sub' '
- git fetch ../sub master &&
- git branch sub3 FETCH_HEAD &&
- git subtree merge --prefix=subdir sub3
-'
-
-test_expect_success 'add main-sub4' '
- create subdir/main-sub4 &&
- git commit -m "main-sub4"
-'
-
-test_expect_success 'split for main-sub4 without --onto' '
- git subtree split --prefix=subdir --branch mainsub4
-'
-
-# at this point, the new commit parent should be sub3 if it is not,
-# something went wrong (the "newparent" of "master~" commit should
-# have been sub3, but it was not, because its cache was not set to
-# itself)
-
-test_expect_success 'check that the commit parent is sub3' '
- test_equal "$(git log --pretty=format:%P -1 mainsub4)" "$(git rev-parse sub3)"
-'
+#
+# A new set of tests
+#
-test_expect_success 'add main-sub5' '
- mkdir subdir2 &&
- create subdir2/main-sub5 &&
- git commit -m "main-sub5"
-'
+test_expect_success 'make sure "git subtree split" find the correct parent' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git branch subproj-ref FETCH_HEAD &&
+ git subtree merge --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --branch subproj-br &&
+
+ # at this point, the new commit parent should be subproj-ref, if it is
+ # not, something went wrong (the "newparent" of "master~" commit should
+ # have been sub2, but it was not, because its cache was not set to
+ # itself)
+ test_equal "$(git log --pretty=format:%P -1 subproj-br)" "$(git rev-parse subproj-ref)"
+ )
+'
+
+test_expect_success 'split a new subtree without --onto option' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --branch subproj-br
+ ) &&
+ test_create_commit "$test_count" subdir2/main-sub2 &&
+ (
+ cd "$test_count" &&
-test_expect_success 'split for main-sub5 without --onto' '
# also test that we still can split out an entirely new subtree
# if the parent of the first commit in the tree is not empty,
# then the new subtree has accidently been attached to something
- git subtree split --prefix=subdir2 --branch mainsub5 &&
- test_equal "$(git log --pretty=format:%P -1 mainsub5)" ""
+ git subtree split --prefix=subdir2 --branch subproj2-br &&
+ test_equal "$(git log --pretty=format:%P -1 subproj2-br)" ""
+ )
'
test_expect_success 'verify one file change per commit' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git branch sub1 FETCH_HEAD &&
+ git subtree add --prefix=subdir sub1
+ ) &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count" subdir/main-sub1 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir --branch subproj-br
+ ) &&
+ test_create_commit "$test_count" subdir2/main-sub2 &&
+ (
+ cd "$test_count" &&
+ git subtree split --prefix=subdir2 --branch subproj2-br &&
+
x= &&
git log --pretty=format:"commit: %H" | join_commits |
(
@@ -465,6 +819,7 @@ test_expect_success 'verify one file change per commit' '
done
test_equal "$x" 1
)
+ )
'
test_done
--
1.7.10.4
^ permalink raw reply related
* [PATCH 10/13] contrib/subtree: Code cleaning and refactoring
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: Techlive Zheng <techlivezheng@gmail.com>
Mostly prepare for the later tests refactoring.
Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/t/t7900-subtree.sh | 270 ++++++++++++++++++------------------
1 file changed, 136 insertions(+), 134 deletions(-)
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index e6bcd50..9cfaaf9 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -4,7 +4,7 @@
#
test_description='Basic porcelain support for subtrees
-This test verifies the basic operation of the merge, pull, add
+This test verifies the basic operation of the add, pull, merge
and split subcommands of git subtree.
'
@@ -18,19 +18,6 @@ create()
git add "$1"
}
-
-check_equal()
-{
- test_debug 'echo'
- test_debug "echo \"check a:\" \"{$1}\""
- test_debug "echo \" b:\" \"{$2}\""
- if [ "$1" = "$2" ]; then
- return 0
- else
- return 1
- fi
-}
-
fixnl()
{
t=""
@@ -55,6 +42,42 @@ undo()
git reset --hard HEAD~
}
+test_equal()
+{
+ test_debug 'echo'
+ test_debug "echo \"check a:\" \"{$1}\""
+ test_debug "echo \" b:\" \"{$2}\""
+ if [ "$1" = "$2" ]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+# Make sure no patch changes more than one file.
+# The original set of commits changed only one file each.
+# A multi-file change would imply that we pruned commits
+# too aggressively.
+join_commits()
+{
+ commit=
+ all=
+ while read x y; do
+ if [ -z "$x" ]; then
+ continue
+ elif [ "$x" = "commit:" ]; then
+ if [ -n "$commit" ]; then
+ echo "$commit $all"
+ all=
+ fi
+ commit="$y"
+ else
+ all="$all $y"
+ fi
+ done
+ echo "$commit $all"
+}
+
last_commit_message()
{
git log --pretty=format:%s -1
@@ -97,7 +120,7 @@ test_expect_success 'add main4' '
create main4 &&
git commit -m "main4" &&
git branch -m master mainline &&
- git branch subdir
+ git branch init
'
test_expect_success 'fetch subproj history' '
@@ -105,40 +128,43 @@ test_expect_success 'fetch subproj history' '
git branch sub1 FETCH_HEAD
'
-test_expect_success 'no subtree exists in main tree' '
- test_must_fail git subtree merge --prefix=subdir sub1
-'
-
test_expect_success 'no pull from non-existant subtree' '
test_must_fail git subtree pull --prefix=subdir ./subproj sub1
'
-test_expect_success 'check if --message works for add' '
- git subtree add --prefix=subdir --message="Added subproject" sub1 &&
- check_equal ''"$(last_commit_message)"'' "Added subproject" &&
+test_expect_success 'no merge from non-existant subtree' '
+ test_must_fail git subtree merge --prefix=subdir FETCH_HEAD
+'
+
+test_expect_success 'add subproj as subtree into subdir/ with --prefix' '
+ git subtree add --prefix=subdir FETCH_HEAD &&
+ test_equal "$(last_commit_message)" "Add '\''subdir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''" &&
undo
'
-test_expect_success 'check if --message works as -m and --prefix as -P' '
- git subtree add -P subdir -m "Added subproject using git subtree" sub1 &&
- check_equal ''"$(last_commit_message)"'' "Added subproject using git subtree" &&
+test_expect_success 'add subproj as subtree into subdir/ with --prefix and --message' '
+ git subtree add --prefix=subdir --message="Added subproject" FETCH_HEAD &&
+ test_equal "$(last_commit_message)" "Added subproject" &&
undo
'
-test_expect_success 'check if --message works with squash too' '
- git subtree add -P subdir -m "Added subproject with squash" --squash sub1 &&
- check_equal ''"$(last_commit_message)"'' "Added subproject with squash" &&
+test_expect_success 'add subproj as subtree into subdir/ with --prefix as -P and --message as -m' '
+ git subtree add -P subdir -m "Added subproject" FETCH_HEAD &&
+ test_equal "$(last_commit_message)" "Added subproject" &&
undo
'
-test_expect_success 'add subproj to mainline' '
- git subtree add --prefix=subdir/ FETCH_HEAD &&
- check_equal ''"$(last_commit_message)"'' "Add '"'subdir/'"' from commit '"'"'''"$(git rev-parse sub1)"'''"'"'"
+test_expect_success 'add subproj as subtree into subdir/ with --squash and --prefix and --message' '
+ git subtree add --prefix=subdir --message="Added subproject with squash" --squash FETCH_HEAD &&
+ test_equal "$(last_commit_message)" "Added subproject with squash" &&
+ undo
'
-# this shouldn't actually do anything, since FETCH_HEAD is already a parent
-test_expect_success 'merge fetched subproj' '
- git merge -m "merge -s -ours" -s ours FETCH_HEAD
+test_expect_success 'merge the added subproj again, should do nothing' '
+ git subtree add --prefix=subdir FETCH_HEAD &&
+ # this shouldn not actually do anything, since FETCH_HEAD
+ # is already a parent
+ git merge -s ours -m "merge -s -ours" FETCH_HEAD
'
test_expect_success 'add main-sub5' '
@@ -161,25 +187,30 @@ test_expect_success 'fetch new subproj history' '
git branch sub2 FETCH_HEAD
'
-test_expect_success 'check if --message works for merge' '
- git subtree merge --prefix=subdir -m "Merged changes from subproject" sub2 &&
- check_equal ''"$(last_commit_message)"'' "Merged changes from subproject" &&
+test_expect_success 'merge new subproj history into subdir/ with --prefix' '
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ test_equal "$(last_commit_message)" "Merge commit '\''$(git rev-parse FETCH_HEAD)'\'' into mainline" &&
undo
'
-test_expect_success 'check if --message for merge works with squash too' '
- git subtree merge --prefix subdir -m "Merged changes from subproject using squash" --squash sub2 &&
- check_equal ''"$(last_commit_message)"'' "Merged changes from subproject using squash" &&
+test_expect_success 'merge new subproj history into subdir/ with --prefix and --message' '
+ git subtree merge --prefix=subdir --message="Merged changes from subproject" FETCH_HEAD &&
+ test_equal "$(last_commit_message)" "Merged changes from subproject" &&
undo
'
-test_expect_success 'merge new subproj history into subdir' '
+test_expect_success 'merge new subproj history into subdir/ with --squash and --prefix and --message' '
+ git subtree merge --prefix=subdir --message="Merged changes from subproject using squash" --squash FETCH_HEAD &&
+ test_equal "$(last_commit_message)" "Merged changes from subproject using squash" &&
+ undo
+'
+
+test_expect_success 'merge new subproj history into subdir/' '
git subtree merge --prefix=subdir FETCH_HEAD &&
- git branch pre-split &&
- check_equal ''"$(last_commit_message)"'' "Merge commit '"'"'"$(git rev-parse sub2)"'"'"' into mainline"
+ git branch pre-split
'
-test_expect_success 'Check that prefix argument is required for split' '
+test_expect_success 'split requires option --prefix' '
echo "You must provide the --prefix option." > expected &&
test_must_fail git subtree split > actual 2>&1 &&
test_debug "echo -n expected: " &&
@@ -190,59 +221,56 @@ test_expect_success 'Check that prefix argument is required for split' '
rm -f expected actual
'
-test_expect_success 'Check that the <prefix> exists for a split' '
- echo "'"'"'non-existent-directory'"'"'" does not exist\; use "'"'"'git subtree add'"'"'" > expected &&
+test_expect_success 'split requires path given by option --prefix must exist' '
+ echo "'\''non-existent-directory'\'' does not exist; use '\''git subtree add'\''" > expected &&
test_must_fail git subtree split --prefix=non-existent-directory > actual 2>&1 &&
test_debug "echo -n expected: " &&
test_debug "cat expected" &&
test_debug "echo -n actual: " &&
test_debug "cat actual" &&
- test_cmp expected actual
-# rm -f expected actual
+ test_cmp expected actual &&
+ rm -f expected actual
'
-test_expect_success 'check if --message works for split+rejoin' '
- spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
- git branch spl1 "$spl1" &&
- check_equal ''"$(last_commit_message)"'' "Split & rejoin" &&
- undo
-'
+test_expect_success 'split subdir/ with --rejoin' '
+ spl1=$(git subtree split --prefix=subdir --annotate="*") &&
+ git branch spl1 "$spl1" &&
+ git subtree split --prefix=subdir --annotate="*" --rejoin &&
+ test_equal "$(last_commit_message)" "Split '\''subdir/'\'' into commit '\''$spl1'\''" &&
+ undo
+ '
-test_expect_success 'check split with --branch' '
- spl1=$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin) &&
- undo &&
- git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --branch splitbr1 &&
- check_equal ''"$(git rev-parse splitbr1)"'' "$spl1"
+test_expect_success 'split subdir/ with --rejoin and --message' '
+ git subtree split --prefix=subdir --message="Split & rejoin" --annotate="*" --rejoin &&
+ test_equal "$(last_commit_message)" "Split & rejoin" &&
+ undo
'
-test_expect_success 'check hash of split' '
- spl1=$(git subtree split --prefix subdir) &&
- undo &&
- git subtree split --prefix subdir --branch splitbr1test &&
- check_equal ''"$(git rev-parse splitbr1test)"'' "$spl1"
- git checkout splitbr1test &&
- new_hash=$(git rev-parse HEAD~2) &&
- git checkout mainline &&
- check_equal ''"$new_hash"'' "$subdir_hash"
-'
+test_expect_success 'split subdir/ with --branch' '
+ spl1=$(git subtree split --prefix=subdir --message="Split & rejoin" --annotate="*" --rejoin) &&
+ undo &&
+ git subtree split --prefix=subdir --annotate="*" --branch splitbr1 &&
+ test_equal "$(git rev-parse splitbr1)" "$spl1"
+ '
-test_expect_success 'check split with --branch for an existing branch' '
- spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
+test_expect_success 'split subdir/ with --branch for an existing branch' '
+ spl1=$(git subtree split --prefix=subdir --annotate="*" --message="Split & rejoin" --rejoin) &&
undo &&
git branch splitbr2 sub1 &&
- git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --branch splitbr2 &&
- check_equal ''"$(git rev-parse splitbr2)"'' "$spl1"
+ git subtree split --prefix=subdir --annotate="*" --branch splitbr2 &&
+ test_equal "$(git rev-parse splitbr2)" "$spl1"
'
-test_expect_success 'check split with --branch for an incompatible branch' '
- test_must_fail git subtree split --prefix subdir --onto FETCH_HEAD --branch subdir
+test_expect_success 'split subdir/ with --branch for an incompatible branch' '
+ test_must_fail git subtree split --prefix=subdir --branch init
'
-test_expect_success 'check split+rejoin' '
- spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
+test_expect_success 'check --unannotate' '
+ spl1=$(git subtree split --unannotate="subproj:" --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin) &&
undo &&
- git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --rejoin &&
- check_equal ''"$(last_commit_message)"'' "Split '"'"'subdir/'"'"' into commit '"'"'"$spl1"'"'"'"
+ git subtree split --unannotate="subproj:" --prefix subdir --onto FETCH_HEAD --branch splitunann &&
+ test_equal "$(git rev-parse splitunann)" "$spl1" &&
+ test_equal "$(git log splitunann | grep subproj)" ""
'
test_expect_success 'add main-sub8' '
@@ -268,8 +296,8 @@ test_expect_success 'add sub9' '
cd ..
test_expect_success 'split for sub8' '
- split2=''"$(git subtree split --annotate='"'*'"' --prefix subdir/ --rejoin)"''
- git branch split2 "$split2"
+ spl2=$(git subtree split --prefix=subdir/ --annotate="*" --rejoin) &&
+ git branch spl2 "$spl2"
'
test_expect_success 'add main-sub10' '
@@ -278,7 +306,7 @@ test_expect_success 'add main-sub10' '
'
test_expect_success 'split for sub10' '
- spl3=''"$(git subtree split --annotate='"'*'"' --prefix subdir --rejoin)"'' &&
+ spl3=$(git subtree split --prefix=subdir --annotate="*" --rejoin) &&
git branch spl3 "$spl3"
'
@@ -299,13 +327,13 @@ chks="sub1 sub2 sub3 sub9"
chks_sub=$(echo $chks | multiline | sed 's,^,subdir/,' | fixnl)
test_expect_success 'make sure exactly the right set of files ends up in the subproj' '
- subfiles=''"$(git ls-files | fixnl)"'' &&
- check_equal "$subfiles" "$chkms $chks"
+ subfiles=$(git ls-files | fixnl) &&
+ test_equal "$subfiles" "$chkms $chks"
'
-test_expect_success 'make sure the subproj history *only* contains commits that affect the subdir' '
- allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | fixnl)"'' &&
- check_equal "$allchanges" "$chkms $chks"
+test_expect_success 'make sure the subproj *only* contains commits that affect the subdir' '
+ allchanges=$(git log --name-only --pretty=format:"" | sort | fixnl) &&
+ test_equal "$allchanges" "$chkms $chks"
'
# Back to mainline
@@ -318,25 +346,25 @@ test_expect_success 'pull from subproj' '
'
test_expect_success 'make sure exactly the right set of files ends up in the mainline' '
- mainfiles=''"$(git ls-files | fixnl)"'' &&
- check_equal "$mainfiles" "$chkm $chkms_sub $chks_sub"
+ mainfiles=$(git ls-files | fixnl) &&
+ test_equal "$mainfiles" "$chkm $chkms_sub $chks_sub"
'
test_expect_success 'make sure each filename changed exactly once in the entire history' '
# main-sub?? and /subdir/main-sub?? both change, because those are the
# changes that were split into their own history. And subdir/sub?? never
# change, since they were *only* changed in the subtree branch.
- allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | fixnl)"'' &&
- check_equal "$allchanges" ''"$(echo $chkms $chkm $chks $chkms_sub | multiline | sort | fixnl)"''
+ allchanges=$(git log --name-only --pretty=format:"" | sort | fixnl) &&
+ test_equal "$allchanges" "$(echo $chkms $chkm $chks $chkms_sub | multiline | sort | fixnl)"
'
test_expect_success 'make sure the --rejoin commits never make it into subproj' '
- check_equal ''"$(git log --pretty=format:'"'%s'"' HEAD^2 | grep -i split)"'' ""
+ test_equal "$(git log --pretty=format:"%s" HEAD^2 | grep -i split)" ""
'
test_expect_success 'make sure no "git subtree" tagged commits make it into subproj' '
# They are meaningless to subproj since one side of the merge refers to the mainline
- check_equal ''"$(git log --pretty=format:'"'%s%n%b'"' HEAD^2 | grep "git-subtree.*:")"'' ""
+ test_equal "$(git log --pretty=format:"%s%n%b" HEAD^2 | grep "git-subtree.*:")" ""
'
# prepare second pair of repositories
@@ -374,7 +402,7 @@ cd ../main
test_expect_success 'add sub as subdir in main' '
git fetch ../sub master &&
git branch sub2 FETCH_HEAD &&
- git subtree add --prefix subdir sub2
+ git subtree add --prefix=subdir sub2
'
cd ../sub
@@ -389,7 +417,7 @@ cd ../main
test_expect_success 'merge from sub' '
git fetch ../sub master &&
git branch sub3 FETCH_HEAD &&
- git subtree merge --prefix subdir sub3
+ git subtree merge --prefix=subdir sub3
'
test_expect_success 'add main-sub4' '
@@ -398,7 +426,7 @@ test_expect_success 'add main-sub4' '
'
test_expect_success 'split for main-sub4 without --onto' '
- git subtree split --prefix subdir --branch mainsub4
+ git subtree split --prefix=subdir --branch mainsub4
'
# at this point, the new commit parent should be sub3 if it is not,
@@ -407,7 +435,7 @@ test_expect_success 'split for main-sub4 without --onto' '
# itself)
test_expect_success 'check that the commit parent is sub3' '
- check_equal ''"$(git log --pretty=format:%P -1 mainsub4)"'' ''"$(git rev-parse sub3)"''
+ test_equal "$(git log --pretty=format:%P -1 mainsub4)" "$(git rev-parse sub3)"
'
test_expect_success 'add main-sub5' '
@@ -420,49 +448,23 @@ test_expect_success 'split for main-sub5 without --onto' '
# also test that we still can split out an entirely new subtree
# if the parent of the first commit in the tree is not empty,
# then the new subtree has accidently been attached to something
- git subtree split --prefix subdir2 --branch mainsub5 &&
- check_equal ''"$(git log --pretty=format:%P -1 mainsub5)"'' ""
+ git subtree split --prefix=subdir2 --branch mainsub5 &&
+ test_equal "$(git log --pretty=format:%P -1 mainsub5)" ""
'
-# make sure no patch changes more than one file. The original set of commits
-# changed only one file each. A multi-file change would imply that we pruned
-# commits too aggressively.
-joincommits()
-{
- commit=
- all=
- while read x y; do
- #echo "{$x}" >&2
- if [ -z "$x" ]; then
- continue
- elif [ "$x" = "commit:" ]; then
- if [ -n "$commit" ]; then
- echo "$commit $all"
- all=
- fi
- commit="$y"
- else
- all="$all $y"
- fi
- done
- echo "$commit $all"
-}
-
test_expect_success 'verify one file change per commit' '
x= &&
- list=''"$(git log --pretty=format:'"'commit: %H'"' | joincommits)"'' &&
-# test_debug "echo HERE" &&
-# test_debug "echo ''"$list"''" &&
- (git log --pretty=format:'"'commit: %H'"' | joincommits |
- ( while read commit a b; do
- test_debug "echo Verifying commit "''"$commit"''
- test_debug "echo a: "''"$a"''
- test_debug "echo b: "''"$b"''
- check_equal "$b" ""
+ git log --pretty=format:"commit: %H" | join_commits |
+ (
+ while read commit a b; do
+ test_debug "echo Verifying commit $commit"
+ test_debug "echo a: $a"
+ test_debug "echo b: $b"
+ test_equal "$b" ""
x=1
done
- check_equal "$x" 1
- ))
+ test_equal "$x" 1
+ )
'
test_done
--
1.7.10.4
^ permalink raw reply related
* [PATCH 13/13] contrib/subtree: Remove --annotate
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: "David A. Greene" <greened@obbligato.org>
Remove --annotate. This obviates the need for an --unannotate
command. We really want a more generalized commit message rewrite
mechanism.
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/git-subtree.sh | 6 +----
contrib/subtree/t/t7900-subtree.sh | 50 ++++++++++++++++++------------------
2 files changed, 26 insertions(+), 30 deletions(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 0493e47..888a191 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -21,7 +21,6 @@ d show debug messages
P,prefix= the name of the subdir to split out
m,message= use the given message as the commit message for the merge commit
options for 'split'
-annotate= add a prefix to commit message of new commits
b,branch= create a new branch from the split subtree
ignore-joins ignore prior --rejoin commits
onto= try connecting new tree to an existing one
@@ -43,7 +42,6 @@ command=
onto=
rejoin=
ignore_joins=
-annotate=
squash=
message=
@@ -79,8 +77,6 @@ while [ $# -gt 0 ]; do
case "$opt" in
-q) quiet=1 ;;
-d) debug=1 ;;
- --annotate) annotate="$1"; shift ;;
- --no-annotate) annotate= ;;
-b) branch="$1"; shift ;;
-P) prefix="${1%/}"; shift ;;
-m) message="$1"; shift ;;
@@ -311,7 +307,7 @@ copy_commit()
GIT_COMMITTER_NAME \
GIT_COMMITTER_EMAIL \
GIT_COMMITTER_DATE
- (echo -n "$annotate"; cat ) |
+ (echo -n ""; cat ) |
git commit-tree "$2" $3 # reads the rest of stdin
) || die "Can't copy commit $1"
}
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 1afd544..59889f1 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -318,8 +318,8 @@ test_expect_success 'split subdir/ with --rejoin' '
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- split_hash=$(git subtree split --prefix=subdir --annotate="*") &&
- git subtree split --prefix=subdir --annotate="*" --rejoin &&
+ split_hash=$(git subtree split --prefix=subdir) &&
+ git subtree split --prefix=subdir --rejoin &&
test_equal "$(last_commit_message)" "Split '\''subdir/'\'' into commit '\''$split_hash'\''"
)
'
@@ -342,7 +342,7 @@ test_expect_success 'split subdir/ with --rejoin and --message' '
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- git subtree split --prefix=subdir --message="Split & rejoin" --annotate="*" --rejoin &&
+ git subtree split --prefix=subdir --message="Split & rejoin" --rejoin &&
test_equal "$(last_commit_message)" "Split & rejoin"
)
'
@@ -365,8 +365,8 @@ test_expect_success 'split subdir/ with --branch' '
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- split_hash=$(git subtree split --prefix=subdir --annotate="*") &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br &&
+ split_hash=$(git subtree split --prefix=subdir) &&
+ git subtree split --prefix=subdir --branch subproj-br &&
test_equal "$(git rev-parse subproj-br)" "$split_hash"
)
'
@@ -390,8 +390,8 @@ test_expect_success 'split subdir/ with --branch for an existing branch' '
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- split_hash=$(git subtree split --prefix=subdir --annotate="*") &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br &&
+ split_hash=$(git subtree split --prefix=subdir) &&
+ git subtree split --prefix=subdir --branch subproj-br &&
test_equal "$(git rev-parse subproj-br)" "$split_hash"
)
'
@@ -441,7 +441,7 @@ test_expect_success 'make sure exactly the right set of files ends up in the sub
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count/subproj" sub3 &&
test_create_commit "$test_count" subdir/main-sub3 &&
@@ -452,12 +452,12 @@ test_expect_success 'make sure exactly the right set of files ends up in the sub
test_create_commit "$test_count/subproj" sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count" subdir/main-sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
(
cd "$test_count/subproj" &&
@@ -491,7 +491,7 @@ test_expect_success 'make sure the subproj *only* contains commits that affect t
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count/subproj" sub3 &&
test_create_commit "$test_count" subdir/main-sub3 &&
@@ -502,12 +502,12 @@ test_expect_success 'make sure the subproj *only* contains commits that affect t
test_create_commit "$test_count/subproj" sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count" subdir/main-sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
(
cd "$test_count/subproj" &&
@@ -541,7 +541,7 @@ test_expect_success 'make sure exactly the right set of files ends up in the mai
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count/subproj" sub3 &&
test_create_commit "$test_count" subdir/main-sub3 &&
@@ -552,12 +552,12 @@ test_expect_success 'make sure exactly the right set of files ends up in the mai
test_create_commit "$test_count/subproj" sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count" subdir/main-sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
(
cd "$test_count/subproj" &&
@@ -595,7 +595,7 @@ test_expect_success 'make sure each filename changed exactly once in the entire
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count/subproj" sub3 &&
test_create_commit "$test_count" subdir/main-sub3 &&
@@ -606,12 +606,12 @@ test_expect_success 'make sure each filename changed exactly once in the entire
test_create_commit "$test_count/subproj" sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count" subdir/main-sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
(
cd "$test_count/subproj" &&
@@ -653,7 +653,7 @@ test_expect_success 'make sure the --rejoin commits never make it into subproj'
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count/subproj" sub3 &&
test_create_commit "$test_count" subdir/main-sub3 &&
@@ -664,12 +664,12 @@ test_expect_success 'make sure the --rejoin commits never make it into subproj'
test_create_commit "$test_count/subproj" sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count" subdir/main-sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
(
cd "$test_count/subproj" &&
@@ -701,7 +701,7 @@ test_expect_success 'make sure no "git subtree" tagged commits make it into subp
cd "$test_count" &&
git fetch ./subproj master &&
git subtree merge --prefix=subdir FETCH_HEAD &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count/subproj" sub3 &&
test_create_commit "$test_count" subdir/main-sub3 &&
@@ -712,12 +712,12 @@ test_expect_success 'make sure no "git subtree" tagged commits make it into subp
test_create_commit "$test_count/subproj" sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
test_create_commit "$test_count" subdir/main-sub4 &&
(
cd "$test_count" &&
- git subtree split --prefix=subdir --annotate="*" --branch subproj-br --rejoin
+ git subtree split --prefix=subdir --branch subproj-br --rejoin
) &&
(
cd "$test_count/subproj" &&
--
1.7.10.4
^ permalink raw reply related
* [PATCH 12/13] contrib/subtree: Handle '--prefix' argument with a slash appended
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: Techlive Zheng <techlivezheng@gmail.com>
'git subtree merge' will fail if the argument of '--prefix' has a slash
appended.
Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/git-subtree.sh | 2 +-
contrib/subtree/t/t7900-subtree.sh | 19 +++++++++++++++++++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index c72af95..0493e47 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -82,7 +82,7 @@ while [ $# -gt 0 ]; do
--annotate) annotate="$1"; shift ;;
--no-annotate) annotate= ;;
-b) branch="$1"; shift ;;
- -P) prefix="$1"; shift ;;
+ -P) prefix="${1%/}"; shift ;;
-m) message="$1"; shift ;;
--no-prefix) prefix= ;;
--onto) onto="$1"; shift ;;
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 769b116..1afd544 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -239,6 +239,25 @@ test_expect_success 'merge new subproj history into subdir/ with --squash and --
)
'
+test_expect_success 'merge new subproj history into subdir/ with a slash appended to the argument of --prefix' '
+ test_create_repo "$test_count" &&
+ test_create_repo "$test_count/subproj" &&
+ test_create_commit "$test_count" main1 &&
+ test_create_commit "$test_count/subproj" sub1 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree add --prefix=subdir/ FETCH_HEAD
+ ) &&
+ test_create_commit "$test_count/subproj" sub2 &&
+ (
+ cd "$test_count" &&
+ git fetch ./subproj master &&
+ git subtree merge --prefix=subdir/ FETCH_HEAD &&
+ test_equal "$(last_commit_message)" "Merge commit '\''$(git rev-parse FETCH_HEAD)'\''"
+ )
+'
+
#
# Tests for 'git subtree split'
#
--
1.7.10.4
^ permalink raw reply related
* Re: [PATCH 09/13] contrib/subtree: Ignore testing directory
From: Junio C Hamano @ 2013-02-05 4:36 UTC (permalink / raw)
To: David A. Greene
Cc: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani,
"David A. Greene <greened
In-Reply-To: <1360037173-23291-10-git-send-email-greened@obbligato.org>
"David A. Greene" <greened@obbligato.org> writes:
> From: Techlive Zheng <techlivezheng@gmail.com>
>
Justification is missing here.
contrib/subtree/Makefile seems to do "rm -rf" on 'mainline' and
'subproj' in its "clean" target, which makes them look like
build/test artifacts that need to be ignored.
If they are no longer build/test artifacts, perhaps their removal
also need to be dropped from the Makefile?
> Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
> Signed-off-by: David A. Greene <greened@obbligato.org>
> ---
> contrib/subtree/.gitignore | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/contrib/subtree/.gitignore b/contrib/subtree/.gitignore
> index 91360a3..59aeeb4 100644
> --- a/contrib/subtree/.gitignore
> +++ b/contrib/subtree/.gitignore
> @@ -1,6 +1,5 @@
> *~
> git-subtree
> -git-subtree.xml
> git-subtree.1
> -mainline
> -subproj
> +git-subtree.xml
> +t/trash\ directory.*
^ permalink raw reply
* Re: [PATCH 08/13] contrib/subtree: Add vim modeline
From: Junio C Hamano @ 2013-02-05 4:32 UTC (permalink / raw)
To: David A. Greene
Cc: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani,
"David A. Greene <greened
In-Reply-To: <1360037173-23291-9-git-send-email-greened@obbligato.org>
"David A. Greene" <greened@obbligato.org> writes:
> From: Techlive Zheng <techlivezheng@gmail.com>
>
> Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
> Signed-off-by: David A. Greene <greened@obbligato.org>
> ---
> contrib/subtree/git-subtree.sh | 2 ++
> contrib/subtree/t/t7900-subtree.sh | 2 ++
> 2 files changed, 4 insertions(+)
>
> diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
> index 6c3929b..c72af95 100755
> --- a/contrib/subtree/git-subtree.sh
> +++ b/contrib/subtree/git-subtree.sh
> @@ -722,3 +722,5 @@ cmd_push()
> }
>
> "cmd_$command" "$@"
> +
> +# vim: set ts=4 sw=4 noet
> diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
> index e6a3702..e6bcd50 100755
> --- a/contrib/subtree/t/t7900-subtree.sh
> +++ b/contrib/subtree/t/t7900-subtree.sh
> @@ -466,3 +466,5 @@ test_expect_success 'verify one file change per commit' '
> '
>
> test_done
> +
> +# vim: set ts=4 sw=4 noet
Please don't.
^ permalink raw reply
* [PATCH 08/13] contrib/subtree: Add vim modeline
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/git-subtree.sh | 2 ++
contrib/subtree/t/t7900-subtree.sh | 2 ++
2 files changed, 4 insertions(+)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 6c3929b..c72af95 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -722,3 +722,5 @@ cmd_push()
}
"cmd_$command" "$@"
+
+# vim: set ts=4 sw=4 noet
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index e6a3702..e6bcd50 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -466,3 +466,5 @@ test_expect_success 'verify one file change per commit' '
'
test_done
+
+# vim: set ts=4 sw=4 noet
--
1.7.10.4
^ permalink raw reply related
* [PATCH 09/13] contrib/subtree: Ignore testing directory
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/.gitignore | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/contrib/subtree/.gitignore b/contrib/subtree/.gitignore
index 91360a3..59aeeb4 100644
--- a/contrib/subtree/.gitignore
+++ b/contrib/subtree/.gitignore
@@ -1,6 +1,5 @@
*~
git-subtree
-git-subtree.xml
git-subtree.1
-mainline
-subproj
+git-subtree.xml
+t/trash\ directory.*
--
1.7.10.4
^ permalink raw reply related
* [PATCH 07/13] contrib/subtree: Fix whitespaces
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: Techlive Zheng <techlivezheng@gmail.com>
Previous code does not fulfill Git's whitespace policy.
Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/git-subtree.sh | 68 ++++----
contrib/subtree/git-subtree.txt | 42 ++---
contrib/subtree/t/t7900-subtree.sh | 314 ++++++++++++++++++------------------
3 files changed, 212 insertions(+), 212 deletions(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 8a23f58..6c3929b 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -5,7 +5,7 @@
# Copyright (C) 2009 Avery Pennarun <apenwarr@gmail.com>
#
if [ $# -eq 0 ]; then
- set -- -h
+ set -- -h
fi
OPTS_SPEC="\
git subtree add --prefix=<prefix> <commit>
@@ -111,9 +111,9 @@ if [ -z "$prefix" ]; then
fi
case "$command" in
- add) [ -e "$prefix" ] &&
+ add) [ -e "$prefix" ] &&
die "prefix '$prefix' already exists." ;;
- *) [ -e "$prefix" ] ||
+ *) [ -e "$prefix" ] ||
die "'$prefix' does not exist; use 'git subtree add'" ;;
esac
@@ -182,8 +182,8 @@ cache_set()
oldrev="$1"
newrev="$2"
if [ "$oldrev" != "latest_old" \
- -a "$oldrev" != "latest_new" \
- -a -e "$cachedir/$oldrev" ]; then
+ -a "$oldrev" != "latest_new" \
+ -a -e "$cachedir/$oldrev" ]; then
die "cache for $oldrev already exists!"
fi
echo "$newrev" >"$cachedir/$oldrev"
@@ -305,7 +305,7 @@ copy_commit()
read GIT_COMMITTER_NAME
read GIT_COMMITTER_EMAIL
read GIT_COMMITTER_DATE
- export GIT_AUTHOR_NAME \
+ export GIT_AUTHOR_NAME \
GIT_AUTHOR_EMAIL \
GIT_AUTHOR_DATE \
GIT_COMMITTER_NAME \
@@ -328,7 +328,7 @@ add_msg()
fi
cat <<-EOF
$commit_message
-
+
git-subtree-dir: $dir
git-subtree-mainline: $latest_old
git-subtree-split: $latest_new
@@ -356,7 +356,7 @@ rejoin_msg()
fi
cat <<-EOF
$commit_message
-
+
git-subtree-dir: $dir
git-subtree-mainline: $latest_old
git-subtree-split: $latest_new
@@ -369,7 +369,7 @@ squash_msg()
oldsub="$2"
newsub="$3"
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"
@@ -379,7 +379,7 @@ squash_msg()
else
echo "Squashed '$dir/' content from commit $newsub_short"
fi
-
+
echo
echo "git-subtree-dir: $dir"
echo "git-subtree-split: $newsub"
@@ -428,7 +428,7 @@ new_squash_commit()
newsub="$3"
tree=$(toptree_for_commit $newsub) || exit $?
if [ -n "$old" ]; then
- squash_msg "$dir" "$oldsub" "$newsub" |
+ squash_msg "$dir" "$oldsub" "$newsub" |
git commit-tree "$tree" -p "$old" || exit $?
else
squash_msg "$dir" "" "$newsub" |
@@ -456,7 +456,7 @@ copy_or_skip()
else
nonidentical="$parent"
fi
-
+
# sometimes both old parents map to the same newparent;
# eliminate duplicates
is_new=1
@@ -471,7 +471,7 @@ copy_or_skip()
p="$p -p $parent"
fi
done
-
+
if [ -n "$identical" ]; then
echo $identical
else
@@ -496,7 +496,7 @@ cmd_add()
fi
ensure_clean
-
+
if [ $# -eq 1 ]; then
git rev-parse -q --verify "$1^{commit}" >/dev/null ||
die "'$1' does not refer to a commit"
@@ -513,8 +513,8 @@ cmd_add()
"cmd_add_repository" "$@"
else
- say "error: parameters were '$@'"
- die "Provide either a commit or a repository and commit."
+ say "error: parameters were '$@'"
+ die "Provide either a commit or a repository and commit."
fi
}
@@ -534,19 +534,19 @@ cmd_add_commit()
revs=$(git rev-parse $default --revs-only "$@") || exit $?
set -- $revs
rev="$1"
-
+
debug "Adding $dir as '$rev'..."
git read-tree --prefix="$dir" $rev || exit $?
git checkout -- "$dir" || exit $?
tree=$(git write-tree) || exit $?
-
+
headrev=$(git rev-parse HEAD) || exit $?
if [ -n "$headrev" -a "$headrev" != "$rev" ]; then
headp="-p $headrev"
else
headp=
fi
-
+
if [ -n "$squash" ]; then
rev=$(new_squash_commit "" "" "$rev") || exit $?
commit=$(add_squashed_msg "$rev" "$dir" |
@@ -556,7 +556,7 @@ cmd_add_commit()
git commit-tree $tree $headp -p "$rev") || exit $?
fi
git reset "$commit" || exit $?
-
+
say "Added dir '$dir'"
}
@@ -564,7 +564,7 @@ cmd_split()
{
debug "Splitting $dir..."
cache_setup || exit $?
-
+
if [ -n "$onto" ]; then
debug "Reading history for --onto=$onto..."
git rev-list $onto |
@@ -575,13 +575,13 @@ cmd_split()
cache_set $rev $rev
done
fi
-
+
if [ -n "$ignore_joins" ]; then
unrevs=
else
unrevs="$(find_existing_splits "$dir" "$revs")"
fi
-
+
# 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)
@@ -603,12 +603,12 @@ cmd_split()
debug " parents: $parents"
newparents=$(cache_get $parents)
debug " newparents: $newparents"
-
+
tree=$(subtree_for_commit $rev "$dir")
debug " tree is: $tree"
check_parents $parents
-
+
# ugly. is there no better way to tell if this is a subtree
# vs. a mainline commit? Does it matter?
if [ -z $tree ]; then
@@ -629,7 +629,7 @@ cmd_split()
if [ -z "$latest_new" ]; then
die "No new revisions were found"
fi
-
+
if [ -n "$rejoin" ]; then
debug "Merging split branch into HEAD..."
latest_old=$(cache_get latest_old)
@@ -657,13 +657,13 @@ cmd_merge()
{
revs=$(git rev-parse $default --revs-only "$@") || exit $?
ensure_clean
-
+
set -- $revs
if [ $# -ne 1 ]; then
die "You must provide exactly one revision. Got: '$revs'"
fi
rev="$1"
-
+
if [ -n "$squash" ]; then
first_split="$(find_latest_squash "$dir")"
if [ -z "$first_split" ]; then
@@ -709,15 +709,15 @@ cmd_pull()
cmd_push()
{
if [ $# -ne 2 ]; then
- die "You must provide <repository> <refspec>"
+ die "You must provide <repository> <refspec>"
fi
if [ -e "$dir" ]; then
- repository=$1
- refspec=$2
- echo "git push using: " $repository $refspec
- git push $repository $(git subtree split --prefix=$prefix):refs/heads/$refspec
+ repository=$1
+ refspec=$2
+ echo "git push using: " $repository $refspec
+ git push $repository $(git subtree split --prefix=$prefix):refs/heads/$refspec
else
- die "'$dir' must already exist. Try 'git subtree add'."
+ die "'$dir' must already exist. Try 'git subtree add'."
fi
}
diff --git a/contrib/subtree/git-subtree.txt b/contrib/subtree/git-subtree.txt
index 7ba853e..aae9d19 100644
--- a/contrib/subtree/git-subtree.txt
+++ b/contrib/subtree/git-subtree.txt
@@ -87,15 +87,15 @@ merge::
go back in time from v2.5 to v2.4, for example. If your
merge introduces a conflict, you can resolve it in the
usual ways.
-
+
pull::
Exactly like 'merge', but parallels 'git pull' in that
it fetches the given commit from the specified remote
repository.
-
+
push::
Does a 'split' (see below) using the <prefix> supplied
- and then does a 'git push' to push the result to the
+ and then does a 'git push' to push the result to the
repository and refspec. This can be used to push your
subtree to different branches of the remote repository.
@@ -107,19 +107,19 @@ split::
contents of <prefix> at the root of the project instead
of in a subdirectory. Thus, the newly created history
is suitable for export as a separate git repository.
-
+
After splitting successfully, a single commit id is
printed to stdout. This corresponds to the HEAD of the
newly created tree, which you can manipulate however you
want.
-
+
Repeated splits of exactly the same history are
guaranteed to be identical (ie. to produce the same
commit ids). Because of this, if you add new commits
and then re-split, the new commits will be attached as
commits on top of the history you generated last time,
so 'git merge' and friends will work as expected.
-
+
Note that if you use '--squash' when you merge, you
should usually not just '--rejoin' when you split.
@@ -156,26 +156,26 @@ OPTIONS FOR add, merge, push, pull
project, produce only a single commit that contains all
the differences you want to merge, and then merge that
new commit into your project.
-
+
Using this option helps to reduce log clutter. People
rarely want to see every change that happened between
v1.0 and v1.1 of the library they're using, since none of the
interim versions were ever included in their application.
-
+
Using '--squash' also helps avoid problems when the same
subproject is included multiple times in the same
project, or is removed and then re-added. In such a
case, it doesn't make sense to combine the histories
anyway, since it's unclear which part of the history
belongs to which subtree.
-
+
Furthermore, with '--squash', you can switch back and
forth between different versions of a subtree, rather
than strictly forward. 'git subtree merge --squash'
always adjusts the subtree to match the exactly
specified commit, even if getting to that commit would
require undoing some changes that were added earlier.
-
+
Whether or not you use '--squash', changes made in your
local repository remain intact and can be later split
and send upstream to the subproject.
@@ -191,11 +191,11 @@ OPTIONS FOR split
commits with the same commit message, but possibly
different content, from the original commits, this can help
to differentiate them and avoid confusion.
-
+
Whenever you split, you need to use the same
<annotation>, or else you don't have a guarantee that
the new re-created history will be identical to the old
- one. That will prevent merging from working correctly.
+ one. That will prevent merging from working correctly.
git subtree tries to make it work anyway, particularly
if you use --rejoin, but it may not always be effective.
@@ -204,8 +204,8 @@ OPTIONS FOR split
This option is only valid for the split command.
After generating the synthetic history, create a new
- branch called <branch> that contains the new history.
- This is suitable for immediate pushing upstream.
+ branch called <branch> that contains the new history.
+ This is suitable for immediate pushing upstream.
<branch> must not already exist.
--ignore-joins::
@@ -228,7 +228,7 @@ OPTIONS FOR split
revision of the subproject's history that was imported
into your project, and git subtree will attempt to build
its history from there.
-
+
If you used 'git subtree add', you should never need
this option.
@@ -239,18 +239,18 @@ OPTIONS FOR split
history back into your main project. That way, future
splits can search only the part of history that has
been added since the most recent --rejoin.
-
+
If your split commits end up merged into the upstream
subproject, and then you want to get the latest upstream
version, this will allow git's merge algorithm to more
intelligently avoid conflicts (since it knows these
synthetic commits are already part of the upstream
repository).
-
+
Unfortunately, using this option results in 'git log'
showing an extra copy of every new commit that was
created (the original, and the synthetic one).
-
+
If you do all your merges with '--squash', don't use
'--rejoin' when you split, because you don't want the
subproject's history to be part of your project anyway.
@@ -285,7 +285,7 @@ First, get your own copy of the git.git repository:
$ cd test-git
gitweb (commit 1130ef3) was merged into git as of commit
-0a8f4f0, after which it was no longer maintained separately.
+0a8f4f0, after which it was no longer maintained separately.
But imagine it had been maintained separately, and we wanted to
extract git's changes to gitweb since that time, to share with
the upstream. You could do this:
@@ -295,7 +295,7 @@ the upstream. You could do this:
--branch gitweb-latest
$ gitk gitweb-latest
$ git push git@github.com:whatever/gitweb.git gitweb-latest:master
-
+
(We use '0a8f4f0^..' because that means "all the changes from
0a8f4f0 to the current version, including 0a8f4f0 itself.")
@@ -329,7 +329,7 @@ And fast forward again:
$ git subtree merge --prefix=gitweb --squash gitweb-latest
And notice that your change is still intact:
-
+
$ ls -l gitweb/myfile
And you can split it out and look at your changes versus
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 3f17f55..e6a3702 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -23,7 +23,7 @@ check_equal()
{
test_debug 'echo'
test_debug "echo \"check a:\" \"{$1}\""
- test_debug "echo \" b:\" \"{$2}\""
+ test_debug "echo \" b:\" \"{$2}\""
if [ "$1" = "$2" ]; then
return 0
else
@@ -61,17 +61,17 @@ last_commit_message()
}
test_expect_success 'init subproj' '
- test_create_repo subproj
+ test_create_repo subproj
'
# To the subproject!
cd subproj
test_expect_success 'add sub1' '
- create sub1 &&
- git commit -m "sub1" &&
- git branch sub1 &&
- git branch -m master subproj
+ create sub1 &&
+ git commit -m "sub1" &&
+ git branch sub1 &&
+ git branch -m master subproj
'
# Save this hash for testing later.
@@ -79,140 +79,140 @@ test_expect_success 'add sub1' '
subdir_hash=`git rev-parse HEAD`
test_expect_success 'add sub2' '
- create sub2 &&
- git commit -m "sub2" &&
- git branch sub2
+ create sub2 &&
+ git commit -m "sub2" &&
+ git branch sub2
'
test_expect_success 'add sub3' '
- create sub3 &&
- git commit -m "sub3" &&
- git branch sub3
+ create sub3 &&
+ git commit -m "sub3" &&
+ git branch sub3
'
# Back to mainline
cd ..
test_expect_success 'add main4' '
- create main4 &&
- git commit -m "main4" &&
- git branch -m master mainline &&
- git branch subdir
+ create main4 &&
+ git commit -m "main4" &&
+ git branch -m master mainline &&
+ git branch subdir
'
test_expect_success 'fetch subproj history' '
- git fetch ./subproj sub1 &&
- git branch sub1 FETCH_HEAD
+ git fetch ./subproj sub1 &&
+ git branch sub1 FETCH_HEAD
'
test_expect_success 'no subtree exists in main tree' '
- test_must_fail git subtree merge --prefix=subdir sub1
+ test_must_fail git subtree merge --prefix=subdir sub1
'
test_expect_success 'no pull from non-existant subtree' '
- test_must_fail git subtree pull --prefix=subdir ./subproj sub1
+ test_must_fail git subtree pull --prefix=subdir ./subproj sub1
'
test_expect_success 'check if --message works for add' '
- git subtree add --prefix=subdir --message="Added subproject" sub1 &&
- check_equal ''"$(last_commit_message)"'' "Added subproject" &&
- undo
+ git subtree add --prefix=subdir --message="Added subproject" sub1 &&
+ check_equal ''"$(last_commit_message)"'' "Added subproject" &&
+ undo
'
test_expect_success 'check if --message works as -m and --prefix as -P' '
- git subtree add -P subdir -m "Added subproject using git subtree" sub1 &&
- check_equal ''"$(last_commit_message)"'' "Added subproject using git subtree" &&
- undo
+ git subtree add -P subdir -m "Added subproject using git subtree" sub1 &&
+ check_equal ''"$(last_commit_message)"'' "Added subproject using git subtree" &&
+ undo
'
test_expect_success 'check if --message works with squash too' '
- git subtree add -P subdir -m "Added subproject with squash" --squash sub1 &&
- check_equal ''"$(last_commit_message)"'' "Added subproject with squash" &&
- undo
+ git subtree add -P subdir -m "Added subproject with squash" --squash sub1 &&
+ check_equal ''"$(last_commit_message)"'' "Added subproject with squash" &&
+ undo
'
test_expect_success 'add subproj to mainline' '
- git subtree add --prefix=subdir/ FETCH_HEAD &&
- check_equal ''"$(last_commit_message)"'' "Add '"'subdir/'"' from commit '"'"'''"$(git rev-parse sub1)"'''"'"'"
+ git subtree add --prefix=subdir/ FETCH_HEAD &&
+ check_equal ''"$(last_commit_message)"'' "Add '"'subdir/'"' from commit '"'"'''"$(git rev-parse sub1)"'''"'"'"
'
# this shouldn't actually do anything, since FETCH_HEAD is already a parent
test_expect_success 'merge fetched subproj' '
- git merge -m "merge -s -ours" -s ours FETCH_HEAD
+ git merge -m "merge -s -ours" -s ours FETCH_HEAD
'
test_expect_success 'add main-sub5' '
- create subdir/main-sub5 &&
- git commit -m "main-sub5"
+ create subdir/main-sub5 &&
+ git commit -m "subproj: main-sub5"
'
test_expect_success 'add main6' '
- create main6 &&
- git commit -m "main6 boring"
+ create main6 &&
+ git commit -m "main6 boring"
'
test_expect_success 'add main-sub7' '
- create subdir/main-sub7 &&
- git commit -m "main-sub7"
+ create subdir/main-sub7 &&
+ git commit -m "subproj: main-sub7"
'
test_expect_success 'fetch new subproj history' '
- git fetch ./subproj sub2 &&
- git branch sub2 FETCH_HEAD
+ git fetch ./subproj sub2 &&
+ git branch sub2 FETCH_HEAD
'
test_expect_success 'check if --message works for merge' '
- git subtree merge --prefix=subdir -m "Merged changes from subproject" sub2 &&
- check_equal ''"$(last_commit_message)"'' "Merged changes from subproject" &&
- undo
+ git subtree merge --prefix=subdir -m "Merged changes from subproject" sub2 &&
+ check_equal ''"$(last_commit_message)"'' "Merged changes from subproject" &&
+ undo
'
test_expect_success 'check if --message for merge works with squash too' '
- git subtree merge --prefix subdir -m "Merged changes from subproject using squash" --squash sub2 &&
- check_equal ''"$(last_commit_message)"'' "Merged changes from subproject using squash" &&
- undo
+ git subtree merge --prefix subdir -m "Merged changes from subproject using squash" --squash sub2 &&
+ check_equal ''"$(last_commit_message)"'' "Merged changes from subproject using squash" &&
+ undo
'
test_expect_success 'merge new subproj history into subdir' '
- git subtree merge --prefix=subdir FETCH_HEAD &&
- git branch pre-split &&
- check_equal ''"$(last_commit_message)"'' "Merge commit '"'"'"$(git rev-parse sub2)"'"'"' into mainline"
+ git subtree merge --prefix=subdir FETCH_HEAD &&
+ git branch pre-split &&
+ check_equal ''"$(last_commit_message)"'' "Merge commit '"'"'"$(git rev-parse sub2)"'"'"' into mainline"
'
test_expect_success 'Check that prefix argument is required for split' '
- echo "You must provide the --prefix option." > expected &&
- test_must_fail git subtree split > actual 2>&1 &&
- test_debug "echo -n expected: " &&
- test_debug "cat expected" &&
- test_debug "echo -n actual: " &&
- test_debug "cat actual" &&
- test_cmp expected actual &&
- rm -f expected actual
+ echo "You must provide the --prefix option." > expected &&
+ test_must_fail git subtree split > actual 2>&1 &&
+ test_debug "echo -n expected: " &&
+ test_debug "cat expected" &&
+ test_debug "echo -n actual: " &&
+ test_debug "cat actual" &&
+ test_cmp expected actual &&
+ rm -f expected actual
'
test_expect_success 'Check that the <prefix> exists for a split' '
- echo "'"'"'non-existent-directory'"'"'" does not exist\; use "'"'"'git subtree add'"'"'" > expected &&
- test_must_fail git subtree split --prefix=non-existent-directory > actual 2>&1 &&
- test_debug "echo -n expected: " &&
- test_debug "cat expected" &&
- test_debug "echo -n actual: " &&
- test_debug "cat actual" &&
- test_cmp expected actual
-# rm -f expected actual
+ echo "'"'"'non-existent-directory'"'"'" does not exist\; use "'"'"'git subtree add'"'"'" > expected &&
+ test_must_fail git subtree split --prefix=non-existent-directory > actual 2>&1 &&
+ test_debug "echo -n expected: " &&
+ test_debug "cat expected" &&
+ test_debug "echo -n actual: " &&
+ test_debug "cat actual" &&
+ test_cmp expected actual
+# rm -f expected actual
'
test_expect_success 'check if --message works for split+rejoin' '
- spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
- git branch spl1 "$spl1" &&
- check_equal ''"$(last_commit_message)"'' "Split & rejoin" &&
- undo
+ spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
+ git branch spl1 "$spl1" &&
+ check_equal ''"$(last_commit_message)"'' "Split & rejoin" &&
+ undo
'
test_expect_success 'check split with --branch' '
- spl1=$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin) &&
- undo &&
- git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --branch splitbr1 &&
- check_equal ''"$(git rev-parse splitbr1)"'' "$spl1"
+ spl1=$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin) &&
+ undo &&
+ git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --branch splitbr1 &&
+ check_equal ''"$(git rev-parse splitbr1)"'' "$spl1"
'
test_expect_success 'check hash of split' '
@@ -227,69 +227,69 @@ test_expect_success 'check hash of split' '
'
test_expect_success 'check split with --branch for an existing branch' '
- spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
- undo &&
- git branch splitbr2 sub1 &&
- git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --branch splitbr2 &&
- check_equal ''"$(git rev-parse splitbr2)"'' "$spl1"
+ spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
+ undo &&
+ git branch splitbr2 sub1 &&
+ git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --branch splitbr2 &&
+ check_equal ''"$(git rev-parse splitbr2)"'' "$spl1"
'
test_expect_success 'check split with --branch for an incompatible branch' '
- test_must_fail git subtree split --prefix subdir --onto FETCH_HEAD --branch subdir
+ test_must_fail git subtree split --prefix subdir --onto FETCH_HEAD --branch subdir
'
test_expect_success 'check split+rejoin' '
- spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
- undo &&
- git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --rejoin &&
- check_equal ''"$(last_commit_message)"'' "Split '"'"'subdir/'"'"' into commit '"'"'"$spl1"'"'"'"
+ spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
+ undo &&
+ git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --rejoin &&
+ check_equal ''"$(last_commit_message)"'' "Split '"'"'subdir/'"'"' into commit '"'"'"$spl1"'"'"'"
'
test_expect_success 'add main-sub8' '
- create subdir/main-sub8 &&
- git commit -m "main-sub8"
+ create subdir/main-sub8 &&
+ git commit -m "main-sub8"
'
# To the subproject!
cd ./subproj
test_expect_success 'merge split into subproj' '
- git fetch .. spl1 &&
- git branch spl1 FETCH_HEAD &&
- git merge FETCH_HEAD
+ git fetch .. spl1 &&
+ git branch spl1 FETCH_HEAD &&
+ git merge FETCH_HEAD
'
test_expect_success 'add sub9' '
- create sub9 &&
- git commit -m "sub9"
+ create sub9 &&
+ git commit -m "sub9"
'
# Back to mainline
cd ..
test_expect_success 'split for sub8' '
- split2=''"$(git subtree split --annotate='"'*'"' --prefix subdir/ --rejoin)"''
- git branch split2 "$split2"
+ split2=''"$(git subtree split --annotate='"'*'"' --prefix subdir/ --rejoin)"''
+ git branch split2 "$split2"
'
test_expect_success 'add main-sub10' '
- create subdir/main-sub10 &&
- git commit -m "main-sub10"
+ create subdir/main-sub10 &&
+ git commit -m "main-sub10"
'
test_expect_success 'split for sub10' '
- spl3=''"$(git subtree split --annotate='"'*'"' --prefix subdir --rejoin)"'' &&
- git branch spl3 "$spl3"
+ spl3=''"$(git subtree split --annotate='"'*'"' --prefix subdir --rejoin)"'' &&
+ git branch spl3 "$spl3"
'
# To the subproject!
cd ./subproj
test_expect_success 'merge split into subproj' '
- git fetch .. spl3 &&
- git branch spl3 FETCH_HEAD &&
- git merge FETCH_HEAD &&
- git branch subproj-merge-spl3
+ git fetch .. spl3 &&
+ git branch spl3 FETCH_HEAD &&
+ git merge FETCH_HEAD &&
+ git branch subproj-merge-spl3
'
chkm="main4 main6"
@@ -299,44 +299,44 @@ chks="sub1 sub2 sub3 sub9"
chks_sub=$(echo $chks | multiline | sed 's,^,subdir/,' | fixnl)
test_expect_success 'make sure exactly the right set of files ends up in the subproj' '
- subfiles=''"$(git ls-files | fixnl)"'' &&
- check_equal "$subfiles" "$chkms $chks"
+ subfiles=''"$(git ls-files | fixnl)"'' &&
+ check_equal "$subfiles" "$chkms $chks"
'
test_expect_success 'make sure the subproj history *only* contains commits that affect the subdir' '
- allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | fixnl)"'' &&
- check_equal "$allchanges" "$chkms $chks"
+ allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | fixnl)"'' &&
+ check_equal "$allchanges" "$chkms $chks"
'
# Back to mainline
cd ..
test_expect_success 'pull from subproj' '
- git fetch ./subproj subproj-merge-spl3 &&
- git branch subproj-merge-spl3 FETCH_HEAD &&
- git subtree pull --prefix=subdir ./subproj subproj-merge-spl3
+ git fetch ./subproj subproj-merge-spl3 &&
+ git branch subproj-merge-spl3 FETCH_HEAD &&
+ git subtree pull --prefix=subdir ./subproj subproj-merge-spl3
'
test_expect_success 'make sure exactly the right set of files ends up in the mainline' '
- mainfiles=''"$(git ls-files | fixnl)"'' &&
- check_equal "$mainfiles" "$chkm $chkms_sub $chks_sub"
+ mainfiles=''"$(git ls-files | fixnl)"'' &&
+ check_equal "$mainfiles" "$chkm $chkms_sub $chks_sub"
'
test_expect_success 'make sure each filename changed exactly once in the entire history' '
- # main-sub?? and /subdir/main-sub?? both change, because those are the
- # changes that were split into their own history. And subdir/sub?? never
- # change, since they were *only* changed in the subtree branch.
- allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | fixnl)"'' &&
- check_equal "$allchanges" ''"$(echo $chkms $chkm $chks $chkms_sub | multiline | sort | fixnl)"''
+ # main-sub?? and /subdir/main-sub?? both change, because those are the
+ # changes that were split into their own history. And subdir/sub?? never
+ # change, since they were *only* changed in the subtree branch.
+ allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | fixnl)"'' &&
+ check_equal "$allchanges" ''"$(echo $chkms $chkm $chks $chkms_sub | multiline | sort | fixnl)"''
'
test_expect_success 'make sure the --rejoin commits never make it into subproj' '
- check_equal ''"$(git log --pretty=format:'"'%s'"' HEAD^2 | grep -i split)"'' ""
+ check_equal ''"$(git log --pretty=format:'"'%s'"' HEAD^2 | grep -i split)"'' ""
'
test_expect_success 'make sure no "git subtree" tagged commits make it into subproj' '
- # They are meaningless to subproj since one side of the merge refers to the mainline
- check_equal ''"$(git log --pretty=format:'"'%s%n%b'"' HEAD^2 | grep "git-subtree.*:")"'' ""
+ # They are meaningless to subproj since one side of the merge refers to the mainline
+ check_equal ''"$(git log --pretty=format:'"'%s%n%b'"' HEAD^2 | grep "git-subtree.*:")"'' ""
'
# prepare second pair of repositories
@@ -344,27 +344,27 @@ mkdir test2
cd test2
test_expect_success 'init main' '
- test_create_repo main
+ test_create_repo main
'
cd main
test_expect_success 'add main1' '
- create main1 &&
- git commit -m "main1"
+ create main1 &&
+ git commit -m "main1"
'
cd ..
test_expect_success 'init sub' '
- test_create_repo sub
+ test_create_repo sub
'
cd sub
test_expect_success 'add sub2' '
- create sub2 &&
- git commit -m "sub2"
+ create sub2 &&
+ git commit -m "sub2"
'
cd ../main
@@ -372,33 +372,33 @@ cd ../main
# check if split can find proper base without --onto
test_expect_success 'add sub as subdir in main' '
- git fetch ../sub master &&
- git branch sub2 FETCH_HEAD &&
- git subtree add --prefix subdir sub2
+ git fetch ../sub master &&
+ git branch sub2 FETCH_HEAD &&
+ git subtree add --prefix subdir sub2
'
cd ../sub
test_expect_success 'add sub3' '
- create sub3 &&
- git commit -m "sub3"
+ create sub3 &&
+ git commit -m "sub3"
'
cd ../main
test_expect_success 'merge from sub' '
- git fetch ../sub master &&
- git branch sub3 FETCH_HEAD &&
- git subtree merge --prefix subdir sub3
+ git fetch ../sub master &&
+ git branch sub3 FETCH_HEAD &&
+ git subtree merge --prefix subdir sub3
'
test_expect_success 'add main-sub4' '
- create subdir/main-sub4 &&
- git commit -m "main-sub4"
+ create subdir/main-sub4 &&
+ git commit -m "main-sub4"
'
test_expect_success 'split for main-sub4 without --onto' '
- git subtree split --prefix subdir --branch mainsub4
+ git subtree split --prefix subdir --branch mainsub4
'
# at this point, the new commit parent should be sub3 if it is not,
@@ -407,21 +407,21 @@ test_expect_success 'split for main-sub4 without --onto' '
# itself)
test_expect_success 'check that the commit parent is sub3' '
- check_equal ''"$(git log --pretty=format:%P -1 mainsub4)"'' ''"$(git rev-parse sub3)"''
+ check_equal ''"$(git log --pretty=format:%P -1 mainsub4)"'' ''"$(git rev-parse sub3)"''
'
test_expect_success 'add main-sub5' '
- mkdir subdir2 &&
- create subdir2/main-sub5 &&
- git commit -m "main-sub5"
+ mkdir subdir2 &&
+ create subdir2/main-sub5 &&
+ git commit -m "main-sub5"
'
test_expect_success 'split for main-sub5 without --onto' '
- # also test that we still can split out an entirely new subtree
- # if the parent of the first commit in the tree is not empty,
- # then the new subtree has accidently been attached to something
- git subtree split --prefix subdir2 --branch mainsub5 &&
- check_equal ''"$(git log --pretty=format:%P -1 mainsub5)"'' ""
+ # also test that we still can split out an entirely new subtree
+ # if the parent of the first commit in the tree is not empty,
+ # then the new subtree has accidently been attached to something
+ git subtree split --prefix subdir2 --branch mainsub5 &&
+ check_equal ''"$(git log --pretty=format:%P -1 mainsub5)"'' ""
'
# make sure no patch changes more than one file. The original set of commits
@@ -449,20 +449,20 @@ joincommits()
}
test_expect_success 'verify one file change per commit' '
- x= &&
- list=''"$(git log --pretty=format:'"'commit: %H'"' | joincommits)"'' &&
-# test_debug "echo HERE" &&
-# test_debug "echo ''"$list"''" &&
- (git log --pretty=format:'"'commit: %H'"' | joincommits |
- ( while read commit a b; do
- test_debug "echo Verifying commit "''"$commit"''
- test_debug "echo a: "''"$a"''
- test_debug "echo b: "''"$b"''
- check_equal "$b" ""
- x=1
- done
- check_equal "$x" 1
- ))
+ x= &&
+ list=''"$(git log --pretty=format:'"'commit: %H'"' | joincommits)"'' &&
+# test_debug "echo HERE" &&
+# test_debug "echo ''"$list"''" &&
+ (git log --pretty=format:'"'commit: %H'"' | joincommits |
+ ( while read commit a b; do
+ test_debug "echo Verifying commit "''"$commit"''
+ test_debug "echo a: "''"$a"''
+ test_debug "echo b: "''"$b"''
+ check_equal "$b" ""
+ x=1
+ done
+ check_equal "$x" 1
+ ))
'
test_done
--
1.7.10.4
^ permalink raw reply related
* [PATCH 03/13] contrib/subtree: Better Error Handling for add
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: "David A. Greene" <greened@obbligato.org>
Check refspecs for validity before passing them on to other commands.
This lets us generate more helpful error messages.
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/git-subtree.sh | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 5598210..771f39d 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -497,12 +497,18 @@ cmd_add()
ensure_clean
if [ $# -eq 1 ]; then
- "cmd_add_commit" "$@"
+ git rev-parse -q --verify "$1^{commit}" >/dev/null ||
+ die "'$1' does not refer to a commit"
+
+ "cmd_add_commit" "$@"
elif [ $# -eq 2 ]; then
- "cmd_add_repository" "$@"
+ git rev-parse -q --verify "$2^{commit}" >/dev/null ||
+ die "'$2' does not refer to a commit"
+
+ "cmd_add_repository" "$@"
else
say "error: parameters were '$@'"
- die "Provide either a refspec or a repository and refspec."
+ die "Provide either a commit or a repository and commit."
fi
}
--
1.7.10.4
^ permalink raw reply related
* [PATCH 06/13] contrib/subtree: Make the Manual Directory if Needed
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: Jesper L. Nielsen, David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: "Jesper L. Nielsen" <lyager@gmail.com>
Before install git-subtree documentation, make sure the manpage
directory exists.
Signed-off-by: Jesper L. Nielsen <lyager@gmail.com>
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/Makefile | 1 +
1 file changed, 1 insertion(+)
diff --git a/contrib/subtree/Makefile b/contrib/subtree/Makefile
index 36ae3e4..b507505 100644
--- a/contrib/subtree/Makefile
+++ b/contrib/subtree/Makefile
@@ -35,6 +35,7 @@ install: $(GIT_SUBTREE)
install-doc: install-man
install-man: $(GIT_SUBTREE_DOC)
+ $(INSTALL) -d -m 755 $(DESTDIR)$(man1dir)
$(INSTALL) -m 644 $^ $(DESTDIR)$(man1dir)
$(GIT_SUBTREE_DOC): $(GIT_SUBTREE_XML)
--
1.7.10.4
^ permalink raw reply related
* [PATCH 05/13] contrib/subtree: Honor DESTDIR
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: Adam Tkac, David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: Adam Tkac <atkac@redhat.com>
Teach git-subtree's Makefile to honor DESTDIR.
Signed-off-by: Adam Tkac <atkac@redhat.com>
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/contrib/subtree/Makefile b/contrib/subtree/Makefile
index 05cdd5c..36ae3e4 100644
--- a/contrib/subtree/Makefile
+++ b/contrib/subtree/Makefile
@@ -30,12 +30,12 @@ $(GIT_SUBTREE): $(GIT_SUBTREE_SH)
doc: $(GIT_SUBTREE_DOC)
install: $(GIT_SUBTREE)
- $(INSTALL) -m 755 $(GIT_SUBTREE) $(libexecdir)
+ $(INSTALL) -m 755 $(GIT_SUBTREE) $(DESTDIR)$(libexecdir)
install-doc: install-man
install-man: $(GIT_SUBTREE_DOC)
- $(INSTALL) -m 644 $^ $(man1dir)
+ $(INSTALL) -m 644 $^ $(DESTDIR)$(man1dir)
$(GIT_SUBTREE_DOC): $(GIT_SUBTREE_XML)
xmlto -m $(MANPAGE_NORMAL_XSL) man $^
--
1.7.10.4
^ permalink raw reply related
* [PATCH 04/13] contrib/subtree: Fix Synopsis
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: "David A. Greene" <greened@obbligato.org>
Fix the documentation of add to show that a repository can be
specified along with a commit.
Suggested by Yann Dirson <dirson@bertin.fr>.
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/git-subtree.sh | 6 ++++++
contrib/subtree/git-subtree.txt | 3 ++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 771f39d..8a23f58 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -9,6 +9,7 @@ if [ $# -eq 0 ]; then
fi
OPTS_SPEC="\
git subtree add --prefix=<prefix> <commit>
+git subtree add --prefix=<prefix> <repository> <commit>
git subtree merge --prefix=<prefix> <commit>
git subtree pull --prefix=<prefix> <repository> <refspec...>
git subtree push --prefix=<prefix> <repository> <refspec...>
@@ -502,6 +503,11 @@ cmd_add()
"cmd_add_commit" "$@"
elif [ $# -eq 2 ]; then
+ # Technically we could accept a refspec here but we're
+ # just going to turn around and add FETCH_HEAD under the
+ # specified directory. Allowing a refspec might be
+ # misleading because we won't do anything with any other
+ # branches fetched via the refspec.
git rev-parse -q --verify "$2^{commit}" >/dev/null ||
die "'$2' does not refer to a commit"
diff --git a/contrib/subtree/git-subtree.txt b/contrib/subtree/git-subtree.txt
index c5bce41..7ba853e 100644
--- a/contrib/subtree/git-subtree.txt
+++ b/contrib/subtree/git-subtree.txt
@@ -9,7 +9,8 @@ git-subtree - Merge subtrees together and split repository into subtrees
SYNOPSIS
--------
[verse]
-'git subtree' add -P <prefix> <commit>
+'git subtree' add -P <prefix> <refspec>
+'git subtree' add -P <prefix> <repository> <refspec>
'git subtree' pull -P <prefix> <repository> <refspec...>
'git subtree' push -P <prefix> <repository> <refspec...>
'git subtree' merge -P <prefix> <commit>
--
1.7.10.4
^ permalink raw reply related
* [PATCH 02/13] contrib/subtree: Use %B for Split Subject/Body
From: David A. Greene @ 2013-02-05 4:06 UTC (permalink / raw)
To: James Nylen, git, Techlive Zheng, Wayne Walter,
Avery Pennarun ", Jakub Suder, John Yani
Cc: David A. Greene
In-Reply-To: <1360037173-23291-1-git-send-email-greened@obbligato.org>
From: Techlive Zheng <techlivezheng@gmail.com>
Use %B to format the commit message and body to avoid an extra newline
if a commit only has a subject line.
Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
Signed-off-by: David A. Greene <greened@obbligato.org>
---
contrib/subtree/git-subtree.sh | 2 +-
contrib/subtree/t/t7900-subtree.sh | 15 +++++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 920c664..5598210 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -296,7 +296,7 @@ copy_commit()
# We're going to set some environment vars here, so
# do it in a subshell to get rid of them safely later
debug copy_commit "{$1}" "{$2}" "{$3}"
- git log -1 --pretty=format:'%an%n%ae%n%ad%n%cn%n%ce%n%cd%n%s%n%n%b' "$1" |
+ git log -1 --pretty=format:'%an%n%ae%n%ad%n%cn%n%ce%n%cd%n%B' "$1" |
(
read GIT_AUTHOR_NAME
read GIT_AUTHOR_EMAIL
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 6cf9fb9..3f17f55 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -74,6 +74,10 @@ test_expect_success 'add sub1' '
git branch -m master subproj
'
+# Save this hash for testing later.
+
+subdir_hash=`git rev-parse HEAD`
+
test_expect_success 'add sub2' '
create sub2 &&
git commit -m "sub2" &&
@@ -211,6 +215,17 @@ test_expect_success 'check split with --branch' '
check_equal ''"$(git rev-parse splitbr1)"'' "$spl1"
'
+test_expect_success 'check hash of split' '
+ spl1=$(git subtree split --prefix subdir) &&
+ undo &&
+ git subtree split --prefix subdir --branch splitbr1test &&
+ check_equal ''"$(git rev-parse splitbr1test)"'' "$spl1"
+ git checkout splitbr1test &&
+ new_hash=$(git rev-parse HEAD~2) &&
+ git checkout mainline &&
+ check_equal ''"$new_hash"'' "$subdir_hash"
+'
+
test_expect_success 'check split with --branch for an existing branch' '
spl1=''"$(git subtree split --annotate='"'*'"' --prefix subdir --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
undo &&
--
1.7.10.4
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox